rsx: Fix surface option invalidation

- Depth buffers can be in special "read" state when writes are disabled. Account for this.
This commit is contained in:
kd-11 2020-06-14 23:00:40 +03:00 committed by kd-11
parent 88a0e0fe2d
commit 2e737ad483
1 changed files with 30 additions and 11 deletions

View File

@ -1350,6 +1350,31 @@ namespace rsx
return any_found; return any_found;
}; };
auto evaluate_depth_buffer_contested = [&]()
{
if (m_framebuffer_layout.zeta_address) [[likely]]
{
// Nothing to do, depth buffer already exists
return false;
}
// Check if depth read/write is enabled
if (m_framebuffer_layout.zeta_write_enabled ||
rsx::method_registers.depth_test_enabled())
{
return true;
}
// Check if stencil read is enabled
if (m_framebuffer_layout.depth_format == rsx::surface_depth_format::z24s8 &&
rsx::method_registers.stencil_test_enabled())
{
return true;
}
return false;
};
if (m_rtts_dirty) if (m_rtts_dirty)
{ {
// Nothing to do // Nothing to do
@ -1361,14 +1386,11 @@ namespace rsx
case NV4097_SET_DEPTH_TEST_ENABLE: case NV4097_SET_DEPTH_TEST_ENABLE:
case NV4097_SET_DEPTH_MASK: case NV4097_SET_DEPTH_MASK:
{ {
auto old_state = m_framebuffer_layout.zeta_write_enabled;
evaluate_depth_buffer_state(); evaluate_depth_buffer_state();
if (m_framebuffer_state_contested && if (m_framebuffer_state_contested)
!old_state && m_framebuffer_layout.zeta_write_enabled)
{ {
// Z buffer needs to be recreated m_rtts_dirty |= evaluate_depth_buffer_contested();
m_rtts_dirty = true;
} }
break; break;
} }
@ -1384,7 +1406,6 @@ namespace rsx
case NV4097_SET_BACK_STENCIL_OP_ZFAIL: case NV4097_SET_BACK_STENCIL_OP_ZFAIL:
{ {
// Stencil takes a back seat to depth buffer stuff // Stencil takes a back seat to depth buffer stuff
bool old_state = m_framebuffer_layout.zeta_write_enabled;
evaluate_depth_buffer_state(); evaluate_depth_buffer_state();
if (!m_framebuffer_layout.zeta_write_enabled) if (!m_framebuffer_layout.zeta_write_enabled)
@ -1392,11 +1413,9 @@ namespace rsx
evaluate_stencil_buffer_state(); evaluate_stencil_buffer_state();
} }
if (m_framebuffer_state_contested && if (m_framebuffer_state_contested)
!old_state && m_framebuffer_layout.zeta_write_enabled)
{ {
// Z|S buffer needs to be recreated m_rtts_dirty |= evaluate_depth_buffer_contested();
m_rtts_dirty = true;
} }
break; break;
} }
@ -1413,7 +1432,7 @@ namespace rsx
bool old_state = false; bool old_state = false;
for (const auto& enabled : m_framebuffer_layout.color_write_enabled) for (const auto& enabled : m_framebuffer_layout.color_write_enabled)
{ {
if (old_state = enabled) break; if (old_state = enabled; old_state) break;
} }
const auto new_state = evaluate_color_buffer_state(); const auto new_state = evaluate_color_buffer_state();