Track fullscreen surface states across frames
This commit is contained in:
@@ -30,11 +30,40 @@ RenderSurface ConfigureFullscreenStageSurface(
|
||||
surface.ResetRenderArea();
|
||||
}
|
||||
|
||||
surface.SetColorStateBefore(RHI::ResourceStates::Common);
|
||||
surface.SetColorStateBefore(entry.currentColorState);
|
||||
surface.SetColorStateAfter(RHI::ResourceStates::PixelShaderResource);
|
||||
return surface;
|
||||
}
|
||||
|
||||
void UpdateTrackedFullscreenSurfaceState(
|
||||
std::vector<std::unique_ptr<FullscreenPassSurfaceCache>>& surfaceCaches,
|
||||
const RenderSurface* surface) {
|
||||
if (surface == nullptr || surface->GetColorAttachments().empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
RHI::RHIResourceView* colorAttachment = surface->GetColorAttachments()[0];
|
||||
if (colorAttachment == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const std::unique_ptr<FullscreenPassSurfaceCache>& cache : surfaceCaches) {
|
||||
if (cache == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (size_t entryIndex = 0; entryIndex < cache->GetSurfaceCount(); ++entryIndex) {
|
||||
FullscreenPassSurfaceCache::SurfaceEntry* entry = cache->GetSurfaceEntry(entryIndex);
|
||||
if (entry == nullptr || entry->renderTargetView != colorAttachment) {
|
||||
continue;
|
||||
}
|
||||
|
||||
entry->currentColorState = surface->GetColorStateAfter();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
SceneRenderer::SceneRenderer() = default;
|
||||
@@ -92,6 +121,16 @@ bool SceneRenderer::Render(const std::vector<CameraRenderRequest>& requests) {
|
||||
if (!m_cameraRenderer.Render(request)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
UpdateTrackedFullscreenSurfaceState(
|
||||
m_ownedFullscreenStageSurfaces,
|
||||
&request.GetMainSceneSurface());
|
||||
if (request.postProcess.IsRequested()) {
|
||||
UpdateTrackedFullscreenSurfaceState(
|
||||
m_ownedFullscreenStageSurfaces,
|
||||
&request.postProcess.destinationSurface);
|
||||
}
|
||||
|
||||
rendered = true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user