From 43e07b8a1823a84fa6b863989cdd46ce3e0d97be Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 13 May 2020 21:52:43 +0100 Subject: [PATCH] Limit typecast on remap texture format to base type. Closes #1882 * Casting to e.g. unorm causes problems if we're remapping to RGBA16 because not all devices will support rendering to RGBA16_UNORM --- renderdoc/core/replay_proxy.cpp | 5 ++++- renderdoc/core/replay_proxy.h | 2 +- renderdoc/driver/d3d11/d3d11_replay.cpp | 24 +++++++++++++++--------- renderdoc/driver/d3d12/d3d12_replay.cpp | 8 +++++--- renderdoc/driver/gl/gl_replay.cpp | 3 +-- renderdoc/driver/gl/gl_resources.cpp | 3 +++ renderdoc/driver/vulkan/vk_replay.cpp | 3 +-- renderdoc/replay/replay_driver.cpp | 14 ++++++++++++++ renderdoc/replay/replay_driver.h | 2 ++ 9 files changed, 46 insertions(+), 18 deletions(-) diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 027cabb5e..5611a6365 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -2293,7 +2293,7 @@ void ReplayProxy::RemapProxyTextureIfNeeded(TextureDescription &tex, GetTextureD } } -void ReplayProxy::EnsureTexCached(ResourceId &texid, CompType typeCast, const Subresource &sub) +void ReplayProxy::EnsureTexCached(ResourceId &texid, CompType &typeCast, const Subresource &sub) { if(m_Reader.IsErrored() || m_Writer.IsErrored()) return; @@ -2365,6 +2365,9 @@ void ReplayProxy::EnsureTexCached(ResourceId &texid, CompType typeCast, const Su m_TextureProxyCache.insert(entry); } + if(proxyit->second.params.remap != RemapTexture::NoRemap) + typeCast = BaseRemapType(typeCast); + // change texid to the proxy texture's ID for passing to our proxy renderer texid = proxyit->second.id; } diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 5a8e34413..04f7a10df 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -576,7 +576,7 @@ public: } private: - void EnsureTexCached(ResourceId &texid, CompType typeCast, const Subresource &sub); + void EnsureTexCached(ResourceId &texid, CompType &typeCast, const Subresource &sub); void RemapProxyTextureIfNeeded(TextureDescription &tex, GetTextureDataParams ¶ms); void EnsureBufCached(ResourceId bufid); IMPLEMENT_FUNCTION_PROXIED(bool, NeedRemapForFetch, const ResourceFormat &format); diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 940a64f22..d6519f50f 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1980,17 +1980,19 @@ void D3D11Replay::GetTextureData(ResourceId tex, const Subresource &sub, { if(params.remap == RemapTexture::RGBA8) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, params.typeCast); + desc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, BaseRemapType(params.typeCast)); if(IsSRGBFormat(desc.Format) && params.typeCast == CompType::Typeless) desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; } else if(params.remap == RemapTexture::RGBA16) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, params.typeCast); + desc.Format = + GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, BaseRemapType(params.typeCast)); } else if(params.remap == RemapTexture::RGBA32) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, params.typeCast); + desc.Format = + GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, BaseRemapType(params.typeCast)); } desc.ArraySize = 1; @@ -2139,18 +2141,20 @@ void D3D11Replay::GetTextureData(ResourceId tex, const Subresource &sub, { if(params.remap == RemapTexture::RGBA8) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, params.typeCast); + desc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, BaseRemapType(params.typeCast)); if((IsSRGBFormat(desc.Format) || wrapTex->m_RealDescriptor) && params.typeCast == CompType::Typeless) desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; } else if(params.remap == RemapTexture::RGBA16) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, params.typeCast); + desc.Format = + GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, BaseRemapType(params.typeCast)); } else if(params.remap == RemapTexture::RGBA32) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, params.typeCast); + desc.Format = + GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, BaseRemapType(params.typeCast)); } desc.ArraySize = 1; @@ -2315,17 +2319,19 @@ void D3D11Replay::GetTextureData(ResourceId tex, const Subresource &sub, { if(params.remap == RemapTexture::RGBA8) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, params.typeCast); + desc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, BaseRemapType(params.typeCast)); if(IsSRGBFormat(desc.Format) && params.typeCast == CompType::Typeless) desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; } else if(params.remap == RemapTexture::RGBA16) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, params.typeCast); + desc.Format = + GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, BaseRemapType(params.typeCast)); } else if(params.remap == RemapTexture::RGBA32) { - desc.Format = GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, params.typeCast); + desc.Format = + GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, BaseRemapType(params.typeCast)); } } diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 01ae62bab..8a791636b 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -3073,17 +3073,19 @@ void D3D12Replay::GetTextureData(ResourceId tex, const Subresource &sub, { if(params.remap == RemapTexture::RGBA8) { - copyDesc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, params.typeCast); + copyDesc.Format = GetTypedFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS, BaseRemapType(params.typeCast)); if(IsSRGBFormat(copyDesc.Format) && params.typeCast == CompType::Typeless) copyDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; } else if(params.remap == RemapTexture::RGBA16) { - copyDesc.Format = GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, params.typeCast); + copyDesc.Format = + GetTypedFormat(DXGI_FORMAT_R16G16B16A16_TYPELESS, BaseRemapType(params.typeCast)); } else if(params.remap == RemapTexture::RGBA32) { - copyDesc.Format = GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, params.typeCast); + copyDesc.Format = + GetTypedFormat(DXGI_FORMAT_R32G32B32A32_TYPELESS, BaseRemapType(params.typeCast)); } // force to 1 mip diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index bc3d29bca..ed1ab32a2 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -2311,8 +2311,7 @@ void GLReplay::GetTextureData(ResourceId tex, const Subresource &sub, else if(params.remap == RemapTexture::RGBA32) remapFormat = eGL_RGBA32F; - if(params.typeCast != CompType::Typeless) - remapFormat = GetViewCastedFormat(remapFormat, params.typeCast); + remapFormat = GetViewCastedFormat(remapFormat, BaseRemapType(params.typeCast)); if(intFormat != remapFormat) { diff --git a/renderdoc/driver/gl/gl_resources.cpp b/renderdoc/driver/gl/gl_resources.cpp index d5ea60c9f..d042e6c47 100644 --- a/renderdoc/driver/gl/gl_resources.cpp +++ b/renderdoc/driver/gl/gl_resources.cpp @@ -1455,6 +1455,9 @@ bool IsSRGBFormat(GLenum internalFormat) GLenum GetViewCastedFormat(GLenum internalFormat, CompType typeCast) { + if(typeCast == CompType::Typeless) + return internalFormat; + switch(internalFormat) { case eGL_RGBA: diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 953123119..c1313be71 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -2929,8 +2929,7 @@ void VulkanReplay::GetTextureData(ResourceId tex, const Subresource &sub, RDCERR("Unsupported remap format: %u", params.remap); } - if(params.typeCast != CompType::Typeless) - imCreateInfo.format = GetViewCastedFormat(imCreateInfo.format, params.typeCast); + imCreateInfo.format = GetViewCastedFormat(imCreateInfo.format, BaseRemapType(params.typeCast)); if(IsUIntFormat(imCreateInfo.format)) renderFlags |= eTexDisplay_RemapUInt; diff --git a/renderdoc/replay/replay_driver.cpp b/renderdoc/replay/replay_driver.cpp index bbf401ff0..ff2bc4043 100644 --- a/renderdoc/replay/replay_driver.cpp +++ b/renderdoc/replay/replay_driver.cpp @@ -58,6 +58,20 @@ static bool PreviousNextExcludedMarker(DrawcallDescription *draw) DrawFlags::APICalls)); } +CompType BaseRemapType(CompType typeCast) +{ + switch(typeCast) + { + case CompType::Float: + case CompType::UNorm: + case CompType::SNorm: + case CompType::UNormSRGB: return CompType::Float; + case CompType::UInt: return CompType::UInt; + case CompType::SInt: return CompType::SInt; + default: return typeCast; + } +} + static DrawcallDescription *SetupDrawcallPointers(rdcarray &drawcallTable, rdcarray &draws, DrawcallDescription *parent, diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 3435cbe20..8c08e1c76 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -93,6 +93,8 @@ struct GetTextureDataParams DECLARE_REFLECTION_STRUCT(GetTextureDataParams); +CompType BaseRemapType(CompType typeCast); + class RDCFile; class AMDRGPControl;