mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-01 03:15:54 +00:00
Add struct VarType and combine flags into single field
* This is not a space saving right now, but allows more flags to be added without adding more storage.
This commit is contained in:
@@ -182,7 +182,7 @@ ShaderConstant BufferFormatter::ParseFormatString(const QString &formatString, u
|
||||
el.byteOffset = cur->offset;
|
||||
el.type.descriptor.pointerTypeID = structContext.pointerTypeId;
|
||||
el.type.descriptor.type = VarType::ULong;
|
||||
el.type.descriptor.displayAsHex = true;
|
||||
el.type.descriptor.flags |= ShaderVariableFlags::HexDisplay;
|
||||
el.type.descriptor.arrayByteStride = 8;
|
||||
el.type.descriptor.elements = arrayCount;
|
||||
|
||||
@@ -223,8 +223,10 @@ ShaderConstant BufferFormatter::ParseFormatString(const QString &formatString, u
|
||||
el.name = !match.captured(6).isEmpty() ? match.captured(6).trimmed() : lit("data");
|
||||
|
||||
QString basetype = match.captured(3);
|
||||
el.type.descriptor.rowMajorStorage = match.captured(1).trimmed() == lit("row_major");
|
||||
el.type.descriptor.displayAsRGB = !match.captured(2).isEmpty();
|
||||
if(match.captured(1).trimmed() == lit("row_major"))
|
||||
el.type.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
if(!match.captured(2).isEmpty())
|
||||
el.type.descriptor.flags |= ShaderVariableFlags::RGBDisplay;
|
||||
QString firstDim = !match.captured(4).isEmpty() ? match.captured(4) : lit("1");
|
||||
QString secondDim = !match.captured(5).isEmpty() ? match.captured(5).mid(1) : lit("1");
|
||||
QString arrayDim = !match.captured(7).isEmpty() ? match.captured(7).trimmed() : lit("[1]");
|
||||
@@ -267,9 +269,9 @@ ShaderConstant BufferFormatter::ParseFormatString(const QString &formatString, u
|
||||
break;
|
||||
}
|
||||
|
||||
// vectors are never marked as row major
|
||||
// vectors are marked as row-major by convention
|
||||
if(el.type.descriptor.rows == 1)
|
||||
el.type.descriptor.rowMajorStorage = false;
|
||||
el.type.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
if(basetype == lit("bool"))
|
||||
{
|
||||
@@ -370,7 +372,7 @@ ShaderConstant BufferFormatter::ParseFormatString(const QString &formatString, u
|
||||
|
||||
if(basetype == lit("xlong") || basetype == lit("xint") || basetype == lit("xshort") ||
|
||||
basetype == lit("xbyte"))
|
||||
el.type.descriptor.displayAsHex = true;
|
||||
el.type.descriptor.flags |= ShaderVariableFlags::HexDisplay;
|
||||
|
||||
SetInterpretedResourceFormat(el, interpretType, interpretCompType);
|
||||
|
||||
@@ -392,7 +394,7 @@ ShaderConstant BufferFormatter::ParseFormatString(const QString &formatString, u
|
||||
}
|
||||
|
||||
uint8_t majorDim =
|
||||
el.type.descriptor.rowMajorStorage ? el.type.descriptor.rows : el.type.descriptor.columns;
|
||||
el.type.descriptor.RowMajor() ? el.type.descriptor.rows : el.type.descriptor.columns;
|
||||
|
||||
// total matrix size is
|
||||
el.type.descriptor.arrayByteStride = el.type.descriptor.matrixByteStride * majorDim;
|
||||
@@ -453,7 +455,7 @@ ShaderConstant BufferFormatter::ParseFormatString(const QString &formatString, u
|
||||
|
||||
ShaderConstant el;
|
||||
el.byteOffset = 0;
|
||||
el.type.descriptor.displayAsHex = true;
|
||||
el.type.descriptor.flags |= ShaderVariableFlags::HexDisplay;
|
||||
el.name = "data";
|
||||
el.type.descriptor.type = VarType::UInt;
|
||||
el.type.descriptor.columns = 4;
|
||||
@@ -666,7 +668,7 @@ QString BufferFormatter::GetBufferFormatString(const ShaderResource &res,
|
||||
}
|
||||
else
|
||||
{
|
||||
if(desc.rowMajorStorage)
|
||||
if(desc.RowMajor() && desc.rows > 1 && desc.columns > 1)
|
||||
format += lit("row_major ");
|
||||
|
||||
format += ToQStr(desc.type);
|
||||
@@ -758,7 +760,7 @@ uint32_t BufferFormatter::GetVarSize(const ShaderConstant &var)
|
||||
|
||||
if(var.type.descriptor.rows > 1)
|
||||
{
|
||||
if(var.type.descriptor.rowMajorStorage)
|
||||
if(var.type.descriptor.RowMajor())
|
||||
size = var.type.descriptor.matrixByteStride * var.type.descriptor.rows;
|
||||
else
|
||||
size = var.type.descriptor.matrixByteStride * var.type.descriptor.columns;
|
||||
@@ -887,7 +889,7 @@ QString BufferFormatter::DeclareStruct(QList<QString> &declaredStructs, const QS
|
||||
|
||||
if(members[i].type.descriptor.rows > 1)
|
||||
{
|
||||
if(members[i].type.descriptor.rowMajorStorage)
|
||||
if(members[i].type.descriptor.RowMajor())
|
||||
{
|
||||
varTypeName = lit("row_major ") + varTypeName;
|
||||
|
||||
@@ -984,7 +986,7 @@ ResourceFormat GetInterpretedResourceFormat(const ShaderConstant &elem)
|
||||
|
||||
format.compByteWidth = VarTypeByteSize(elem.type.descriptor.type);
|
||||
|
||||
if(elem.type.descriptor.rowMajorStorage || elem.type.descriptor.rows == 1)
|
||||
if(elem.type.descriptor.RowMajor() || elem.type.descriptor.rows == 1)
|
||||
format.compCount = elem.type.descriptor.columns;
|
||||
else
|
||||
format.compCount = elem.type.descriptor.rows;
|
||||
@@ -1015,7 +1017,7 @@ static void FillShaderVarData(ShaderVariable &var, const ShaderConstant &elem, c
|
||||
|
||||
bool colMajor = false;
|
||||
|
||||
if(!elem.type.descriptor.rowMajorStorage && outerCount > 1)
|
||||
if(elem.type.descriptor.ColMajor() && outerCount > 1)
|
||||
{
|
||||
colMajor = true;
|
||||
std::swap(outerCount, innerCount);
|
||||
@@ -1071,6 +1073,7 @@ static void FillShaderVarData(ShaderVariable &var, const ShaderConstant &elem, c
|
||||
case VarType::ReadWriteResource:
|
||||
case VarType::Sampler:
|
||||
case VarType::Unknown:
|
||||
case VarType::Struct:
|
||||
qCritical() << "Unexpected variable type" << ToQStr(var.type) << "in variable"
|
||||
<< (QString)var.name;
|
||||
break;
|
||||
@@ -1087,10 +1090,8 @@ ShaderVariable InterpretShaderVar(const ShaderConstant &elem, const byte *data,
|
||||
ret.type = elem.type.descriptor.type;
|
||||
ret.columns = qMin(elem.type.descriptor.columns, uint8_t(4));
|
||||
ret.rows = qMin(elem.type.descriptor.rows, uint8_t(4));
|
||||
ret.isStruct = !elem.type.members.isEmpty();
|
||||
|
||||
ret.displayAsHex = elem.type.descriptor.displayAsHex;
|
||||
ret.rowMajor = elem.type.descriptor.rowMajorStorage;
|
||||
ret.flags = elem.type.descriptor.flags;
|
||||
|
||||
if(!elem.type.members.isEmpty())
|
||||
{
|
||||
@@ -1118,7 +1119,6 @@ ShaderVariable InterpretShaderVar(const ShaderConstant &elem, const byte *data,
|
||||
data += elem.type.descriptor.arrayByteStride;
|
||||
}
|
||||
|
||||
ret.isStruct = false;
|
||||
ret.members = arrayElements;
|
||||
}
|
||||
else
|
||||
@@ -1472,7 +1472,7 @@ QVariantList GetVariants(ResourceFormat format, const ShaderConstantDescriptor &
|
||||
{
|
||||
for(uint32_t col = 0; col < qMax(colCount, 1U); col++)
|
||||
{
|
||||
if(varDesc.rowMajorStorage || rowCount == 1)
|
||||
if(varDesc.RowMajor() || rowCount == 1)
|
||||
data = base + row * varDesc.matrixByteStride + col * format.compByteWidth;
|
||||
else
|
||||
data = base + col * varDesc.matrixByteStride + row * format.compByteWidth;
|
||||
@@ -1586,12 +1586,19 @@ QVariantList GetVariants(ResourceFormat format, const ShaderConstantDescriptor &
|
||||
|
||||
QString TypeString(const ShaderVariable &v)
|
||||
{
|
||||
if(!v.members.isEmpty() || v.isStruct)
|
||||
if(!v.members.isEmpty() || v.type == VarType::Struct)
|
||||
{
|
||||
if(v.isStruct)
|
||||
return lit("struct");
|
||||
if(v.type == VarType::Struct)
|
||||
{
|
||||
if(!v.members.empty() && v.members[0].name.contains('['))
|
||||
return lit("struct[%2]").arg(v.members.count());
|
||||
else
|
||||
return lit("struct");
|
||||
}
|
||||
else
|
||||
{
|
||||
return QFormatStr("%1[%2]").arg(TypeString(v.members[0])).arg(v.members.count());
|
||||
}
|
||||
}
|
||||
|
||||
if(v.type == VarType::GPUPointer)
|
||||
@@ -1608,7 +1615,7 @@ QString TypeString(const ShaderVariable &v)
|
||||
else if(v.type == VarType::ConstantBlock)
|
||||
typeStr = lit("Constant Block");
|
||||
|
||||
if(v.displayAsHex)
|
||||
if(v.flags & ShaderVariableFlags::HexDisplay)
|
||||
{
|
||||
if(v.type == VarType::ULong)
|
||||
typeStr = lit("xlong");
|
||||
@@ -1631,12 +1638,14 @@ QString TypeString(const ShaderVariable &v)
|
||||
.arg(typeStr)
|
||||
.arg(v.rows)
|
||||
.arg(v.columns)
|
||||
.arg(v.rowMajor ? lit("row_major") : lit("column_major"));
|
||||
.arg(v.RowMajor() ? lit("row_major") : lit("column_major"));
|
||||
}
|
||||
|
||||
template <typename el>
|
||||
static QString RowValuesToString(int cols, bool hex, el x, el y, el z, el w)
|
||||
static QString RowValuesToString(int cols, ShaderVariableFlags flags, el x, el y, el z, el w)
|
||||
{
|
||||
const bool hex = bool(flags & ShaderVariableFlags::HexDisplay);
|
||||
|
||||
if(cols == 1)
|
||||
return Formatter::Format(x, hex);
|
||||
else if(cols == 2)
|
||||
@@ -1662,56 +1671,59 @@ QString RowString(const ShaderVariable &v, uint32_t row, VarType type)
|
||||
if(v.type == VarType::GPUPointer)
|
||||
return ToQStr(v.GetPointer());
|
||||
|
||||
if(v.type == VarType::Struct)
|
||||
return lit("{ ... }");
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case VarType::Float:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.f32v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.f32v[row * v.columns + 0],
|
||||
v.value.f32v[row * v.columns + 1], v.value.f32v[row * v.columns + 2],
|
||||
v.value.f32v[row * v.columns + 3]);
|
||||
case VarType::Double:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.f64v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.f64v[row * v.columns + 0],
|
||||
v.value.f64v[row * v.columns + 1], v.value.f64v[row * v.columns + 2],
|
||||
v.value.f64v[row * v.columns + 3]);
|
||||
case VarType::Half:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.f16v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.f16v[row * v.columns + 0],
|
||||
v.value.f16v[row * v.columns + 1], v.value.f16v[row * v.columns + 2],
|
||||
v.value.f16v[row * v.columns + 3]);
|
||||
case VarType::Bool:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex,
|
||||
return RowValuesToString((int)v.columns, v.flags,
|
||||
v.value.u32v[row * v.columns + 0] ? true : false,
|
||||
v.value.u32v[row * v.columns + 1] ? true : false,
|
||||
v.value.u32v[row * v.columns + 2] ? true : false,
|
||||
v.value.u32v[row * v.columns + 3] ? true : false);
|
||||
case VarType::ULong:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.u64v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.u64v[row * v.columns + 0],
|
||||
v.value.u64v[row * v.columns + 1], v.value.u64v[row * v.columns + 2],
|
||||
v.value.u64v[row * v.columns + 3]);
|
||||
case VarType::UInt:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.u32v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.u32v[row * v.columns + 0],
|
||||
v.value.u32v[row * v.columns + 1], v.value.u32v[row * v.columns + 2],
|
||||
v.value.u32v[row * v.columns + 3]);
|
||||
case VarType::UShort:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.u16v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.u16v[row * v.columns + 0],
|
||||
v.value.u16v[row * v.columns + 1], v.value.u16v[row * v.columns + 2],
|
||||
v.value.u16v[row * v.columns + 3]);
|
||||
case VarType::UByte:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.u8v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.u8v[row * v.columns + 0],
|
||||
v.value.u8v[row * v.columns + 1], v.value.u8v[row * v.columns + 2],
|
||||
v.value.u8v[row * v.columns + 3]);
|
||||
case VarType::SLong:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.s64v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.s64v[row * v.columns + 0],
|
||||
v.value.s64v[row * v.columns + 1], v.value.s64v[row * v.columns + 2],
|
||||
v.value.s64v[row * v.columns + 3]);
|
||||
case VarType::SInt:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.s32v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.s32v[row * v.columns + 0],
|
||||
v.value.s32v[row * v.columns + 1], v.value.s32v[row * v.columns + 2],
|
||||
v.value.s32v[row * v.columns + 3]);
|
||||
case VarType::SShort:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.s16v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.s16v[row * v.columns + 0],
|
||||
v.value.s16v[row * v.columns + 1], v.value.s16v[row * v.columns + 2],
|
||||
v.value.s16v[row * v.columns + 3]);
|
||||
case VarType::SByte:
|
||||
return RowValuesToString((int)v.columns, v.displayAsHex, v.value.s8v[row * v.columns + 0],
|
||||
return RowValuesToString((int)v.columns, v.flags, v.value.s8v[row * v.columns + 0],
|
||||
v.value.s8v[row * v.columns + 1], v.value.s8v[row * v.columns + 2],
|
||||
v.value.s8v[row * v.columns + 3]);
|
||||
case VarType::GPUPointer: return ToQStr(v.GetPointer());
|
||||
@@ -1719,7 +1731,8 @@ QString RowString(const ShaderVariable &v, uint32_t row, VarType type)
|
||||
case VarType::ReadOnlyResource:
|
||||
case VarType::ReadWriteResource:
|
||||
case VarType::Sampler:
|
||||
case VarType::Unknown: break;
|
||||
case VarType::Unknown:
|
||||
case VarType::Struct: break;
|
||||
}
|
||||
|
||||
return lit("???");
|
||||
@@ -1746,9 +1759,9 @@ QString VarString(const ShaderVariable &v)
|
||||
|
||||
QString RowTypeString(const ShaderVariable &v)
|
||||
{
|
||||
if(!v.members.isEmpty() || v.isStruct)
|
||||
if(!v.members.isEmpty() || v.type == VarType::Struct)
|
||||
{
|
||||
if(v.isStruct)
|
||||
if(v.type == VarType::Struct)
|
||||
return lit("struct");
|
||||
else
|
||||
return lit("flibbertygibbet");
|
||||
@@ -1762,7 +1775,7 @@ QString RowTypeString(const ShaderVariable &v)
|
||||
|
||||
QString typeStr = ToQStr(v.type);
|
||||
|
||||
if(v.displayAsHex)
|
||||
if(v.flags & ShaderVariableFlags::HexDisplay)
|
||||
{
|
||||
if(v.type == VarType::ULong)
|
||||
typeStr = lit("xlong");
|
||||
|
||||
@@ -749,10 +749,12 @@ static QString interpretVariant(const QVariant &v, const ShaderConstant &el,
|
||||
memcpy(&u, &f, sizeof(f));
|
||||
}
|
||||
|
||||
if(el.type.descriptor.displayAsHex && prop.format.type == ResourceFormatType::Regular)
|
||||
const bool hexDisplay = bool(el.type.descriptor.flags & ShaderVariableFlags::HexDisplay);
|
||||
|
||||
if(hexDisplay && prop.format.type == ResourceFormatType::Regular)
|
||||
ret = Formatter::HexFormat(u, prop.format.compByteWidth);
|
||||
else
|
||||
ret = Formatter::Format(u, el.type.descriptor.displayAsHex);
|
||||
ret = Formatter::Format(u, hexDisplay);
|
||||
}
|
||||
else if(vt == QMetaType::Int || vt == QMetaType::Short || vt == QMetaType::SChar)
|
||||
{
|
||||
@@ -771,7 +773,8 @@ static QString interpretVariant(const QVariant &v, const ShaderConstant &el,
|
||||
}
|
||||
else if(vt == QMetaType::ULongLong)
|
||||
{
|
||||
ret = Formatter::Format((uint64_t)v.toULongLong(), el.type.descriptor.displayAsHex);
|
||||
ret = Formatter::Format((uint64_t)v.toULongLong(),
|
||||
bool(el.type.descriptor.flags & ShaderVariableFlags::HexDisplay));
|
||||
}
|
||||
else if(vt == QMetaType::LongLong)
|
||||
{
|
||||
@@ -980,7 +983,8 @@ public:
|
||||
const ShaderConstant &el = elementForColumn(col);
|
||||
const BufferElementProperties &prop = propForColumn(col);
|
||||
|
||||
if(el.type.descriptor.displayAsRGB && prop.buffer < config.buffers.size())
|
||||
if((el.type.descriptor.flags & ShaderVariableFlags::RGBDisplay) &&
|
||||
prop.buffer < config.buffers.size())
|
||||
{
|
||||
const byte *data = config.buffers[prop.buffer]->data();
|
||||
const byte *end = config.buffers[prop.buffer]->end();
|
||||
|
||||
@@ -3057,7 +3057,7 @@ const RDTreeWidgetItem *ShaderViewer::evaluateVar(const RDTreeWidgetItem *item,
|
||||
|
||||
ShaderVariable &ret = *var;
|
||||
ret.name = mapping.name;
|
||||
ret.rowMajor = true;
|
||||
ret.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
ret.rows = mapping.rows;
|
||||
ret.columns = mapping.columns;
|
||||
ret.type = mapping.type;
|
||||
@@ -4177,6 +4177,7 @@ bool ShaderViewer::updateWatchVariable(RDTreeWidgetItem *watchItem, const RDTree
|
||||
case VarType::SInt:
|
||||
case VarType::SShort:
|
||||
case VarType::SByte: regcast = QLatin1Char('i'); break;
|
||||
case VarType::Struct:
|
||||
case VarType::GPUPointer:
|
||||
regcast = QLatin1Char('#');
|
||||
dataSize = 8;
|
||||
@@ -4638,7 +4639,8 @@ RDTreeWidgetItem *ShaderViewer::makeSourceVariableNode(const SourceVariableMappi
|
||||
case VarType::ConstantBlock:
|
||||
case VarType::ReadOnlyResource:
|
||||
case VarType::ReadWriteResource:
|
||||
case VarType::Sampler: value += stringRep(*reg, 0); break;
|
||||
case VarType::Sampler:
|
||||
case VarType::Struct: value += stringRep(*reg, 0); break;
|
||||
case VarType::Unknown:
|
||||
qCritical() << "Unexpected unknown variable" << (QString)l.name;
|
||||
break;
|
||||
|
||||
@@ -863,6 +863,7 @@ rdcstr DoStringise(const VarType &el)
|
||||
STRINGISE_ENUM_CLASS_NAMED(SByte, "byte");
|
||||
STRINGISE_ENUM_CLASS_NAMED(UByte, "ubyte");
|
||||
STRINGISE_ENUM_CLASS_NAMED(Bool, "bool");
|
||||
STRINGISE_ENUM_CLASS_NAMED(Struct, "struct");
|
||||
STRINGISE_ENUM_CLASS_NAMED(GPUPointer, "pointer");
|
||||
STRINGISE_ENUM_CLASS_NAMED(ConstantBlock, "cbuffer");
|
||||
STRINGISE_ENUM_CLASS_NAMED(ReadOnlyResource, "resource");
|
||||
@@ -1109,6 +1110,20 @@ rdcstr DoStringise(const SectionFlags &el)
|
||||
END_BITFIELD_STRINGISE();
|
||||
}
|
||||
|
||||
template <>
|
||||
rdcstr DoStringise(const ShaderVariableFlags &el)
|
||||
{
|
||||
BEGIN_BITFIELD_STRINGISE(ShaderVariableFlags);
|
||||
{
|
||||
STRINGISE_BITFIELD_CLASS_VALUE_NAMED(NoFlags, "None");
|
||||
|
||||
STRINGISE_BITFIELD_CLASS_BIT(RowMajorMatrix);
|
||||
STRINGISE_BITFIELD_CLASS_BIT(HexDisplay);
|
||||
STRINGISE_BITFIELD_CLASS_BIT(RGBDisplay);
|
||||
}
|
||||
END_BITFIELD_STRINGISE();
|
||||
}
|
||||
|
||||
template <>
|
||||
rdcstr DoStringise(const ShaderEvents &el)
|
||||
{
|
||||
|
||||
@@ -132,8 +132,6 @@ enum class SectionType : uint32_t
|
||||
ITERABLE_OPERATORS(SectionType);
|
||||
DECLARE_REFLECTION_ENUM(SectionType);
|
||||
|
||||
// replay_shader.h
|
||||
|
||||
DOCUMENT(R"(Represents the category of debugging variable that a source variable maps to.
|
||||
|
||||
.. data:: Undefined
|
||||
@@ -227,6 +225,10 @@ DOCUMENT(R"(Represents the base type of a shader variable in debugging or consta
|
||||
|
||||
A boolean value.
|
||||
|
||||
.. data:: Struct
|
||||
|
||||
A structure with some number of members.
|
||||
|
||||
.. data:: GPUPointer
|
||||
|
||||
A 64-bit pointer into GPU-addressable memory. Variables with this type are stored with opaque
|
||||
@@ -270,6 +272,7 @@ enum class VarType : uint8_t
|
||||
SByte,
|
||||
UByte,
|
||||
Bool,
|
||||
Struct,
|
||||
GPUPointer,
|
||||
ConstantBlock,
|
||||
ReadOnlyResource,
|
||||
@@ -1153,8 +1156,6 @@ enum class ShaderBuiltin : uint32_t
|
||||
ITERABLE_OPERATORS(ShaderBuiltin);
|
||||
DECLARE_REFLECTION_ENUM(ShaderBuiltin);
|
||||
|
||||
// replay_render.h
|
||||
|
||||
DOCUMENT(R"(The type of :class:`ReplayOutput` to create
|
||||
|
||||
.. data:: Headless
|
||||
@@ -4265,6 +4266,38 @@ enum class ShaderEvents : uint32_t
|
||||
BITMASK_OPERATORS(ShaderEvents);
|
||||
DECLARE_REFLECTION_ENUM(ShaderEvents);
|
||||
|
||||
DOCUMENT(R"(A set of flags for events that control how a shader/buffer value is interpreted and
|
||||
displayed
|
||||
|
||||
.. data:: NoFlags
|
||||
|
||||
No flags are specified.
|
||||
|
||||
.. data:: RowMajorMatrix
|
||||
|
||||
This matrix is stored in row-major order in memory, instead of column-major. In RenderDoc values
|
||||
are always provided row-major regardless, for consistency of access, but if this flag is not
|
||||
present then the original values were in column order in memory, so the data has been transposed.
|
||||
|
||||
.. data:: HexDisplay
|
||||
|
||||
This value should be displayed using hexadecimal where possible.
|
||||
|
||||
.. data:: RGBDisplay
|
||||
|
||||
This value should be interpreted as an RGB colour for display where possible.
|
||||
)");
|
||||
enum class ShaderVariableFlags : uint32_t
|
||||
{
|
||||
NoFlags = 0x0000,
|
||||
RowMajorMatrix = 0x0001,
|
||||
HexDisplay = 0x0002,
|
||||
RGBDisplay = 0x0004,
|
||||
};
|
||||
|
||||
BITMASK_OPERATORS(ShaderVariableFlags);
|
||||
DECLARE_REFLECTION_ENUM(ShaderVariableFlags);
|
||||
|
||||
DOCUMENT(R"(A set of flags describing the properties of a particular action. An action is a call
|
||||
such as a draw, a compute dispatch, clears, copies, resolves, etc. Any GPU event which may have
|
||||
deliberate visible side-effects to application-visible memory, typically resources such as textures
|
||||
|
||||
@@ -224,7 +224,6 @@ struct ShaderVariable
|
||||
{
|
||||
name = "";
|
||||
rows = columns = 0;
|
||||
displayAsHex = isStruct = rowMajor = false;
|
||||
type = VarType::Unknown;
|
||||
memset(&value, 0, sizeof(value));
|
||||
}
|
||||
@@ -235,7 +234,6 @@ struct ShaderVariable
|
||||
name = n;
|
||||
rows = 1;
|
||||
columns = 4;
|
||||
displayAsHex = isStruct = rowMajor = false;
|
||||
memset(&value, 0, sizeof(value));
|
||||
type = VarType::Float;
|
||||
value.f32v[0] = x;
|
||||
@@ -248,7 +246,6 @@ struct ShaderVariable
|
||||
name = n;
|
||||
rows = 1;
|
||||
columns = 4;
|
||||
displayAsHex = isStruct = rowMajor = false;
|
||||
memset(&value, 0, sizeof(value));
|
||||
type = VarType::SInt;
|
||||
value.s32v[0] = x;
|
||||
@@ -261,7 +258,6 @@ struct ShaderVariable
|
||||
name = n;
|
||||
rows = 1;
|
||||
columns = 4;
|
||||
displayAsHex = isStruct = rowMajor = false;
|
||||
memset(&value, 0, sizeof(value));
|
||||
type = VarType::UInt;
|
||||
value.u32v[0] = x;
|
||||
@@ -272,8 +268,7 @@ struct ShaderVariable
|
||||
bool operator==(const ShaderVariable &o) const
|
||||
{
|
||||
return rows == o.rows && columns == o.columns && name == o.name && type == o.type &&
|
||||
displayAsHex == o.displayAsHex && !memcmp(&value, &o.value, sizeof(value)) &&
|
||||
isStruct == o.isStruct && rowMajor == o.rowMajor && members == o.members;
|
||||
flags == o.flags && value.u64v == o.value.u64v && members == o.members;
|
||||
}
|
||||
bool operator<(const ShaderVariable &o) const
|
||||
{
|
||||
@@ -285,14 +280,10 @@ struct ShaderVariable
|
||||
return name < o.name;
|
||||
if(!(type == o.type))
|
||||
return type < o.type;
|
||||
if(!(displayAsHex == o.displayAsHex))
|
||||
return displayAsHex < o.displayAsHex;
|
||||
if(!(isStruct == o.isStruct))
|
||||
return isStruct < o.isStruct;
|
||||
if(!(rowMajor == o.rowMajor))
|
||||
return rowMajor < o.rowMajor;
|
||||
if(memcmp(&value, &o.value, sizeof(value)) < 0)
|
||||
return true;
|
||||
if(!(flags == o.flags))
|
||||
return flags < o.flags;
|
||||
if(value.u64v != o.value.u64v)
|
||||
return value.u64v < o.value.u64v;
|
||||
if(!(members == o.members))
|
||||
return members < o.members;
|
||||
return false;
|
||||
@@ -306,18 +297,15 @@ struct ShaderVariable
|
||||
DOCUMENT("The number of columns in this matrix.");
|
||||
uint8_t columns;
|
||||
|
||||
DOCUMENT("``True`` if the contents of this variable should be displayed as hex.");
|
||||
bool displayAsHex;
|
||||
|
||||
DOCUMENT("``True`` if this variable is a structure and not an array or basic type.");
|
||||
bool isStruct;
|
||||
|
||||
DOCUMENT("``True`` if this variable is stored in rows in memory. Only relevant for matrices.");
|
||||
bool rowMajor;
|
||||
|
||||
DOCUMENT("The :class:`basic type <VarType>` of this variable.");
|
||||
VarType type;
|
||||
|
||||
DOCUMENT(R"(The flags controlling how this constant is interpreted and displayed.
|
||||
|
||||
:type: ShaderVariableFlags
|
||||
)");
|
||||
ShaderVariableFlags flags = ShaderVariableFlags::NoFlags;
|
||||
|
||||
DOCUMENT(R"(The contents of this variable if it has no members.
|
||||
|
||||
:type: ShaderValue
|
||||
@@ -330,6 +318,28 @@ struct ShaderVariable
|
||||
)");
|
||||
rdcarray<ShaderVariable> members;
|
||||
|
||||
DOCUMENT(R"(Helper function for checking if :data:`flags` has
|
||||
:data:`ShaderVariableFlags.RowMajorMatrix` set. This is entirely equivalent to checking that flag
|
||||
manually, but since it is common this helper is provided.
|
||||
|
||||
.. note::
|
||||
Vectors and scalars will be marked as row-major by convention for convenience.
|
||||
|
||||
:return: If the storage is row-major order in memory
|
||||
:rtype: Bool
|
||||
)");
|
||||
inline bool RowMajor() const { return bool(flags & ShaderVariableFlags::RowMajorMatrix); }
|
||||
DOCUMENT(R"(Helper function for checking if :data:`flags` *does not* have
|
||||
:data:`ShaderVariableFlags.RowMajorMatrix` set. This is entirely equivalent to checking that flag
|
||||
manually, but since it is common this helper is provided.
|
||||
|
||||
.. note::
|
||||
Vectors and scalars will be marked as row-major by convention for convenience.
|
||||
|
||||
:return: If the storage is column-major order in memory
|
||||
:rtype: Bool
|
||||
)");
|
||||
inline bool ColMajor() const { return !(flags & ShaderVariableFlags::RowMajorMatrix); }
|
||||
DOCUMENT(R"(Utility function for setting a pointer value with no type information.
|
||||
|
||||
:param int pointer: The actual pointer value.
|
||||
@@ -920,10 +930,10 @@ struct ShaderConstantDescriptor
|
||||
|
||||
bool operator==(const ShaderConstantDescriptor &o) const
|
||||
{
|
||||
return type == o.type && rows == o.rows && columns == o.columns &&
|
||||
rowMajorStorage == o.rowMajorStorage && elements == o.elements &&
|
||||
arrayByteStride == o.arrayByteStride && matrixByteStride == o.matrixByteStride &&
|
||||
pointerTypeID == o.pointerTypeID && name == o.name;
|
||||
return type == o.type && rows == o.rows && columns == o.columns && flags == o.flags &&
|
||||
elements == o.elements && arrayByteStride == o.arrayByteStride &&
|
||||
matrixByteStride == o.matrixByteStride && pointerTypeID == o.pointerTypeID &&
|
||||
name == o.name;
|
||||
}
|
||||
bool operator<(const ShaderConstantDescriptor &o) const
|
||||
{
|
||||
@@ -933,8 +943,8 @@ struct ShaderConstantDescriptor
|
||||
return rows < o.rows;
|
||||
if(!(columns == o.columns))
|
||||
return columns < o.columns;
|
||||
if(!(rowMajorStorage == o.rowMajorStorage))
|
||||
return rowMajorStorage < o.rowMajorStorage;
|
||||
if(!(flags == o.flags))
|
||||
return flags < o.flags;
|
||||
if(!(elements == o.elements))
|
||||
return elements < o.elements;
|
||||
if(!(arrayByteStride == o.arrayByteStride))
|
||||
@@ -961,14 +971,34 @@ struct ShaderConstantDescriptor
|
||||
uint8_t columns = 1;
|
||||
DOCUMENT("The number of bytes between the start of one column/row in a matrix and the next.");
|
||||
uint8_t matrixByteStride = 0;
|
||||
DOCUMENT("``True`` if the matrix is stored as row major instead of column major.");
|
||||
bool rowMajorStorage = false;
|
||||
DOCUMENT("``True`` if the contents of this variable should be displayed as hex.");
|
||||
bool displayAsHex = false;
|
||||
DOCUMENT(R"(``True`` if the contents of this variable should be displayed as RGB color (where
|
||||
possible).
|
||||
)");
|
||||
bool displayAsRGB = false;
|
||||
DOCUMENT(R"(The flags controlling how this constant is interpreted and displayed.
|
||||
|
||||
:type: ShaderVariableFlags
|
||||
)");
|
||||
ShaderVariableFlags flags = ShaderVariableFlags::NoFlags;
|
||||
|
||||
DOCUMENT(R"(Helper function for checking if :data:`flags` has
|
||||
:data:`ShaderVariableFlags.RowMajorMatrix` set. This is entirely equivalent to checking that flag
|
||||
manually, but since it is common this helper is provided.
|
||||
|
||||
.. note::
|
||||
Vectors and scalars will be marked as row-major by convention for convenience.
|
||||
|
||||
:return: If the storage is row-major order in memory
|
||||
:rtype: Bool
|
||||
)");
|
||||
inline bool RowMajor() const { return bool(flags & ShaderVariableFlags::RowMajorMatrix); }
|
||||
DOCUMENT(R"(Helper function for checking if :data:`flags` *does not* have
|
||||
:data:`ShaderVariableFlags.RowMajorMatrix` set. This is entirely equivalent to checking that flag
|
||||
manually, but since it is common this helper is provided.
|
||||
|
||||
.. note::
|
||||
Vectors and scalars will be marked as row-major by convention for convenience.
|
||||
|
||||
:return: If the storage is column-major order in memory
|
||||
:rtype: Bool
|
||||
)");
|
||||
inline bool ColMajor() const { return !(flags & ShaderVariableFlags::RowMajorMatrix); }
|
||||
};
|
||||
|
||||
DECLARE_REFLECTION_STRUCT(ShaderConstantDescriptor);
|
||||
@@ -1008,7 +1038,9 @@ struct ShaderConstantType
|
||||
|
||||
DECLARE_REFLECTION_STRUCT(ShaderConstantType);
|
||||
|
||||
DOCUMENT("Contains the detail of a constant within a :class:`ConstantBlock` in memory.");
|
||||
DOCUMENT(R"(Contains the detail of a constant within a struct, such as a :class:`ConstantBlock`,
|
||||
with its type and relative location in memory.
|
||||
)");
|
||||
struct ShaderConstant
|
||||
{
|
||||
DOCUMENT("");
|
||||
|
||||
@@ -336,7 +336,7 @@ void main() {
|
||||
CHECK(member.type.descriptor.rows == 2);
|
||||
CHECK(member.type.descriptor.columns == 3);
|
||||
CHECK(member.type.descriptor.elements == 3);
|
||||
CHECK(member.type.descriptor.rowMajorStorage == false);
|
||||
CHECK(member.type.descriptor.ColMajor());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -963,7 +963,7 @@ void main() {
|
||||
CHECK(member.type.descriptor.type == VarType::Float);
|
||||
CHECK(member.type.descriptor.rows == 3);
|
||||
CHECK(member.type.descriptor.columns == 4);
|
||||
CHECK(member.type.descriptor.rowMajorStorage == false);
|
||||
CHECK(member.type.descriptor.ColMajor());
|
||||
}
|
||||
|
||||
CHECK(ubo_root[2].name == "ubo_c");
|
||||
@@ -976,7 +976,7 @@ void main() {
|
||||
CHECK(member.type.descriptor.type == VarType::Float);
|
||||
CHECK(member.type.descriptor.rows == 3);
|
||||
CHECK(member.type.descriptor.columns == 4);
|
||||
CHECK(member.type.descriptor.rowMajorStorage == true);
|
||||
CHECK(member.type.descriptor.RowMajor());
|
||||
}
|
||||
|
||||
CHECK(ubo_root[3].name == "ubo_d");
|
||||
@@ -1052,7 +1052,7 @@ void main() {
|
||||
CHECK(submember.type.descriptor.type == VarType::Float);
|
||||
CHECK(submember.type.descriptor.rows == 2);
|
||||
CHECK(submember.type.descriptor.columns == 2);
|
||||
CHECK(submember.type.descriptor.rowMajorStorage == false);
|
||||
CHECK(submember.type.descriptor.ColMajor());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1299,7 +1299,7 @@ void main() {
|
||||
CHECK(submember.type.descriptor.type == VarType::Float);
|
||||
CHECK(submember.type.descriptor.rows == 2);
|
||||
CHECK(submember.type.descriptor.columns == 2);
|
||||
CHECK(submember.type.descriptor.rowMajorStorage == false);
|
||||
CHECK(submember.type.descriptor.ColMajor());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1385,7 +1385,7 @@ void main() {
|
||||
CHECK(subsubmember.type.descriptor.type == VarType::Float);
|
||||
CHECK(subsubmember.type.descriptor.rows == 2);
|
||||
CHECK(subsubmember.type.descriptor.columns == 2);
|
||||
CHECK(subsubmember.type.descriptor.rowMajorStorage == false);
|
||||
CHECK(subsubmember.type.descriptor.ColMajor());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1435,7 +1435,7 @@ void main() {
|
||||
CHECK(subsubmember.type.descriptor.type == VarType::Float);
|
||||
CHECK(subsubmember.type.descriptor.rows == 2);
|
||||
CHECK(subsubmember.type.descriptor.columns == 2);
|
||||
CHECK(subsubmember.type.descriptor.rowMajorStorage == false);
|
||||
CHECK(subsubmember.type.descriptor.ColMajor());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2095,7 +2095,7 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
var.rows = desc.rows;
|
||||
var.columns = desc.columns;
|
||||
var.type = desc.type;
|
||||
var.rowMajor = desc.rowMajorStorage;
|
||||
var.flags = desc.flags;
|
||||
|
||||
const uint32_t matStride = desc.matrixByteStride;
|
||||
|
||||
@@ -2105,7 +2105,7 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
{
|
||||
OpenGLFillCBufferVariables(shader, prog, bufferBacked, prefix + var.name.c_str() + ".",
|
||||
variables[i].type.members, var.members, data);
|
||||
var.isStruct = true;
|
||||
var.type = VarType::Struct;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2116,14 +2116,12 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
arrEl.rows = var.rows;
|
||||
arrEl.columns = var.columns;
|
||||
arrEl.name = StringFormat::Fmt("%s[%u]", var.name.c_str(), a);
|
||||
arrEl.type = var.type;
|
||||
arrEl.isStruct = true;
|
||||
arrEl.rowMajor = var.rowMajor;
|
||||
arrEl.type = VarType::Struct;
|
||||
arrEl.flags = var.flags;
|
||||
|
||||
OpenGLFillCBufferVariables(shader, prog, bufferBacked, prefix + arrEl.name.c_str() + ".",
|
||||
variables[i].type.members, arrEl.members, data);
|
||||
}
|
||||
var.isStruct = false;
|
||||
var.rows = var.columns = 0;
|
||||
}
|
||||
}
|
||||
@@ -2166,13 +2164,10 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
else
|
||||
el.name = StringFormat::Fmt("[%u]", a);
|
||||
|
||||
el.isStruct = false;
|
||||
|
||||
elems.push_back(el);
|
||||
}
|
||||
|
||||
var.members = elems;
|
||||
var.isStruct = false;
|
||||
var.rows = var.columns = 0;
|
||||
}
|
||||
}
|
||||
@@ -2209,6 +2204,7 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
case VarType::SByte:
|
||||
case VarType::UByte:
|
||||
case VarType::Half:
|
||||
case VarType::Struct:
|
||||
RDCERR("Unexpected base variable type %s, treating as float",
|
||||
ToStr(var.type).c_str());
|
||||
DELIBERATE_FALLTHROUGH();
|
||||
@@ -2260,6 +2256,7 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
case VarType::SByte:
|
||||
case VarType::UByte:
|
||||
case VarType::Half:
|
||||
case VarType::Struct:
|
||||
RDCERR("Unexpected base variable type %s, treating as float",
|
||||
ToStr(var.type).c_str());
|
||||
DELIBERATE_FALLTHROUGH();
|
||||
@@ -2284,13 +2281,10 @@ void GLReplay::OpenGLFillCBufferVariables(ResourceId shader, GLuint prog, bool b
|
||||
if(bufferBacked)
|
||||
offset += desc.arrayByteStride;
|
||||
|
||||
el.isStruct = false;
|
||||
|
||||
elems.push_back(el);
|
||||
}
|
||||
|
||||
var.members = elems;
|
||||
var.isStruct = false;
|
||||
var.rows = var.columns = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -742,7 +742,8 @@ void ReconstructVarTree(GLenum query, GLuint sepProg, GLuint varIdx, GLint numPa
|
||||
var.byteOffset = ~0U;
|
||||
}
|
||||
|
||||
var.type.descriptor.rowMajorStorage = (values[6] > 0);
|
||||
if(values[6] > 0)
|
||||
var.type.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
var.type.descriptor.matrixByteStride = (uint8_t)values[8];
|
||||
|
||||
RDCASSERTMSG("Stride is too large for uint16_t", values[7] <= 0xffff);
|
||||
@@ -756,7 +757,7 @@ void ReconstructVarTree(GLenum query, GLuint sepProg, GLuint varIdx, GLint numPa
|
||||
bareUniform = true;
|
||||
|
||||
// plain matrices are always column major, so this is the size of a column
|
||||
var.type.descriptor.rowMajorStorage = false;
|
||||
var.type.descriptor.flags &= ~ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
const uint32_t elemByteStride = (var.type.descriptor.type == VarType::Double) ? 8 : 4;
|
||||
var.type.descriptor.matrixByteStride = uint8_t(var.type.descriptor.rows * elemByteStride);
|
||||
@@ -765,7 +766,8 @@ void ReconstructVarTree(GLenum query, GLuint sepProg, GLuint varIdx, GLint numPa
|
||||
var.type.descriptor.arrayByteStride = 0;
|
||||
}
|
||||
|
||||
// set vectors as row major for convenience, since that's how they're stored in the fv array.
|
||||
// set vectors/scalars as row major for convenience, since that's how they're stored in the fv
|
||||
// array.
|
||||
switch(values[0])
|
||||
{
|
||||
case eGL_FLOAT_VEC4:
|
||||
@@ -787,7 +789,7 @@ void ReconstructVarTree(GLenum query, GLuint sepProg, GLuint varIdx, GLint numPa
|
||||
case eGL_INT_VEC4:
|
||||
case eGL_INT_VEC3:
|
||||
case eGL_INT_VEC2:
|
||||
case eGL_INT: var.type.descriptor.rowMajorStorage = true; break;
|
||||
case eGL_INT: var.type.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
@@ -881,7 +883,6 @@ void ReconstructVarTree(GLenum query, GLuint sepProg, GLuint varIdx, GLint numPa
|
||||
parentVar.type.descriptor.name = "struct";
|
||||
parentVar.type.descriptor.rows = 0;
|
||||
parentVar.type.descriptor.columns = 0;
|
||||
parentVar.type.descriptor.rowMajorStorage = false;
|
||||
parentVar.type.descriptor.type = var.type.descriptor.type;
|
||||
parentVar.type.descriptor.elements =
|
||||
isarray && !multiDimArray ? RDCMAX(1U, uint32_t(arrayIdx + 1)) : 0;
|
||||
@@ -1155,7 +1156,6 @@ void MakeShaderReflection(GLenum shadType, GLuint sepProg, ShaderReflection &ref
|
||||
res.variableType.descriptor.rows = 1;
|
||||
res.variableType.descriptor.columns = 4;
|
||||
res.variableType.descriptor.elements = 0;
|
||||
res.variableType.descriptor.rowMajorStorage = false;
|
||||
res.variableType.descriptor.arrayByteStride = 0;
|
||||
res.variableType.descriptor.matrixByteStride = 0;
|
||||
|
||||
@@ -1701,7 +1701,6 @@ void MakeShaderReflection(GLenum shadType, GLuint sepProg, ShaderReflection &ref
|
||||
res.variableType.descriptor.rows = 0;
|
||||
res.variableType.descriptor.columns = 0;
|
||||
res.variableType.descriptor.elements = 0;
|
||||
res.variableType.descriptor.rowMajorStorage = false;
|
||||
res.variableType.descriptor.arrayByteStride = 0;
|
||||
res.variableType.descriptor.matrixByteStride = 0;
|
||||
res.variableType.descriptor.name = "buffer";
|
||||
|
||||
@@ -1746,7 +1746,7 @@ void FlattenSingleVariable(const rdcstr &cbufferName, uint32_t byteOffset, const
|
||||
size_t outIdx = byteOffset / 16;
|
||||
size_t outComp = (byteOffset % 16) / 4;
|
||||
|
||||
if(v.rowMajor)
|
||||
if(v.RowMajor())
|
||||
outvars.resize(RDCMAX(outIdx + v.rows, outvars.size()));
|
||||
else
|
||||
outvars.resize(RDCMAX(outIdx + v.columns, outvars.size()));
|
||||
@@ -1777,17 +1777,16 @@ void FlattenSingleVariable(const rdcstr &cbufferName, uint32_t byteOffset, const
|
||||
}
|
||||
else
|
||||
{
|
||||
const uint32_t numRegisters = v.rowMajor ? v.rows : v.columns;
|
||||
const uint32_t numRegisters = v.RowMajor() ? v.rows : v.columns;
|
||||
for(uint32_t reg = 0; reg < numRegisters; reg++)
|
||||
{
|
||||
outvars[outIdx + reg].rows = 1;
|
||||
outvars[outIdx + reg].type = VarType::Unknown;
|
||||
outvars[outIdx + reg].isStruct = false;
|
||||
outvars[outIdx + reg].columns = v.columns;
|
||||
outvars[outIdx + reg].rowMajor = v.rowMajor;
|
||||
outvars[outIdx + reg].flags = v.flags;
|
||||
}
|
||||
|
||||
if(v.rowMajor)
|
||||
if(v.RowMajor())
|
||||
{
|
||||
for(size_t ri = 0; ri < v.rows; ri++)
|
||||
memcpy(&outvars[outIdx + ri].value.u32v[0], &v.value.u32v[ri * v.columns],
|
||||
@@ -1817,8 +1816,8 @@ void FlattenSingleVariable(const rdcstr &cbufferName, uint32_t byteOffset, const
|
||||
{
|
||||
for(uint8_t c = 0; c < v.columns; c++)
|
||||
{
|
||||
size_t regIndex = outIdx + (v.rowMajor ? r : c);
|
||||
size_t compIndex = outComp + (v.rowMajor ? c : r);
|
||||
size_t regIndex = outIdx + (v.RowMajor() ? r : c);
|
||||
size_t compIndex = outComp + (v.RowMajor() ? c : r);
|
||||
|
||||
mapping.variables[i].type = DebugVariableType::Constant;
|
||||
mapping.variables[i].name = StringFormat::Fmt("%s[%zu]", cbufferName.c_str(), regIndex);
|
||||
@@ -1847,43 +1846,37 @@ void FlattenVariables(const rdcstr &cbufferName, const rdcarray<ShaderConstant>
|
||||
|
||||
rdcstr basename = prefix + rdcstr(v.name);
|
||||
|
||||
if((v.rows == 0 && v.columns == 0) || !v.members.empty())
|
||||
if(v.type == VarType::Struct)
|
||||
{
|
||||
if(v.isStruct)
|
||||
// check if this is an array of structs or not
|
||||
if(c.type.descriptor.elements == 1)
|
||||
{
|
||||
FlattenVariables(cbufferName, c.type.members, v.members, outvars, basename + ".",
|
||||
byteOffset, sourceVars);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(c.type.members.empty())
|
||||
for(int m = 0; m < v.members.count(); m++)
|
||||
{
|
||||
// if there are no members in this type, it means it's a basic array - unroll directly
|
||||
|
||||
for(int m = 0; m < v.members.count(); m++)
|
||||
{
|
||||
FlattenSingleVariable(cbufferName, byteOffset + m * c.type.descriptor.arrayByteStride,
|
||||
StringFormat::Fmt("%s[%zu]", basename.c_str(), m), v.members[m],
|
||||
outvars, sourceVars);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// otherwise we recurse into each member and flatten
|
||||
|
||||
for(int m = 0; m < v.members.count(); m++)
|
||||
{
|
||||
FlattenVariables(cbufferName, c.type.members, v.members[m].members, outvars,
|
||||
StringFormat::Fmt("%s[%zu].", basename.c_str(), m),
|
||||
byteOffset + m * c.type.descriptor.arrayByteStride, sourceVars);
|
||||
}
|
||||
FlattenVariables(cbufferName, c.type.members, v.members[m].members, outvars,
|
||||
StringFormat::Fmt("%s[%zu].", basename.c_str(), m),
|
||||
byteOffset + m * c.type.descriptor.arrayByteStride, sourceVars);
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
FlattenSingleVariable(cbufferName, byteOffset, basename, v, outvars, sourceVars);
|
||||
else if(c.type.descriptor.elements > 1 || (v.rows == 0 && v.columns == 0) || !v.members.empty())
|
||||
{
|
||||
for(int m = 0; m < v.members.count(); m++)
|
||||
{
|
||||
FlattenSingleVariable(cbufferName, byteOffset + m * c.type.descriptor.arrayByteStride,
|
||||
StringFormat::Fmt("%s[%zu]", basename.c_str(), m), v.members[m],
|
||||
outvars, sourceVars);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FlattenSingleVariable(cbufferName, byteOffset, basename, v, outvars, sourceVars);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,9 +40,9 @@ static ShaderConstantType MakeShaderConstantType(bool cbufferPacking, DXBC::CBuf
|
||||
ret.descriptor.columns = (uint8_t)type.descriptor.cols;
|
||||
ret.descriptor.elements = type.descriptor.elements;
|
||||
ret.descriptor.name = type.descriptor.name;
|
||||
ret.descriptor.rowMajorStorage = (type.descriptor.varClass == DXBC::CLASS_MATRIX_ROWS ||
|
||||
type.descriptor.varClass == DXBC::CLASS_VECTOR ||
|
||||
type.descriptor.varClass == DXBC::CLASS_SCALAR);
|
||||
if(type.descriptor.varClass == DXBC::CLASS_MATRIX_ROWS ||
|
||||
type.descriptor.varClass == DXBC::CLASS_VECTOR || type.descriptor.varClass == DXBC::CLASS_SCALAR)
|
||||
ret.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
uint32_t baseElemSize = (ret.descriptor.type == VarType::Double) ? 8 : 4;
|
||||
|
||||
@@ -51,9 +51,8 @@ static ShaderConstantType MakeShaderConstantType(bool cbufferPacking, DXBC::CBuf
|
||||
if(cbufferPacking)
|
||||
ret.descriptor.matrixByteStride = uint8_t(baseElemSize * 4);
|
||||
else
|
||||
ret.descriptor.matrixByteStride =
|
||||
uint8_t(baseElemSize *
|
||||
(ret.descriptor.rowMajorStorage ? ret.descriptor.rows : ret.descriptor.columns));
|
||||
ret.descriptor.matrixByteStride = uint8_t(
|
||||
baseElemSize * (ret.descriptor.RowMajor() ? ret.descriptor.columns : ret.descriptor.rows));
|
||||
|
||||
if(type.descriptor.varClass == DXBC::CLASS_STRUCT)
|
||||
{
|
||||
@@ -69,7 +68,7 @@ static ShaderConstantType MakeShaderConstantType(bool cbufferPacking, DXBC::CBuf
|
||||
}
|
||||
else
|
||||
{
|
||||
if(ret.descriptor.rowMajorStorage)
|
||||
if(ret.descriptor.RowMajor())
|
||||
ret.descriptor.arrayByteStride = ret.descriptor.matrixByteStride * ret.descriptor.rows;
|
||||
else
|
||||
ret.descriptor.arrayByteStride = ret.descriptor.matrixByteStride * ret.descriptor.columns;
|
||||
|
||||
@@ -2234,7 +2234,7 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
|
||||
ShaderVariable result;
|
||||
result.rows = 1;
|
||||
result.columns = 1;
|
||||
result.isStruct = true;
|
||||
result.type = VarType::Struct;
|
||||
result.members = {lsb, msb};
|
||||
result.members[0].name = "lsb";
|
||||
result.members[1].name = "msb";
|
||||
@@ -2482,7 +2482,7 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
|
||||
ShaderVariable result;
|
||||
result.rows = 1;
|
||||
result.columns = 1;
|
||||
result.isStruct = true;
|
||||
result.type = VarType::Struct;
|
||||
result.members = {GetSrc(sampled.image), GetSrc(sampled.sampler)};
|
||||
result.members[0].name = "image";
|
||||
result.members[1].name = "sampler";
|
||||
@@ -3022,7 +3022,7 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
|
||||
ShaderVariable result;
|
||||
result.rows = 1;
|
||||
result.columns = 1;
|
||||
result.isStruct = true;
|
||||
result.type = VarType::Struct;
|
||||
result.members = {ReadPointerValue(ptr.image), GetSrc(ptr.coordinate), GetSrc(ptr.sample)};
|
||||
result.members[0].name = "image";
|
||||
result.members[1].name = "coord";
|
||||
|
||||
@@ -415,7 +415,7 @@ ShaderVariable ModfStruct(ThreadState &state, uint32_t, const rdcarray<Id> ¶
|
||||
ShaderVariable ret;
|
||||
ret.rows = 1;
|
||||
ret.columns = 1;
|
||||
ret.isStruct = true;
|
||||
ret.type = VarType::Struct;
|
||||
ret.members = {var, var};
|
||||
ret.members[0].name = "_child0";
|
||||
ret.members[1].name = "_child1";
|
||||
@@ -788,7 +788,7 @@ ShaderVariable FrexpStruct(ThreadState &state, uint32_t, const rdcarray<Id> &par
|
||||
ShaderVariable ret;
|
||||
ret.rows = 1;
|
||||
ret.columns = 1;
|
||||
ret.isStruct = true;
|
||||
ret.type = VarType::Struct;
|
||||
ret.members = {var, var};
|
||||
ret.members[0].name = "_child0";
|
||||
ret.members[1].name = "_child1";
|
||||
|
||||
@@ -446,13 +446,18 @@ rdcstr Reflector::Disassemble(const rdcstr &entryPoint,
|
||||
case VarType::UShort: ret += ToStr(value.u16v[0]); break;
|
||||
case VarType::UByte: ret += ToStr(value.u8v[0]); break;
|
||||
case VarType::SLong: ret += ToStr(value.s64v[0]); break;
|
||||
case VarType::ULong:
|
||||
ret += ToStr(value.u64v[0]);
|
||||
break;
|
||||
// none of these types are expected, either because they're opaque or (for struct)
|
||||
// because ConstantComposite should have been used
|
||||
case VarType::Struct:
|
||||
case VarType::Unknown:
|
||||
case VarType::GPUPointer:
|
||||
case VarType::ConstantBlock:
|
||||
case VarType::ReadOnlyResource:
|
||||
case VarType::ReadWriteResource:
|
||||
case VarType::Sampler:
|
||||
case VarType::ULong: ret += ToStr(value.u64v[0]); break;
|
||||
case VarType::Sampler: ret += "???"; break;
|
||||
}
|
||||
|
||||
ret += getDecorationString(decorations[decoded.result]);
|
||||
@@ -1675,6 +1680,7 @@ rdcstr Reflector::StringiseConstant(rdcspv::Id id) const
|
||||
case VarType::UByte: return ToStr(value.value.u8v[0]);
|
||||
case VarType::SLong: return ToStr(value.value.s64v[0]);
|
||||
case VarType::ULong: return ToStr(value.value.u64v[0]);
|
||||
case VarType::Struct:
|
||||
case VarType::Unknown:
|
||||
case VarType::GPUPointer:
|
||||
case VarType::ConstantBlock:
|
||||
@@ -1702,6 +1708,7 @@ rdcstr Reflector::StringiseConstant(rdcspv::Id id) const
|
||||
case VarType::UByte: ret += ToStr(value.value.u8v[i]); break;
|
||||
case VarType::SLong: ret += ToStr(value.value.s64v[i]); break;
|
||||
case VarType::ULong: ret += ToStr(value.value.u64v[i]); break;
|
||||
case VarType::Struct:
|
||||
case VarType::Unknown:
|
||||
case VarType::GPUPointer:
|
||||
case VarType::ConstantBlock:
|
||||
|
||||
@@ -619,7 +619,6 @@ void Processor::RegisterOp(Iter it)
|
||||
|
||||
ShaderVariable v("composite", 0, 0, 0, 0);
|
||||
v.rows = v.columns = 0;
|
||||
v.isStruct = (type.type == DataType::StructType);
|
||||
|
||||
if(type.type == DataType::VectorType)
|
||||
{
|
||||
@@ -633,7 +632,11 @@ void Processor::RegisterOp(Iter it)
|
||||
v.rows = type.vector().count & 0xf;
|
||||
v.columns = type.matrix().count & 0xf;
|
||||
// always store constants row major
|
||||
v.rowMajor = true;
|
||||
v.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
}
|
||||
else if(type.type == DataType::StructType)
|
||||
{
|
||||
v.type = VarType::Struct;
|
||||
}
|
||||
|
||||
rdcarray<ShaderVariable> members;
|
||||
@@ -961,7 +964,6 @@ ShaderVariable Processor::MakeNULL(const DataType &type, uint64_t value)
|
||||
{
|
||||
ShaderVariable v("", 0, 0, 0, 0);
|
||||
v.rows = v.columns = 0;
|
||||
v.isStruct = (type.type == DataType::StructType);
|
||||
|
||||
for(uint8_t c = 0; c < 16; c++)
|
||||
v.value.u64v[c] = value;
|
||||
@@ -977,7 +979,7 @@ ShaderVariable Processor::MakeNULL(const DataType &type, uint64_t value)
|
||||
v.type = type.scalar().Type();
|
||||
v.rows = type.vector().count & 0xf;
|
||||
v.columns = type.matrix().count & 0xf;
|
||||
v.rowMajor = true;
|
||||
v.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
}
|
||||
else if(type.type == DataType::ScalarType)
|
||||
{
|
||||
@@ -1003,6 +1005,11 @@ ShaderVariable Processor::MakeNULL(const DataType &type, uint64_t value)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(type.type == DataType::StructType)
|
||||
v.type = VarType::Struct;
|
||||
else
|
||||
RDCWARN("Unexpected type %d making NULL", type.type);
|
||||
|
||||
v.members.resize(type.children.size());
|
||||
for(size_t i = 0; i < v.members.size(); i++)
|
||||
{
|
||||
|
||||
@@ -286,11 +286,11 @@ static uint32_t CalculateMinimumByteSize(const rdcarray<ShaderConstant> &variabl
|
||||
return byteOffset + rows * basicTypeSize;
|
||||
|
||||
// for matrices we need to pad 3-column or 3-row up to 4
|
||||
if(cols == 3 && last.type.descriptor.rowMajorStorage)
|
||||
if(cols == 3 && last.type.descriptor.RowMajor())
|
||||
{
|
||||
return byteOffset + rows * 4 * basicTypeSize;
|
||||
}
|
||||
else if(rows == 3 && !last.type.descriptor.rowMajorStorage)
|
||||
else if(rows == 3 && last.type.descriptor.ColMajor())
|
||||
{
|
||||
return byteOffset + cols * 4 * basicTypeSize;
|
||||
}
|
||||
@@ -995,7 +995,6 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st
|
||||
|
||||
res.variableType.descriptor.columns = 1;
|
||||
res.variableType.descriptor.rows = 1;
|
||||
res.variableType.descriptor.rowMajorStorage = false;
|
||||
res.variableType.descriptor.type = VarType::UInt;
|
||||
res.variableType.descriptor.name = varType->name;
|
||||
|
||||
@@ -1110,8 +1109,6 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st
|
||||
|
||||
res.variableType.descriptor.columns = 0;
|
||||
res.variableType.descriptor.rows = 0;
|
||||
res.variableType.descriptor.rowMajorStorage = false;
|
||||
res.variableType.descriptor.rows = 0;
|
||||
res.variableType.descriptor.type = VarType::Float;
|
||||
res.variableType.descriptor.name = varType->name;
|
||||
|
||||
@@ -1482,8 +1479,8 @@ void Reflector::MakeConstantBlockVariable(ShaderConstant &outConst,
|
||||
{
|
||||
outConst.type.descriptor.type = curType->scalar().Type();
|
||||
|
||||
outConst.type.descriptor.rowMajorStorage =
|
||||
(curType->type == DataType::VectorType || varDecorations.flags & Decorations::RowMajor);
|
||||
if(curType->type == DataType::VectorType || (varDecorations.flags & Decorations::RowMajor))
|
||||
outConst.type.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
if(varDecorations.matrixStride != ~0U)
|
||||
outConst.type.descriptor.matrixByteStride = varDecorations.matrixStride & 0xff;
|
||||
@@ -1503,7 +1500,7 @@ void Reflector::MakeConstantBlockVariable(ShaderConstant &outConst,
|
||||
else if(curType->type == DataType::ScalarType)
|
||||
{
|
||||
outConst.type.descriptor.type = curType->scalar().Type();
|
||||
outConst.type.descriptor.rowMajorStorage = true;
|
||||
outConst.type.descriptor.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
outConst.type.descriptor.name = curType->name;
|
||||
}
|
||||
@@ -1512,7 +1509,6 @@ void Reflector::MakeConstantBlockVariable(ShaderConstant &outConst,
|
||||
if(curType->type == DataType::PointerType)
|
||||
{
|
||||
outConst.type.descriptor.type = VarType::ULong;
|
||||
outConst.type.descriptor.rowMajorStorage = false;
|
||||
outConst.type.descriptor.rows = 1;
|
||||
outConst.type.descriptor.columns = 1;
|
||||
outConst.type.descriptor.name = curType->name;
|
||||
@@ -1529,7 +1525,6 @@ void Reflector::MakeConstantBlockVariable(ShaderConstant &outConst,
|
||||
RDCASSERT(curType->type == DataType::StructType || curType->type == DataType::ArrayType);
|
||||
|
||||
outConst.type.descriptor.type = VarType::Float;
|
||||
outConst.type.descriptor.rowMajorStorage = false;
|
||||
outConst.type.descriptor.rows = 0;
|
||||
outConst.type.descriptor.columns = 0;
|
||||
|
||||
|
||||
@@ -167,12 +167,10 @@ void DoSerialise(SerialiserType &ser, ShaderConstantDescriptor &el)
|
||||
SERIALISE_MEMBER(rows);
|
||||
SERIALISE_MEMBER(columns);
|
||||
SERIALISE_MEMBER(matrixByteStride);
|
||||
SERIALISE_MEMBER(rowMajorStorage);
|
||||
SERIALISE_MEMBER(elements);
|
||||
SERIALISE_MEMBER(arrayByteStride);
|
||||
SERIALISE_MEMBER(name);
|
||||
SERIALISE_MEMBER(displayAsHex);
|
||||
SERIALISE_MEMBER(displayAsRGB);
|
||||
SERIALISE_MEMBER(flags);
|
||||
SERIALISE_MEMBER(pointerTypeID);
|
||||
|
||||
SIZE_CHECK(48);
|
||||
@@ -320,9 +318,7 @@ void DoSerialise(SerialiserType &ser, ShaderVariable &el)
|
||||
SERIALISE_MEMBER(name);
|
||||
SERIALISE_MEMBER(type);
|
||||
|
||||
SERIALISE_MEMBER(displayAsHex);
|
||||
SERIALISE_MEMBER(isStruct);
|
||||
SERIALISE_MEMBER(rowMajor);
|
||||
SERIALISE_MEMBER(flags);
|
||||
|
||||
SERIALISE_MEMBER(value.u64v);
|
||||
|
||||
|
||||
@@ -362,7 +362,7 @@ void StandardFillCBufferVariable(ResourceId shader, const ShaderConstantDescript
|
||||
// so a matrix is a secondaryDim number of primaryDim-sized vectors
|
||||
uint32_t primaryDim = cols;
|
||||
uint32_t secondaryDim = rows;
|
||||
if(rows > 1 && !outvar.rowMajor)
|
||||
if(rows > 1 && outvar.ColMajor())
|
||||
{
|
||||
primaryDim = rows;
|
||||
secondaryDim = cols;
|
||||
@@ -390,7 +390,7 @@ void StandardFillCBufferVariable(ResourceId shader, const ShaderConstantDescript
|
||||
}
|
||||
|
||||
// if it's a matrix and not row major, transpose
|
||||
if(primaryDim > 1 && secondaryDim > 1 && !outvar.rowMajor)
|
||||
if(primaryDim > 1 && secondaryDim > 1 && outvar.ColMajor())
|
||||
{
|
||||
ShaderVariable tmp = outvar;
|
||||
|
||||
@@ -436,7 +436,7 @@ static void StandardFillCBufferVariables(ResourceId shader, const rdcarray<Shade
|
||||
uint8_t rows = invars[v].type.descriptor.rows;
|
||||
uint8_t cols = invars[v].type.descriptor.columns;
|
||||
uint32_t elems = RDCMAX(1U, invars[v].type.descriptor.elements);
|
||||
const bool rowMajor = invars[v].type.descriptor.rowMajorStorage != 0;
|
||||
const bool rowMajor = invars[v].type.descriptor.RowMajor();
|
||||
const bool isArray = elems > 1;
|
||||
|
||||
const uint32_t matStride = invars[v].type.descriptor.matrixByteStride;
|
||||
@@ -448,8 +448,9 @@ static void StandardFillCBufferVariables(ResourceId shader, const rdcarray<Shade
|
||||
ShaderVariable var;
|
||||
var.name = basename;
|
||||
var.rows = var.columns = 0;
|
||||
var.type = VarType::Float;
|
||||
var.rowMajor = rowMajor;
|
||||
var.type = VarType::Struct;
|
||||
if(rowMajor)
|
||||
var.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
rdcarray<ShaderVariable> varmembers;
|
||||
|
||||
@@ -461,23 +462,18 @@ static void StandardFillCBufferVariables(ResourceId shader, const rdcarray<Shade
|
||||
ShaderVariable &vr = var.members[i];
|
||||
vr.name = StringFormat::Fmt("%s[%u]", basename.c_str(), i);
|
||||
vr.rows = vr.columns = 0;
|
||||
vr.type = VarType::Float;
|
||||
vr.rowMajor = rowMajor;
|
||||
vr.type = VarType::Struct;
|
||||
if(rowMajor)
|
||||
vr.flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
StandardFillCBufferVariables(shader, invars[v].type.members, vr.members, data, dataOffset);
|
||||
|
||||
var.type = vr.type;
|
||||
|
||||
dataOffset += invars[v].type.descriptor.arrayByteStride;
|
||||
|
||||
vr.isStruct = true;
|
||||
}
|
||||
|
||||
var.isStruct = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var.isStruct = true;
|
||||
var.type = VarType::Struct;
|
||||
|
||||
StandardFillCBufferVariables(shader, invars[v].type.members, var.members, data, dataOffset);
|
||||
}
|
||||
@@ -496,9 +492,9 @@ static void StandardFillCBufferVariables(ResourceId shader, const rdcarray<Shade
|
||||
outvars[outIdx].name = basename;
|
||||
outvars[outIdx].rows = 1;
|
||||
outvars[outIdx].type = type;
|
||||
outvars[outIdx].isStruct = false;
|
||||
outvars[outIdx].columns = cols;
|
||||
outvars[outIdx].rowMajor = rowMajor;
|
||||
if(rowMajor)
|
||||
outvars[outIdx].flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
ShaderVariable &var = outvars[outIdx];
|
||||
|
||||
@@ -525,9 +521,9 @@ static void StandardFillCBufferVariables(ResourceId shader, const rdcarray<Shade
|
||||
varmembers[e].name = StringFormat::Fmt("%s[%u]", base.c_str(), e);
|
||||
varmembers[e].rows = rows;
|
||||
varmembers[e].type = type;
|
||||
varmembers[e].isStruct = false;
|
||||
varmembers[e].columns = cols;
|
||||
varmembers[e].rowMajor = rowMajor;
|
||||
if(rowMajor)
|
||||
varmembers[e].flags |= ShaderVariableFlags::RowMajorMatrix;
|
||||
|
||||
uint32_t rowDataOffset = dataOffset;
|
||||
|
||||
@@ -537,10 +533,7 @@ static void StandardFillCBufferVariables(ResourceId shader, const rdcarray<Shade
|
||||
varmembers[e], matStride);
|
||||
}
|
||||
|
||||
{
|
||||
var.isStruct = false;
|
||||
var.members = varmembers;
|
||||
}
|
||||
var.members = varmembers;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,15 +94,15 @@ class ShaderVariableCheck:
|
||||
return self
|
||||
|
||||
def row_major(self):
|
||||
if not self.var.rowMajor:
|
||||
if not self.var.RowMajor():
|
||||
raise TestFailureException("Variable {} is not row-major, as expected"
|
||||
.format(self.var.name))
|
||||
|
||||
return self
|
||||
|
||||
def column_major(self):
|
||||
if self.var.rowMajor:
|
||||
raise TestFailureException("Variable {} is not row-major, as expected"
|
||||
if not self.var.ColMajor():
|
||||
raise TestFailureException("Variable {} is not column-major, as expected"
|
||||
.format(self.var.name))
|
||||
|
||||
return self
|
||||
@@ -115,7 +115,7 @@ class ShaderVariableCheck:
|
||||
return self
|
||||
|
||||
def structSize(self, elements_: int):
|
||||
if not self.var.isStruct:
|
||||
if not self.var.type == rd.VarType.Struct:
|
||||
raise TestFailureException("Variable {} is not a struct as was expected"
|
||||
.format(self.var.name))
|
||||
|
||||
@@ -663,7 +663,7 @@ class TestCase:
|
||||
f32v = [0.0] * 16
|
||||
for i, debugVarPath in enumerate(sourceVar.variables):
|
||||
debugVar = self.get_debug_var(debugVars, debugVarPath.name)
|
||||
debugged.rowMajor = debugVar.rowMajor
|
||||
debugged.flags = debugVar.flags
|
||||
f32v[i] = debugVar.value.f32v[debugVarPath.component]
|
||||
debugged.value.f32v = f32v
|
||||
return debugged
|
||||
@@ -719,9 +719,9 @@ class TestCase:
|
||||
v.name = v.name[len(base):]
|
||||
if v.name[0] == '.':
|
||||
v.name = v.name[1:]
|
||||
combined.isStruct = True
|
||||
combined.type = rd.VarType.Struct
|
||||
if check == base + '.':
|
||||
combined.isStruct = True
|
||||
combined.type = rd.VarType.Struct
|
||||
members.append(vars[i])
|
||||
|
||||
if not bare_array:
|
||||
|
||||
@@ -97,7 +97,7 @@ class D3D12_Reflection_Zoo(rdtest.TestCase):
|
||||
self.check(type.members[2].type.members[0].type.descriptor.type == rd.VarType.Float)
|
||||
self.check(type.members[2].type.members[0].type.descriptor.rows == 2)
|
||||
self.check(type.members[2].type.members[0].type.descriptor.columns == 3)
|
||||
self.check(type.members[2].type.members[0].type.descriptor.rowMajorStorage)
|
||||
self.check(type.members[2].type.members[0].type.descriptor.RowMajor())
|
||||
|
||||
return
|
||||
|
||||
|
||||
Reference in New Issue
Block a user