@@ -324,6 +324,91 @@ void D3D12DebugManager::CreateShaderGlobalState(ShaderDebug::GlobalState &global
324
324
global.PopulateGroupshared (dxbc->GetDXBCByteCode ());
325
325
}
326
326
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
+
327
412
ShaderDebugTrace D3D12Replay::DebugVertex (uint32_t eventId, uint32_t vertid, uint32_t instid,
328
413
uint32_t idx, uint32_t instOffset, uint32_t vertOffset)
329
414
{
0 commit comments