From a22b8a88a25605be7328d15eaaa991119fe2b786 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 19 Sep 2025 11:11:26 +0100 Subject: [PATCH] Calculate mip shift accurately for NPOT textures --- renderdoc/data/glsl/glsl_ubos.h | 3 +-- renderdoc/data/glsl/texdisplay.frag | 2 +- renderdoc/driver/gl/gl_rendertexture.cpp | 9 +++++++-- renderdoc/driver/vulkan/vk_rendertexture.cpp | 11 +++++++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/renderdoc/data/glsl/glsl_ubos.h b/renderdoc/data/glsl/glsl_ubos.h index 45e7f3227..b7bbc2b67 100644 --- a/renderdoc/data/glsl/glsl_ubos.h +++ b/renderdoc/data/glsl/glsl_ubos.h @@ -107,9 +107,8 @@ BINDING(0) uniform TexDisplayUBOData float Slice; int SampleIdx; - float MipShift; int DecodeYUV; - float Padding; + vec2 MipShift; uvec4 YUVDownsampleRate; uvec4 YUVAChannels; diff --git a/renderdoc/data/glsl/texdisplay.frag b/renderdoc/data/glsl/texdisplay.frag index 62794722b..b7661bb35 100644 --- a/renderdoc/data/glsl/texdisplay.frag +++ b/renderdoc/data/glsl/texdisplay.frag @@ -94,7 +94,7 @@ void main(void) scr /= texdisplay.Scale; - scr /= vec2(texdisplay.MipShift, texdisplay.MipShift); + scr /= texdisplay.MipShift; vec2 scr2 = scr; #ifdef VULKAN diff --git a/renderdoc/driver/gl/gl_rendertexture.cpp b/renderdoc/driver/gl/gl_rendertexture.cpp index 798f5801d..30b70c52c 100644 --- a/renderdoc/driver/gl/gl_rendertexture.cpp +++ b/renderdoc/driver/gl/gl_rendertexture.cpp @@ -623,9 +623,14 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, TexDisplayFlags flags) ubo->TextureResolutionPS.z = float(RDCMAX(1, tex_z >> cfg.subresource.mip)); if(mipShift) - ubo->MipShift = float(1 << cfg.subresource.mip); + { + ubo->MipShift.x = float(tex_x) / float(RDCMAX(1, tex_x >> cfg.subresource.mip)); + ubo->MipShift.y = float(tex_y) / float(RDCMAX(1, tex_y >> cfg.subresource.mip)); + } else - ubo->MipShift = 1.0f; + { + ubo->MipShift.x = ubo->MipShift.y = 1.0f; + } ubo->OutputRes.x = DebugData.outWidth; ubo->OutputRes.y = DebugData.outHeight; diff --git a/renderdoc/driver/vulkan/vk_rendertexture.cpp b/renderdoc/driver/vulkan/vk_rendertexture.cpp index b861a67c0..d499ca481 100644 --- a/renderdoc/driver/vulkan/vk_rendertexture.cpp +++ b/renderdoc/driver/vulkan/vk_rendertexture.cpp @@ -246,8 +246,6 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, const ImageState &i if(!data) return false; - data->Padding = 0; - float x = cfg.xOffset; float y = cfg.yOffset; @@ -332,9 +330,14 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, const ImageState &i data->TextureResolutionPS.z = float(RDCMAX(1, tex_z >> cfg.subresource.mip)); if(mipShift) - data->MipShift = float(1 << cfg.subresource.mip); + { + data->MipShift.x = float(tex_x) / float(RDCMAX(1, tex_x >> cfg.subresource.mip)); + data->MipShift.y = float(tex_y) / float(RDCMAX(1, tex_y >> cfg.subresource.mip)); + } else - data->MipShift = 1.0f; + { + data->MipShift.x = data->MipShift.y = 1.0f; + } data->Scale = cfg.scale;