From 34b1d0ecf91d7dd44894f7cd575849a9534314e6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 1 Aug 2018 16:08:51 +0100 Subject: [PATCH] Fetch all samples when caching MSAA textures for replay proxy --- renderdoc/core/replay_proxy.cpp | 24 +++++++++++++++++++----- renderdoc/core/replay_proxy.h | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 739c1d1f6..70a65e8ec 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -1797,20 +1797,34 @@ void ReplayProxy::EnsureTexCached(ResourceId texid, uint32_t arrayIdx, uint32_t RemapProxyTextureIfNeeded(tex, proxy.params); proxy.id = m_Proxy->CreateProxyTexture(tex); + proxy.msSamp = RDCMAX(1U, tex.msSamp); m_ProxyTextures[texid] = proxy; } const ProxyTextureProperties &proxy = m_ProxyTextures[texid]; + for(uint32_t sample = 0; sample < proxy.msSamp; sample++) + { + // MSAA array textures are remapped so it's: + // [slice 0 samp 0, slice 0 samp 1, slice 1 samp 0, slice 1 samp 1, ...] + // so we need to calculate the effective array index to fetch and set the data. + // For non-MSAA textures this operation does nothing (sample is 0, proxy.msSamp is 1) + uint32_t sampleArrayIdx = arrayIdx * proxy.msSamp + sample; + + TextureCacheEntry sampleArrayEntry = entry; + sampleArrayEntry.arrayIdx = sampleArrayIdx; + #if ENABLED(TRANSFER_RESOURCE_CONTENTS_DELTAS) - CacheTextureData(texid, arrayIdx, mip, proxy.params); + CacheTextureData(texid, sampleArrayIdx, mip, proxy.params); #else - GetTextureData(texid, arrayIdx, mip, proxy.params, m_ProxyTextureData[entry]); + GetTextureData(texid, sampleArrayIdx, mip, proxy.params, m_ProxyTextureData[entry]); #endif - auto it = m_ProxyTextureData.find(entry); - if(it != m_ProxyTextureData.end()) - m_Proxy->SetProxyTextureData(proxy.id, arrayIdx, mip, it->second.data(), it->second.size()); + auto it = m_ProxyTextureData.find(sampleArrayEntry); + if(it != m_ProxyTextureData.end()) + m_Proxy->SetProxyTextureData(proxy.id, sampleArrayIdx, mip, it->second.data(), + it->second.size()); + } m_TextureProxyCache.insert(entry); } diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 4b9222fd1..f1aaddaa9 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -570,6 +570,7 @@ private: struct ProxyTextureProperties { ResourceId id; + uint32_t msSamp; GetTextureDataParams params; ProxyTextureProperties() {}