From 499e3b7c9fe735ac9df794d6642856c8dcf0722e Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 26 Sep 2014 21:58:04 +0100 Subject: [PATCH] pass through sample index to pixel history --- renderdoc/api/replay/renderdoc_replay.h | 2 +- renderdoc/core/image_viewer.cpp | 3 ++- renderdoc/core/replay_proxy.cpp | 7 ++++--- renderdoc/core/replay_proxy.h | 2 +- renderdoc/driver/d3d11/d3d11_analyse.cpp | 24 ++++++++++++++---------- 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/PixelHistoryView.cs | 6 ++++-- renderdocui/Windows/TextureViewer.cs | 4 ++-- 16 files changed, 46 insertions(+), 35 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index abde8616b..a66c844e5 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -152,7 +152,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetBuffers(ReplayRen extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetResolve(ReplayRenderer *rend, uint64_t *callstack, uint32_t callstackLen, rdctype::array *trace); extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShaderDetails(ReplayRenderer *rend, ResourceId shader); -extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, rdctype::array *history); +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_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 860b9e34a..628d3554a 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -123,7 +123,8 @@ 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) { return vector(); } + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, 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; } ShaderDebugTrace DebugPixel(uint32_t frameID, uint32_t eventID, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 1ed20a438..b5ed41525 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -824,7 +824,7 @@ bool ProxySerialiser::Tick() RenderOverlay(ResourceId(), eTexOverlay_None, 0, 0, vector()); break; case eCommand_PixelHistory: - PixelHistory(0, vector(), ResourceId(), 0, 0); + PixelHistory(0, vector(), ResourceId(), 0, 0, 0); break; case eCommand_DebugVertex: DebugVertex(0, 0, 0, 0, 0, 0, 0); @@ -1522,7 +1522,7 @@ void ProxySerialiser::RemoveReplacement(ResourceId id) } } -vector ProxySerialiser::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y) +vector ProxySerialiser::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) { vector ret; @@ -1531,10 +1531,11 @@ vector ProxySerialiser::PixelHistory(uint32_t frameID, vector m_ToReplaySerialiser->Serialise("", target); m_ToReplaySerialiser->Serialise("", x); m_ToReplaySerialiser->Serialise("", y); + m_ToReplaySerialiser->Serialise("", sampleIdx); if(m_ReplayHost) { - ret = m_Remote->PixelHistory(frameID, events, target, x, y); + ret = m_Remote->PixelHistory(frameID, events, target, x, y, sampleIdx); } else { diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index b7c842e25..6626a909d 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -299,7 +299,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); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, 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_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index 782fd9d10..f2f3ff132 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -3239,7 +3239,7 @@ void D3D11DebugManager::PixelHistoryDepthCopySubresource(bool depthbound, ID3D11 SAFE_RELEASE(curCSUAV); } -vector D3D11DebugManager::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y) +vector D3D11DebugManager::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) { vector history; @@ -3253,6 +3253,10 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect SCOPED_TIMER("D3D11DebugManager::PixelHistory"); + uint32_t sampleMask = ~0U; + if(sampleIdx < 32) + sampleMask = 1U << sampleIdx; + // needed for comparison with viewports float xf = (float)x; float yf = (float)y; @@ -3645,7 +3649,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.NopDepthState, stencilRef); for(UINT i=0; i < curNumViews; i++) @@ -3815,7 +3819,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_pDevice->CreateRasterizerState(&rdsc, &newRS); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassIncrDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); @@ -4014,7 +4018,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4041,7 +4045,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4068,7 +4072,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4120,7 +4124,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumScissors, intersectScissors); @@ -4160,7 +4164,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(newDS, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4192,7 +4196,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i].eventID, eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, sampleMask); m_pImmediateContext->OMSetDepthStencilState(newDS, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4626,7 +4630,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect { m_pImmediateContext->OMGetBlendState(&curBS, blendFactor, &curSample); - m_pImmediateContext->OMSetBlendState(NULL, blendFactor, ~0U); + m_pImmediateContext->OMSetBlendState(NULL, blendFactor, sampleMask); // fetch shader output value { diff --git a/renderdoc/driver/d3d11/d3d11_debug.h b/renderdoc/driver/d3d11/d3d11_debug.h index b0ea09281..aaba79a07 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.h +++ b/renderdoc/driver/d3d11/d3d11_debug.h @@ -150,7 +150,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); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, 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 8544e0081..7161ee56e 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -1299,9 +1299,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) +vector D3D11Replay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) { - return m_pDevice->GetDebugManager()->PixelHistory(frameID, events, target, x, y); + return m_pDevice->GetDebugManager()->PixelHistory(frameID, events, target, x, y, 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 03d5f7032..bdc29aec3 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -109,7 +109,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); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, 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 e20b3e7df..abcb41d38 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1420,7 +1420,7 @@ void GLReplay::BuildCustomShader(string source, string entry, const uint32_t com RDCUNIMPLEMENTED("BuildCustomShader"); } -vector GLReplay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y) +vector GLReplay::PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) { RDCUNIMPLEMENTED("GLReplay::PixelHistory"); return vector(); diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 2f8027562..ad246daad 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -109,7 +109,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); + vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, 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 c966de6cf..42f78cacb 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -93,7 +93,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) = 0; + virtual vector PixelHistory(uint32_t frameID, vector events, ResourceId target, uint32_t x, uint32_t y, 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 d3abaebcc..96220d4dc 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -1016,7 +1016,7 @@ bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const wchar_t *pat return success; } -bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, rdctype::array *history) +bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history) { bool outofbounds = false; @@ -1032,6 +1032,9 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, rdc return false; } + if(m_Textures[t].msSamp == 1) + sampleIdx = ~0U; + break; } } @@ -1086,7 +1089,7 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, rdc return false; } - *history = m_pDevice->PixelHistory(m_FrameID, events, m_pDevice->GetLiveID(target), x, y); + *history = m_pDevice->PixelHistory(m_FrameID, events, m_pDevice->GetLiveID(target), x, y, sampleIdx); SetFrameEvent(m_FrameID, m_EventID, true); @@ -1461,8 +1464,8 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetResolve(ReplayRen extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShaderDetails(ReplayRenderer *rend, ResourceId shader) { return rend->GetShaderDetails(shader); } -extern "C" RENDERDOC_API bool32 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 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_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 ec5818fb5..383579396 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -160,7 +160,7 @@ struct ReplayRenderer bool GetResolve(uint64_t *callstack, uint32_t callstackLen, rdctype::array *trace); ShaderReflection *GetShaderDetails(ResourceId shader); - bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, rdctype::array *history); + bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, 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 d4cd68cdf..e9260c269 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -211,7 +211,7 @@ namespace renderdoc private static extern IntPtr ReplayRenderer_GetShaderDetails(IntPtr real, ResourceId shader); [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); + private static extern bool ReplayRenderer_PixelHistory(IntPtr real, ResourceId target, UInt32 x, UInt32 y, 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)] @@ -490,11 +490,11 @@ namespace renderdoc return ret; } - public PixelModification[] PixelHistory(ResourceId target, UInt32 x, UInt32 y) + public PixelModification[] PixelHistory(ResourceId target, UInt32 x, UInt32 y, UInt32 sampleIdx) { IntPtr mem = CustomMarshal.Alloc(typeof(templated_array)); - bool success = ReplayRenderer_PixelHistory(m_Real, target, x, y, mem); + bool success = ReplayRenderer_PixelHistory(m_Real, target, x, y, sampleIdx, mem); PixelModification[] ret = null; diff --git a/renderdocui/Windows/PixelHistoryView.cs b/renderdocui/Windows/PixelHistoryView.cs index 30f985189..4f1fdcc32 100644 --- a/renderdocui/Windows/PixelHistoryView.cs +++ b/renderdocui/Windows/PixelHistoryView.cs @@ -60,7 +60,7 @@ namespace renderdocui.Windows float rangeMin, rangeMax; int numChannels, channelIdx; - public PixelHistoryView(Core core, FetchTexture tex, Point pt, + public PixelHistoryView(Core core, FetchTexture tex, Point pt, UInt32 sampleIdx, float rangemin, float rangemax, bool[] channels) { InitializeComponent(); @@ -74,9 +74,11 @@ namespace renderdocui.Windows rangeMin = rangemin; rangeMax = rangemax; visibleChannels = channels; - sample = 0; + sample = sampleIdx; Text = String.Format("Pixel History on {0} for ({1}, {2})", tex.name, pt.X, pt.Y); + if(tex.msSamp > 1) + Text += String.Format(" @ Sample {0}", sample); string channelStr = ""; numChannels = 0; diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index f87a710d5..a475e6dde 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -2646,7 +2646,7 @@ namespace renderdocui.Windows { PixelModification[] history = null; - PixelHistoryView hist = new PixelHistoryView(m_Core, CurrentTexture, m_PickedPoint, + PixelHistoryView hist = new PixelHistoryView(m_Core, CurrentTexture, m_PickedPoint, m_TexDisplay.sampleIdx, m_TexDisplay.rangemin, m_TexDisplay.rangemax, new bool[] { m_TexDisplay.Red, m_TexDisplay.Green, m_TexDisplay.Blue, m_TexDisplay.Alpha }); @@ -2660,7 +2660,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); + history = r.PixelHistory(CurrentTexture.ID, (UInt32)m_PickedPoint.X, (UInt32)m_PickedPoint.Y, m_TexDisplay.sampleIdx); this.BeginInvoke(new Action(() => {