diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index 24356118b..3e8ebb195 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -3905,7 +3905,13 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect curNumInst = D3D11_SHADER_MAX_INTERFACES; curNumScissors = curNumViews = 16; - bool uavOutput = (events[ev].usage == eUsage_CS_UAV || events[ev].usage == eUsage_PS_UAV); + bool uavOutput = (events[ev].usage == eUsage_PS_UAV || + events[ev].usage == eUsage_CS_UAV || + events[ev].usage == eUsage_CopyDst || + events[ev].usage == eUsage_Copy || + events[ev].usage == eUsage_Resolve || + events[ev].usage == eUsage_ResolveDst || + events[ev].usage == eUsage_GenMips); m_pImmediateContext->RSGetState(&curRS); m_pImmediateContext->OMGetBlendState(&curBS, blendFactor, &curSample); @@ -4390,7 +4396,15 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect bool clear = (draw->flags & eDraw_Clear); - if(occlData > 0 || clear || events[i].usage == eUsage_PS_UAV || events[i].usage == eUsage_CS_UAV) + bool uavWrite = (events[i].usage == eUsage_PS_UAV || + events[i].usage == eUsage_CS_UAV || + events[i].usage == eUsage_CopyDst || + events[i].usage == eUsage_Copy || + events[i].usage == eUsage_Resolve || + events[i].usage == eUsage_ResolveDst || + events[i].usage == eUsage_GenMips); + + if(occlData > 0 || clear || uavWrite) { PixelModification mod; RDCEraseEl(mod); @@ -4399,13 +4413,11 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect mod.eventID = events[i].eventID; - mod.uavWrite = (events[i].usage == eUsage_PS_UAV || events[i].usage == eUsage_CS_UAV); + mod.uavWrite = uavWrite; mod.preMod.col.value_u[0] = (uint32_t)i; - if((draw->flags & eDraw_Clear) == 0 && - events[i].usage != eUsage_PS_UAV && - events[i].usage != eUsage_CS_UAV) + if((draw->flags & eDraw_Clear) == 0 && !uavWrite) { if(flags[i] & TestMustFail_DepthTesting) mod.depthTestFailed = true; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 1968bd72a..aec998ea1 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -1152,6 +1152,8 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uin case eUsage_GS_SRV: case eUsage_PS_SRV: case eUsage_CS_SRV: + case eUsage_CopySrc: + case eUsage_ResolveSrc: // read-only, not a valid pixel history event continue; @@ -1162,6 +1164,11 @@ bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uin case eUsage_OM_RTV: case eUsage_OM_DSV: case eUsage_Clear: + case eUsage_Copy: + case eUsage_CopyDst: + case eUsage_Resolve: + case eUsage_ResolveDst: + case eUsage_GenMips: // writing - include in pixel history events break; } diff --git a/renderdocui/Windows/PixelHistoryView.cs b/renderdocui/Windows/PixelHistoryView.cs index acd13240a..fbf569d91 100644 --- a/renderdocui/Windows/PixelHistoryView.cs +++ b/renderdocui/Windows/PixelHistoryView.cs @@ -262,7 +262,7 @@ namespace renderdocui.Windows if (mod.uavWrite) { - string name = "Potential UAV write"; + string name = "Potential UAV/Copy write"; string preModVal = "Tex Before\n\n" + ModificationValueString(mod.preMod, texture.format, depth); string postModVal = "Tex After\n\n" + ModificationValueString(mod.postMod, texture.format, depth); @@ -352,7 +352,7 @@ namespace renderdocui.Windows if (mods[0].uavWrite) { - name += String.Format("EID {0}\n{1}\nBound as UAV - potential modification", mods[0].eventID, drawcall.name); + name += String.Format("EID {0}\n{1}\nBound as UAV or copy - potential modification", mods[0].eventID, drawcall.name); if (mods[0].preMod.col.value.u[0] == mods[0].postMod.col.value.u[0] && mods[0].preMod.col.value.u[1] == mods[0].postMod.col.value.u[1] &&