Skip to content

Commit 149dbea

Browse files
skarolewicsbaldurk
authored andcommitted
Add helper function to fetch constant buffer data for D3D12 debugging
1 parent 7bf16a8 commit 149dbea

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

renderdoc/driver/d3d12/d3d12_shaderdebug.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,91 @@ void D3D12DebugManager::CreateShaderGlobalState(ShaderDebug::GlobalState &global
324324
global.PopulateGroupshared(dxbc->GetDXBCByteCode());
325325
}
326326

327+
void GatherConstantBuffers(WrappedID3D12Device *pDevice, DXBC::ShaderType shaderType,
328+
const D3D12RenderState::RootSignature &rootsig,
329+
bytebuf cbufData[D3D12_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT])
330+
{
331+
WrappedID3D12RootSignature *pD3D12RootSig =
332+
pDevice->GetResourceManager()->GetCurrentAs<WrappedID3D12RootSignature>(rootsig.rootsig);
333+
334+
size_t numParams = RDCMIN(pD3D12RootSig->sig.Parameters.size(), rootsig.sigelems.size());
335+
for(size_t i = 0; i < numParams; i++)
336+
{
337+
const D3D12RootSignatureParameter &rootSigParam = pD3D12RootSig->sig.Parameters[i];
338+
const D3D12RenderState::SignatureElement &element = rootsig.sigelems[i];
339+
if(IsShaderParameterVisible(shaderType, rootSigParam.ShaderVisibility))
340+
{
341+
if(rootSigParam.ParameterType == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS &&
342+
element.type == eRootConst)
343+
{
344+
UINT cbufIndex = rootSigParam.Constants.ShaderRegister;
345+
UINT sizeBytes = sizeof(uint32_t) * RDCMIN(rootSigParam.Constants.Num32BitValues,
346+
(UINT)element.constants.size());
347+
cbufData[cbufIndex].assign((const byte *)element.constants.data(), sizeBytes);
348+
}
349+
else if(rootSigParam.ParameterType == D3D12_ROOT_PARAMETER_TYPE_CBV && element.type == eRootCBV)
350+
{
351+
UINT cbufIndex = rootSigParam.Descriptor.ShaderRegister;
352+
ID3D12Resource *cbv = pDevice->GetResourceManager()->GetCurrentAs<ID3D12Resource>(element.id);
353+
pDevice->GetDebugManager()->GetBufferData(cbv, element.offset, 0, cbufData[cbufIndex]);
354+
}
355+
else if(rootSigParam.ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE &&
356+
element.type == eRootTable)
357+
{
358+
UINT prevTableOffset = 0;
359+
WrappedID3D12DescriptorHeap *heap =
360+
pDevice->GetResourceManager()->GetCurrentAs<WrappedID3D12DescriptorHeap>(element.id);
361+
362+
size_t numRanges = rootSigParam.ranges.size();
363+
for(size_t r = 0; r < numRanges; r++)
364+
{
365+
// For this traversal we only care about CBV descriptor ranges
366+
const D3D12_DESCRIPTOR_RANGE1 &range = rootSigParam.ranges[r];
367+
if(range.RangeType != D3D12_DESCRIPTOR_RANGE_TYPE_CBV)
368+
continue;
369+
370+
UINT offset = range.OffsetInDescriptorsFromTableStart;
371+
if(range.OffsetInDescriptorsFromTableStart == D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
372+
offset = prevTableOffset;
373+
374+
D3D12Descriptor *desc = (D3D12Descriptor *)heap->GetCPUDescriptorHandleForHeapStart().ptr;
375+
desc += element.offset;
376+
desc += offset;
377+
378+
UINT numDescriptors = range.NumDescriptors;
379+
if(numDescriptors == UINT_MAX)
380+
{
381+
// Find out how many descriptors are left after
382+
numDescriptors = heap->GetNumDescriptors() - offset - (UINT)element.offset;
383+
384+
// TODO: Look up the bind point in the D3D12 state to try to get
385+
// a better guess at the number of descriptors
386+
}
387+
388+
prevTableOffset = offset + numDescriptors;
389+
390+
UINT cbufIndex = range.BaseShaderRegister;
391+
392+
for(UINT n = 0; n < numDescriptors; ++n, ++cbufIndex)
393+
{
394+
if(desc)
395+
{
396+
const D3D12_CONSTANT_BUFFER_VIEW_DESC &cbv = desc->GetCBV();
397+
ResourceId resId;
398+
uint64_t byteOffset = 0;
399+
WrappedID3D12Resource1::GetResIDFromAddr(cbv.BufferLocation, resId, byteOffset);
400+
ID3D12Resource *pCbvResource =
401+
pDevice->GetResourceManager()->GetCurrentAs<ID3D12Resource>(resId);
402+
pDevice->GetDebugManager()->GetBufferData(pCbvResource, element.offset, 0,
403+
cbufData[cbufIndex]);
404+
}
405+
}
406+
}
407+
}
408+
}
409+
}
410+
}
411+
327412
ShaderDebugTrace D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid,
328413
uint32_t idx, uint32_t instOffset, uint32_t vertOffset)
329414
{

0 commit comments

Comments
 (0)