Support pixel history over a specific mip/array slice only

This commit is contained in:
baldurk
2015-07-06 17:18:19 +02:00
parent 6bb8ebee32
commit 7277d5d76e
16 changed files with 211 additions and 43 deletions
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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; }
+5 -3
View File
@@ -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
{
+1 -1
View File
@@ -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]);
+12 -13
View File
@@ -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)];
}
}
}
+168 -7
View File
@@ -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);
+1 -1
View File
@@ -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]);
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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]);
+1 -1
View File
@@ -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>();
+1 -1
View File
@@ -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]);
+1 -1
View File
@@ -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;
+7 -4
View File
@@ -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)
+1 -1
View File
@@ -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);
+3 -3
View File
@@ -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;
+5 -2
View File
@@ -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(() =>
{