From 8608e7bc970f3bd63ca1dcbe6a6676b22e6e3903 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 27 Jun 2024 12:52:03 +0100 Subject: [PATCH] Fix matrix byte size in DXIL MakeCBufferVariableType Account for cbuffer D3D matrix row/column alignment (16 bytes) --- renderdoc/driver/shaders/dxil/dxil_reflect.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp index 520432749..fbe6c64c3 100644 --- a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp @@ -1191,8 +1191,14 @@ static DXBC::CBufferVariableType MakeCBufferVariableType(const TypeInfo &typeInf var.type.name += "x"; var.type.name += ToStr(var.type.cols); - var.type.bytesize = - VarTypeByteSize(var.type.varType) * var.type.rows * var.type.cols * var.type.elements; + // D3D matrices in cbuffers always take up a float4 per row/column. + uint32_t matrixByteStride = AlignUp16(VarTypeByteSize(var.type.varType)); + if(var.type.varClass == CLASS_MATRIX_ROWS) + matrixByteStride *= var.type.rows; + else + matrixByteStride *= var.type.cols; + + var.type.bytesize = matrixByteStride * var.type.elements; } else {