From faf93fa2ac017f9f6cf19433f966ea66919a3132 Mon Sep 17 00:00:00 2001 From: Janos Pantos Date: Thu, 19 Oct 2017 19:32:35 +0200 Subject: [PATCH] Fix reading back compressed texture data during remote replay --- renderdoc/driver/gl/gl_driver.h | 2 ++ renderdoc/driver/gl/gl_manager.cpp | 29 ++++++++++++++--------------- renderdoc/driver/gl/gl_replay.cpp | 21 +++------------------ 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index bf4751483..f95510422 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -287,6 +287,8 @@ private: // uploading // level -> data map > compressedData; + + void GetCompressedImageDataGLES(int mip, GLenum target, size_t size, byte *buf); }; map m_Textures; diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index 9eaf82287..fa1c16c23 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -660,20 +660,19 @@ void GLResourceManager::CreateTextureImage(GLuint tex, GLenum internalFormat, GL } } -static void GetCompressedImageDataGLES(const vector &data, GLenum target, size_t size, byte *buf) +void WrappedOpenGL::TextureData::GetCompressedImageDataGLES(int mip, GLenum target, size_t size, + byte *buf) { - const bool isCubeFace = IsCubeFace(target); - size_t startOffs = isCubeFace ? CubeTargetIndex(target) * size : 0; - if(data.size() >= startOffs + size) + const vector &data = compressedData[mip]; + + memset(buf, 0, size); + + size_t startOffs = IsCubeFace(target) ? CubeTargetIndex(target) * size : 0; + if(data.size() >= startOffs) { - memcpy(buf, data.data() + startOffs, size); - } - else - { - // we don't warn for cube maps because some cube faces can be missing - if(!isCubeFace) - RDCERR("Different expected and stored compressed texture sizes!"); - memset(buf, 0, size); + size_t byteSize = RDCMIN(data.size() - startOffs, size); + if(byteSize > 0) + memcpy(buf, data.data() + startOffs, byteSize); } } @@ -887,7 +886,7 @@ void GLResourceManager::PrepareTextureInitialContents(ResourceId liveid, Resourc if(IsGLES) { - GetCompressedImageDataGLES(details.compressedData[i], targets[trg], size, buf); + details.GetCompressedImageDataGLES(i, targets[trg], size, buf); } else { @@ -1270,7 +1269,7 @@ bool GLResourceManager::Serialise_InitialState(ResourceId resid, GLResource res) if(IsGLES) { - GetCompressedImageDataGLES(details.compressedData[i], targets[trg], size, buf); + details.GetCompressedImageDataGLES(i, targets[trg], size, buf); } else { @@ -1860,7 +1859,7 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i if(IsGLES) { - GetCompressedImageDataGLES(details.compressedData[i], targets[trg], size, buf); + details.GetCompressedImageDataGLES(i, targets[trg], size, buf); } else { diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 9d2eeaa31..5f8679a43 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -2580,17 +2580,10 @@ byte *GLReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, { m_GetTexturePrevData[mip] = new byte[dataSize * arraysize]; if(IsGLES) - { - const vector &data = texDetails.compressedData[mip]; - if(data.size() == dataSize * arraysize) - memcpy(m_GetTexturePrevData[mip], data.data(), data.size()); - else - RDCERR("Different expected and stored compressed texture sizes for array texture!"); - } + texDetails.GetCompressedImageDataGLES(mip, target, dataSize * arraysize, + m_GetTexturePrevData[mip]); else - { gl.glGetCompressedTexImage(target, mip, m_GetTexturePrevData[mip]); - } } // now copy the slice from the cache into ret @@ -2603,17 +2596,9 @@ byte *GLReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, { // for non-arrays we can just readback without caching if(IsGLES) - { - const vector &data = texDetails.compressedData[mip]; - if(data.size() == dataSize) - memcpy(ret, data.data(), data.size()); - else - RDCERR("Different expected and stored compressed texture sizes!"); - } + texDetails.GetCompressedImageDataGLES(mip, target, dataSize, ret); else - { gl.glGetCompressedTexImage(target, mip, ret); - } } } else