diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 3a9020649..8e28962ce 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -153,9 +153,9 @@ extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_GetResolve(ReplayRende extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShaderDetails(ReplayRenderer *rend, ResourceId shader); extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, rdctype::array *history); -extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_VSGetDebugStates(ReplayRenderer *rend, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace); -extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_PSGetDebugStates(ReplayRenderer *rend, uint32_t x, uint32_t y, ShaderDebugTrace *trace); -extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_CSGetDebugStates(ReplayRenderer *rend, uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace); +extern "C" RENDERDOC_API bool 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 bool RENDERDOC_CC ReplayRenderer_DebugPixel(ReplayRenderer *rend, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace); +extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_DebugThread(ReplayRenderer *rend, uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace); extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_GetUsage(ReplayRenderer *rend, ResourceId id, rdctype::array *usage); diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 6678be869..8212aa7fe 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -827,7 +827,7 @@ bool ProxySerialiser::Tick() DebugVertex(0, 0, 0, 0, 0, 0, 0); break; case eCommand_DebugPixel: - DebugPixel(0, 0, 0, 0); + DebugPixel(0, 0, 0, 0, 0, 0); break; case eCommand_DebugThread: { @@ -1571,7 +1571,7 @@ ShaderDebugTrace ProxySerialiser::DebugVertex(uint32_t frameID, uint32_t eventID return ret; } -ShaderDebugTrace ProxySerialiser::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y) +ShaderDebugTrace ProxySerialiser::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) { ShaderDebugTrace ret; @@ -1579,10 +1579,12 @@ ShaderDebugTrace ProxySerialiser::DebugPixel(uint32_t frameID, uint32_t eventID, m_ToReplaySerialiser->Serialise("", eventID); m_ToReplaySerialiser->Serialise("", x); m_ToReplaySerialiser->Serialise("", y); + m_ToReplaySerialiser->Serialise("", sample); + m_ToReplaySerialiser->Serialise("", primitive); if(m_ReplayHost) { - ret = m_Remote->DebugPixel(frameID, eventID, x, y); + ret = m_Remote->DebugPixel(frameID, eventID, x, y, sample, primitive); } else { diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 96fcd8ae2..b7c842e25 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -301,7 +301,7 @@ class ProxySerialiser : public IReplayDriver, Callstack::StackResolver vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y); 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); + 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]); void BuildTargetShader(string source, string entry, const uint32_t compileFlags, ShaderStageType type, ResourceId *id, string *errors); diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index c907ae3e4..7e8709c2d 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -1145,7 +1145,7 @@ ShaderDebugTrace D3D11DebugManager::DebugVertex(uint32_t frameID, uint32_t event return ret; } -ShaderDebugTrace D3D11DebugManager::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y) +ShaderDebugTrace D3D11DebugManager::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) { using namespace DXBC; using namespace ShaderDebug; @@ -1371,17 +1371,10 @@ ShaderDebugTrace D3D11DebugManager::DebugPixel(uint32_t frameID, uint32_t eventI } // if we encounter multiple hits at our destination pixel co-ord (or any other) we - // really need to check depth state here, but that's difficult so skip it for now - // we can iterate over the hits and get the depth of each from the second element - // in each struct, but we also need the test depth AND need to be able to resolve - // the depth test in the same way for each fragment. - // - // For now, just take the first. Later need to modify buf to point at the data of - // the actual passing fragment. - // also with alpha blending on we'd need to be able to pick the right one anyway. - // so really here we just need to be able to get the depth result of each hit and - // let the user choose, since multiple might pass & apply. - + // check to see if a specific primitive was requested (via primitive parameter not + // being set to ~0U). If it was, debug that pixel, otherwise do a best-estimate + // of which fragment was the last to successfully depth test and debug that, just by + // checking if the depth test is ordered and picking the final fragment in the series // our debugging quad. Order is TL, TR, BL, BR State quad[4]; @@ -1410,29 +1403,50 @@ ShaderDebugTrace D3D11DebugManager::DebugPixel(uint32_t frameID, uint32_t eventI DebugHit *winner = NULL; - for(size_t i=0; i < buf[0].numHits && i < overdrawLevels; i++) + if(primitive != ~0U) { - DebugHit *hit = (DebugHit *)(initialData+i*structStride); - - // only interested in destination pixel - if(hit->posx != (float)x + 0.5 || hit->posy != (float)y + 0.5) - continue; - - if(winner == NULL || depthFunc == D3D11_COMPARISON_ALWAYS || depthFunc == D3D11_COMPARISON_NEVER || - depthFunc == D3D11_COMPARISON_NOT_EQUAL || depthFunc == D3D11_COMPARISON_EQUAL) + for(size_t i=0; i < buf[0].numHits && i < overdrawLevels; i++) { - winner = hit; - continue; + DebugHit *hit = (DebugHit *)(initialData+i*structStride); + + // only interested in destination pixel + if(hit->posx != (float)x + 0.5 || hit->posy != (float)y + 0.5) + continue; + + if(hit->primitive == primitive) + { + winner = hit; + break; + } } - - if( - (depthFunc == D3D11_COMPARISON_LESS && hit->depth < winner->depth) || - (depthFunc == D3D11_COMPARISON_LESS_EQUAL && hit->depth <= winner->depth) || - (depthFunc == D3D11_COMPARISON_GREATER && hit->depth > winner->depth) || - (depthFunc == D3D11_COMPARISON_GREATER_EQUAL && hit->depth >= winner->depth) - ) + } + + if(winner == NULL) + { + for(size_t i=0; i < buf[0].numHits && i < overdrawLevels; i++) { - winner = hit; + DebugHit *hit = (DebugHit *)(initialData+i*structStride); + + // only interested in destination pixel + if(hit->posx != (float)x + 0.5 || hit->posy != (float)y + 0.5) + continue; + + if(winner == NULL || depthFunc == D3D11_COMPARISON_ALWAYS || depthFunc == D3D11_COMPARISON_NEVER || + depthFunc == D3D11_COMPARISON_NOT_EQUAL || depthFunc == D3D11_COMPARISON_EQUAL) + { + winner = hit; + continue; + } + + if( + (depthFunc == D3D11_COMPARISON_LESS && hit->depth < winner->depth) || + (depthFunc == D3D11_COMPARISON_LESS_EQUAL && hit->depth <= winner->depth) || + (depthFunc == D3D11_COMPARISON_GREATER && hit->depth > winner->depth) || + (depthFunc == D3D11_COMPARISON_GREATER_EQUAL && hit->depth >= winner->depth) + ) + { + winner = hit; + } } } diff --git a/renderdoc/driver/d3d11/d3d11_debug.h b/renderdoc/driver/d3d11/d3d11_debug.h index 582036427..b0ea09281 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.h +++ b/renderdoc/driver/d3d11/d3d11_debug.h @@ -152,7 +152,7 @@ class D3D11DebugManager vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y); 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); + 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]); void PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_t sliceFace, uint32_t mip, uint32_t sample, float pixel[4]); diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 074bdcdf6..1ed51e19d 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1309,9 +1309,9 @@ ShaderDebugTrace D3D11Replay::DebugVertex(uint32_t frameID, uint32_t eventID, ui return m_pDevice->GetDebugManager()->DebugVertex(frameID, eventID, vertid, instid, idx, instOffset, vertOffset); } -ShaderDebugTrace D3D11Replay::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y) +ShaderDebugTrace D3D11Replay::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) { - return m_pDevice->GetDebugManager()->DebugPixel(frameID, eventID, x, y); + return m_pDevice->GetDebugManager()->DebugPixel(frameID, eventID, x, y, sample, primitive); } ShaderDebugTrace D3D11Replay::DebugThread(uint32_t frameID, uint32_t eventID, uint32_t groupid[3], uint32_t threadid[3]) diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index b36258a5b..03d5f7032 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -111,7 +111,7 @@ class D3D11Replay : public IReplayDriver vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y); 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); + 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]); void PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_t sliceFace, uint32_t mip, uint32_t sample, float pixel[4]); diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 1ba0990ed..e20b3e7df 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1432,7 +1432,7 @@ ShaderDebugTrace GLReplay::DebugVertex(uint32_t frameID, uint32_t eventID, uint3 return ShaderDebugTrace(); } -ShaderDebugTrace GLReplay::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y) +ShaderDebugTrace GLReplay::DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) { RDCUNIMPLEMENTED("DebugPixel"); return ShaderDebugTrace(); diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 08f3b0d37..2f8027562 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -111,7 +111,7 @@ class GLReplay : public IReplayDriver vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y); 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); + 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]); void PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_t sliceFace, uint32_t mip, uint32_t sample, float pixel[4]); diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 8f146a463..c966de6cf 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -95,7 +95,7 @@ class IRemoteDriver virtual vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y) = 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) = 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; virtual ResourceId RenderOverlay(ResourceId texid, TextureDisplayOverlay overlay, uint32_t frameID, uint32_t eventID, const vector &passEvents) = 0; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 4d9808846..e0811040f 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -1092,7 +1092,7 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, rdc return true; } -bool ReplayRenderer::VSGetDebugStates(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace) +bool ReplayRenderer::DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace) { if(trace == NULL) return false; @@ -1103,18 +1103,18 @@ bool ReplayRenderer::VSGetDebugStates(uint32_t vertid, uint32_t instid, uint32_t return true; } -bool ReplayRenderer::PSGetDebugStates(uint32_t x, uint32_t y, ShaderDebugTrace *trace) +bool ReplayRenderer::DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace) { if(trace == NULL) return false; - *trace = m_pDevice->DebugPixel(m_FrameID, m_EventID, x, y); + *trace = m_pDevice->DebugPixel(m_FrameID, m_EventID, x, y, sample, primitive); SetFrameEvent(m_FrameID, m_EventID, true); return true; } -bool ReplayRenderer::CSGetDebugStates(uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace) +bool ReplayRenderer::DebugThread(uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace) { if(trace == NULL) return false; @@ -1462,12 +1462,12 @@ extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShader extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, rdctype::array *history) { return rend->PixelHistory(target, x, y, history); } -extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_VSGetDebugStates(ReplayRenderer *rend, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace) -{ return rend->VSGetDebugStates(vertid, instid, idx, instOffset, vertOffset, trace); } -extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_PSGetDebugStates(ReplayRenderer *rend, uint32_t x, uint32_t y, ShaderDebugTrace *trace) -{ return rend->PSGetDebugStates(x, y, trace); } -extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_CSGetDebugStates(ReplayRenderer *rend, uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace) -{ return rend->CSGetDebugStates(groupid, threadid, trace); } +extern "C" RENDERDOC_API bool 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 bool RENDERDOC_CC ReplayRenderer_DebugPixel(ReplayRenderer *rend, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive, ShaderDebugTrace *trace) +{ return rend->DebugPixel(x, y, sample, primitive, trace); } +extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_DebugThread(ReplayRenderer *rend, uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace) +{ return rend->DebugThread(groupid, threadid, trace); } extern "C" RENDERDOC_API bool RENDERDOC_CC ReplayRenderer_GetUsage(ReplayRenderer *rend, ResourceId id, rdctype::array *usage) { return rend->GetUsage(id, usage); } diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index bc0aa79af..ec5818fb5 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -161,9 +161,9 @@ struct ReplayRenderer ShaderReflection *GetShaderDetails(ResourceId shader); bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, rdctype::array *history); - bool VSGetDebugStates(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace); - bool PSGetDebugStates(uint32_t x, uint32_t y, ShaderDebugTrace *trace); - bool CSGetDebugStates(uint32_t groupid[3], uint32_t threadid[3], ShaderDebugTrace *trace); + 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); bool GetPostVSData(MeshDataStage stage, PostVSMeshData *data); diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index 19892f85a..d4cd68cdf 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -213,11 +213,11 @@ namespace renderdoc [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_PixelHistory(IntPtr real, ResourceId target, UInt32 x, UInt32 y, IntPtr history); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern bool ReplayRenderer_VSGetDebugStates(IntPtr real, UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset, IntPtr outtrace); + 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)] - private static extern bool ReplayRenderer_PSGetDebugStates(IntPtr real, UInt32 x, UInt32 y, IntPtr outtrace); + private static extern bool ReplayRenderer_DebugPixel(IntPtr real, UInt32 x, UInt32 y, UInt32 sample, UInt32 primitive, IntPtr outtrace); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] - private static extern bool ReplayRenderer_CSGetDebugStates(IntPtr real, UInt32[] groupid, UInt32[] threadid, IntPtr outtrace); + private static extern bool ReplayRenderer_DebugThread(IntPtr real, UInt32[] groupid, UInt32[] threadid, IntPtr outtrace); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_GetUsage(IntPtr real, ResourceId id, IntPtr outusage); @@ -506,11 +506,11 @@ namespace renderdoc return ret; } - public ShaderDebugTrace VSGetDebugStates(UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset) + public ShaderDebugTrace DebugVertex(UInt32 vertid, UInt32 instid, UInt32 idx, UInt32 instOffset, UInt32 vertOffset) { IntPtr mem = CustomMarshal.Alloc(typeof(ShaderDebugTrace)); - bool success = ReplayRenderer_VSGetDebugStates(m_Real, vertid, instid, idx, instOffset, vertOffset, mem); + bool success = ReplayRenderer_DebugVertex(m_Real, vertid, instid, idx, instOffset, vertOffset, mem); ShaderDebugTrace ret = null; @@ -522,11 +522,11 @@ namespace renderdoc return ret; } - public ShaderDebugTrace PSGetDebugStates(UInt32 x, UInt32 y) + public ShaderDebugTrace DebugPixel(UInt32 x, UInt32 y, UInt32 sample, UInt32 primitive) { IntPtr mem = CustomMarshal.Alloc(typeof(ShaderDebugTrace)); - bool success = ReplayRenderer_PSGetDebugStates(m_Real, x, y, mem); + bool success = ReplayRenderer_DebugPixel(m_Real, x, y, sample, primitive, mem); ShaderDebugTrace ret = null; @@ -538,11 +538,11 @@ namespace renderdoc return ret; } - public ShaderDebugTrace CSGetDebugStates(UInt32[] groupid, UInt32[] threadid) + public ShaderDebugTrace DebugThread(UInt32[] groupid, UInt32[] threadid) { IntPtr mem = CustomMarshal.Alloc(typeof(ShaderDebugTrace)); - bool success = ReplayRenderer_CSGetDebugStates(m_Real, groupid, threadid, mem); + bool success = ReplayRenderer_DebugThread(m_Real, groupid, threadid, mem); ShaderDebugTrace ret = null; diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index ca45dedc5..9a63205d1 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -2172,7 +2172,7 @@ namespace renderdocui.Windows m_Core.Renderer.Invoke((ReplayRenderer r) => { - trace = r.VSGetDebugStates((UInt32)row, (UInt32)m_CurInst, idx, draw.instanceOffset, draw.vertexOffset); + trace = r.DebugVertex((UInt32)row, (UInt32)m_CurInst, idx, draw.instanceOffset, draw.vertexOffset); }); this.BeginInvoke(new Action(() => diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index 629111f39..7f50a8d83 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -2030,7 +2030,7 @@ namespace renderdocui.Windows.PipelineState m_Core.Renderer.Invoke((ReplayRenderer r) => { - trace = r.CSGetDebugStates(new uint[] { gx, gy, gz }, new uint[] { tx, ty, tz }); + trace = r.DebugThread(new uint[] { gx, gy, gz }, new uint[] { tx, ty, tz }); }); if (trace == null || trace.states.Length == 0) diff --git a/renderdocui/Windows/PixelHistoryView.cs b/renderdocui/Windows/PixelHistoryView.cs index 96aae77d6..30f985189 100644 --- a/renderdocui/Windows/PixelHistoryView.cs +++ b/renderdocui/Windows/PixelHistoryView.cs @@ -39,9 +39,22 @@ namespace renderdocui.Windows { public partial class PixelHistoryView : DockContent, ILogViewerForm { + struct EventTag + { + public EventTag(uint eid, uint prim) + { + EID = eid; + Primitive = prim; + } + + public uint EID; + public uint Primitive; + }; + Core m_Core; FetchTexture texture; Point pixel; + uint sample; PixelModification[] modifications; bool[] visibleChannels; float rangeMin, rangeMax; @@ -61,6 +74,7 @@ namespace renderdocui.Windows rangeMin = rangemin; rangeMax = rangemax; visibleChannels = channels; + sample = 0; Text = String.Format("Pixel History on {0} for ({1}, {2})", tex.name, pt.X, pt.Y); @@ -276,7 +290,7 @@ namespace renderdocui.Windows node = new TreelistView.Node(new object[] { name, shadOutVal, "", postModVal, "" }); } - node.Tag = mod.eventID; + node.Tag = new EventTag(mod.eventID, mod.uavWrite ? uint.MaxValue : mod.primitiveID); if (floatTex || depth) { @@ -360,7 +374,7 @@ namespace renderdocui.Windows var node = new TreelistView.Node(new object[] { name, preModVal, "", postModVal, "" }); node.DefaultBackColor = passed ? Color.FromArgb(235, 255, 235) : Color.FromArgb(255, 235, 235); - node.Tag = mods[0].eventID; + node.Tag = new EventTag(mods[0].eventID, uint.MaxValue); if (uavnowrite) node.DefaultBackColor = Color.FromArgb(235, 235, 235); @@ -427,9 +441,9 @@ namespace renderdocui.Windows private void events_NodeDoubleClicked(TreelistView.Node node) { - if (node.Tag is uint) + if (node.Tag is EventTag) { - m_Core.SetEventID(this, m_Core.CurFrame, (uint)node.Tag); + m_Core.SetEventID(this, m_Core.CurFrame, ((EventTag)node.Tag).EID); } } @@ -441,11 +455,12 @@ namespace renderdocui.Windows debugToolStripMenuItem.Text = "Debug Pixel"; - if (events.SelectedNode != null && events.SelectedNode.Tag != null && events.SelectedNode.Tag is uint) + if (events.SelectedNode != null && events.SelectedNode.Tag != null && events.SelectedNode.Tag is EventTag) { + EventTag tag = (EventTag)events.SelectedNode.Tag; debugToolStripMenuItem.Enabled = true; - debugToolStripMenuItem.Text = String.Format("Debug Pixel ({0}, {1}) at Event {2}", - pixel.X, pixel.Y, (uint)events.SelectedNode.Tag); + debugToolStripMenuItem.Text = String.Format("Debug Pixel ({0}, {1}) primitive {2} at Event {3}", + pixel.X, pixel.Y, tag.Primitive, tag.EID); } rightclickMenu.Show(events.PointToScreen(e.Location)); @@ -458,9 +473,11 @@ namespace renderdocui.Windows var node = events.SelectedNode; - if (node.Tag is uint) + if (node.Tag is EventTag) { - m_Core.SetEventID(this, m_Core.CurFrame, (uint)node.Tag); + EventTag tag = (EventTag)node.Tag; + + m_Core.SetEventID(this, m_Core.CurFrame, tag.EID); ShaderDebugTrace trace = null; @@ -468,7 +485,7 @@ namespace renderdocui.Windows m_Core.Renderer.Invoke((ReplayRenderer r) => { - trace = r.PSGetDebugStates((UInt32)pixel.X, (UInt32)pixel.Y); + trace = r.DebugPixel((UInt32)pixel.X, (UInt32)pixel.Y, sample, tag.Primitive); }); if (trace == null || trace.states.Length == 0) diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index 5ce4aee9b..a42e3583f 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -2681,7 +2681,7 @@ namespace renderdocui.Windows m_Core.Renderer.Invoke((ReplayRenderer r) => { - trace = r.PSGetDebugStates((UInt32)m_PickedPoint.X, (UInt32)m_PickedPoint.Y); + trace = r.DebugPixel((UInt32)m_PickedPoint.X, (UInt32)m_PickedPoint.Y, m_TexDisplay.sampleIdx, uint.MaxValue); }); if (trace == null || trace.states.Length == 0)