From b5545d52f8091f37b62e61e2ff204586670c42eb Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 27 Dec 2022 12:23:05 +0000 Subject: [PATCH] Fix float precision/rounding issues for NPOT textures. Closes #2807 --- qrenderdoc/Windows/TextureViewer.cpp | 7 +++++-- renderdoc/replay/replay_output.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 234c05c65..921a67bf7 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -4455,7 +4455,10 @@ uint32_t TextureViewer::MipCoordFromBase(int coord, uint32_t dim) float coordf = float(coord) / float(dim); - return uint32_t(mipDim * coordf); + // we add 1e-6 to account for float errors, where we might not get back coord after rounding down + // in the coordf calculation even when mipDim == dim. This will not affect the rounding for any + // realistic texture sizes - even for a dim of 16383 and coord of 16382 + return uint32_t(mipDim * coordf + 1e-6); } uint32_t TextureViewer::BaseCoordFromMip(int coord, uint32_t dim) @@ -4467,7 +4470,7 @@ uint32_t TextureViewer::BaseCoordFromMip(int coord, uint32_t dim) float coordf = float(coord) / float(mipDim); - return uint32_t(dim * coordf); + return uint32_t(dim * coordf + 1e-6); } void TextureViewer::on_customCreate_clicked() diff --git a/renderdoc/replay/replay_output.cpp b/renderdoc/replay/replay_output.cpp index c6db6a6d6..8d6a2d464 100644 --- a/renderdoc/replay/replay_output.cpp +++ b/renderdoc/replay/replay_output.cpp @@ -729,11 +729,11 @@ void ReplayOutput::DisplayContext() rdcpair mipDim = {RDCMAX(1U, m_TextureDim.first >> disp.subresource.mip), RDCMAX(1U, m_TextureDim.second >> disp.subresource.mip)}; - x = int((float(x) / float(m_TextureDim.first)) * mipDim.first); - x = int((float(x) / float(mipDim.first)) * m_TextureDim.first); + x = int((float(x) / float(m_TextureDim.first)) * mipDim.first + 1e-6f); + x = int((float(x) / float(mipDim.first)) * m_TextureDim.first + 1e-6f); - y = int((float(y) / float(m_TextureDim.second)) * mipDim.second); - y = int((float(y) / float(mipDim.second)) * m_TextureDim.second); + y = int((float(y) / float(m_TextureDim.second)) * mipDim.second + 1e-6f); + y = int((float(y) / float(mipDim.second)) * m_TextureDim.second + 1e-6f); } else {