Pica: Write depth value even when depth test is disabled
This has been confirmed on hardware. Fixes Etrian Odyssey IV.
This commit is contained in:
parent
b5ca152389
commit
c58bc25d5b
|
@ -858,12 +858,12 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Does depth indeed only get written even if depth testing is enabled?
|
unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
|
||||||
|
u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
|
||||||
|
v1.screenpos[2].ToFloat32() * w1 +
|
||||||
|
v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
|
||||||
|
|
||||||
if (output_merger.depth_test_enable) {
|
if (output_merger.depth_test_enable) {
|
||||||
unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
|
|
||||||
u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
|
|
||||||
v1.screenpos[2].ToFloat32() * w1 +
|
|
||||||
v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
|
|
||||||
u32 ref_z = GetDepth(x >> 4, y >> 4);
|
u32 ref_z = GetDepth(x >> 4, y >> 4);
|
||||||
|
|
||||||
bool pass = false;
|
bool pass = false;
|
||||||
|
@ -907,11 +907,11 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
|
||||||
UpdateStencil(stencil_test.action_depth_fail);
|
UpdateStencil(stencil_test.action_depth_fail);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output_merger.depth_write_enable)
|
|
||||||
SetDepth(x >> 4, y >> 4, z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (output_merger.depth_write_enable)
|
||||||
|
SetDepth(x >> 4, y >> 4, z);
|
||||||
|
|
||||||
// The stencil depth_pass action is executed even if depth testing is disabled
|
// The stencil depth_pass action is executed even if depth testing is disabled
|
||||||
if (stencil_action_enable)
|
if (stencil_action_enable)
|
||||||
UpdateStencil(stencil_test.action_depth_pass);
|
UpdateStencil(stencil_test.action_depth_pass);
|
||||||
|
|
|
@ -887,8 +887,10 @@ void RasterizerOpenGL::SyncStencilTest() {
|
||||||
|
|
||||||
void RasterizerOpenGL::SyncDepthTest() {
|
void RasterizerOpenGL::SyncDepthTest() {
|
||||||
const auto& regs = Pica::g_state.regs;
|
const auto& regs = Pica::g_state.regs;
|
||||||
state.depth.test_enabled = (regs.output_merger.depth_test_enable == 1);
|
state.depth.test_enabled = regs.output_merger.depth_test_enable == 1 ||
|
||||||
state.depth.test_func = PicaToGL::CompareFunc(regs.output_merger.depth_test_func);
|
regs.output_merger.depth_write_enable == 1;
|
||||||
|
state.depth.test_func = regs.output_merger.depth_test_enable == 1 ?
|
||||||
|
PicaToGL::CompareFunc(regs.output_merger.depth_test_func) : GL_ALWAYS;
|
||||||
state.color_mask.red_enabled = regs.output_merger.red_enable;
|
state.color_mask.red_enabled = regs.output_merger.red_enable;
|
||||||
state.color_mask.green_enabled = regs.output_merger.green_enable;
|
state.color_mask.green_enabled = regs.output_merger.green_enable;
|
||||||
state.color_mask.blue_enabled = regs.output_merger.blue_enable;
|
state.color_mask.blue_enabled = regs.output_merger.blue_enable;
|
||||||
|
|
Reference in New Issue