mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-05 09:30:44 +00:00
Support pixel history over a specific mip/array slice only
This commit is contained in:
@@ -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<DebugMessage> *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<PixelModification> *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<PixelModification> *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);
|
||||
|
||||
@@ -129,7 +129,7 @@ class ImageViewer : public IReplayDriver
|
||||
void InitCallstackResolver() {}
|
||||
Callstack::StackResolver *GetCallstackResolver() { return NULL; }
|
||||
void FreeTargetResource(ResourceId id) {}
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx)
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx)
|
||||
{ return vector<PixelModification>(); }
|
||||
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; }
|
||||
|
||||
@@ -1143,7 +1143,7 @@ bool ProxySerialiser::Tick()
|
||||
RenderOverlay(ResourceId(), eTexOverlay_None, 0, 0, vector<uint32_t>());
|
||||
break;
|
||||
case eCommand_PixelHistory:
|
||||
PixelHistory(0, vector<EventUsage>(), ResourceId(), 0, 0, 0);
|
||||
PixelHistory(0, vector<EventUsage>(), 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<PixelModification> ProxySerialiser::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx)
|
||||
vector<PixelModification> ProxySerialiser::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx)
|
||||
{
|
||||
vector<PixelModification> ret;
|
||||
|
||||
@@ -1891,11 +1891,13 @@ vector<PixelModification> 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
|
||||
{
|
||||
|
||||
@@ -339,7 +339,7 @@ class ProxySerialiser : public IReplayDriver, Callstack::StackResolver
|
||||
|
||||
void FreeTargetResource(ResourceId id);
|
||||
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx);
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> 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]);
|
||||
|
||||
@@ -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)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<PixelModification> D3D11DebugManager::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx)
|
||||
vector<PixelModification> D3D11DebugManager::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx)
|
||||
{
|
||||
vector<PixelModification> history;
|
||||
|
||||
@@ -3636,8 +3638,8 @@ vector<PixelModification> 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<PixelModification> 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<PixelModification> 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<PixelModification> 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);
|
||||
|
||||
@@ -166,7 +166,7 @@ class D3D11DebugManager
|
||||
|
||||
void RenderHighlightBox(float w, float h, float scale);
|
||||
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx);
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> 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]);
|
||||
|
||||
@@ -1354,9 +1354,9 @@ void D3D11Replay::FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vec
|
||||
return;
|
||||
}
|
||||
|
||||
vector<PixelModification> D3D11Replay::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx)
|
||||
vector<PixelModification> D3D11Replay::PixelHistory(uint32_t frameID, vector<EventUsage> 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)
|
||||
|
||||
@@ -116,7 +116,7 @@ class D3D11Replay : public IReplayDriver
|
||||
|
||||
void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector<ShaderVariable> &outvars, const vector<byte> &data);
|
||||
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx);
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> 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]);
|
||||
|
||||
@@ -2781,7 +2781,7 @@ void GLReplay::SetContextFilter(ResourceId id, uint32_t firstDefEv, uint32_t las
|
||||
|
||||
|
||||
|
||||
vector<PixelModification> GLReplay::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx)
|
||||
vector<PixelModification> GLReplay::PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx)
|
||||
{
|
||||
GLNOTIMP("GLReplay::PixelHistory");
|
||||
return vector<PixelModification>();
|
||||
|
||||
@@ -160,7 +160,7 @@ class GLReplay : public IReplayDriver
|
||||
|
||||
void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector<ShaderVariable> &outvars, const vector<byte> &data);
|
||||
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx);
|
||||
vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> 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]);
|
||||
|
||||
@@ -97,7 +97,7 @@ class IRemoteDriver
|
||||
|
||||
virtual void FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector<ShaderVariable> &outvars, const vector<byte> &data) = 0;
|
||||
|
||||
virtual vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx) = 0;
|
||||
virtual vector<PixelModification> PixelHistory(uint32_t frameID, vector<EventUsage> 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;
|
||||
|
||||
@@ -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<PixelModification> *history)
|
||||
bool ReplayRenderer::PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, rdctype::array<PixelModification> *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<DebugMessage> *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<PixelModification> *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<PixelModification> *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)
|
||||
|
||||
@@ -164,7 +164,7 @@ struct ReplayRenderer
|
||||
ShaderReflection *GetShaderDetails(ResourceId shader);
|
||||
bool GetDebugMessages(rdctype::array<DebugMessage> *msgs);
|
||||
|
||||
bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array<PixelModification> *history);
|
||||
bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, rdctype::array<PixelModification> *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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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(() =>
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user