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 // Start rendering
render::CullFunctor cullFunctor = LODManager::shouldRender; render::CullFunctor cullFunctor = LODManager::shouldRender;
_renderEngine->addTask(make_shared<RenderShadowTask>(cullFunctor)); _renderEngine->addJob<RenderShadowTask>("RenderShadowTask", cullFunctor);
_renderEngine->addTask(make_shared<RenderDeferredTask>(cullFunctor)); _renderEngine->addJob<RenderDeferredTask>("RenderDeferredTask", cullFunctor);
_renderEngine->registerScene(_main3DScene); _renderEngine->registerScene(_main3DScene);
_offscreenContext->makeCurrent(); _offscreenContext->makeCurrent();

View file

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

View file

@ -35,6 +35,8 @@ public:
RenderShadowTask(render::CullFunctor shouldRender); RenderShadowTask(render::CullFunctor shouldRender);
void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext);
using JobModel = render::Task::Job::Model<RenderShadowTask>;
}; };
#endif // hifi_RenderShadowTask_h #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() { void Engine::run() {
// Sync GPU state before beginning to render // Sync GPU state before beginning to render
_renderContext->getArgs()->_context->syncCache(); _renderContext->getArgs()->_context->syncCache();
for (auto task : _tasks) { for (auto job : _jobs) {
task->run(_sceneContext, _renderContext); job.run(_sceneContext, _renderContext);
} }
} }

View file

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