diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index fa6a9bc3c..ba87a4357 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -173,6 +173,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetMinMax(ReplayRend extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetHistogram(ReplayRenderer *rend, ResourceId tex, uint32_t sliceFace, uint32_t mip, uint32_t sample, float minval, float maxval, bool32 channels[4], rdctype::array *histogram); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetBufferData(ReplayRenderer *rend, ResourceId buff, uint32_t offset, uint32_t len, rdctype::array *data); +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetTextureData(ReplayRenderer *rend, ResourceId tex, uint32_t arrayIdx, uint32_t mip, rdctype::array *data); #ifdef RENDERDOC_EXPORTS struct RemoteAccess; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 69723b8ee..1968bd72a 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -439,6 +439,21 @@ bool ReplayRenderer::GetBufferData(ResourceId buff, uint32_t offset, uint32_t le return true; } +bool ReplayRenderer::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, rdctype::array *data) +{ + if(data == NULL) return false; + + size_t sz; + byte *bytes = m_pDevice->GetTextureData(m_pDevice->GetLiveID(tex), arrayIdx, mip, false, false, 0.0f, 0.0f, sz); + + create_array_uninit(*data, sz); + memcpy(data->elems, bytes, sz); + + delete[] bytes; + + return true; +} + bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const char *path) { TextureSave sd = saveData; // mutable copy @@ -1576,3 +1591,6 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetHistogram(ReplayR extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetBufferData(ReplayRenderer *rend, ResourceId buff, uint32_t offset, uint32_t len, rdctype::array *data) { return rend->GetBufferData(buff, offset, len, data); } + +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetTextureData(ReplayRenderer *rend, ResourceId tex, uint32_t arrayIdx, uint32_t mip, rdctype::array *data) +{ return rend->GetTextureData(tex, arrayIdx, mip, data); } diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index 1cb7a45cd..2f3341529 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -177,6 +177,7 @@ struct ReplayRenderer bool GetUsage(ResourceId id, rdctype::array *usage); bool GetBufferData(ResourceId buff, uint32_t offset, uint32_t len, rdctype::array *data); + bool GetTextureData(ResourceId buff, uint32_t arrayIdx, uint32_t mip, rdctype::array *data); bool SaveTexture(const TextureSave &saveData, const char *path); diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index 4f681d17e..2acb760af 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -255,6 +255,8 @@ namespace renderdoc [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_GetBufferData(IntPtr real, ResourceId buff, UInt32 offset, UInt32 len, IntPtr outdata); + [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] + private static extern bool ReplayRenderer_GetTextureData(IntPtr real, ResourceId tex, UInt32 arrayIdx, UInt32 mip, IntPtr outdata); private IntPtr m_Real = IntPtr.Zero; @@ -791,6 +793,22 @@ namespace renderdoc return ret; } + + public byte[] GetTextureData(ResourceId tex, UInt32 arrayIdx, UInt32 mip) + { + IntPtr mem = CustomMarshal.Alloc(typeof(templated_array)); + + bool success = ReplayRenderer_GetTextureData(m_Real, tex, arrayIdx, mip, mem); + + byte[] ret = null; + + if (success) + ret = (byte[])CustomMarshal.GetTemplatedArray(mem, typeof(byte), true); + + CustomMarshal.Free(mem); + + return ret; + } }; public class RemoteRenderer