Make Engine a Task

This commit is contained in:
Zach Pomerantz 2016-01-19 16:48:45 -08:00
parent 3dab1571a5
commit 8b68d5922c
5 changed files with 21 additions and 35 deletions

View file

@ -677,8 +677,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
// Start rendering
render::CullFunctor cullFunctor = LODManager::shouldRender;
_renderEngine->addTask(make_shared<RenderShadowTask>(cullFunctor));
_renderEngine->addTask(make_shared<RenderDeferredTask>(cullFunctor));
_renderEngine->addJob<RenderShadowTask>("RenderShadowTask", cullFunctor);
_renderEngine->addJob<RenderDeferredTask>("RenderDeferredTask", cullFunctor);
_renderEngine->registerScene(_main3DScene);
_offscreenContext->makeCurrent();

View file

@ -115,6 +115,10 @@ class RenderDeferredTask : public render::Task {
public:
RenderDeferredTask(render::CullFunctor cullFunctor);
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
using JobModel = render::Task::Job::Model<RenderDeferredTask>;
void setDrawDebugDeferredBuffer(int draw) { enableJob(_drawDebugDeferredBufferIndex, draw >= 0); }
bool doDrawDebugDeferredBuffer() const { return getEnableJob(_drawDebugDeferredBufferIndex); }
@ -136,7 +140,6 @@ public:
void setToneMappingToneCurve(int toneCurve);
int getToneMappingToneCurve() const;
virtual void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
protected:
int _drawDebugDeferredBufferIndex;

View file

@ -35,6 +35,8 @@ public:
RenderShadowTask(render::CullFunctor shouldRender);
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
using JobModel = render::Task::Job::Model<RenderShadowTask>;
};
#endif // hifi_RenderShadowTask_h

View file

@ -21,25 +21,11 @@ Engine::Engine() :
{
}
void Engine::registerScene(const ScenePointer& scene) {
_sceneContext->_scene = scene;
}
void Engine::setRenderContext(const RenderContext& renderContext) {
(*_renderContext) = renderContext;
}
void Engine::addTask(const TaskPointer& task) {
if (task) {
_tasks.push_back(task);
}
}
void Engine::run() {
// Sync GPU state before beginning to render
_renderContext->getArgs()->_context->syncCache();
for (auto task : _tasks) {
task->run(_sceneContext, _renderContext);
for (auto job : _jobs) {
job.run(_sceneContext, _renderContext);
}
}

View file

@ -17,36 +17,31 @@
namespace render {
// The root of the tasks, the Engine, should not be known from the Tasks,
// The SceneContext is what navigates from the engine down to the Tasks
class Engine {
// The render engine holds all render tasks, and is itself a render task.
// State flows through tasks to jobs via the render and scene contexts -
// the engine should not be known from its jobs.
class Engine : public Task {
public:
Engine();
~Engine() {}
~Engine() = default;
// Register the scene should be [art of the init phase before running the engine
void registerScene(const ScenePointer& scene);
// Register the scene
void registerScene(const ScenePointer& scene) { _sceneContext->_scene = scene; }
// Push a RenderContext
void setRenderContext(const RenderContext& renderContext);
void setRenderContext(const RenderContext& renderContext) { (*_renderContext) = renderContext; }
RenderContextPointer getRenderContext() const { return _renderContext; }
void addTask(const TaskPointer& task);
const Tasks& getTasks() const { return _tasks; }
// Render a frame
// A frame must have a scene registered and a context set to render
void run();
protected:
Tasks _tasks;
SceneContextPointer _sceneContext;
RenderContextPointer _renderContext;
};
typedef std::shared_ptr<Engine> EnginePointer;
using EnginePointer = std::shared_ptr<Engine>;
}
#endif // hifi_render_Engine_h