History

Merge pull request #7697 from samcake/orange

Introduce a simple state sort for drawing opaque items

Brad Hefta-Gaub committed 10 years ago

Commit 5d550192 parents d16750c 9087de29 files · +155 −12Browse files

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

Unified · Split

libraries/render-utils/src/RenderDeferredTask.cpp+33−1
@@ -96,7 +96,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { · 95 unmodified lines
9696 addJob<PrepareDeferred>("PrepareDeferred");
9797
9898 // Render opaque objects in DeferredBuffer
99− addJob<DrawDeferred>("DrawOpaqueDeferred", opaques, shapePlumber);
99+ addJob<DrawStateSortDeferred>("DrawOpaqueDeferred", opaques, shapePlumber);
100100
101101 // Once opaque is all rendered create stencil background
102102 addJob<DrawStencilDeferred>("DrawOpaqueStencil");
@@ -200,6 +200,38 @@ void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderCont · 97 unmodified lines
200200 config->setNumDrawn((int)inItems.size());
201201 }
202202
203+void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems) {
204+ assert(renderContext->args);
205+ assert(renderContext->args->_viewFrustum);
206+
207+ auto config = std::static_pointer_cast<Config>(renderContext->jobConfig);
208+
209+ RenderArgs* args = renderContext->args;
210+
211+ gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
212+ args->_batch = &batch;
213+ batch.setViewportTransform(args->_viewport);
214+ batch.setStateScissorRect(args->_viewport);
215+
216+ glm::mat4 projMat;
217+ Transform viewMat;
218+ args->_viewFrustum->evalProjectionMatrix(projMat);
219+ args->_viewFrustum->evalViewTransform(viewMat);
220+
221+ batch.setProjectionTransform(projMat);
222+ batch.setViewTransform(viewMat);
223+
224+ if (_stateSort) {
225+ renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
226+ } else {
227+ renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
228+ }
229+ args->_batch = nullptr;
230+ });
231+
232+ config->setNumDrawn((int)inItems.size());
233+}
234+
203235 DrawOverlay3D::DrawOverlay3D(bool opaque) :
204236 _shapePlumber(std::make_shared<ShapePlumber>()),
205237 _opaquePass(opaque) {