Skip to content

Commit fffd25c

Browse files
committed
rsx: Framebuffer setup fix
- Stencil flag is meaningless if surface does not support stencil
1 parent 39347c3 commit fffd25c

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

rpcs3/Emu/RSX/GL/GLRenderTargets.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,12 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool sk
188188

189189
//NOTE: Z buffers with pitch = 64 are valid even if they would not fit (GT HD Concept)
190190
const auto required_color_pitch = std::max<u32>((u32)rsx::utility::get_packed_pitch(surface_format, clip_horizontal), 64u);
191+
const bool stencil_test_enabled = depth_format == rsx::surface_depth_format::z24s8 && rsx::method_registers.stencil_test_enabled();
191192

192193
if (depth_address)
193194
{
194195
if (!rsx::method_registers.depth_test_enabled() &&
195-
!rsx::method_registers.stencil_test_enabled() &&
196+
!stencil_test_enabled &&
196197
target != rsx::surface_target::none)
197198
{
198199
//Disable depth buffer if depth testing is not enabled, unless a clear command is targeting the depth buffer
@@ -216,7 +217,7 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool sk
216217
//TODO: Research clearing both depth AND color
217218
//TODO: If context is creation_draw, deal with possibility of a lost buffer clear
218219
if (context == rsx::framebuffer_creation_context::context_clear_depth ||
219-
rsx::method_registers.depth_test_enabled() || rsx::method_registers.stencil_test_enabled() ||
220+
rsx::method_registers.depth_test_enabled() || stencil_test_enabled ||
220221
(!rsx::method_registers.color_write_enabled() && rsx::method_registers.depth_write_enabled()))
221222
{
222223
// Use address for depth data

rpcs3/Emu/RSX/VK/VKGSRender.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,11 +2426,12 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context)
24262426

24272427
//NOTE: Z buffers with pitch = 64 are valid even if they would not fit (GT HD Concept)
24282428
const auto required_color_pitch = std::max<u32>((u32)rsx::utility::get_packed_pitch(color_fmt, clip_width), 64u);
2429+
const bool stencil_test_enabled = depth_fmt == rsx::surface_depth_format::z24s8 && rsx::method_registers.stencil_test_enabled();
24292430

24302431
if (zeta_address)
24312432
{
24322433
if (!rsx::method_registers.depth_test_enabled() &&
2433-
!rsx::method_registers.stencil_test_enabled() &&
2434+
!stencil_test_enabled &&
24342435
target != rsx::surface_target::none)
24352436
{
24362437
//Disable depth buffer if depth testing is not enabled, unless a clear command is targeting the depth buffer
@@ -2452,7 +2453,7 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context)
24522453
{
24532454
LOG_TRACE(RSX, "Framebuffer at 0x%X has aliasing color/depth targets, zeta_pitch = %d, color_pitch=%d", zeta_address, zeta_pitch, surface_pitchs[index]);
24542455
if (context == rsx::framebuffer_creation_context::context_clear_depth ||
2455-
rsx::method_registers.depth_test_enabled() || rsx::method_registers.stencil_test_enabled() ||
2456+
rsx::method_registers.depth_test_enabled() || stencil_test_enabled ||
24562457
(!rsx::method_registers.color_write_enabled() && rsx::method_registers.depth_write_enabled()))
24572458
{
24582459
// Use address for depth data

0 commit comments

Comments
 (0)