summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/shader_dxbc.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/shader_dxbc.cpp')
-rw-r--r--3rdparty/bgfx/src/shader_dxbc.cpp340
1 files changed, 278 insertions, 62 deletions
diff --git a/3rdparty/bgfx/src/shader_dxbc.cpp b/3rdparty/bgfx/src/shader_dxbc.cpp
index 49da315b3e9..6f27ff7d2a3 100644
--- a/3rdparty/bgfx/src/shader_dxbc.cpp
+++ b/3rdparty/bgfx/src/shader_dxbc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2022 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
@@ -108,17 +108,17 @@ namespace bgfx
{ 1, 0 }, // DCL_CONSTANT_BUFFER
{ 1, 0 }, // DCL_SAMPLER
{ 1, 1 }, // DCL_INDEX_RANGE
- { 1, 0 }, // DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY
- { 1, 0 }, // DCL_GS_INPUT_PRIMITIVE
+ { 0, 0 }, // DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY
+ { 0, 0 }, // DCL_GS_INPUT_PRIMITIVE
{ 0, 1 }, // DCL_MAX_OUTPUT_VERTEX_COUNT
{ 1, 0 }, // DCL_INPUT
{ 1, 1 }, // DCL_INPUT_SGV
- { 1, 0 }, // DCL_INPUT_SIV
+ { 1, 1 }, // DCL_INPUT_SIV
{ 1, 0 }, // DCL_INPUT_PS
{ 1, 1 }, // DCL_INPUT_PS_SGV
{ 1, 1 }, // DCL_INPUT_PS_SIV
{ 1, 0 }, // DCL_OUTPUT
- { 1, 0 }, // DCL_OUTPUT_SGV
+ { 1, 1 }, // DCL_OUTPUT_SGV
{ 1, 1 }, // DCL_OUTPUT_SIV
{ 0, 1 }, // DCL_TEMPS
{ 0, 3 }, // DCL_INDEXABLE_TEMP
@@ -135,8 +135,8 @@ namespace bgfx
{ 0, 0 }, // HS_CONTROL_POINT_PHASE
{ 0, 0 }, // HS_FORK_PHASE
{ 0, 0 }, // HS_JOIN_PHASE
- { 0, 0 }, // EMIT_STREAM
- { 0, 0 }, // CUT_STREAM
+ { 1, 0 }, // EMIT_STREAM
+ { 1, 0 }, // CUT_STREAM
{ 1, 0 }, // EMITTHENCUT_STREAM
{ 1, 0 }, // INTERFACE_CALL
{ 0, 0 }, // BUFINFO
@@ -161,7 +161,7 @@ namespace bgfx
{ 5, 0 }, // BFI
{ 0, 0 }, // BFREV
{ 5, 0 }, // SWAPC
- { 0, 0 }, // DCL_STREAM
+ { 1, 0 }, // DCL_STREAM
{ 1, 0 }, // DCL_FUNCTION_BODY
{ 0, 0 }, // DCL_FUNCTION_TABLE
{ 0, 0 }, // DCL_INTERFACE
@@ -468,7 +468,7 @@ namespace bgfx
const char* getName(DxbcOpcode::Enum _opcode)
{
- BX_CHECK(_opcode < DxbcOpcode::Count, "Unknown opcode id %d.", _opcode);
+ BX_ASSERT(_opcode < DxbcOpcode::Count, "Unknown opcode id %d.", _opcode);
return s_dxbcOpcode[_opcode];
}
@@ -503,6 +503,69 @@ namespace bgfx
};
BX_STATIC_ASSERT(BX_COUNTOF(s_dxbcInterpolationName) == DxbcInterpolation::Count);
+ const char *s_dxbcPrimitiveTopologyName[] =
+ {
+ "",
+ "PointList",
+ "LineList",
+ "LineStrip",
+ "TriangleList",
+ "TriangleStrip",
+ "",
+ "",
+ "",
+ "",
+ "LineListAdj",
+ "LineStripAdj",
+ "TriangleListAdj",
+ "TriangleStripAdj",
+ };
+ BX_STATIC_ASSERT(BX_COUNTOF(s_dxbcPrimitiveTopologyName) == DxbcPrimitiveTopology::Count);
+
+ const char *s_dxbcPrimitiveName[] = {
+ "",
+ "Point",
+ "Line",
+ "Triangle",
+ "",
+ "",
+ "LineAdj",
+ "TriangleAdj",
+ "_1ControlPointPatch",
+ "_2ControlPointPatch",
+ "_3ControlPointPatch",
+ "_4ControlPointPatch",
+ "_5ControlPointPatch",
+ "_6ControlPointPatch",
+ "_7ControlPointPatch",
+ "_8ControlPointPatch",
+ "_9ControlPointPatch",
+ "_10ControlPointPatch",
+ "_11ControlPointPatch",
+ "_12ControlPointPatch",
+ "_13ControlPointPatch",
+ "_14ControlPointPatch",
+ "_15ControlPointPatch",
+ "_16ControlPointPatch",
+ "_17ControlPointPatch",
+ "_18ControlPointPatch",
+ "_19ControlPointPatch",
+ "_20ControlPointPatch",
+ "_21ControlPointPatch",
+ "_22ControlPointPatch",
+ "_23ControlPointPatch",
+ "_24ControlPointPatch",
+ "_25ControlPointPatch",
+ "_26ControlPointPatch",
+ "_27ControlPointPatch",
+ "_28ControlPointPatch",
+ "_29ControlPointPatch",
+ "_30ControlPointPatch",
+ "_31ControlPointPatch",
+ "_32ControlPointPatch",
+ };
+ BX_STATIC_ASSERT(BX_COUNTOF(s_dxbcPrimitiveName) == DxbcPrimitive::Count);
+
// mesa/src/gallium/state_trackers/d3d1x/d3d1xshader/defs/shortfiles.txt
static const char* s_dxbcOperandType[] =
{
@@ -717,8 +780,8 @@ namespace bgfx
}
// dxbc hash function is slightly modified version of MD5 hash.
- // https://tools.ietf.org/html/rfc1321
- // http://www.efgh.com/software/md5.txt
+ // https://web.archive.org/web/20190207230524/https://tools.ietf.org/html/rfc1321
+ // https://web.archive.org/web/20190207230538/http://www.efgh.com/software/md5.txt
//
// Assumption is that data pointer, size are both 4-byte aligned,
// and little endian.
@@ -825,7 +888,7 @@ namespace bgfx
break;
default:
- BX_CHECK(false, "sub operand addressing mode %d", _subOperand.addrMode);
+ BX_ASSERT(false, "sub operand addressing mode %d", _subOperand.addrMode);
break;
}
@@ -878,7 +941,7 @@ namespace bgfx
break;
default:
- BX_CHECK(false, "sub operand addressing mode %d", _subOperand.addrMode);
+ BX_ASSERT(false, "sub operand addressing mode %d", _subOperand.addrMode);
break;
}
@@ -967,7 +1030,7 @@ namespace bgfx
break;
default:
- BX_CHECK(false, "operand %d addressing mode %d", ii, _operand.addrMode[ii]);
+ BX_ASSERT(false, "operand %d addressing mode %d", ii, _operand.addrMode[ii]);
break;
}
}
@@ -1042,7 +1105,7 @@ namespace bgfx
break;
default:
- BX_CHECK(false, "operand %d addressing mode %d", ii, _operand.addrMode[ii]);
+ BX_ASSERT(false, "operand %d addressing mode %d", ii, _operand.addrMode[ii]);
break;
}
}
@@ -1065,6 +1128,8 @@ namespace bgfx
// +-------------------------------- extended
_instruction.opcode = DxbcOpcode::Enum( (token & UINT32_C(0x000007ff) ) );
+ BX_ASSERT(_instruction.opcode < DxbcOpcode::Enum::Count, "unknown opcode");
+
_instruction.length = uint8_t( (token & UINT32_C(0x7f000000) ) >> 24);
bool extended = 0 != (token & UINT32_C(0x80000000) );
@@ -1147,11 +1212,30 @@ namespace bgfx
_instruction.enableShaderExtensions = 0 != (token & UINT32_C(0x00040000) );
break;
- case DxbcOpcode::DCL_INPUT_PS:
+ case DxbcOpcode::DCL_GS_INPUT_PRIMITIVE:
+ // 0 1 2 3
+ // 76543210765432107654321076543210
+ // ........ pppppp...........
+ // ^----------------- Primitive
+
+ _instruction.primitive = DxbcPrimitive::Enum( (token & UINT32_C(0x0001f800) ) >> 11);
+ break;
+
+ case DxbcOpcode::DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
+ // 0 1 2 3
+ // 76543210765432107654321076543210
+ // ........ pppppp...........
+ // ^----------------- Primitive Topology
+
+ _instruction.primitiveTopology = DxbcPrimitiveTopology::Enum( (token & UINT32_C(0x0001f800) ) >> 11);
+ break;
+
+ case DxbcOpcode::DCL_INPUT_PS: BX_FALLTHROUGH;
+ case DxbcOpcode::DCL_INPUT_PS_SIV:
// 0 1 2 3
// 76543210765432107654321076543210
// ........ iiiii...........
- // ^---------------- Interploation
+ // ^---------------- Interpolation
_instruction.interpolation = DxbcInterpolation::Enum( (token & UINT32_C(0x0000f800) ) >> 11);
break;
@@ -1279,7 +1363,7 @@ namespace bgfx
size += read(_reader, tableId, _err);
uint32_t num;
- size += read(_reader, num);
+ size += read(_reader, num, _err);
for (uint32_t ii = 0; ii < num; ++ii)
{
@@ -1297,7 +1381,7 @@ namespace bgfx
uint32_t num;
size += read(_reader, num, _err);
- BX_CHECK(false, "not implemented.");
+ BX_ASSERT(false, "not implemented.");
}
break;
@@ -1325,7 +1409,7 @@ namespace bgfx
break;
default:
- BX_CHECK(false, "Instruction %s with invalid number of operands %d (numValues %d)."
+ BX_ASSERT(false, "Instruction %s with invalid number of operands %d (numValues %d)."
, getName(_instruction.opcode)
, info.numOperands
, info.numValues
@@ -1356,7 +1440,7 @@ namespace bgfx
token &= UINT32_C(0x000007ff);
token |= _instruction.customDataClass << 11;
- size += bx::write(_writer, token);
+ size += bx::write(_writer, token, _err);
uint32_t len = uint32_t(_instruction.customData.size()*sizeof(uint32_t) );
size += bx::write(_writer, len/4+2, _err);
@@ -1379,7 +1463,16 @@ namespace bgfx
token |= _instruction.enableShaderExtensions ? UINT32_C(0x00040000) : 0;
break;
- case DxbcOpcode::DCL_INPUT_PS:
+ case DxbcOpcode::DCL_GS_INPUT_PRIMITIVE:
+ token |= (_instruction.primitive << 11) & UINT32_C(0x0001f800);
+ break;
+
+ case DxbcOpcode::DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
+ token |= (_instruction.primitiveTopology << 11) & UINT32_C(0x0001f800);
+ break;
+
+ case DxbcOpcode::DCL_INPUT_PS: BX_FALLTHROUGH;
+ case DxbcOpcode::DCL_INPUT_PS_SIV:
token |= (_instruction.interpolation << 11) & UINT32_C(0x0000f800);
break;
@@ -1408,7 +1501,7 @@ namespace bgfx
break;
}
- size += bx::write(_writer, token);
+ size += bx::write(_writer, token, _err);
for (uint32_t ii = 0; _instruction.extended[ii] != DxbcInstruction::ExtendedType::Count; ++ii)
{
@@ -1547,6 +1640,22 @@ namespace bgfx
);
break;
+ case DxbcOpcode::DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
+ size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
+ , "%s %s"
+ , getName(_instruction.opcode)
+ , s_dxbcPrimitiveTopologyName[_instruction.primitiveTopology]
+ );
+ break;
+
+ case DxbcOpcode::DCL_GS_INPUT_PRIMITIVE:
+ size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
+ , "%s %s"
+ , getName(_instruction.opcode)
+ , s_dxbcPrimitiveName[_instruction.primitive]
+ );
+ break;
+
case DxbcOpcode::IF:
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, "%s%s"
@@ -1732,7 +1841,7 @@ namespace bgfx
DxbcSignature::Element element;
uint32_t nameOffset;
- size += bx::read(_reader, nameOffset);
+ size += bx::read(_reader, nameOffset, _err);
char name[DXBC_MAX_NAME_STRING];
readString(_reader, offset + nameOffset, name, DXBC_MAX_NAME_STRING, _err);
@@ -1782,7 +1891,7 @@ namespace bgfx
}
else
{
- size += bx::write(_writer, it->second);
+ size += bx::write(_writer, it->second, _err);
}
size += bx::write(_writer, element.semanticIndex, _err);
@@ -1849,6 +1958,12 @@ namespace bgfx
#define DXBC_CHUNK_INPUT_SIGNATURE BX_MAKEFOURCC('I', 'S', 'G', 'N')
#define DXBC_CHUNK_OUTPUT_SIGNATURE BX_MAKEFOURCC('O', 'S', 'G', 'N')
+#define DXBC_CHUNK_SFI0 BX_MAKEFOURCC('S', 'F', 'I', '0')
+#define DXBC_CHUNK_SPDB BX_MAKEFOURCC('S', 'P', 'D', 'B')
+
+#define DXBC_CHUNK_RDEF BX_MAKEFOURCC('R', 'D', 'E', 'F')
+#define DXBC_CHUNK_STAT BX_MAKEFOURCC('S', 'T', 'A', 'T')
+
int32_t read(bx::ReaderSeekerI* _reader, DxbcContext& _dxbc, bx::Error* _err)
{
int32_t size = 0;
@@ -1867,6 +1982,7 @@ namespace bgfx
uint32_t fourcc;
size += bx::read(_reader, fourcc, _err);
+ _dxbc.chunksFourcc[ii] = fourcc;
uint32_t chunkSize;
size += bx::read(_reader, chunkSize, _err);
@@ -1896,12 +2012,27 @@ namespace bgfx
_dxbc.shader.aon9 = true;
break;
+ case DXBC_CHUNK_SFI0: // ?
+ BX_ASSERT(chunkSize == sizeof(_dxbc.sfi0.data),
+ "Unexpected size of SFI0 chunk");
+
+ size += bx::read(_reader, _dxbc.sfi0.data, _err);
+ break;
+
+ case DXBC_CHUNK_SPDB: // Shader debugging info (new).
+ _dxbc.spdb.debugCode.resize(chunkSize);
+ size += bx::read(_reader, _dxbc.spdb.debugCode.data(), chunkSize, _err);
+ break;
+ case DXBC_CHUNK_RDEF: // Resource definition.
+ _dxbc.rdef.rdefCode.resize(chunkSize);
+ size += bx::read(_reader, _dxbc.rdef.rdefCode.data(), chunkSize, _err);
+ break;
+ case DXBC_CHUNK_STAT: // Statistics.
+ _dxbc.stat.statCode.resize(chunkSize);
+ size += bx::read(_reader, _dxbc.stat.statCode.data(), chunkSize, _err);
+ break;
case BX_MAKEFOURCC('I', 'F', 'C', 'E'): // Interface.
- case BX_MAKEFOURCC('R', 'D', 'E', 'F'): // Resource definition.
case BX_MAKEFOURCC('S', 'D', 'G', 'B'): // Shader debugging info (old).
- case BX_MAKEFOURCC('S', 'P', 'D', 'B'): // Shader debugging info (new).
- case BX_MAKEFOURCC('S', 'F', 'I', '0'): // ?
- case BX_MAKEFOURCC('S', 'T', 'A', 'T'): // Statistics.
case BX_MAKEFOURCC('P', 'C', 'S', 'G'): // Patch constant signature.
case BX_MAKEFOURCC('P', 'S', 'O', '1'): // Pipeline State Object 1
case BX_MAKEFOURCC('P', 'S', 'O', '2'): // Pipeline State Object 2
@@ -1912,7 +2043,7 @@ namespace bgfx
default:
size += chunkSize;
- BX_CHECK(false, "UNKNOWN FOURCC %c%c%c%c %d"
+ BX_ASSERT(false, "UNKNOWN FOURCC %c%c%c%c %d"
, ( (char*)&fourcc)[0]
, ( (char*)&fourcc)[1]
, ( (char*)&fourcc)[2]
@@ -1930,8 +2061,32 @@ namespace bgfx
{
int32_t size = 0;
+ uint32_t numSupportedChunks = 0;
+ for (uint32_t ii = 0; ii < _dxbc.header.numChunks; ++ii)
+ {
+ switch(_dxbc.chunksFourcc[ii])
+ {
+ case DXBC_CHUNK_SHADER_EX:
+ case DXBC_CHUNK_SHADER:
+ case BX_MAKEFOURCC('I', 'S', 'G', '1'):
+ case DXBC_CHUNK_INPUT_SIGNATURE:
+ case BX_MAKEFOURCC('O', 'S', 'G', '1'):
+ case BX_MAKEFOURCC('O', 'S', 'G', '5'):
+ case DXBC_CHUNK_OUTPUT_SIGNATURE:
+ case DXBC_CHUNK_SFI0:
+ case DXBC_CHUNK_SPDB:
+ case DXBC_CHUNK_RDEF:
+ case DXBC_CHUNK_STAT:
+ ++numSupportedChunks;
+ break;
+
+ default:
+ break;
+ }
+ }
+
int64_t dxbcOffset = bx::seek(_writer);
- size += bx::write(_writer, DXBC_CHUNK_HEADER);
+ size += bx::write(_writer, DXBC_CHUNK_HEADER, _err);
size += bx::writeRep(_writer, 0, 16, _err);
@@ -1940,35 +2095,96 @@ namespace bgfx
int64_t sizeOffset = bx::seek(_writer);
size += bx::writeRep(_writer, 0, 4, _err);
- uint32_t numChunks = 3;
- size += bx::write(_writer, numChunks, _err);
+ size += bx::write(_writer, numSupportedChunks, _err);
int64_t chunksOffsets = bx::seek(_writer);
- size += bx::writeRep(_writer, 0, numChunks*sizeof(uint32_t), _err);
-
- uint32_t chunkOffset[3];
- uint32_t chunkSize[3];
-
- chunkOffset[0] = uint32_t(bx::seek(_writer) - dxbcOffset);
- size += write(_writer, DXBC_CHUNK_INPUT_SIGNATURE, _err);
- size += write(_writer, UINT32_C(0), _err);
- chunkSize[0] = write(_writer, _dxbc.inputSignature, _err);
-
- chunkOffset[1] = uint32_t(bx::seek(_writer) - dxbcOffset);
- size += write(_writer, DXBC_CHUNK_OUTPUT_SIGNATURE, _err);
- size += write(_writer, UINT32_C(0), _err);
- chunkSize[1] = write(_writer, _dxbc.outputSignature, _err);
-
- chunkOffset[2] = uint32_t(bx::seek(_writer) - dxbcOffset);
- size += write(_writer, _dxbc.shader.shex ? DXBC_CHUNK_SHADER_EX : DXBC_CHUNK_SHADER, _err);
- size += write(_writer, UINT32_C(0), _err);
- chunkSize[2] = write(_writer, _dxbc.shader, _err);
-
- size += 0
- + chunkSize[0]
- + chunkSize[1]
- + chunkSize[2]
- ;
+ size += bx::writeRep(_writer, 0, numSupportedChunks*sizeof(uint32_t), _err);
+
+ uint32_t chunkOffset[DXBC_MAX_CHUNKS] = {};
+ uint32_t chunkSize[DXBC_MAX_CHUNKS] = {};
+
+ for (uint32_t ii = 0, idx = 0; ii < _dxbc.header.numChunks; ++ii)
+ {
+ switch (_dxbc.chunksFourcc[ii])
+ {
+ case DXBC_CHUNK_SHADER_EX:
+ case DXBC_CHUNK_SHADER:
+ chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
+ size += bx::write(_writer, _dxbc.shader.shex ? DXBC_CHUNK_SHADER_EX : DXBC_CHUNK_SHADER, _err);
+ size += bx::write(_writer, UINT32_C(0), _err);
+ chunkSize[idx] = write(_writer, _dxbc.shader, _err);
+ size += chunkSize[idx++];
+ break;
+
+ 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, UINT32_C(0), _err);
+ chunkSize[idx] = write(_writer, _dxbc.inputSignature, _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, UINT32_C(0), _err);
+ chunkSize[idx] = write(_writer, _dxbc.outputSignature, _err);
+ size += chunkSize[idx++];
+ break;
+
+ case DXBC_CHUNK_SFI0:
+ chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
+ size += bx::write(_writer, DXBC_CHUNK_SFI0, _err);
+ size += bx::write(_writer, UINT32_C(0), _err);
+ chunkSize[idx] = bx::write(_writer, _dxbc.sfi0.data, _err);
+ size += chunkSize[idx++];
+ break;
+
+ case DXBC_CHUNK_SPDB: // Shader debugging info (new).
+ chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
+ size += bx::write(_writer, DXBC_CHUNK_SPDB, _err);
+ size += bx::write(_writer, UINT32_C(0), _err);
+ chunkSize[idx] = bx::write(_writer, _dxbc.spdb.debugCode.data(), int32_t(_dxbc.spdb.debugCode.size() ), _err);
+ size += chunkSize[idx++];
+ break;
+
+ case DXBC_CHUNK_RDEF: // Resource definition.
+ chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
+ size += bx::write(_writer, DXBC_CHUNK_RDEF, _err);
+ size += bx::write(_writer, uint32_t(_dxbc.rdef.rdefCode.size()), _err);
+ chunkSize[idx] = bx::write(_writer, _dxbc.rdef.rdefCode.data(), int32_t(_dxbc.rdef.rdefCode.size() ), _err);
+ size += chunkSize[idx++];
+ break;
+
+ case DXBC_CHUNK_STAT: // Statistics.
+ chunkOffset[idx] = uint32_t(bx::seek(_writer) - dxbcOffset);
+ size += bx::write(_writer, DXBC_CHUNK_STAT, _err);
+ size += bx::write(_writer, uint32_t(_dxbc.stat.statCode.size()), _err);
+ chunkSize[idx] = bx::write(_writer, _dxbc.stat.statCode.data(), int32_t(_dxbc.stat.statCode.size() ), _err);
+ size += chunkSize[idx++];
+ break;
+
+ case BX_MAKEFOURCC('A', 'o', 'n', '9'): // Contains DX9BC for feature level 9.x (*s_4_0_level_9_*) shaders.
+ case BX_MAKEFOURCC('I', 'F', 'C', 'E'): // Interface.
+ case BX_MAKEFOURCC('S', 'D', 'G', 'B'): // Shader debugging info (old).
+ case BX_MAKEFOURCC('P', 'C', 'S', 'G'): // Patch constant signature.
+ case BX_MAKEFOURCC('P', 'S', 'O', '1'): // Pipeline State Object 1
+ case BX_MAKEFOURCC('P', 'S', 'O', '2'): // Pipeline State Object 2
+ case BX_MAKEFOURCC('X', 'N', 'A', 'P'): // ?
+ case BX_MAKEFOURCC('X', 'N', 'A', 'S'): // ?
+ default:
+ BX_ASSERT(false, "Writing of DXBC %c%c%c%c chunk unsupported"
+ , ( (char*)&_dxbc.chunksFourcc[ii])[0]
+ , ( (char*)&_dxbc.chunksFourcc[ii])[1]
+ , ( (char*)&_dxbc.chunksFourcc[ii])[2]
+ , ( (char*)&_dxbc.chunksFourcc[ii])[3]
+ );
+ break;
+ }
+ }
int64_t eof = bx::seek(_writer);
@@ -1976,9 +2192,9 @@ namespace bgfx
bx::write(_writer, size, _err);
bx::seek(_writer, chunksOffsets, bx::Whence::Begin);
- bx::write(_writer, chunkOffset, sizeof(chunkOffset), _err);
+ bx::write(_writer, chunkOffset, numSupportedChunks*sizeof(chunkOffset[0]), _err);
- for (uint32_t ii = 0; ii < BX_COUNTOF(chunkOffset); ++ii)
+ for (uint32_t ii = 0; ii < numSupportedChunks; ++ii)
{
bx::seek(_writer, chunkOffset[ii]+4, bx::Whence::Begin);
bx::write(_writer, chunkSize[ii], _err);
@@ -1999,7 +2215,7 @@ namespace bgfx
{
DxbcInstruction instruction;
uint32_t size = read(&reader, instruction, _err);
- BX_CHECK(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
+ BX_ASSERT(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
bool cont = _fn(token * sizeof(uint32_t), instruction, _userData);
if (!cont)
@@ -2026,7 +2242,7 @@ namespace bgfx
{
DxbcInstruction instruction;
uint32_t size = read(&reader, instruction, _err);
- BX_CHECK(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
+ BX_ASSERT(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
_fn(instruction, _userData);