diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index 0f1d9b8de..d5f09c085 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -2819,6 +2819,12 @@ byte *D3D11DebugManager::GetTextureData(ResourceId id, uint32_t arrayIdx, uint32 m_pImmediateContext->CopyResource(UNWRAP(WrappedID3D11Texture3D, d), wrapTex->GetReal()); } } + else + { + RDCERR("Trying to get texture data for unknown ID %llu!", id); + dataSize = 0; + return new byte[0]; + } MapIntercept intercept; diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index 33a2f59d0..c21b370f8 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -2078,7 +2078,10 @@ void D3D11DebugManager::GetBufferData(ResourceId buff, uint64_t offset, uint64_t auto it = WrappedID3D11Buffer::m_BufferList.find(buff); if(it == WrappedID3D11Buffer::m_BufferList.end()) + { + RDCERR("Getting buffer data for unknown buffer %llu!", buff); return; + } ID3D11Buffer *buffer = it->second.m_Buffer; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 1449ba25a..7e973fb24 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -2211,6 +2211,13 @@ byte *GLReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, GLsizei arraysize = 1; GLint samples = texDetails.samples; + if(texType == eGL_NONE) + { + RDCERR("Trying to get texture data for unknown ID %llu!", tex); + dataSize = 0; + return new byte[0]; + } + if(texType == eGL_TEXTURE_BUFFER) { GLuint bufName = 0; diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 94ddb52f9..8785b773b 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -2170,6 +2170,12 @@ void VulkanDebugManager::GetBufferData(ResourceId buff, uint64_t offset, uint64_ VkBuffer srcBuf = m_pDriver->GetResourceManager()->GetCurrentHandle(buff); + if(srcBuf == VK_NULL_HANDLE) + { + RDCERR("Getting buffer data for unknown buffer %llu!", buff); + return; + } + if(len == 0) { len = m_pDriver->m_CreationInfo.m_Buffer[buff].size - offset; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 5edc8f94f..61eabc625 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -4346,6 +4346,13 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m { bool wasms = false; + if(m_pDriver->m_CreationInfo.m_Image.find(tex) == m_pDriver->m_CreationInfo.m_Image.end()) + { + RDCERR("Trying to get texture data for unknown ID %llu!", tex); + dataSize = 0; + return new byte[0]; + } + VulkanCreationInfo::Image &imInfo = m_pDriver->m_CreationInfo.m_Image[tex]; ImageLayouts &layouts = m_pDriver->m_ImageLayouts[tex]; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 461b9515c..7ef1ed758 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -453,8 +453,16 @@ bool ReplayRenderer::GetBufferData(ResourceId buff, uint64_t offset, uint64_t le if(data == NULL) return false; + ResourceId liveId = m_pDevice->GetLiveID(buff); + + if(liveId == ResourceId()) + { + RDCERR("Couldn't get Live ID for %llu getting buffer data", buff); + return false; + } + vector retData; - m_pDevice->GetBufferData(m_pDevice->GetLiveID(buff), offset, len, retData); + m_pDevice->GetBufferData(liveId, offset, len, retData); create_array_init(*data, retData.size(), !retData.empty() ? &retData[0] : NULL); @@ -467,9 +475,16 @@ bool ReplayRenderer::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t if(data == NULL) return false; + ResourceId liveId = m_pDevice->GetLiveID(tex); + + if(liveId == ResourceId()) + { + RDCERR("Couldn't get Live ID for %llu getting texture data", tex); + return false; + } + size_t sz; - byte *bytes = m_pDevice->GetTextureData(m_pDevice->GetLiveID(tex), arrayIdx, mip, false, false, - 0.0f, 0.0f, sz); + byte *bytes = m_pDevice->GetTextureData(liveId, arrayIdx, mip, false, false, 0.0f, 0.0f, sz); create_array_init(*data, sz, bytes); diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index d3eef148c..ac567e1b8 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -811,7 +811,7 @@ namespace renderdoc bool success = ReplayRenderer_GetBufferData(m_Real, buff, offset, len, mem); - byte[] ret = null; + byte[] ret = new byte[] { }; if (success) ret = (byte[])CustomMarshal.GetTemplatedArray(mem, typeof(byte), true); @@ -827,7 +827,7 @@ namespace renderdoc bool success = ReplayRenderer_GetTextureData(m_Real, tex, arrayIdx, mip, mem); - byte[] ret = null; + byte[] ret = new byte[] { }; if (success) ret = (byte[])CustomMarshal.GetTemplatedArray(mem, typeof(byte), true);