From 9bc648cf3b7c61079b65b6aabeac5f158bd974f9 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 4 Dec 2024 16:49:02 +0000 Subject: [PATCH] Fix fetching DRED contexts * Though these are broken as they are not properly processing BeginEvent strings which are not packed/encoded --- renderdoc/driver/d3d12/d3d12_device.cpp | 8 ++++-- renderdoc/driver/d3d12/d3d12_device.h | 35 ++++++++++++++----------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index c3deeea88..590481089 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -3748,8 +3748,12 @@ void WrappedID3D12Device::DumpDRED(D3D12_AUTO_BREADCRUMB_NODE *node, if(ctx && numContexts > 0 && ctx->BreadcrumbIndex == i) { RDCLOG(" [%u]: %s -- %ls", i, ToStr(node->pCommandHistory[i]).c_str(), ctx->pContextString); - ctx++; - numContexts--; + // sometimes get duplicates? + while(ctx->BreadcrumbIndex == i) + { + ctx++; + numContexts--; + } } else { diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 1169c0644..77de1437e 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -549,6 +549,26 @@ class WrappedID3D12CommandQueue; template \ bool CONCAT(Serialise_, func(SerialiserType &ser, __VA_ARGS__)); +template +inline void GetDREDContexts(const DRED_NODE *node, D3D12_DRED_BREADCRUMB_CONTEXT **contexts, + UINT &numContexts); + +template <> +inline void GetDREDContexts(const D3D12_AUTO_BREADCRUMB_NODE *node, + D3D12_DRED_BREADCRUMB_CONTEXT **contexts, UINT &numContexts) +{ + *contexts = NULL; + numContexts = 0; +} + +template <> +inline void GetDREDContexts(const D3D12_AUTO_BREADCRUMB_NODE1 *node, + D3D12_DRED_BREADCRUMB_CONTEXT **contexts, UINT &numContexts) +{ + *contexts = node->pBreadcrumbContexts; + numContexts = node->BreadcrumbContextsCount; +} + class WrappedID3D12Device : public IFrameCapturer, public ID3DDevice, public ID3D12Device14 { private: @@ -805,21 +825,6 @@ private: void DumpDREDPageFault(const D3D12_DRED_PAGE_FAULT_OUTPUT &DredPageFaultOutput); - template - void GetDREDContexts(DRED_NODE *node, D3D12_DRED_BREADCRUMB_CONTEXT **contexts, UINT &numContexts) - { - *contexts = NULL; - numContexts = 0; - } - - template <> - void GetDREDContexts(D3D12_AUTO_BREADCRUMB_NODE1 *node, D3D12_DRED_BREADCRUMB_CONTEXT **contexts, - UINT &numContexts) - { - *contexts = node->pBreadcrumbContexts; - numContexts = node->BreadcrumbContextsCount; - } - template void DumpDRED(DRED_NODE *head) {