From d9b63353b019e1f1775370154f4f045ff14184ce Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 17 Apr 2023 05:13:53 -0300 Subject: Support copy between multisample and non-multisample depth textures (#4676) * Support copy between multisample and non-multisample depth textures * PR feedback --- .../DepthDrawToNonMsFragmentShaderSource.frag | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Ryujinx.Graphics.Vulkan/Shaders/DepthDrawToNonMsFragmentShaderSource.frag (limited to 'Ryujinx.Graphics.Vulkan/Shaders/DepthDrawToNonMsFragmentShaderSource.frag') diff --git a/Ryujinx.Graphics.Vulkan/Shaders/DepthDrawToNonMsFragmentShaderSource.frag b/Ryujinx.Graphics.Vulkan/Shaders/DepthDrawToNonMsFragmentShaderSource.frag new file mode 100644 index 00000000..e376b2e7 --- /dev/null +++ b/Ryujinx.Graphics.Vulkan/Shaders/DepthDrawToNonMsFragmentShaderSource.frag @@ -0,0 +1,28 @@ +#version 450 core + +layout (std140, binding = 0) uniform sample_counts_log2_in +{ + ivec4 sample_counts_log2; +}; + +layout (set = 2, binding = 0) uniform sampler2DMS srcMS; + +void main() +{ + uvec2 coords = uvec2(gl_FragCoord.xy); + + int deltaX = sample_counts_log2.x - sample_counts_log2.z; + int deltaY = sample_counts_log2.y - sample_counts_log2.w; + int samplesInXLog2 = sample_counts_log2.z; + int samplesInYLog2 = sample_counts_log2.w; + int samplesInX = 1 << samplesInXLog2; + int samplesInY = 1 << samplesInYLog2; + int sampleIdx = ((int(coords.x) >> deltaX) & (samplesInX - 1)) | (((int(coords.y) >> deltaY) & (samplesInY - 1)) << samplesInXLog2); + + samplesInXLog2 = sample_counts_log2.x; + samplesInYLog2 = sample_counts_log2.y; + + ivec2 shiftedCoords = ivec2(int(coords.x) >> samplesInXLog2, int(coords.y) >> samplesInYLog2); + + gl_FragDepth = texelFetch(srcMS, shiftedCoords, sampleIdx).r; +} \ No newline at end of file -- cgit v1.2.3