From 7277d5d76eae51cb7002082a67b4851154d352c8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 6 Jul 2015 17:18:19 +0200 Subject: [PATCH] Support pixel history over a specific mip/array slice only --- renderdoc/api/replay/renderdoc_replay.h | 2 +- renderdoc/core/image_viewer.cpp | 2 +- renderdoc/core/replay_proxy.cpp | 8 +- renderdoc/core/replay_proxy.h | 2 +- renderdoc/data/hlsl/debugdisplay.hlsl | 25 ++-- renderdoc/driver/d3d11/d3d11_analyse.cpp | 175 ++++++++++++++++++++++- renderdoc/driver/d3d11/d3d11_debug.h | 2 +- renderdoc/driver/d3d11/d3d11_replay.cpp | 4 +- renderdoc/driver/d3d11/d3d11_replay.h | 2 +- renderdoc/driver/gl/gl_replay.cpp | 2 +- renderdoc/driver/gl/gl_replay.h | 2 +- renderdoc/replay/replay_driver.h | 2 +- renderdoc/replay/replay_renderer.cpp | 11 +- renderdoc/replay/replay_renderer.h | 2 +- renderdocui/Interop/ReplayRenderer.cs | 6 +- renderdocui/Windows/TextureViewer.cs | 7 +- 16 files changed, 211 insertions(+), 43 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 3d15233b8..6fed6e234 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -156,7 +156,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetResolve(ReplayRen extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShaderDetails(ReplayRenderer *rend, ResourceId shader); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetDebugMessages(ReplayRenderer *rend, rdctype::array *msgs); -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history); +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, rdctype::array *history); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_DebugVertex(ReplayRenderer *rend, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_DebugPixel(ReplayRenderer *rend, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_DebugThread(ReplayRenderer *rend, uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace); diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index cd7b69b10..5e5dd1bf1 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -129,7 +129,7 @@ class ImageViewer : public IReplayDriver void InitCallstackResolver() {} Callstack::StackResolver *GetCallstackResolver() { return NULL; } void FreeTargetResource(ResourceId id) {} - vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx) { return vector(); } ShaderDebugTrace DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset) { ShaderDebugTrace ret; RDCEraseEl(ret); return ret; } diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index bf62e3849..e8a6690db 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -1143,7 +1143,7 @@ bool ProxySerialiser::Tick() RenderOverlay(ResourceId(), eTexOverlay_None, 0, 0, vector()); break; case eCommand_PixelHistory: - PixelHistory(0, vector(), ResourceId(), 0, 0, 0); + PixelHistory(0, vector(), ResourceId(), 0, 0, 0, 0, 0); break; case eCommand_DebugVertex: DebugVertex(0, 0, 0, 0, 0, 0, 0); @@ -1882,7 +1882,7 @@ void ProxySerialiser::RemoveReplacement(ResourceId id) } } -vector ProxySerialiser::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) +vector ProxySerialiser::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx) { vector ret; @@ -1891,11 +1891,13 @@ vector ProxySerialiser::PixelHistory(uint32_t frameID, vector m_ToReplaySerialiser->Serialise("", target); m_ToReplaySerialiser->Serialise("", x); m_ToReplaySerialiser->Serialise("", y); + m_ToReplaySerialiser->Serialise("", slice); + m_ToReplaySerialiser->Serialise("", mip); m_ToReplaySerialiser->Serialise("", sampleIdx); if(m_ReplayHost) { - ret = m_Remote->PixelHistory(frameID, events, target, x, y, sampleIdx); + ret = m_Remote->PixelHistory(frameID, events, target, x, y, slice, mip, sampleIdx); } else { diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 5a5c01f25..7d9fbc16c 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -339,7 +339,7 @@ class ProxySerialiser : public IReplayDriver, Callstack::StackResolver void FreeTargetResource(ResourceId id); - vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx); ShaderDebugTrace DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset); ShaderDebugTrace DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace DebugThread(uint32_t frameID, uint32_t eventID, uint32_t groupid[3], uint32_t threadid[3]); diff --git a/renderdoc/data/hlsl/debugdisplay.hlsl b/renderdoc/data/hlsl/debugdisplay.hlsl index 3f35116df..c47e24372 100644 --- a/renderdoc/data/hlsl/debugdisplay.hlsl +++ b/renderdoc/data/hlsl/debugdisplay.hlsl @@ -415,13 +415,12 @@ float4 RENDERDOC_QOResolvePS(float4 vpos : SV_POSITION) : SV_Target0 cbuffer cb0 : register(b0) { - uint3 src_coord; + uint4 src_coord; // x, y, mip/sample, slice + bool multisampled; - bool is_float; bool is_uint; bool is_int; - uint padding; }; cbuffer cb1 : register(b1) @@ -464,9 +463,9 @@ void RENDERDOC_PixelHistoryCopyPixel() { if(copy_depth || copy_stencil) { - float2 val = float2(copyin_depth_ms.sample[src_coord.z][uint3(src_coord.xy, 0)].r, -1.0f); + float2 val = float2(copyin_depth_ms.sample[src_coord.z][uint3(src_coord.xy, src_coord.w)].r, -1.0f); - if(copy_stencil) val.g = (float)copyin_stencil_ms.sample[src_coord.z][uint3(src_coord.xy, 0)].g; + if(copy_stencil) val.g = (float)copyin_stencil_ms.sample[src_coord.z][uint3(src_coord.xy, src_coord.w)].g; copyout_depth[dst_coord.xy].rg = val; } @@ -474,15 +473,15 @@ void RENDERDOC_PixelHistoryCopyPixel() { if(is_float) { - copyout_float[dst_coord.xy] = copyin_float_ms.sample[src_coord.z][uint3(src_coord.xy, 0)]; + copyout_float[dst_coord.xy] = copyin_float_ms.sample[src_coord.z][uint3(src_coord.xy, src_coord.w)]; } else if(is_uint) { - copyout_uint[dst_coord.xy] = copyin_uint_ms.sample[src_coord.z][uint3(src_coord.xy, 0)]; + copyout_uint[dst_coord.xy] = copyin_uint_ms.sample[src_coord.z][uint3(src_coord.xy, src_coord.w)]; } else if(is_int) { - copyout_int[dst_coord.xy] = copyin_int_ms.sample[src_coord.z][uint3(src_coord.xy, 0)]; + copyout_int[dst_coord.xy] = copyin_int_ms.sample[src_coord.z][uint3(src_coord.xy, src_coord.w)]; } } } @@ -490,9 +489,9 @@ void RENDERDOC_PixelHistoryCopyPixel() { if(copy_depth || copy_stencil) { - float2 val = float2(copyin_depth[uint3(src_coord.xy, 0)].r, -1.0f); + float2 val = float2(copyin_depth.mips[src_coord.z][uint3(src_coord.xy, src_coord.w)].r, -1.0f); - if(copy_stencil) val.g = (float)copyin_stencil[uint3(src_coord.xy, 0)].g; + if(copy_stencil) val.g = (float)copyin_stencil.mips[src_coord.z][uint3(src_coord.xy, src_coord.w)].g; copyout_depth[dst_coord.xy].rg = val; } @@ -500,15 +499,15 @@ void RENDERDOC_PixelHistoryCopyPixel() { if(is_float) { - copyout_float[dst_coord.xy] = copyin_float[uint3(src_coord.xy, 0)]; + copyout_float[dst_coord.xy] = copyin_float.mips[src_coord.z][uint3(src_coord.xy, src_coord.w)]; } else if(is_uint) { - copyout_uint[dst_coord.xy] = copyin_uint[uint3(src_coord.xy, 0)]; + copyout_uint[dst_coord.xy] = copyin_uint.mips[src_coord.z][uint3(src_coord.xy, src_coord.w)]; } else if(is_int) { - copyout_int[dst_coord.xy] = copyin_int[uint3(src_coord.xy, 0)]; + copyout_int[dst_coord.xy] = copyin_int.mips[src_coord.z][uint3(src_coord.xy, src_coord.w)]; } } } diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index 8f349ad11..e7852e2a6 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -3305,6 +3305,8 @@ struct CopyPixelParams bool uintTex; bool intTex; + UINT subres; + bool depthcopy; // are we copying depth or colour bool depthbound; // if copying depth, was any depth bound (or should we write <-1,-1> marker) @@ -3324,7 +3326,7 @@ void D3D11DebugManager::PixelHistoryCopyPixel(CopyPixelParams &p, uint32_t x, ui { // perform a subresource copy if the real source tex couldn't be directly bound as SRV if(p.sourceTex != p.srvTex && p.sourceTex && p.srvTex) - m_pImmediateContext->CopySubresourceRegion(p.srvTex, 0, 0, 0, 0, p.sourceTex, 0, NULL); + m_pImmediateContext->CopySubresourceRegion(p.srvTex, p.subres, 0, 0, 0, p.sourceTex, p.subres, NULL); ID3D11RenderTargetView* tmpViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = {0}; m_pImmediateContext->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, tmpViews, NULL); @@ -3428,7 +3430,7 @@ void D3D11DebugManager::PixelHistoryCopyPixel(CopyPixelParams &p, uint32_t x, ui for(size_t i=0; i < ARRAY_COUNT(curCSUAV); i++) SAFE_RELEASE(curCSUAV[i]); } -vector D3D11DebugManager::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) +vector D3D11DebugManager::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx) { vector history; @@ -3636,8 +3638,8 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect D3D11_TEXTURE2D_DESC depthCopyD24S8Desc = { details.texWidth, details.texHeight, - 1U, - 1U, + details.texMips, + details.texArraySize, DXGI_FORMAT_R24G8_TYPELESS, { details.sampleCount, details.sampleQuality }, D3D11_USAGE_DEFAULT, @@ -3679,13 +3681,12 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect } uint32_t srcxyData[8] = { - x, y, sampleIdx, + x, y, multisampled ? sampleIdx : mip, slice, + uint32_t(multisampled), - uint32_t(floatTex), uint32_t(uintTex), uint32_t(intTex), - 0, }; ID3D11Buffer *srcxyCBuf = MakeCBuffer(sizeof(srcxyData)); @@ -3729,6 +3730,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect colourCopyParams.intTex = intTex; colourCopyParams.srcxyCBuf = srcxyCBuf; colourCopyParams.storexyCBuf = storexyCBuf; + colourCopyParams.subres = details.texArraySize * slice + mip; CopyPixelParams depthCopyParams = colourCopyParams; @@ -4442,6 +4444,165 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); + { + ID3D11RenderTargetView* tmpViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = {0}; + m_pImmediateContext->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, tmpViews, NULL); + + uint32_t UAVStartSlot = 0; + for(int v=0; v < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; v++) + { + if(tmpViews[v] != NULL) + { + UAVStartSlot = v+1; + SAFE_RELEASE(tmpViews[v]); + } + } + + ID3D11RenderTargetView* curRTVs[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = {0}; + ID3D11UnorderedAccessView* curUAVs[D3D11_1_UAV_SLOT_COUNT] = {0}; + ID3D11DepthStencilView *curDSV = NULL; + const UINT numUAVs = m_WrappedContext->GetReal1() ? D3D11_1_UAV_SLOT_COUNT : D3D11_PS_CS_UAV_REGISTER_COUNT; + m_pImmediateContext->OMGetRenderTargetsAndUnorderedAccessViews(UAVStartSlot, curRTVs, &curDSV, + UAVStartSlot, numUAVs-UAVStartSlot, curUAVs); + + // check that this selected mip/slice is the one being rendered to here + if(events[i].usage == eUsage_ColourTarget) + { + bool used = false; + for(int i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) + { + if(curRTVs[i]) + { + ID3D11Resource *res = NULL; + curRTVs[i]->GetResource(&res); + + if(res != targetres) + continue; + + SAFE_RELEASE(res); + + D3D11_RENDER_TARGET_VIEW_DESC desc; + curRTVs[i]->GetDesc(&desc); + if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE1D && + desc.Texture1D.MipSlice == mip) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE1DARRAY && + desc.Texture1DArray.MipSlice == mip && + desc.Texture1DArray.FirstArraySlice <= slice && + desc.Texture1DArray.FirstArraySlice+desc.Texture1DArray.ArraySize > slice) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2D && + desc.Texture2D.MipSlice == mip) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DARRAY && + desc.Texture2DArray.MipSlice == mip && + desc.Texture2DArray.FirstArraySlice <= slice && + desc.Texture2DArray.FirstArraySlice+desc.Texture2DArray.ArraySize > slice) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DMS) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY && + desc.Texture2DMSArray.FirstArraySlice <= slice && + desc.Texture2DMSArray.FirstArraySlice+desc.Texture2DMSArray.ArraySize > slice) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE3D && + desc.Texture3D.MipSlice == mip && + desc.Texture3D.FirstWSlice <= slice && + desc.Texture3D.FirstWSlice+desc.Texture3D.WSize > slice) + { + used = true; + break; + } + } + } + if(!used) continue; + } + else if(events[i].usage == eUsage_DepthStencilTarget) + { + if(!curDSV) continue; + + ID3D11Resource *res = NULL; + curDSV->GetResource(&res); + + if(res != targetres) + continue; + + SAFE_RELEASE(res); + + D3D11_DEPTH_STENCIL_VIEW_DESC desc; + curDSV->GetDesc(&desc); + + bool used = false; + + if(desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE1D && + desc.Texture1D.MipSlice == mip) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE1DARRAY && + desc.Texture1DArray.MipSlice == mip && + desc.Texture1DArray.FirstArraySlice <= slice && + desc.Texture1DArray.FirstArraySlice+desc.Texture1DArray.ArraySize > slice) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2D && + desc.Texture2D.MipSlice == mip) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2DARRAY && + desc.Texture2DArray.MipSlice == mip && + desc.Texture2DArray.FirstArraySlice <= slice && + desc.Texture2DArray.FirstArraySlice+desc.Texture2DArray.ArraySize > slice) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2DMS) + { + used = true; + break; + } + else if(desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY && + desc.Texture2DMSArray.FirstArraySlice <= slice && + desc.Texture2DMSArray.FirstArraySlice+desc.Texture2DMSArray.ArraySize > slice) + { + used = true; + break; + } + + if(!used) continue; + } + + for(int i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) + SAFE_RELEASE(curRTVs[i]); + for(int i=0; i < D3D11_1_UAV_SLOT_COUNT; i++) + SAFE_RELEASE(curUAVs[i]); + SAFE_RELEASE(curDSV); + } + curNumScissors = curNumViews = 16; m_pImmediateContext->RSGetViewports(&curNumViews, curViewports); m_pImmediateContext->RSGetScissorRects(&curNumScissors, curScissors); diff --git a/renderdoc/driver/d3d11/d3d11_debug.h b/renderdoc/driver/d3d11/d3d11_debug.h index 024d9e800..699b6547e 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.h +++ b/renderdoc/driver/d3d11/d3d11_debug.h @@ -166,7 +166,7 @@ class D3D11DebugManager void RenderHighlightBox(float w, float h, float scale); - vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx); ShaderDebugTrace DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset); ShaderDebugTrace DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace DebugThread(uint32_t frameID, uint32_t eventID, uint32_t groupid[3], uint32_t threadid[3]); diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index ec4d7f7a9..d8a10cff0 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1354,9 +1354,9 @@ void D3D11Replay::FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vec return; } -vector D3D11Replay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) +vector D3D11Replay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx) { - return m_pDevice->GetDebugManager()->PixelHistory(frameID, events, target, x, y, sampleIdx); + return m_pDevice->GetDebugManager()->PixelHistory(frameID, events, target, x, y, slice, mip, sampleIdx); } ShaderDebugTrace D3D11Replay::DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset) diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index f329b3725..710d85628 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -116,7 +116,7 @@ class D3D11Replay : public IReplayDriver void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector &outvars, const vector &data); - vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx); ShaderDebugTrace DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset); ShaderDebugTrace DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace DebugThread(uint32_t frameID, uint32_t eventID, uint32_t groupid[3], uint32_t threadid[3]); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index ad91a183f..6a052cbc0 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -2781,7 +2781,7 @@ void GLReplay::SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t las -vector GLReplay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) +vector GLReplay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx) { GLNOTIMP("GLReplay::PixelHistory"); return vector(); diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 950bfa9e6..1f51beb70 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -160,7 +160,7 @@ class GLReplay : public IReplayDriver void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector &outvars, const vector &data); - vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx); ShaderDebugTrace DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset); ShaderDebugTrace DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace DebugThread(uint32_t frameID, uint32_t eventID, uint32_t groupid[3], uint32_t threadid[3]); diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 733061682..b3de342c3 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -97,7 +97,7 @@ class IRemoteDriver virtual void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector &outvars, const vector &data) = 0; - virtual vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) = 0; + virtual vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx) = 0; virtual ShaderDebugTrace DebugVertex(uint32_t frameID, uint32_t eventID, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset) = 0; virtual ShaderDebugTrace DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) = 0; virtual ShaderDebugTrace DebugThread(uint32_t frameID, uint32_t eventID, uint32_t groupid[3], uint32_t threadid[3]) = 0; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index cf7e37538..56309a180 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -1104,7 +1104,7 @@ bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const char *path) return success; } -bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history) +bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, rdctype::array *history) { bool outofbounds = false; @@ -1123,6 +1123,9 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uin if(m_Textures[t].msSamp == 1) sampleIdx = ~0U; + slice = RDCCLAMP(slice, 0U, m_Textures[t].arraysize); + mip = RDCCLAMP(mip, 0U, m_Textures[t].mips); + break; } } @@ -1188,7 +1191,7 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uin return false; } - *history = m_pDevice->PixelHistory(m_FrameID, events, m_pDevice->GetLiveID(target), x, y, sampleIdx); + *history = m_pDevice->PixelHistory(m_FrameID, events, m_pDevice->GetLiveID(target), x, y, slice, mip, sampleIdx); SetFrameEvent(m_FrameID, m_EventID, true); @@ -1571,8 +1574,8 @@ extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShader extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetDebugMessages(ReplayRenderer *rend, rdctype::array *msgs) { return rend->GetDebugMessages(msgs); } -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history) -{ return rend->PixelHistory(target, x, y, sampleIdx, history); } +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, rdctype::array *history) +{ return rend->PixelHistory(target, x, y, slice, mip, sampleIdx, history); } extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_DebugVertex(ReplayRenderer *rend, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace) { return rend->DebugVertex(vertid, instid, idx, instOffset, vertOffset, trace); } extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_DebugPixel(ReplayRenderer *rend, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace) diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index 2f3341529..c89718ef1 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -164,7 +164,7 @@ struct ReplayRenderer ShaderReflection *GetShaderDetails(ResourceId shader); bool GetDebugMessages(rdctype::array *msgs); - bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history); + bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, rdctype::array *history); bool DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace); bool DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace); bool DebugThread(uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace); diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index 2acb760af..c19d85196 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -228,7 +228,7 @@ namespace renderdoc private static extern bool ReplayRenderer_GetDebugMessages(IntPtr real, IntPtr outmsgs); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern bool ReplayRenderer_PixelHistory(IntPtr real, ResourceId target, UInt32 x, UInt32 y, UInt32 sampleIdx, IntPtr history); + private static extern bool ReplayRenderer_PixelHistory(IntPtr real, ResourceId target, UInt32 x, UInt32 y, UInt32 slice, UInt32 mip, UInt32 sampleIdx, IntPtr history); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_DebugVertex(IntPtr real, UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset, IntPtr outtrace); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] @@ -610,11 +610,11 @@ namespace renderdoc return ret; } - public PixelModification[] PixelHistory(ResourceId target, UInt32 x, UInt32 y, UInt32 sampleIdx) + public PixelModification[] PixelHistory(ResourceId target, UInt32 x, UInt32 y, UInt32 slice, UInt32 mip, UInt32 sampleIdx) { IntPtr mem = CustomMarshal.Alloc(typeof(templated_array)); - bool success = ReplayRenderer_PixelHistory(m_Real, target, x, y, sampleIdx, mem); + bool success = ReplayRenderer_PixelHistory(m_Real, target, x, y, slice, mip, sampleIdx, mem); PixelModification[] ret = null; diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index 771b7a000..cd3165865 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -2967,7 +2967,10 @@ namespace renderdocui.Windows { PixelModification[] history = null; - PixelHistoryView hist = new PixelHistoryView(m_Core, CurrentTexture, m_PickedPoint, m_TexDisplay.sampleIdx, + int x = m_PickedPoint.X >> (int)m_TexDisplay.mip; + int y = m_PickedPoint.Y >> (int)m_TexDisplay.mip; + + PixelHistoryView hist = new PixelHistoryView(m_Core, CurrentTexture, new Point(x, y), m_TexDisplay.sampleIdx, m_TexDisplay.rangemin, m_TexDisplay.rangemax, new bool[] { m_TexDisplay.Red, m_TexDisplay.Green, m_TexDisplay.Blue, m_TexDisplay.Alpha }); @@ -2981,7 +2984,7 @@ namespace renderdocui.Windows Thread.Sleep(100); m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { - history = r.PixelHistory(CurrentTexture.ID, (UInt32)m_PickedPoint.X, (UInt32)m_PickedPoint.Y, m_TexDisplay.sampleIdx); + history = r.PixelHistory(CurrentTexture.ID, (UInt32)x, (UInt32)y, m_TexDisplay.sliceFace, m_TexDisplay.mip, m_TexDisplay.sampleIdx); this.BeginInvoke(new Action(() => {