From 9f6a5660e8f138053ba03dc5f9b6bdf7950c3263 Mon Sep 17 00:00:00 2001 From: Subv Date: Thu, 5 Jul 2018 13:01:31 -0500 Subject: GPU: Allow using the old NV04 values for the depth test function. These seem to be just a valid as the GL token values. Thanks @ReinUsesLisp This restores graphical output to Disgaea 5 --- src/video_core/engines/maxwell_3d.h | 30 ++++++++++++++++++-------- src/video_core/renderer_opengl/maxwell_to_gl.h | 8 +++++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index cc1f90de6..5a7cf0107 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -281,14 +281,26 @@ public: }; enum class ComparisonOp : u32 { - Never = 0, - Less = 1, - Equal = 2, - LessEqual = 3, - Greater = 4, - NotEqual = 5, - GreaterEqual = 6, - Always = 7, + // These values are used by Nouveau and most games, they correspond to the OpenGL token + // values for these operations. + Never = 0x200, + Less = 0x201, + Equal = 0x202, + LessEqual = 0x203, + Greater = 0x204, + NotEqual = 0x205, + GreaterEqual = 0x206, + Always = 0x207, + + // These values are used by some games, they seem to be NV04 values. + NeverOld = 1, + LessOld = 2, + EqualOld = 3, + LessEqualOld = 4, + GreaterOld = 5, + NotEqualOld = 6, + GreaterEqualOld = 7, + AlwaysOld = 8, }; struct Cull { @@ -482,7 +494,7 @@ public: u32 d3d_cull_mode; - BitField<0, 3, ComparisonOp> depth_test_func; + ComparisonOp depth_test_func; INSERT_PADDING_WORDS(0xB); diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h index 6ce53bbd9..e19c3b280 100644 --- a/src/video_core/renderer_opengl/maxwell_to_gl.h +++ b/src/video_core/renderer_opengl/maxwell_to_gl.h @@ -211,20 +211,28 @@ inline GLenum SwizzleSource(Tegra::Texture::SwizzleSource source) { inline GLenum ComparisonOp(Maxwell::ComparisonOp comparison) { switch (comparison) { case Maxwell::ComparisonOp::Never: + case Maxwell::ComparisonOp::NeverOld: return GL_NEVER; case Maxwell::ComparisonOp::Less: + case Maxwell::ComparisonOp::LessOld: return GL_LESS; case Maxwell::ComparisonOp::Equal: + case Maxwell::ComparisonOp::EqualOld: return GL_EQUAL; case Maxwell::ComparisonOp::LessEqual: + case Maxwell::ComparisonOp::LessEqualOld: return GL_LEQUAL; case Maxwell::ComparisonOp::Greater: + case Maxwell::ComparisonOp::GreaterOld: return GL_GREATER; case Maxwell::ComparisonOp::NotEqual: + case Maxwell::ComparisonOp::NotEqualOld: return GL_NOTEQUAL; case Maxwell::ComparisonOp::GreaterEqual: + case Maxwell::ComparisonOp::GreaterEqualOld: return GL_GEQUAL; case Maxwell::ComparisonOp::Always: + case Maxwell::ComparisonOp::AlwaysOld: return GL_ALWAYS; } LOG_CRITICAL(Render_OpenGL, "Unimplemented comparison op={}", static_cast(comparison)); -- cgit v1.2.3