From 885e2b619c43499bdaa3e6e5572abf9e3e2e5e13 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 18 Jun 2020 13:40:56 +0100 Subject: [PATCH] Fix a few cases in struct reflection --- .../driver/shaders/dxil/dxil_reflect.cpp | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp index d6bd4ff01..d4dba8851 100644 --- a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp @@ -358,6 +358,8 @@ static DXBC::CBufferVariableType MakeCBufferVariableType(const TypeInfo &typeInf CBufferVariableType ret = {}; + ret.descriptor.elements = 1; + if(t->type == Type::Scalar || t->type == Type::Vector) { ret.descriptor.rows = ret.descriptor.cols = 1; @@ -389,14 +391,19 @@ static DXBC::CBufferVariableType MakeCBufferVariableType(const TypeInfo &typeInf else if(t->bitWidth == 1) ret.descriptor.varType = VarType::Bool; } + + ret.descriptor.name = ToStr(ret.descriptor.varType); + if(t->type == Type::Vector) + ret.descriptor.name += ToStr(ret.descriptor.cols); + return ret; } else if(t->type == Type::Array) { ret = MakeCBufferVariableType(typeInfo, t->inner); - ret.descriptor.elements = t->elemCount; + ret.descriptor.elements *= t->elemCount; // assume normal D3D array packing with each element on float4 boundary - ret.descriptor.bytesize += (t->elemCount - 1) * 16; + ret.descriptor.bytesize += (t->elemCount - 1) * AlignUp16(ret.descriptor.bytesize); return ret; } else if(t->type == Type::Struct) @@ -409,23 +416,23 @@ static DXBC::CBufferVariableType MakeCBufferVariableType(const TypeInfo &typeInf return ret; } + ret.descriptor.name = t->name; + ret.descriptor.varType = VarType::Unknown; + ret.descriptor.varClass = CLASS_STRUCT; + if(ret.descriptor.name.beginsWith("struct.")) + ret.descriptor.name.erase(0, 7); + if(ret.descriptor.name.beginsWith("class.")) + ret.descriptor.name.erase(0, 6); + // if there are no members, return straight away if(t->members.empty()) return ret; auto it = typeInfo.structData.find(t); - ret.descriptor.name = t->name; - ret.descriptor.varType = VarType::Unknown; - ret.descriptor.varClass = CLASS_STRUCT; - if(it != typeInfo.structData.end()) { ret.descriptor.bytesize = it->second.byteSize; - if(ret.descriptor.name.beginsWith("struct.")) - ret.descriptor.name.erase(0, 7); - if(ret.descriptor.name.beginsWith("class.")) - ret.descriptor.name.erase(0, 6); } else { @@ -450,6 +457,12 @@ static DXBC::CBufferVariableType MakeCBufferVariableType(const TypeInfo &typeInf var.type.descriptor.varClass = (it->second.members[i].flags & TypeInfo::MemberData::RowMajor) ? CLASS_MATRIX_ROWS : CLASS_MATRIX_COLUMNS; + + // the array was expanded out like float[4][3] would be, so divide by the matrix dimension + // to get the real array size + var.type.descriptor.elements /= (it->second.members[i].flags & TypeInfo::MemberData::RowMajor) + ? var.type.descriptor.rows + : var.type.descriptor.cols; } if(var.type.members.empty() && t->members[i]->type != Type::Struct)