Fixes for dxbc signature read/write (OSG5)

Also added toString for DxbcSignature::Element.
This commit is contained in:
aleiby 2022-01-12 13:13:45 -08:00
parent a2ad066739
commit 77d62575ed
2 changed files with 130 additions and 25 deletions

View File

@ -561,6 +561,54 @@ namespace bgfx
};
BX_STATIC_ASSERT(BX_COUNTOF(s_dxbcCustomDataClass) == DxbcCustomDataClass::Count);
static const char* s_dxbcComponentType[] =
{
"",
"Uint32",
"Int32",
"Float",
};
BX_STATIC_ASSERT(BX_COUNTOF(s_dxbcComponentType) == DxbcComponentType::Count);
static const char *s_dxbcBuiltin[] =
{
"",
"Position",
"ClipDistance",
"CullDistance",
"RenderTargetArrayIndex",
"ViewportArrayIndex",
"VertexId",
"PrimitiveId",
"InstanceId",
"IsFrontFace",
"SampleIndex",
"FinalQuadUEq0EdgeTessFactor",
"FinalQuadVEq0EdgeTessFactor",
"FinalQuadUEq1EdgeTessFactor",
"FinalQuadVEq1EdgeTessFactor",
"FinalQuadUInsideTessFactor",
"FinalQuadVInsideTessFactor",
"FinalTriUEq0EdgeTessFactor",
"FinalTriVEq0EdgeTessFactor",
"FinalTriWEq0EdgeTessFactor",
"FinalTriInsideTessFactor",
"FinalLineDetailTessFactor",
"FinalLineDensityTessFactor",
"Target", // = 64
"Depth",
"Coverage",
"DepthGreaterEqual",
"DepthLessEqual",
"StencilRef",
"InnerCoverage",
};
const char *toString(DxbcBuiltin::Enum _value)
{
constexpr int offset = DxbcBuiltin::Target - DxbcBuiltin::FinalLineDensityTessFactor - 1;
return s_dxbcBuiltin[_value < DxbcBuiltin::Target ? _value : _value - offset];
}
#define DXBC_MAX_NAME_STRING 512
int32_t readString(bx::ReaderSeekerI* _reader, int64_t _offset, char* _out, uint32_t _max, bx::Error* _err)
@ -1489,6 +1537,22 @@ namespace bgfx
return size;
}
int32_t toString(char* _out, int32_t _size, uint8_t _mask, const char *prefix = "")
{
int32_t size = 0;
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, "%s%s%s%s%s"
, prefix
, 0 == (_mask & 1) ? "" : "x"
, 0 == (_mask & 2) ? "" : "y"
, 0 == (_mask & 4) ? "" : "z"
, 0 == (_mask & 8) ? "" : "w"
);
return size;
}
int32_t toString(char* _out, int32_t _size, DxbcOperandMode::Enum _mode, uint8_t _modeBits)
{
int32_t size = 0;
@ -1499,13 +1563,7 @@ namespace bgfx
if (0xf > _modeBits
&& 0 < _modeBits)
{
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, ".%s%s%s%s"
, 0 == (_modeBits & 1) ? "" : "x"
, 0 == (_modeBits & 2) ? "" : "y"
, 0 == (_modeBits & 4) ? "" : "z"
, 0 == (_modeBits & 8) ? "" : "w"
);
size += toString(&_out[size], bx::uint32_imax(0, _size-size), _modeBits, ".");
}
break;
@ -1536,6 +1594,26 @@ namespace bgfx
return size;
}
int32_t toString(char* _out, int32_t _size, const DxbcSignature::Element& _element)
{
int32_t size = 0;
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, "%12s i%d r%d s%x %12s %s"
, _element.name.c_str()
, _element.semanticIndex
, _element.registerIndex
, _element.stream
, toString(_element.valueType)
, s_dxbcComponentType[_element.componentType]
);
size += toString(&_out[size], bx::uint32_imax(0, _size-size), _element.mask, " ");
size += toString(&_out[size], bx::uint32_imax(0, _size-size), _element.readWriteMask, " ");
return size;
}
int32_t toString(char* _out, int32_t _size, const DxbcInstruction& _instruction)
{
int32_t size = 0;
@ -1719,7 +1797,7 @@ namespace bgfx
return size;
}
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bx::Error* _err)
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bool _readStream, bx::Error* _err)
{
int32_t size = 0;
@ -1733,6 +1811,15 @@ namespace bgfx
{
DxbcSignature::Element element;
if (_readStream)
{
size += bx::read(_reader, element.stream, _err);
}
else
{
element.stream = 0;
}
uint32_t nameOffset;
size += bx::read(_reader, nameOffset, _err);
@ -1746,10 +1833,9 @@ namespace bgfx
size += bx::read(_reader, element.registerIndex, _err);
size += bx::read(_reader, element.mask, _err);
size += bx::read(_reader, element.readWriteMask, _err);
size += bx::read(_reader, element.stream, _err);
// padding
uint8_t padding;
uint16_t padding;
size += bx::read(_reader, padding, _err);
_signature.elements.push_back(element);
@ -1758,7 +1844,7 @@ namespace bgfx
return size;
}
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bx::Error* _err)
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bool _writeStream, bx::Error* _err)
{
int32_t size = 0;
@ -1769,12 +1855,21 @@ namespace bgfx
typedef stl::unordered_map<stl::string, uint32_t> NameOffsetMap;
NameOffsetMap nom;
const uint8_t pad = 0;
const uint16_t pad = 0;
uint32_t nameOffset = num * 24 + 8;
if (_writeStream)
{
nameOffset += 4;
}
for (uint32_t ii = 0; ii < num; ++ii)
{
const DxbcSignature::Element& element = _signature.elements[ii];
if (_writeStream)
{
size += bx::write(_writer, element.stream, _err);
}
NameOffsetMap::iterator it = nom.find(element.name);
if (it == nom.end() )
{
@ -1793,7 +1888,6 @@ namespace bgfx
size += bx::write(_writer, element.registerIndex, _err);
size += bx::write(_writer, element.mask, _err);
size += bx::write(_writer, element.readWriteMask, _err);
size += bx::write(_writer, element.stream, _err);
size += bx::write(_writer, pad, _err);
}
@ -1892,13 +1986,16 @@ namespace bgfx
case BX_MAKEFOURCC('I', 'S', 'G', '1'):
case DXBC_CHUNK_INPUT_SIGNATURE:
size += read(_reader, _dxbc.inputSignature, _err);
size += read(_reader, _dxbc.inputSignature, false, _err);
break;
case BX_MAKEFOURCC( 'O', 'S', 'G', '1' ):
case BX_MAKEFOURCC('O', 'S', 'G', '5'):
case DXBC_CHUNK_OUTPUT_SIGNATURE:
size += read(_reader, _dxbc.outputSignature, _err);
size += read(_reader, _dxbc.outputSignature, false, _err);
break;
case BX_MAKEFOURCC( 'O', 'S', 'G', '5' ):
size += read(_reader, _dxbc.outputSignature, true, _err);
break;
case BX_MAKEFOURCC('A', 'o', 'n', '9'): // Contains DX9BC for feature level 9.x (*s_4_0_level_9_*) shaders.
@ -2012,19 +2109,26 @@ namespace bgfx
case BX_MAKEFOURCC('I', 'S', 'G', '1'):
case DXBC_CHUNK_INPUT_SIGNATURE:
chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
size += bx::write(_writer, DXBC_CHUNK_INPUT_SIGNATURE, _err);
size += bx::write(_writer, _dxbc.chunksFourcc[ii], _err);
size += bx::write(_writer, UINT32_C(0), _err);
chunkSize[idx] = write(_writer, _dxbc.inputSignature, _err);
chunkSize[idx] = write(_writer, _dxbc.inputSignature, false, _err);
size += chunkSize[idx++];
break;
case BX_MAKEFOURCC('O', 'S', 'G', '1'):
case BX_MAKEFOURCC('O', 'S', 'G', '5'):
case DXBC_CHUNK_OUTPUT_SIGNATURE:
chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
size += bx::write(_writer, DXBC_CHUNK_OUTPUT_SIGNATURE, _err);
size += bx::write(_writer, _dxbc.chunksFourcc[ii], _err);
size += bx::write(_writer, UINT32_C(0), _err);
chunkSize[idx] = write(_writer, _dxbc.outputSignature, _err);
chunkSize[idx] = write(_writer, _dxbc.outputSignature, false, _err);
size += chunkSize[idx++];
break;
case BX_MAKEFOURCC( 'O', 'S', 'G', '5' ):
chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
size += bx::write(_writer, _dxbc.chunksFourcc[ii], _err);
size += bx::write(_writer, UINT32_C(0), _err);
chunkSize[idx] = write(_writer, _dxbc.outputSignature, true, _err);
size += chunkSize[idx++];
break;

View File

@ -613,17 +613,18 @@ namespace bgfx
DxbcBuiltin::Enum valueType;
DxbcComponentType::Enum componentType;
uint32_t registerIndex;
uint32_t stream;
uint8_t mask;
uint8_t readWriteMask;
uint8_t stream;
};
uint32_t key;
stl::vector<Element> elements;
};
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bx::Error* _err);
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bx::Error* _err);
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bool _readStream, bx::Error* _err);
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bool _writeStream, bx::Error* _err);
int32_t toString(char* _out, int32_t _size, const DxbcSignature::Element& _element);
struct DxbcShader
{