Introduce a simple state sort for drawing opaque items
Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 9 files). Show all
Unified · Split
| @@ -96,7 +96,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { · 95 unmodified lines | ||
| 96 | 96 | addJob<PrepareDeferred>("PrepareDeferred"); |
| 97 | 97 | |
| 98 | 98 | // Render opaque objects in DeferredBuffer |
| 99 | − addJob<DrawDeferred>("DrawOpaqueDeferred", opaques, shapePlumber); | |
| 99 | + addJob<DrawStateSortDeferred>("DrawOpaqueDeferred", opaques, shapePlumber); | |
| 100 | 100 | |
| 101 | 101 | // Once opaque is all rendered create stencil background |
| 102 | 102 | addJob<DrawStencilDeferred>("DrawOpaqueStencil"); |
| @@ -200,6 +200,38 @@ void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderCont · 97 unmodified lines | ||
| 200 | 200 | config->setNumDrawn((int)inItems.size()); |
| 201 | 201 | } |
| 202 | 202 | |
| 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 | + | |
| 203 | 235 | DrawOverlay3D::DrawOverlay3D(bool opaque) : |
| 204 | 236 | _shapePlumber(std::make_shared<ShapePlumber>()), |
| 205 | 237 | _opaquePass(opaque) { |