From fc2c123ae2a48680e0fecaffcd14e1bef09bb560 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Wed, 16 Mar 2022 20:51:49 +0000 Subject: [PATCH] Implement GPU depthMode register This controls the depth range used by the shader, hades already has support for the necessary patching so we only need to pass the current mode over to it and it'll do the necessary work. --- app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h | 4 ++++ app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h | 5 +++++ app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp | 4 ++++ app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h | 2 ++ 4 files changed, 15 insertions(+) diff --git a/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h b/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h index 81c083e2..37037ae3 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/graphics_context.h @@ -1152,6 +1152,10 @@ namespace skyline::gpu::interconnect { rasterizerState.get().depthBiasSlopeFactor = factor; } + void SetDepthMode(maxwell3d::DepthMode mode) { + UpdateRuntimeInformation(runtimeInfo.convert_depth_mode, mode == maxwell3d::DepthMode::MinusOneToOne, maxwell3d::PipelineStage::Vertex, maxwell3d::PipelineStage::Geometry); + } + /* Color Blending */ private: std::array commonRtBlendState{}, independentRtBlendState{}; //!< Per-RT blending state for common/independent blending for trivial toggling behavior diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h index b5e35b7c..93d9755a 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h @@ -761,5 +761,10 @@ namespace skyline::soc::gm20b::engine::maxwell3d::type { } format; }; + enum class DepthMode : u32 { + MinusOneToOne = 0, + ZeroToOne = 1 + }; + #pragma pack(pop) } diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp index 10aa0f33..b9ad83b4 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp @@ -668,6 +668,10 @@ namespace skyline::soc::gm20b::engine::maxwell3d { BOOST_PP_REPEAT(16, CBUF_UPDATE_CALLBACKS, 0) #undef CBUF_UPDATE_CALLBACKS + MAXWELL3D_CASE(depthMode, { + context.SetDepthMode(depthMode); + }) + default: break; } diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h index 226e8213..7f3132cd 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h @@ -66,6 +66,8 @@ namespace skyline::soc::gm20b::engine::maxwell3d { Register<0x35D, u32> drawVertexFirst; //!< The first vertex to draw Register<0x35E, u32> drawVertexCount; //!< The amount of vertices to draw, calling this method triggers non-indexed drawing + Register<0x35F, type::DepthMode> depthMode; + Register<0x360, std::array> clearColorValue; Register<0x364, float> clearDepthValue; Register<0x368, u32> clearStencilValue;