History

Improving the design of the Jobs and varying

Sam Gateau committed 11 years ago

Commit 9be87751 parent fb5738e8 files · +310 −127Browse files

Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 8 files). Show all

Unified · Split

libraries/render-utils/src/RenderDeferredTask.cpp+69−12
@@ -21,18 +21,18 @@ · 20 unmodified lines
21 21
22using namespace render;22using namespace render;
23 23
24template <> void render::jobRun(const PrepareDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {24void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
25 PerformanceTimer perfTimer("PrepareDeferred");25 PerformanceTimer perfTimer("PrepareDeferred");
26 DependencyManager::get<DeferredLightingEffect>()->prepare();26 DependencyManager::get<DeferredLightingEffect>()->prepare(renderContext->args);
27}27}
28 28
29template <> void render::jobRun(const RenderDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {29void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
30 PerformanceTimer perfTimer("RenderDeferred");30 PerformanceTimer perfTimer("RenderDeferred");
31 DependencyManager::get<DeferredLightingEffect>()->render();31 DependencyManager::get<DeferredLightingEffect>()->render(renderContext->args);
32// renderContext->args->_context->syncCache();32// renderContext->args->_context->syncCache();
33}33}
34 34
35template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {35void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
36 PerformanceTimer perfTimer("ResolveDeferred");36 PerformanceTimer perfTimer("ResolveDeferred");
37 DependencyManager::get<DeferredLightingEffect>()->copyBack(renderContext->args);37 DependencyManager::get<DeferredLightingEffect>()->copyBack(renderContext->args);
38 renderContext->args->_context->syncCache();38 renderContext->args->_context->syncCache();
@@ -40,7 +40,7 @@ template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPo · 1 unmodified line
40}40}
41 41
42 42
43 43/*
44RenderDeferredTask::RenderDeferredTask() : Task() {44RenderDeferredTask::RenderDeferredTask() : Task() {
45 _jobs.push_back(Job(PrepareDeferred()));45 _jobs.push_back(Job(PrepareDeferred()));
46 _jobs.push_back(Job(DrawBackground()));46 _jobs.push_back(Job(DrawBackground()));
@@ -53,6 +53,22 @@ RenderDeferredTask::RenderDeferredTask() : Task() { · 6 unmodified lines
53 _jobs.push_back(Job(DrawPostLayered()));53 _jobs.push_back(Job(DrawPostLayered()));
54 _jobs.push_back(Job(ResetGLState()));54 _jobs.push_back(Job(ResetGLState()));
55}55}
56*/
57RenderDeferredTask::RenderDeferredTask() : Task() {
58 _jobs.push_back(Job(new PrepareDeferred::JobModel()));
59 _jobs.push_back(Job(new DrawBackground::JobModel()));
60 _jobs.push_back(Job(new FetchItems::JobModel()));
61 _jobs.push_back(Job(new CullItems::JobModel(_jobs.back().getOutput())));
62 _jobs.push_back(Job(new DepthSortItems::JobModel(_jobs.back().getOutput())));
63 _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel(_jobs.back().getOutput())));
64 _jobs.push_back(Job(new DrawLight::JobModel()));
65 _jobs.push_back(Job(new ResetGLState::JobModel()));
66 _jobs.push_back(Job(new RenderDeferred::JobModel()));
67 _jobs.push_back(Job(new ResolveDeferred::JobModel()));
68 _jobs.push_back(Job(new DrawTransparentDeferred::JobModel()));
69 _jobs.push_back(Job(new DrawPostLayered::JobModel()));
70 _jobs.push_back(Job(new ResetGLState::JobModel()));
71}
56 72
57RenderDeferredTask::~RenderDeferredTask() {73RenderDeferredTask::~RenderDeferredTask() {
58}74}
@@ -77,9 +93,8 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend · 18 unmodified lines
77 }93 }
78};94};
79 95
80 96/*
81 97void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
82template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
83 PerformanceTimer perfTimer("DrawOpaqueDeferred");98 PerformanceTimer perfTimer("DrawOpaqueDeferred");
84 assert(renderContext->args);99 assert(renderContext->args);
85 assert(renderContext->args->_viewFrustum);100 assert(renderContext->args->_viewFrustum);
@@ -126,7 +141,7 @@ template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContex · 40 unmodified lines
126 }141 }
127 }142 }
128*/143*/
129 144/*
130 if (renderContext->_renderOpaque) {145 if (renderContext->_renderOpaque) {
131 RenderArgs* args = renderContext->args;146 RenderArgs* args = renderContext->args;
132 gpu::Batch batch;147 gpu::Batch batch;
@@ -153,13 +168,49 @@ template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContex · 20 unmodified lines
153 168
154 renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems);169 renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems);
155 170
171 renderContext->args->_context->syncCache();
156 args->_context->render((*args->_batch));172 args->_context->render((*args->_batch));
157 args->_batch = nullptr;173 args->_batch = nullptr;
158 }174 }
159}175}
176*/
160 177
178void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDsBounds& inItems) {
179 PerformanceTimer perfTimer("DrawOpaqueDeferred");
180 assert(renderContext->args);
181 assert(renderContext->args->_viewFrustum);
161 182
162template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {183 RenderArgs* args = renderContext->args;
184 gpu::Batch batch;
185 args->_batch = &batch;
186
187 glm::mat4 projMat;
188 Transform viewMat;
189 args->_viewFrustum->evalProjectionMatrix(projMat);
190 args->_viewFrustum->evalViewTransform(viewMat);
191 if (args->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
192 viewMat.postScale(glm::vec3(-1.0f, 1.0f, 1.0f));
193 }
194 batch.setProjectionTransform(projMat);
195 batch.setViewTransform(viewMat);
196
197 {
198 GLenum buffers[3];
199 int bufferCount = 0;
200 buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
201 buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
202 buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
203 batch._glDrawBuffers(bufferCount, buffers);
204 }
205
206 renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems);
207
208 renderContext->args->_context->syncCache();
209 args->_context->render((*args->_batch));
210 args->_batch = nullptr;
211}
212
213void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
163 PerformanceTimer perfTimer("DrawTransparentDeferred");214 PerformanceTimer perfTimer("DrawTransparentDeferred");
164 assert(renderContext->args);215 assert(renderContext->args);
165 assert(renderContext->args->_viewFrustum);216 assert(renderContext->args->_viewFrustum);
@@ -172,7 +223,13 @@ template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneC · 6 unmodified lines
172 ItemIDsBounds inItems;223 ItemIDsBounds inItems;
173 inItems.reserve(items.size());224 inItems.reserve(items.size());
174 for (auto id : items) {225 for (auto id : items) {
175 inItems.push_back(id);226 auto item = scene->getItem(id);
227 AABox bound;
228 {
229 PerformanceTimer perfTimer("getBound");
230 bound = item.getBound();
231 }
232 inItems.emplace_back(ItemIDAndBounds(id, bound));
176 }233 }
177 ItemIDsBounds& renderedItems = inItems;234 ItemIDsBounds& renderedItems = inItems;
178 235