diff options
author | Jannik Vogel <email@jannikvogel.de> | 2016-04-01 15:44:42 +0200 |
---|---|---|
committer | Jannik Vogel <email@jannikvogel.de> | 2016-04-08 22:35:22 +0200 |
commit | fa24df73404b1db5e2cff855c2ec88300972be5c (patch) | |
tree | 28bddb26d39008cacc01b9517e4f41267133df27 | |
parent | OpenGL: Keep stencil-test and framebuffer.depth_format in sync (diff) | |
download | yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.tar yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.tar.gz yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.tar.bz2 yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.tar.lz yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.tar.xz yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.tar.zst yuzu-fa24df73404b1db5e2cff855c2ec88300972be5c.zip |
-rw-r--r-- | src/video_core/pica.h | 12 | ||||
-rw-r--r-- | src/video_core/rasterizer.cpp | 8 |
2 files changed, 16 insertions, 4 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h index 16f9e4006..4552ff81c 100644 --- a/src/video_core/pica.h +++ b/src/video_core/pica.h @@ -578,7 +578,17 @@ struct Regs { } struct { - INSERT_PADDING_WORDS(0x6); + INSERT_PADDING_WORDS(0x3); + + union { + BitField<0, 4, u32> allow_color_write; // 0 = disable, else enable + }; + + INSERT_PADDING_WORDS(0x1); + + union { + BitField<0, 2, u32> allow_depth_stencil_write; // 0 = disable, else enable + }; DepthFormat depth_format; // TODO: Should be a BitField! BitField<16, 3, ColorFormat> color_format; diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp index fd02aa652..5b9ed7c64 100644 --- a/src/video_core/rasterizer.cpp +++ b/src/video_core/rasterizer.cpp @@ -809,7 +809,8 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0, auto UpdateStencil = [stencil_test, x, y, &old_stencil](Pica::Regs::StencilAction action) { u8 new_stencil = PerformStencilAction(action, old_stencil, stencil_test.reference_value); - SetStencil(x >> 4, y >> 4, (new_stencil & stencil_test.write_mask) | (old_stencil & ~stencil_test.write_mask)); + if (g_state.regs.framebuffer.allow_depth_stencil_write != 0) + SetStencil(x >> 4, y >> 4, (new_stencil & stencil_test.write_mask) | (old_stencil & ~stencil_test.write_mask)); }; if (stencil_action_enable) { @@ -909,7 +910,7 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0, } } - if (output_merger.depth_write_enable) + if (regs.framebuffer.allow_depth_stencil_write != 0 && output_merger.depth_write_enable) SetDepth(x >> 4, y >> 4, z); // The stencil depth_pass action is executed even if depth testing is disabled @@ -1133,7 +1134,8 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0, output_merger.alpha_enable ? blend_output.a() : dest.a() }; - DrawPixel(x >> 4, y >> 4, result); + if (regs.framebuffer.allow_color_write != 0) + DrawPixel(x >> 4, y >> 4, result); } } } |