From a5c3ee4b7051c7a5aacbe73851962516bd2eae68 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 25 Sep 2025 15:35:12 +0100 Subject: [PATCH] Tweak to DXIL debugger cbuffer handling Initialise the ShaderVariable for the handle to 0xCC Only memory copy the bytes available (do not assume the source buffer is a multiple of 16 bytes in size) Fixes non-determinism problem (exposed by root constant buffer of size four bytes) --- renderdoc/driver/shaders/dxil/dxil_debug.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.cpp b/renderdoc/driver/shaders/dxil/dxil_debug.cpp index b9cf6c1f2..26da702c9 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debug.cpp @@ -2715,6 +2715,8 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper, var.columns = 4; var.name = StringFormat::Fmt("%s[%u]", result.name.c_str(), i); var.rows = 1; + // Initialise to 0xCC to aid determinism and show unset values + memset(&var.value, 0XCC, sizeof(var.value)); } // Memory copy from the cbuffer data into the cbuffer variable @@ -2729,7 +2731,8 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper, for(size_t i = 0; i < cbufferVar.members.size(); ++i) { ShaderVariable &var = cbufferVar.members[i]; - memcpy(var.value.u32v.data(), data + offset, 16); + size_t countBytes = RDCMIN((size_t)16, cbufferData.size() - offset); + memcpy(var.value.u32v.data(), data + offset, countBytes); offset += 16; if(offset >= cbufferData.size()) break;