Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 3 files). Show all
Unified · Split
| @@ -211,6 +211,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren · 210 unmodified lines | |||
| 211 | const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN<FilterLayeredItems::Outputs>(0); | 211 | const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN<FilterLayeredItems::Outputs>(0); |
| 212 | const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN<FilterLayeredItems::Outputs>(0); | 212 | const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN<FilterLayeredItems::Outputs>(0); |
| 213 | 213 | ||
| 214 | // We don't want the overlay to clear the deferred frame buffer depth because we would like to keep it for debugging visualisation | ||
| 215 | task.addJob<SetSeparateDeferredDepthBuffer>("SeparateDepthForOverlay", deferredFramebuffer); | ||
| 216 | |||
| 214 | const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying(); | 217 | const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying(); |
| 215 | const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying(); | 218 | const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying(); |
| 216 | task.addJob<DrawOverlay3D>("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); | 219 | task.addJob<DrawOverlay3D>("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); |
| @@ -451,3 +454,26 @@ void DrawStateSortDeferred::run(const RenderContextPointer& renderContext, const · 234 unmodified lines | |||
| 451 | 454 | ||
| 452 | config->setNumDrawn((int)inItems.size()); | 455 | config->setNumDrawn((int)inItems.size()); |
| 453 | } | 456 | } |
| 457 | |||
| 458 | void SetSeparateDeferredDepthBuffer::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { | ||
| 459 | assert(renderContext->args); | ||
| 460 | |||
| 461 | const auto deferredFramebuffer = inputs->getDeferredFramebuffer(); | ||
| 462 | const auto frameSize = deferredFramebuffer->getSize(); | ||
| 463 | const auto renderbufferCount = deferredFramebuffer->getNumRenderBuffers(); | ||
| 464 | |||
| 465 | if (!_framebuffer || _framebuffer->getSize() != frameSize || _framebuffer->getNumRenderBuffers() != renderbufferCount) { | ||
| 466 | auto depthFormat = deferredFramebuffer->getDepthStencilBufferFormat(); | ||
| 467 | auto depthStencilTexture = gpu::TexturePointer(gpu::Texture::createRenderBuffer(depthFormat, frameSize.x, frameSize.y)); | ||
| 468 | _framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("deferredFramebufferSeparateDepth")); | ||
| 469 | _framebuffer->setDepthStencilBuffer(depthStencilTexture, depthFormat); | ||
| 470 | for (decltype(deferredFramebuffer->getNumRenderBuffers()) i = 0; i < renderbufferCount; i++) { | ||
| 471 | _framebuffer->setRenderBuffer(i, deferredFramebuffer->getRenderBuffer(i)); | ||
| 472 | } | ||
| 473 | } | ||
| 474 | |||
| 475 | RenderArgs* args = renderContext->args; | ||
| 476 | gpu::doInBatch("SetSeparateDeferredDepthBuffer::run", args->_context, [this](gpu::Batch& batch) { | ||
| 477 | batch.setFramebuffer(_framebuffer); | ||
| 478 | }); | ||
| 479 | } | ||