mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2025-03-23 05:15:28 -04:00
Spir-V WIP.
This commit is contained in:
parent
5fab86f3ef
commit
e14c5b1c3e
8 changed files with 909 additions and 613 deletions
|
@ -3728,8 +3728,9 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
{
|
{
|
||||||
bx::MemoryReader rd(_code, _size);
|
bx::MemoryReader rd(_code, _size);
|
||||||
|
|
||||||
|
bx::Error err;
|
||||||
DxbcContext dxbc;
|
DxbcContext dxbc;
|
||||||
read(&rd, dxbc);
|
read(&rd, dxbc, &err);
|
||||||
|
|
||||||
struct FindDepthOp
|
struct FindDepthOp
|
||||||
{
|
{
|
||||||
|
|
|
@ -2238,7 +2238,8 @@ data.NumQualityLevels = 0;
|
||||||
bx::StaticMemoryBlockWriter wr(temp->data, temp->size);
|
bx::StaticMemoryBlockWriter wr(temp->data, temp->size);
|
||||||
|
|
||||||
DxbcContext dxbc;
|
DxbcContext dxbc;
|
||||||
read(&rd, dxbc);
|
bx::Error err;
|
||||||
|
read(&rd, dxbc, &err);
|
||||||
|
|
||||||
bool patchShader = true;
|
bool patchShader = true;
|
||||||
if (BX_ENABLED(BGFX_CONFIG_DEBUG) )
|
if (BX_ENABLED(BGFX_CONFIG_DEBUG) )
|
||||||
|
@ -2246,7 +2247,7 @@ data.NumQualityLevels = 0;
|
||||||
union { uint32_t offset; void* ptr; } cast = { 0 };
|
union { uint32_t offset; void* ptr; } cast = { 0 };
|
||||||
filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr);
|
filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr);
|
||||||
|
|
||||||
write(&wr, dxbc);
|
write(&wr, dxbc, &err);
|
||||||
|
|
||||||
dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4);
|
dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4);
|
||||||
|
|
||||||
|
@ -2280,7 +2281,7 @@ data.NumQualityLevels = 0;
|
||||||
uint32_t(program.m_vsh->m_size)/16
|
uint32_t(program.m_vsh->m_size)/16
|
||||||
};
|
};
|
||||||
filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr);
|
filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr);
|
||||||
write(&wr, dxbc);
|
write(&wr, dxbc, &err);
|
||||||
dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4);
|
dxbcHash(temp->data + 20, temp->size - 20, temp->data + 4);
|
||||||
|
|
||||||
desc.PS.pShaderBytecode = temp->data;
|
desc.PS.pShaderBytecode = temp->data;
|
||||||
|
|
|
@ -274,12 +274,12 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
BX_STATIC_ASSERT(BX_COUNTOF(s_dx9bcDeclUsage) == Dx9bcDeclUsage::Count);
|
BX_STATIC_ASSERT(BX_COUNTOF(s_dx9bcDeclUsage) == Dx9bcDeclUsage::Count);
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, Dx9bcSubOperand& _subOperand)
|
int32_t read(bx::ReaderI* _reader, Dx9bcSubOperand& _subOperand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
uint32_t token;
|
uint32_t token;
|
||||||
size += bx::read(_reader, token);
|
size += bx::read(_reader, token, _err);
|
||||||
|
|
||||||
_subOperand.type = Dx9bcOperandType::Enum( ( (token & UINT32_C(0x70000000) ) >> 28)
|
_subOperand.type = Dx9bcOperandType::Enum( ( (token & UINT32_C(0x70000000) ) >> 28)
|
||||||
| ( (token & UINT32_C(0x00001800) ) >> 8) );
|
| ( (token & UINT32_C(0x00001800) ) >> 8) );
|
||||||
|
@ -289,7 +289,7 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const Dx9bcSubOperand& _subOperand)
|
int32_t write(bx::WriterI* _writer, const Dx9bcSubOperand& _subOperand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
|
@ -298,17 +298,17 @@ namespace bgfx
|
||||||
token |= (_subOperand.type << 8) & UINT32_C(0x00001800);
|
token |= (_subOperand.type << 8) & UINT32_C(0x00001800);
|
||||||
token |= _subOperand.regIndex & UINT32_C(0x000007ff);
|
token |= _subOperand.regIndex & UINT32_C(0x000007ff);
|
||||||
token |= (_subOperand.swizzleBits << 16) & UINT32_C(0x00ff0000);
|
token |= (_subOperand.swizzleBits << 16) & UINT32_C(0x00ff0000);
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token, _err);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, Dx9bcOperand& _operand)
|
int32_t read(bx::ReaderI* _reader, Dx9bcOperand& _operand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
uint32_t token;
|
uint32_t token;
|
||||||
size += bx::read(_reader, token);
|
size += bx::read(_reader, token, _err);
|
||||||
|
|
||||||
_operand.type = Dx9bcOperandType::Enum( ( (token & UINT32_C(0x70000000) ) >> 28)
|
_operand.type = Dx9bcOperandType::Enum( ( (token & UINT32_C(0x70000000) ) >> 28)
|
||||||
| ( (token & UINT32_C(0x00001800) ) >> 8) );
|
| ( (token & UINT32_C(0x00001800) ) >> 8) );
|
||||||
|
@ -339,13 +339,13 @@ namespace bgfx
|
||||||
|
|
||||||
if (Dx9bcOperandAddrMode::Relative == _operand.addrMode)
|
if (Dx9bcOperandAddrMode::Relative == _operand.addrMode)
|
||||||
{
|
{
|
||||||
size += read(_reader, _operand.subOperand);
|
size += read(_reader, _operand.subOperand, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const Dx9bcOperand& _operand)
|
int32_t write(bx::WriterI* _writer, const Dx9bcOperand& _operand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
|
@ -354,22 +354,22 @@ namespace bgfx
|
||||||
token |= (_operand.type << 8) & UINT32_C(0x00001800);
|
token |= (_operand.type << 8) & UINT32_C(0x00001800);
|
||||||
token |= _operand.regIndex & UINT32_C(0x000007ff);
|
token |= _operand.regIndex & UINT32_C(0x000007ff);
|
||||||
token |= (_operand.addrMode << 13) & UINT32_C(0x00002000);
|
token |= (_operand.addrMode << 13) & UINT32_C(0x00002000);
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token, _err);
|
||||||
|
|
||||||
if (Dx9bcOperandAddrMode::Relative == _operand.addrMode)
|
if (Dx9bcOperandAddrMode::Relative == _operand.addrMode)
|
||||||
{
|
{
|
||||||
size += write(_writer, _operand.subOperand);
|
size += write(_writer, _operand.subOperand, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, Dx9bcInstruction& _instruction)
|
int32_t read(bx::ReaderI* _reader, Dx9bcInstruction& _instruction, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
uint32_t token;
|
uint32_t token;
|
||||||
size += bx::read(_reader, token);
|
size += bx::read(_reader, token, _err);
|
||||||
|
|
||||||
_instruction.opcode = Dx9bcOpcode::Enum( (token & UINT32_C(0x0000ffff) ) );
|
_instruction.opcode = Dx9bcOpcode::Enum( (token & UINT32_C(0x0000ffff) ) );
|
||||||
|
|
||||||
|
@ -395,7 +395,7 @@ namespace bgfx
|
||||||
for (int32_t ii = 0, num = _instruction.length-1; ii < num; ++ii)
|
for (int32_t ii = 0, num = _instruction.length-1; ii < num; ++ii)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
uint32_t tmp;
|
||||||
size += bx::read(_reader, tmp);
|
size += bx::read(_reader, tmp, _err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,24 +436,24 @@ namespace bgfx
|
||||||
if (valuesBeforeOpcode
|
if (valuesBeforeOpcode
|
||||||
&& 0 < info.numValues)
|
&& 0 < info.numValues)
|
||||||
{
|
{
|
||||||
size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t) );
|
size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t), _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
_instruction.operand[0].destination = true;
|
_instruction.operand[0].destination = true;
|
||||||
|
|
||||||
switch (_instruction.numOperands)
|
switch (_instruction.numOperands)
|
||||||
{
|
{
|
||||||
case 6: size += read(_reader, _instruction.operand[currOp++]);
|
case 6: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 5: size += read(_reader, _instruction.operand[currOp++]);
|
case 5: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 4: size += read(_reader, _instruction.operand[currOp++]);
|
case 4: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 3: size += read(_reader, _instruction.operand[currOp++]);
|
case 3: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 2: size += read(_reader, _instruction.operand[currOp++]);
|
case 2: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 1: size += read(_reader, _instruction.operand[currOp++]);
|
case 1: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 0:
|
case 0:
|
||||||
if (!valuesBeforeOpcode
|
if (!valuesBeforeOpcode
|
||||||
&& 0 < info.numValues)
|
&& 0 < info.numValues)
|
||||||
{
|
{
|
||||||
size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t) );
|
size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t), _err);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const Dx9bcInstruction& _instruction)
|
int32_t write(bx::WriterI* _writer, const Dx9bcInstruction& _instruction, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
|
@ -477,17 +477,17 @@ namespace bgfx
|
||||||
token |= _instruction.opcode & UINT32_C(0x0000ffff);
|
token |= _instruction.opcode & UINT32_C(0x0000ffff);
|
||||||
token |= (_instruction.specific << 16) & UINT32_C(0x00ff0000);
|
token |= (_instruction.specific << 16) & UINT32_C(0x00ff0000);
|
||||||
token |= ( (_instruction.length - 1) << 24) & UINT32_C(0x0f000000);
|
token |= ( (_instruction.length - 1) << 24) & UINT32_C(0x0f000000);
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token, _err);
|
||||||
|
|
||||||
uint32_t currOp = 0;
|
uint32_t currOp = 0;
|
||||||
switch (_instruction.numOperands)
|
switch (_instruction.numOperands)
|
||||||
{
|
{
|
||||||
case 6: size += write(_writer, _instruction.operand[currOp++]);
|
case 6: size += write(_writer, _instruction.operand[currOp++], _err);
|
||||||
case 5: size += write(_writer, _instruction.operand[currOp++]);
|
case 5: size += write(_writer, _instruction.operand[currOp++], _err);
|
||||||
case 4: size += write(_writer, _instruction.operand[currOp++]);
|
case 4: size += write(_writer, _instruction.operand[currOp++], _err);
|
||||||
case 3: size += write(_writer, _instruction.operand[currOp++]);
|
case 3: size += write(_writer, _instruction.operand[currOp++], _err);
|
||||||
case 2: size += write(_writer, _instruction.operand[currOp++]);
|
case 2: size += write(_writer, _instruction.operand[currOp++], _err);
|
||||||
case 1: size += write(_writer, _instruction.operand[currOp++]);
|
case 1: size += write(_writer, _instruction.operand[currOp++], _err);
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -626,7 +626,7 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, Dx9bcShader& _shader)
|
int32_t read(bx::ReaderSeekerI* _reader, Dx9bcShader& _shader, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
int64_t offset = bx::seek(_reader);
|
int64_t offset = bx::seek(_reader);
|
||||||
|
@ -634,7 +634,7 @@ namespace bgfx
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
Dx9bcInstruction instruction;
|
Dx9bcInstruction instruction;
|
||||||
int32_t length = read(_reader, instruction);
|
int32_t length = read(_reader, instruction, _err);
|
||||||
size += length;
|
size += length;
|
||||||
|
|
||||||
if (Dx9bcOpcode::Count > instruction.opcode)
|
if (Dx9bcOpcode::Count > instruction.opcode)
|
||||||
|
@ -662,22 +662,22 @@ namespace bgfx
|
||||||
bx::seek(_reader, offset, bx::Whence::Begin);
|
bx::seek(_reader, offset, bx::Whence::Begin);
|
||||||
|
|
||||||
_shader.byteCode.resize(size);
|
_shader.byteCode.resize(size);
|
||||||
bx::read(_reader, _shader.byteCode.data(), size);
|
bx::read(_reader, _shader.byteCode.data(), size, _err);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const Dx9bcShader& _shader)
|
int32_t write(bx::WriterI* _writer, const Dx9bcShader& _shader, bx::Error* _err)
|
||||||
{
|
{
|
||||||
BX_UNUSED(_writer, _shader);
|
BX_UNUSED(_writer, _shader, _err);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, Dx9bc& _bc)
|
int32_t read(bx::ReaderSeekerI* _reader, Dx9bc& _bc, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
size += bx::read(_reader, _bc.version);
|
size += bx::read(_reader, _bc.version, _err);
|
||||||
|
|
||||||
bool pixelShader = (0xffff0000 == (_bc.version & 0xffff0000) );
|
bool pixelShader = (0xffff0000 == (_bc.version & 0xffff0000) );
|
||||||
uint32_t versionMajor = (_bc.version>>8)&0xff;
|
uint32_t versionMajor = (_bc.version>>8)&0xff;
|
||||||
|
@ -689,27 +689,29 @@ namespace bgfx
|
||||||
, versionMinor
|
, versionMinor
|
||||||
);
|
);
|
||||||
|
|
||||||
size += read(_reader, _bc.shader);
|
size += read(_reader, _bc.shader, _err);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterSeekerI* _writer, const Dx9bc& _dxbc)
|
int32_t write(bx::WriterSeekerI* _writer, const Dx9bc& _dxbc, bx::Error* _err)
|
||||||
{
|
{
|
||||||
BX_UNUSED(_writer, _dxbc);
|
BX_UNUSED(_writer, _dxbc, _err);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse(const Dx9bcShader& _src, Dx9bcParseFn _fn, void* _userData)
|
void parse(const Dx9bcShader& _src, Dx9bcParseFn _fn, void* _userData, bx::Error* _err)
|
||||||
{
|
{
|
||||||
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
||||||
|
|
||||||
//BX_TRACE("parse %d", _src.byteCode.size());
|
bx::Error err;
|
||||||
|
|
||||||
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
||||||
{
|
{
|
||||||
Dx9bcInstruction instruction;
|
Dx9bcInstruction instruction;
|
||||||
uint32_t size = read(&reader, 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_CHECK(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
|
||||||
|
|
||||||
bool cont = _fn(token * sizeof(uint32_t), instruction, _userData);
|
bool cont = _fn(token * sizeof(uint32_t), instruction, _userData);
|
||||||
|
@ -722,8 +724,10 @@ namespace bgfx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void filter(Dx9bcShader& _dst, const Dx9bcShader& _src, Dx9bcFilterFn _fn, void* _userData)
|
void filter(Dx9bcShader& _dst, const Dx9bcShader& _src, Dx9bcFilterFn _fn, void* _userData, bx::Error* _err)
|
||||||
{
|
{
|
||||||
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
||||||
|
|
||||||
bx::MemoryBlock mb(g_allocator);
|
bx::MemoryBlock mb(g_allocator);
|
||||||
|
@ -732,7 +736,7 @@ namespace bgfx
|
||||||
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
||||||
{
|
{
|
||||||
Dx9bcInstruction instruction;
|
Dx9bcInstruction instruction;
|
||||||
uint32_t size = read(&reader, 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_CHECK(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
|
||||||
|
|
||||||
_fn(instruction, _userData);
|
_fn(instruction, _userData);
|
||||||
|
|
|
@ -226,8 +226,8 @@ namespace bgfx
|
||||||
int32_t value[4];
|
int32_t value[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, Dx9bcInstruction& _instruction);
|
int32_t read(bx::ReaderI* _reader, Dx9bcInstruction& _instruction, bx::Error* _err);
|
||||||
int32_t write(bx::WriterI* _writer, const Dx9bcInstruction& _instruction);
|
int32_t write(bx::WriterI* _writer, const Dx9bcInstruction& _instruction, bx::Error* _err);
|
||||||
int32_t toString(char* _out, int32_t _size, const Dx9bcInstruction& _instruction);
|
int32_t toString(char* _out, int32_t _size, const Dx9bcInstruction& _instruction);
|
||||||
|
|
||||||
struct Dx9bcShader
|
struct Dx9bcShader
|
||||||
|
@ -235,8 +235,8 @@ namespace bgfx
|
||||||
stl::vector<uint8_t> byteCode;
|
stl::vector<uint8_t> byteCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, Dx9bcShader& _shader);
|
int32_t read(bx::ReaderSeekerI* _reader, Dx9bcShader& _shader, bx::Error* _err);
|
||||||
int32_t write(bx::WriterI* _writer, const Dx9bcShader& _shader);
|
int32_t write(bx::WriterI* _writer, const Dx9bcShader& _shader, bx::Error* _err);
|
||||||
|
|
||||||
struct Dx9bc
|
struct Dx9bc
|
||||||
{
|
{
|
||||||
|
@ -244,14 +244,14 @@ namespace bgfx
|
||||||
Dx9bcShader shader;
|
Dx9bcShader shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, Dx9bc& _dx9bc);
|
int32_t read(bx::ReaderSeekerI* _reader, Dx9bc& _dx9bc, bx::Error* _err);
|
||||||
int32_t write(bx::WriterSeekerI* _writer, const Dx9bc& _dx9bc);
|
int32_t write(bx::WriterSeekerI* _writer, const Dx9bc& _dx9bc, bx::Error* _err);
|
||||||
|
|
||||||
typedef bool (*Dx9bcParseFn)(uint32_t _offset, const Dx9bcInstruction& _instruction, void* _userData);
|
typedef bool (*Dx9bcParseFn)(uint32_t _offset, const Dx9bcInstruction& _instruction, void* _userData);
|
||||||
void parse(const Dx9bcShader& _src, Dx9bcParseFn _fn, void* _userData);
|
void parse(const Dx9bcShader& _src, Dx9bcParseFn _fn, void* _userData, bx::Error* _err = NULL);
|
||||||
|
|
||||||
typedef void (*Dx9bcFilterFn)(Dx9bcInstruction& _instruction, void* _userData);
|
typedef void (*Dx9bcFilterFn)(Dx9bcInstruction& _instruction, void* _userData);
|
||||||
void filter(Dx9bcShader& _dst, const Dx9bcShader& _src, Dx9bcFilterFn _fn, void* _userData);
|
void filter(Dx9bcShader& _dst, const Dx9bcShader& _src, Dx9bcFilterFn _fn, void* _userData, bx::Error* _err = NULL);
|
||||||
|
|
||||||
} // namespace bgfx
|
} // namespace bgfx
|
||||||
|
|
||||||
|
|
|
@ -552,7 +552,7 @@ namespace bgfx
|
||||||
|
|
||||||
#define DXBC_MAX_NAME_STRING 512
|
#define DXBC_MAX_NAME_STRING 512
|
||||||
|
|
||||||
int32_t readString(bx::ReaderSeekerI* _reader, int64_t _offset, char* _out, uint32_t _max = DXBC_MAX_NAME_STRING)
|
int32_t readString(bx::ReaderSeekerI* _reader, int64_t _offset, char* _out, uint32_t _max, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int64_t oldOffset = bx::seek(_reader);
|
int64_t oldOffset = bx::seek(_reader);
|
||||||
bx::seek(_reader, _offset, bx::Whence::Begin);
|
bx::seek(_reader, _offset, bx::Whence::Begin);
|
||||||
|
@ -562,7 +562,7 @@ namespace bgfx
|
||||||
for (uint32_t ii = 0; ii < _max-1; ++ii)
|
for (uint32_t ii = 0; ii < _max-1; ++ii)
|
||||||
{
|
{
|
||||||
char ch;
|
char ch;
|
||||||
size += bx::read(_reader, ch);
|
size += bx::read(_reader, ch, _err);
|
||||||
*_out++ = ch;
|
*_out++ = ch;
|
||||||
|
|
||||||
if ('\0' == ch)
|
if ('\0' == ch)
|
||||||
|
@ -755,7 +755,7 @@ namespace bgfx
|
||||||
memcpy(_digest, hash, 16);
|
memcpy(_digest, hash, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, DxbcSubOperand& _subOperand)
|
int32_t read(bx::ReaderI* _reader, DxbcSubOperand& _subOperand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
uint32_t token;
|
uint32_t token;
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
@ -773,7 +773,7 @@ namespace bgfx
|
||||||
// |+------------------------------- addressing mode 2
|
// |+------------------------------- addressing mode 2
|
||||||
// +-------------------------------- extended
|
// +-------------------------------- extended
|
||||||
|
|
||||||
size += bx::read(_reader, token);
|
size += bx::read(_reader, token, _err);
|
||||||
_subOperand.type = DxbcOperandType::Enum( (token & UINT32_C(0x000ff000) ) >> 12);
|
_subOperand.type = DxbcOperandType::Enum( (token & UINT32_C(0x000ff000) ) >> 12);
|
||||||
_subOperand.numAddrModes = uint8_t( (token & UINT32_C(0x00300000) ) >> 20);
|
_subOperand.numAddrModes = uint8_t( (token & UINT32_C(0x00300000) ) >> 20);
|
||||||
_subOperand.addrMode = uint8_t( (token & UINT32_C(0x01c00000) ) >> 22);
|
_subOperand.addrMode = uint8_t( (token & UINT32_C(0x01c00000) ) >> 22);
|
||||||
|
@ -784,7 +784,7 @@ namespace bgfx
|
||||||
switch (_subOperand.addrMode)
|
switch (_subOperand.addrMode)
|
||||||
{
|
{
|
||||||
case DxbcOperandAddrMode::Imm32:
|
case DxbcOperandAddrMode::Imm32:
|
||||||
size += bx::read(_reader, _subOperand.regIndex);
|
size += bx::read(_reader, _subOperand.regIndex, _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandAddrMode::Reg:
|
case DxbcOperandAddrMode::Reg:
|
||||||
|
@ -796,7 +796,7 @@ namespace bgfx
|
||||||
|
|
||||||
case DxbcOperandAddrMode::RegImm32:
|
case DxbcOperandAddrMode::RegImm32:
|
||||||
{
|
{
|
||||||
size += bx::read(_reader, _subOperand.regIndex);
|
size += bx::read(_reader, _subOperand.regIndex, _err);
|
||||||
|
|
||||||
DxbcSubOperand subOperand;
|
DxbcSubOperand subOperand;
|
||||||
size += read(_reader, subOperand);
|
size += read(_reader, subOperand);
|
||||||
|
@ -805,8 +805,8 @@ namespace bgfx
|
||||||
|
|
||||||
case DxbcOperandAddrMode::RegImm64:
|
case DxbcOperandAddrMode::RegImm64:
|
||||||
{
|
{
|
||||||
size += bx::read(_reader, _subOperand.regIndex);
|
size += bx::read(_reader, _subOperand.regIndex, _err);
|
||||||
size += bx::read(_reader, _subOperand.regIndex);
|
size += bx::read(_reader, _subOperand.regIndex, _err);
|
||||||
|
|
||||||
DxbcSubOperand subOperand;
|
DxbcSubOperand subOperand;
|
||||||
size += read(_reader, subOperand);
|
size += read(_reader, subOperand);
|
||||||
|
@ -821,7 +821,7 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcSubOperand& _subOperand)
|
int32_t write(bx::WriterI* _writer, const DxbcSubOperand& _subOperand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
|
@ -832,12 +832,12 @@ namespace bgfx
|
||||||
token |= (_subOperand.mode << 2) & UINT32_C(0x0000000c);
|
token |= (_subOperand.mode << 2) & UINT32_C(0x0000000c);
|
||||||
token |= (_subOperand.modeBits << 4) & UINT32_C(0x00000ff0);
|
token |= (_subOperand.modeBits << 4) & UINT32_C(0x00000ff0);
|
||||||
token |= _subOperand.num & UINT32_C(0x00000003);
|
token |= _subOperand.num & UINT32_C(0x00000003);
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token, _err);
|
||||||
|
|
||||||
switch (_subOperand.addrMode)
|
switch (_subOperand.addrMode)
|
||||||
{
|
{
|
||||||
case DxbcOperandAddrMode::Imm32:
|
case DxbcOperandAddrMode::Imm32:
|
||||||
size += bx::write(_writer, _subOperand.regIndex);
|
size += bx::write(_writer, _subOperand.regIndex, _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandAddrMode::Reg:
|
case DxbcOperandAddrMode::Reg:
|
||||||
|
@ -849,7 +849,7 @@ namespace bgfx
|
||||||
|
|
||||||
case DxbcOperandAddrMode::RegImm32:
|
case DxbcOperandAddrMode::RegImm32:
|
||||||
{
|
{
|
||||||
size += bx::write(_writer, _subOperand.regIndex);
|
size += bx::write(_writer, _subOperand.regIndex, _err);
|
||||||
|
|
||||||
DxbcSubOperand subOperand;
|
DxbcSubOperand subOperand;
|
||||||
size += write(_writer, subOperand);
|
size += write(_writer, subOperand);
|
||||||
|
@ -858,8 +858,8 @@ namespace bgfx
|
||||||
|
|
||||||
case DxbcOperandAddrMode::RegImm64:
|
case DxbcOperandAddrMode::RegImm64:
|
||||||
{
|
{
|
||||||
size += bx::write(_writer, _subOperand.regIndex);
|
size += bx::write(_writer, _subOperand.regIndex, _err);
|
||||||
size += bx::write(_writer, _subOperand.regIndex);
|
size += bx::write(_writer, _subOperand.regIndex, _err);
|
||||||
|
|
||||||
DxbcSubOperand subOperand;
|
DxbcSubOperand subOperand;
|
||||||
size += write(_writer, subOperand);
|
size += write(_writer, subOperand);
|
||||||
|
@ -874,12 +874,12 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, DxbcOperand& _operand)
|
int32_t read(bx::ReaderI* _reader, DxbcOperand& _operand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
uint32_t token;
|
uint32_t token;
|
||||||
size += bx::read(_reader, token);
|
size += bx::read(_reader, token, _err);
|
||||||
|
|
||||||
// 0 1 2 3
|
// 0 1 2 3
|
||||||
// 76543210765432107654321076543210
|
// 76543210765432107654321076543210
|
||||||
|
@ -906,7 +906,7 @@ namespace bgfx
|
||||||
|
|
||||||
if (_operand.extended)
|
if (_operand.extended)
|
||||||
{
|
{
|
||||||
size += bx::read(_reader, _operand.extBits);
|
size += bx::read(_reader, _operand.extBits, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (_operand.type)
|
switch (_operand.type)
|
||||||
|
@ -915,7 +915,7 @@ namespace bgfx
|
||||||
_operand.num = 2 == _operand.num ? 4 : _operand.num;
|
_operand.num = 2 == _operand.num ? 4 : _operand.num;
|
||||||
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
||||||
{
|
{
|
||||||
size += bx::read(_reader, _operand.un.imm32[ii]);
|
size += bx::read(_reader, _operand.un.imm32[ii], _err);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -923,7 +923,7 @@ namespace bgfx
|
||||||
_operand.num = 2 == _operand.num ? 4 : _operand.num;
|
_operand.num = 2 == _operand.num ? 4 : _operand.num;
|
||||||
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
||||||
{
|
{
|
||||||
size += bx::read(_reader, _operand.un.imm64[ii]);
|
size += bx::read(_reader, _operand.un.imm64[ii], _err);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -936,16 +936,16 @@ namespace bgfx
|
||||||
switch (_operand.addrMode[ii])
|
switch (_operand.addrMode[ii])
|
||||||
{
|
{
|
||||||
case DxbcOperandAddrMode::Imm32:
|
case DxbcOperandAddrMode::Imm32:
|
||||||
size += bx::read(_reader, _operand.regIndex[ii]);
|
size += bx::read(_reader, _operand.regIndex[ii], _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandAddrMode::Reg:
|
case DxbcOperandAddrMode::Reg:
|
||||||
size += read(_reader, _operand.subOperand[ii]);
|
size += read(_reader, _operand.subOperand[ii], _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandAddrMode::RegImm32:
|
case DxbcOperandAddrMode::RegImm32:
|
||||||
size += bx::read(_reader, _operand.regIndex[ii]);
|
size += bx::read(_reader, _operand.regIndex[ii], _err);
|
||||||
size += read(_reader, _operand.subOperand[ii]);
|
size += read(_reader, _operand.subOperand[ii], _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -957,7 +957,7 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcOperand& _operand)
|
int32_t write(bx::WriterI* _writer, const DxbcOperand& _operand, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
|
@ -973,7 +973,7 @@ namespace bgfx
|
||||||
token |= (4 == _operand.num ? 2 : _operand.num) & UINT32_C(0x00000003);
|
token |= (4 == _operand.num ? 2 : _operand.num) & UINT32_C(0x00000003);
|
||||||
token |= ( (_operand.modeBits & "\x0f\xff\x03\x00"[_operand.mode]) << 4) & UINT32_C(0x00000ff0);
|
token |= ( (_operand.modeBits & "\x0f\xff\x03\x00"[_operand.mode]) << 4) & UINT32_C(0x00000ff0);
|
||||||
|
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token, _err);
|
||||||
|
|
||||||
if (_operand.extended)
|
if (_operand.extended)
|
||||||
{
|
{
|
||||||
|
@ -985,14 +985,14 @@ namespace bgfx
|
||||||
case DxbcOperandType::Imm32:
|
case DxbcOperandType::Imm32:
|
||||||
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
||||||
{
|
{
|
||||||
size += bx::write(_writer, _operand.un.imm32[ii]);
|
size += bx::write(_writer, _operand.un.imm32[ii], _err);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandType::Imm64:
|
case DxbcOperandType::Imm64:
|
||||||
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
for (uint32_t ii = 0; ii < _operand.num; ++ii)
|
||||||
{
|
{
|
||||||
size += bx::write(_writer, _operand.un.imm64[ii]);
|
size += bx::write(_writer, _operand.un.imm64[ii], _err);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1005,16 +1005,16 @@ namespace bgfx
|
||||||
switch (_operand.addrMode[ii])
|
switch (_operand.addrMode[ii])
|
||||||
{
|
{
|
||||||
case DxbcOperandAddrMode::Imm32:
|
case DxbcOperandAddrMode::Imm32:
|
||||||
size += bx::write(_writer, _operand.regIndex[ii]);
|
size += bx::write(_writer, _operand.regIndex[ii], _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandAddrMode::Reg:
|
case DxbcOperandAddrMode::Reg:
|
||||||
size += write(_writer, _operand.subOperand[ii]);
|
size += write(_writer, _operand.subOperand[ii], _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DxbcOperandAddrMode::RegImm32:
|
case DxbcOperandAddrMode::RegImm32:
|
||||||
size += bx::write(_writer, _operand.regIndex[ii]);
|
size += bx::write(_writer, _operand.regIndex[ii], _err);
|
||||||
size += write(_writer, _operand.subOperand[ii]);
|
size += write(_writer, _operand.subOperand[ii], _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1026,12 +1026,12 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, DxbcInstruction& _instruction)
|
int32_t read(bx::ReaderI* _reader, DxbcInstruction& _instruction, bx::Error* _err)
|
||||||
{
|
{
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
|
|
||||||
uint32_t token;
|
uint32_t token;
|
||||||
size += bx::read(_reader, token);
|
size += bx::read(_reader, token, _err);
|
||||||
|
|
||||||
// 0 1 2 3
|
// 0 1 2 3
|
||||||
// 76543210765432107654321076543210
|
// 76543210765432107654321076543210
|
||||||
|
@ -1077,7 +1077,7 @@ namespace bgfx
|
||||||
for (uint32_t ii = 0, num = (_instruction.length-2)/4; ii < num; ++ii)
|
for (uint32_t ii = 0, num = (_instruction.length-2)/4; ii < num; ++ii)
|
||||||
{
|
{
|
||||||
char temp[16];
|
char temp[16];
|
||||||
size += bx::read(_reader, temp, 16);
|
size += bx::read(_reader, temp, 16, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1190,7 +1190,7 @@ namespace bgfx
|
||||||
uint32_t extBits;
|
uint32_t extBits;
|
||||||
size += bx::read(_reader, extBits);
|
size += bx::read(_reader, extBits);
|
||||||
extended = 0 != (extBits & UINT32_C(0x80000000) );
|
extended = 0 != (extBits & UINT32_C(0x80000000) );
|
||||||
_instruction.extended[ii] = DxbcInstruction::ExtendedType::Enum(extBits & UINT32_C(0x0000001f) );
|
_instruction.extended[ii ] = DxbcInstruction::ExtendedType::Enum(extBits & UINT32_C(0x0000001f) );
|
||||||
_instruction.extended[ii+1] = DxbcInstruction::ExtendedType::Count;
|
_instruction.extended[ii+1] = DxbcInstruction::ExtendedType::Count;
|
||||||
|
|
||||||
switch (_instruction.extended[ii])
|
switch (_instruction.extended[ii])
|
||||||
|
@ -1244,7 +1244,7 @@ namespace bgfx
|
||||||
case DxbcOpcode::DCL_FUNCTION_TABLE:
|
case DxbcOpcode::DCL_FUNCTION_TABLE:
|
||||||
{
|
{
|
||||||
uint32_t tableId;
|
uint32_t tableId;
|
||||||
size += read(_reader, tableId);
|
size += read(_reader, tableId, _err);
|
||||||
|
|
||||||
uint32_t num;
|
uint32_t num;
|
||||||
size += read(_reader, num);
|
size += read(_reader, num);
|
||||||
|
@ -1252,7 +1252,7 @@ namespace bgfx
|
||||||
for (uint32_t ii = 0; ii < num; ++ii)
|
for (uint32_t ii = 0; ii < num; ++ii)
|
||||||
{
|
{
|
||||||
uint32_t bodyId;
|
uint32_t bodyId;
|
||||||
size += read(_reader, bodyId);
|
size += read(_reader, bodyId, _err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1260,10 +1260,10 @@ namespace bgfx
|
||||||
case DxbcOpcode::DCL_INTERFACE:
|
case DxbcOpcode::DCL_INTERFACE:
|
||||||
{
|
{
|
||||||
uint32_t interfaceId;
|
uint32_t interfaceId;
|
||||||
size += read(_reader, interfaceId);
|
size += read(_reader, interfaceId, _err);
|
||||||
|
|
||||||
uint32_t num;
|
uint32_t num;
|
||||||
size += read(_reader, num);
|
size += read(_reader, num, _err);
|
||||||
|
|
||||||
BX_CHECK(false, "not implemented.");
|
BX_CHECK(false, "not implemented.");
|
||||||
}
|
}
|
||||||
|
@ -1279,16 +1279,16 @@ namespace bgfx
|
||||||
_instruction.numOperands = info.numOperands;
|
_instruction.numOperands = info.numOperands;
|
||||||
switch (info.numOperands)
|
switch (info.numOperands)
|
||||||
{
|
{
|
||||||
case 6: size += read(_reader, _instruction.operand[currOp++]);
|
case 6: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 5: size += read(_reader, _instruction.operand[currOp++]);
|
case 5: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 4: size += read(_reader, _instruction.operand[currOp++]);
|
case 4: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 3: size += read(_reader, _instruction.operand[currOp++]);
|
case 3: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 2: size += read(_reader, _instruction.operand[currOp++]);
|
case 2: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 1: size += read(_reader, _instruction.operand[currOp++]);
|
case 1: size += read(_reader, _instruction.operand[currOp++], _err);
|
||||||
case 0:
|
case 0:
|
||||||
if (0 < info.numValues)
|
if (0 < info.numValues)
|
||||||
{
|
{
|
||||||
size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t) );
|
size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t), _err);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1304,7 +1304,7 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcInstruction& _instruction)
|
int32_t write(bx::WriterI* _writer, const DxbcInstruction& _instruction, bx::Error* _err)
|
||||||
{
|
{
|
||||||
uint32_t token = 0;
|
uint32_t token = 0;
|
||||||
token |= (_instruction.opcode ) & UINT32_C(0x000007ff);
|
token |= (_instruction.opcode ) & UINT32_C(0x000007ff);
|
||||||
|
@ -1366,7 +1366,7 @@ namespace bgfx
|
||||||
|
|
||||||
uint32_t size =0;
|
uint32_t size =0;
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token);
|
||||||
;
|
|
||||||
for (uint32_t ii = 0; _instruction.extended[ii] != DxbcInstruction::ExtendedType::Count; ++ii)
|
for (uint32_t ii = 0; _instruction.extended[ii] != DxbcInstruction::ExtendedType::Count; ++ii)
|
||||||
{
|
{
|
||||||
// 0 1 2 3
|
// 0 1 2 3
|
||||||
|
@ -1427,18 +1427,18 @@ namespace bgfx
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
size += bx::write(_writer, token);
|
size += bx::write(_writer, token, _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t ii = 0; ii < _instruction.numOperands; ++ii)
|
for (uint32_t ii = 0; ii < _instruction.numOperands; ++ii)
|
||||||
{
|
{
|
||||||
size += write(_writer, _instruction.operand[ii]);
|
size += write(_writer, _instruction.operand[ii], _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
const DxbcOpcodeInfo& info = s_dxbcOpcodeInfo[_instruction.opcode];
|
const DxbcOpcodeInfo& info = s_dxbcOpcodeInfo[_instruction.opcode];
|
||||||
if (0 < info.numValues)
|
if (0 < info.numValues)
|
||||||
{
|
{
|
||||||
size += bx::write(_writer, _instruction.value, info.numValues*sizeof(uint32_t) );
|
size += bx::write(_writer, _instruction.value, info.numValues*sizeof(uint32_t), _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
|
@ -1609,15 +1609,15 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature)
|
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
int64_t offset = bx::seek(_reader);
|
int64_t offset = bx::seek(_reader);
|
||||||
|
|
||||||
uint32_t num;
|
uint32_t num;
|
||||||
size += bx::read(_reader, num);
|
size += bx::read(_reader, num, _err);
|
||||||
size += bx::read(_reader, _signature.key);
|
size += bx::read(_reader, _signature.key, _err);
|
||||||
|
|
||||||
for (uint32_t ii = 0; ii < num; ++ii)
|
for (uint32_t ii = 0; ii < num; ++ii)
|
||||||
{
|
{
|
||||||
|
@ -1627,20 +1627,20 @@ namespace bgfx
|
||||||
size += bx::read(_reader, nameOffset);
|
size += bx::read(_reader, nameOffset);
|
||||||
|
|
||||||
char name[DXBC_MAX_NAME_STRING];
|
char name[DXBC_MAX_NAME_STRING];
|
||||||
readString(_reader, offset + nameOffset, name);
|
readString(_reader, offset + nameOffset, name, DXBC_MAX_NAME_STRING, _err);
|
||||||
element.name = name;
|
element.name = name;
|
||||||
|
|
||||||
size += bx::read(_reader, element.semanticIndex);
|
size += bx::read(_reader, element.semanticIndex, _err);
|
||||||
size += bx::read(_reader, element.valueType);
|
size += bx::read(_reader, element.valueType, _err);
|
||||||
size += bx::read(_reader, element.componentType);
|
size += bx::read(_reader, element.componentType, _err);
|
||||||
size += bx::read(_reader, element.registerIndex);
|
size += bx::read(_reader, element.registerIndex, _err);
|
||||||
size += bx::read(_reader, element.mask);
|
size += bx::read(_reader, element.mask, _err);
|
||||||
size += bx::read(_reader, element.readWriteMask);
|
size += bx::read(_reader, element.readWriteMask, _err);
|
||||||
size += bx::read(_reader, element.stream);
|
size += bx::read(_reader, element.stream, _err);
|
||||||
|
|
||||||
// padding
|
// padding
|
||||||
uint8_t padding;
|
uint8_t padding;
|
||||||
size += bx::read(_reader, padding);
|
size += bx::read(_reader, padding, _err);
|
||||||
|
|
||||||
_signature.elements.push_back(element);
|
_signature.elements.push_back(element);
|
||||||
}
|
}
|
||||||
|
@ -1648,13 +1648,13 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature)
|
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
const uint32_t num = uint32_t(_signature.elements.size() );
|
const uint32_t num = uint32_t(_signature.elements.size() );
|
||||||
size += bx::write(_writer, num);
|
size += bx::write(_writer, num, _err);
|
||||||
size += bx::write(_writer, _signature.key);
|
size += bx::write(_writer, _signature.key, _err);
|
||||||
|
|
||||||
typedef stl::unordered_map<stl::string, uint32_t> NameOffsetMap;
|
typedef stl::unordered_map<stl::string, uint32_t> NameOffsetMap;
|
||||||
NameOffsetMap nom;
|
NameOffsetMap nom;
|
||||||
|
@ -1669,7 +1669,7 @@ namespace bgfx
|
||||||
if (it == nom.end() )
|
if (it == nom.end() )
|
||||||
{
|
{
|
||||||
nom.insert(stl::make_pair(element.name, nameOffset) );
|
nom.insert(stl::make_pair(element.name, nameOffset) );
|
||||||
size += bx::write(_writer, nameOffset);
|
size += bx::write(_writer, nameOffset, _err);
|
||||||
nameOffset += uint32_t(element.name.size() + 1);
|
nameOffset += uint32_t(element.name.size() + 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1677,15 +1677,14 @@ namespace bgfx
|
||||||
size += bx::write(_writer, it->second);
|
size += bx::write(_writer, it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
size += bx::write(_writer, element.semanticIndex);
|
size += bx::write(_writer, element.semanticIndex, _err);
|
||||||
size += bx::write(_writer, element.valueType);
|
size += bx::write(_writer, element.valueType, _err);
|
||||||
size += bx::write(_writer, element.componentType);
|
size += bx::write(_writer, element.componentType, _err);
|
||||||
size += bx::write(_writer, element.registerIndex);
|
size += bx::write(_writer, element.registerIndex, _err);
|
||||||
size += bx::write(_writer, element.mask);
|
size += bx::write(_writer, element.mask, _err);
|
||||||
size += bx::write(_writer, element.readWriteMask);
|
size += bx::write(_writer, element.readWriteMask, _err);
|
||||||
size += bx::write(_writer, element.stream);
|
size += bx::write(_writer, element.stream, _err);
|
||||||
size += bx::write(_writer, pad);
|
size += bx::write(_writer, pad, _err);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
|
@ -1696,42 +1695,42 @@ namespace bgfx
|
||||||
if (it != nom.end() )
|
if (it != nom.end() )
|
||||||
{
|
{
|
||||||
nom.erase(it);
|
nom.erase(it);
|
||||||
size += bx::write(_writer, element.name.c_str(), uint32_t(element.name.size() + 1) );
|
size += bx::write(_writer, element.name.c_str(), uint32_t(element.name.size() + 1), _err);
|
||||||
len += uint32_t(element.name.size() + 1);
|
len += uint32_t(element.name.size() + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// align 4 bytes
|
// align 4 bytes
|
||||||
size += bx::writeRep(_writer, 0xab, (len+3)/4*4 - len);
|
size += bx::writeRep(_writer, 0xab, (len+3)/4*4 - len, _err);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader)
|
int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
size += bx::read(_reader, _shader.version);
|
size += bx::read(_reader, _shader.version, _err);
|
||||||
|
|
||||||
uint32_t bcLength;
|
uint32_t bcLength;
|
||||||
size += bx::read(_reader, bcLength);
|
size += bx::read(_reader, bcLength, _err);
|
||||||
|
|
||||||
uint32_t len = (bcLength-2)*sizeof(uint32_t);
|
uint32_t len = (bcLength-2)*sizeof(uint32_t);
|
||||||
_shader.byteCode.resize(len);
|
_shader.byteCode.resize(len);
|
||||||
size += bx::read(_reader, _shader.byteCode.data(), len);
|
size += bx::read(_reader, _shader.byteCode.data(), len, _err);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcShader& _shader)
|
int32_t write(bx::WriterI* _writer, const DxbcShader& _shader, bx::Error* _err)
|
||||||
{
|
{
|
||||||
const uint32_t len = uint32_t(_shader.byteCode.size() );
|
const uint32_t len = uint32_t(_shader.byteCode.size() );
|
||||||
const uint32_t bcLength = len / sizeof(uint32_t) + 2;
|
const uint32_t bcLength = len / sizeof(uint32_t) + 2;
|
||||||
|
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
size += bx::write(_writer, _shader.version);
|
size += bx::write(_writer, _shader.version, _err);
|
||||||
size += bx::write(_writer, bcLength);
|
size += bx::write(_writer, bcLength, _err);
|
||||||
size += bx::write(_writer, _shader.byteCode.data(), len);
|
size += bx::write(_writer, _shader.byteCode.data(), len, _err);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -1743,10 +1742,10 @@ namespace bgfx
|
||||||
#define DXBC_CHUNK_INPUT_SIGNATURE BX_MAKEFOURCC('I', 'S', 'G', 'N')
|
#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_OUTPUT_SIGNATURE BX_MAKEFOURCC('O', 'S', 'G', 'N')
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, DxbcContext& _dxbc)
|
int32_t read(bx::ReaderSeekerI* _reader, DxbcContext& _dxbc, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
size += bx::read(_reader, _dxbc.header);
|
size += bx::read(_reader, _dxbc.header, _err);
|
||||||
_dxbc.shader.shex = false;
|
_dxbc.shader.shex = false;
|
||||||
|
|
||||||
for (uint32_t ii = 0; ii < _dxbc.header.numChunks; ++ii)
|
for (uint32_t ii = 0; ii < _dxbc.header.numChunks; ++ii)
|
||||||
|
@ -1754,15 +1753,15 @@ namespace bgfx
|
||||||
bx::seek(_reader, sizeof(DxbcContext::Header) + ii*sizeof(uint32_t), bx::Whence::Begin);
|
bx::seek(_reader, sizeof(DxbcContext::Header) + ii*sizeof(uint32_t), bx::Whence::Begin);
|
||||||
|
|
||||||
uint32_t chunkOffset;
|
uint32_t chunkOffset;
|
||||||
size += bx::read(_reader, chunkOffset);
|
size += bx::read(_reader, chunkOffset, _err);
|
||||||
|
|
||||||
bx::seek(_reader, chunkOffset, bx::Whence::Begin);
|
bx::seek(_reader, chunkOffset, bx::Whence::Begin);
|
||||||
|
|
||||||
uint32_t fourcc;
|
uint32_t fourcc;
|
||||||
size += bx::read(_reader, fourcc);
|
size += bx::read(_reader, fourcc, _err);
|
||||||
|
|
||||||
uint32_t chunkSize;
|
uint32_t chunkSize;
|
||||||
size += bx::read(_reader, chunkSize);
|
size += bx::read(_reader, chunkSize, _err);
|
||||||
|
|
||||||
switch (fourcc)
|
switch (fourcc)
|
||||||
{
|
{
|
||||||
|
@ -1771,18 +1770,18 @@ namespace bgfx
|
||||||
// fallthrough
|
// fallthrough
|
||||||
|
|
||||||
case DXBC_CHUNK_SHADER:
|
case DXBC_CHUNK_SHADER:
|
||||||
size += read(_reader, _dxbc.shader);
|
size += read(_reader, _dxbc.shader, _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BX_MAKEFOURCC('I', 'S', 'G', '1'):
|
case BX_MAKEFOURCC('I', 'S', 'G', '1'):
|
||||||
case DXBC_CHUNK_INPUT_SIGNATURE:
|
case DXBC_CHUNK_INPUT_SIGNATURE:
|
||||||
size += read(_reader, _dxbc.inputSignature);
|
size += read(_reader, _dxbc.inputSignature, _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BX_MAKEFOURCC('O', 'S', 'G', '1'):
|
case BX_MAKEFOURCC('O', 'S', 'G', '1'):
|
||||||
case BX_MAKEFOURCC('O', 'S', 'G', '5'):
|
case BX_MAKEFOURCC('O', 'S', 'G', '5'):
|
||||||
case DXBC_CHUNK_OUTPUT_SIGNATURE:
|
case DXBC_CHUNK_OUTPUT_SIGNATURE:
|
||||||
size += read(_reader, _dxbc.outputSignature);
|
size += read(_reader, _dxbc.outputSignature, _err);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BX_MAKEFOURCC('A', 'o', 'n', '9'): // Contains DX9BC for feature level 9.x (*s_4_0_level_9_*) shaders.
|
case BX_MAKEFOURCC('A', 'o', 'n', '9'): // Contains DX9BC for feature level 9.x (*s_4_0_level_9_*) shaders.
|
||||||
|
@ -1816,43 +1815,43 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t write(bx::WriterSeekerI* _writer, const DxbcContext& _dxbc)
|
int32_t write(bx::WriterSeekerI* _writer, const DxbcContext& _dxbc, bx::Error* _err)
|
||||||
{
|
{
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
|
|
||||||
int64_t dxbcOffset = bx::seek(_writer);
|
int64_t dxbcOffset = bx::seek(_writer);
|
||||||
size += bx::write(_writer, DXBC_CHUNK_HEADER);
|
size += bx::write(_writer, DXBC_CHUNK_HEADER);
|
||||||
|
|
||||||
size += bx::writeRep(_writer, 0, 16);
|
size += bx::writeRep(_writer, 0, 16, _err);
|
||||||
|
|
||||||
size += bx::write(_writer, UINT32_C(1) );
|
size += bx::write(_writer, UINT32_C(1), _err);
|
||||||
|
|
||||||
int64_t sizeOffset = bx::seek(_writer);
|
int64_t sizeOffset = bx::seek(_writer);
|
||||||
size += bx::writeRep(_writer, 0, 4);
|
size += bx::writeRep(_writer, 0, 4, _err);
|
||||||
|
|
||||||
uint32_t numChunks = 3;
|
uint32_t numChunks = 3;
|
||||||
size += bx::write(_writer, numChunks);
|
size += bx::write(_writer, numChunks, _err);
|
||||||
|
|
||||||
int64_t chunksOffsets = bx::seek(_writer);
|
int64_t chunksOffsets = bx::seek(_writer);
|
||||||
size += bx::writeRep(_writer, 0, numChunks*sizeof(uint32_t) );
|
size += bx::writeRep(_writer, 0, numChunks*sizeof(uint32_t), _err);
|
||||||
|
|
||||||
uint32_t chunkOffset[3];
|
uint32_t chunkOffset[3];
|
||||||
uint32_t chunkSize[3];
|
uint32_t chunkSize[3];
|
||||||
|
|
||||||
chunkOffset[0] = uint32_t(bx::seek(_writer) - dxbcOffset);
|
chunkOffset[0] = uint32_t(bx::seek(_writer) - dxbcOffset);
|
||||||
size += write(_writer, DXBC_CHUNK_INPUT_SIGNATURE);
|
size += write(_writer, DXBC_CHUNK_INPUT_SIGNATURE, _err);
|
||||||
size += write(_writer, UINT32_C(0) );
|
size += write(_writer, UINT32_C(0), _err);
|
||||||
chunkSize[0] = write(_writer, _dxbc.inputSignature);
|
chunkSize[0] = write(_writer, _dxbc.inputSignature, _err);
|
||||||
|
|
||||||
chunkOffset[1] = uint32_t(bx::seek(_writer) - dxbcOffset);
|
chunkOffset[1] = uint32_t(bx::seek(_writer) - dxbcOffset);
|
||||||
size += write(_writer, DXBC_CHUNK_OUTPUT_SIGNATURE);
|
size += write(_writer, DXBC_CHUNK_OUTPUT_SIGNATURE, _err);
|
||||||
size += write(_writer, UINT32_C(0) );
|
size += write(_writer, UINT32_C(0), _err);
|
||||||
chunkSize[1] = write(_writer, _dxbc.outputSignature);
|
chunkSize[1] = write(_writer, _dxbc.outputSignature, _err);
|
||||||
|
|
||||||
chunkOffset[2] = uint32_t(bx::seek(_writer) - dxbcOffset);
|
chunkOffset[2] = uint32_t(bx::seek(_writer) - dxbcOffset);
|
||||||
size += write(_writer, _dxbc.shader.shex ? DXBC_CHUNK_SHADER_EX : DXBC_CHUNK_SHADER);
|
size += write(_writer, _dxbc.shader.shex ? DXBC_CHUNK_SHADER_EX : DXBC_CHUNK_SHADER, _err);
|
||||||
size += write(_writer, UINT32_C(0) );
|
size += write(_writer, UINT32_C(0), _err);
|
||||||
chunkSize[2] = write(_writer, _dxbc.shader);
|
chunkSize[2] = write(_writer, _dxbc.shader, _err);
|
||||||
|
|
||||||
size += 0
|
size += 0
|
||||||
+ chunkSize[0]
|
+ chunkSize[0]
|
||||||
|
@ -1863,15 +1862,15 @@ namespace bgfx
|
||||||
int64_t eof = bx::seek(_writer);
|
int64_t eof = bx::seek(_writer);
|
||||||
|
|
||||||
bx::seek(_writer, sizeOffset, bx::Whence::Begin);
|
bx::seek(_writer, sizeOffset, bx::Whence::Begin);
|
||||||
bx::write(_writer, size);
|
bx::write(_writer, size, _err);
|
||||||
|
|
||||||
bx::seek(_writer, chunksOffsets, bx::Whence::Begin);
|
bx::seek(_writer, chunksOffsets, bx::Whence::Begin);
|
||||||
bx::write(_writer, chunkOffset, sizeof(chunkOffset) );
|
bx::write(_writer, chunkOffset, sizeof(chunkOffset), _err);
|
||||||
|
|
||||||
for (uint32_t ii = 0; ii < BX_COUNTOF(chunkOffset); ++ii)
|
for (uint32_t ii = 0; ii < BX_COUNTOF(chunkOffset); ++ii)
|
||||||
{
|
{
|
||||||
bx::seek(_writer, chunkOffset[ii]+4, bx::Whence::Begin);
|
bx::seek(_writer, chunkOffset[ii]+4, bx::Whence::Begin);
|
||||||
bx::write(_writer, chunkSize[ii]);
|
bx::write(_writer, chunkSize[ii], _err);
|
||||||
}
|
}
|
||||||
|
|
||||||
bx::seek(_writer, eof, bx::Whence::Begin);
|
bx::seek(_writer, eof, bx::Whence::Begin);
|
||||||
|
@ -1879,14 +1878,16 @@ namespace bgfx
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse(const DxbcShader& _src, DxbcParseFn _fn, void* _userData)
|
void parse(const DxbcShader& _src, DxbcParseFn _fn, void* _userData, bx::Error* _err)
|
||||||
{
|
{
|
||||||
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
||||||
|
|
||||||
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
||||||
{
|
{
|
||||||
DxbcInstruction instruction;
|
DxbcInstruction instruction;
|
||||||
uint32_t size = read(&reader, 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_CHECK(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
|
||||||
|
|
||||||
bool cont = _fn(token * sizeof(uint32_t), instruction, _userData);
|
bool cont = _fn(token * sizeof(uint32_t), instruction, _userData);
|
||||||
|
@ -1899,8 +1900,10 @@ namespace bgfx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void filter(DxbcShader& _dst, const DxbcShader& _src, DxbcFilterFn _fn, void* _userData)
|
void filter(DxbcShader& _dst, const DxbcShader& _src, DxbcFilterFn _fn, void* _userData, bx::Error* _err)
|
||||||
{
|
{
|
||||||
|
BX_ERROR_SCOPE(_err);
|
||||||
|
|
||||||
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
bx::MemoryReader reader(_src.byteCode.data(), uint32_t(_src.byteCode.size() ) );
|
||||||
|
|
||||||
bx::MemoryBlock mb(g_allocator);
|
bx::MemoryBlock mb(g_allocator);
|
||||||
|
@ -1909,12 +1912,12 @@ namespace bgfx
|
||||||
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;)
|
||||||
{
|
{
|
||||||
DxbcInstruction instruction;
|
DxbcInstruction instruction;
|
||||||
uint32_t size = read(&reader, 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_CHECK(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size);
|
||||||
|
|
||||||
_fn(instruction, _userData);
|
_fn(instruction, _userData);
|
||||||
|
|
||||||
write(&writer, instruction);
|
write(&writer, instruction, _err);
|
||||||
|
|
||||||
token += instruction.length;
|
token += instruction.length;
|
||||||
}
|
}
|
||||||
|
|
|
@ -540,8 +540,8 @@ namespace bgfx
|
||||||
DxbcOperand operand[6];
|
DxbcOperand operand[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, DxbcInstruction& _instruction);
|
int32_t read(bx::ReaderI* _reader, DxbcInstruction& _instruction, bx::Error* _err);
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcInstruction& _instruction);
|
int32_t write(bx::WriterI* _writer, const DxbcInstruction& _instruction, bx::Error* _err);
|
||||||
int32_t toString(char* _out, int32_t _size, const DxbcInstruction& _instruction);
|
int32_t toString(char* _out, int32_t _size, const DxbcInstruction& _instruction);
|
||||||
|
|
||||||
struct DxbcSignature
|
struct DxbcSignature
|
||||||
|
@ -562,8 +562,8 @@ namespace bgfx
|
||||||
stl::vector<Element> elements;
|
stl::vector<Element> elements;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature);
|
int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bx::Error* _err);
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature);
|
int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bx::Error* _err);
|
||||||
|
|
||||||
struct DxbcShader
|
struct DxbcShader
|
||||||
{
|
{
|
||||||
|
@ -572,14 +572,14 @@ namespace bgfx
|
||||||
bool shex;
|
bool shex;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader);
|
int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader, bx::Error* _err);
|
||||||
int32_t write(bx::WriterI* _writer, const DxbcShader& _shader);
|
int32_t write(bx::WriterI* _writer, const DxbcShader& _shader, bx::Error* _err);
|
||||||
|
|
||||||
typedef bool (*DxbcParseFn)(uint32_t _offset, const DxbcInstruction& _instruction, void* _userData);
|
typedef bool (*DxbcParseFn)(uint32_t _offset, const DxbcInstruction& _instruction, void* _userData);
|
||||||
void parse(const DxbcShader& _src, DxbcParseFn _fn, void* _userData);
|
void parse(const DxbcShader& _src, DxbcParseFn _fn, void* _userData, bx::Error* _err = NULL);
|
||||||
|
|
||||||
typedef void (*DxbcFilterFn)(DxbcInstruction& _instruction, void* _userData);
|
typedef void (*DxbcFilterFn)(DxbcInstruction& _instruction, void* _userData);
|
||||||
void filter(DxbcShader& _dst, const DxbcShader& _src, DxbcFilterFn _fn, void* _userData);
|
void filter(DxbcShader& _dst, const DxbcShader& _src, DxbcFilterFn _fn, void* _userData, bx::Error* _err = NULL);
|
||||||
|
|
||||||
struct DxbcContext
|
struct DxbcContext
|
||||||
{
|
{
|
||||||
|
@ -598,8 +598,8 @@ namespace bgfx
|
||||||
DxbcShader shader;
|
DxbcShader shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, DxbcContext& _dxbc);
|
int32_t read(bx::ReaderSeekerI* _reader, DxbcContext& _dxbc, bx::Error* _err);
|
||||||
int32_t write(bx::WriterSeekerI* _writer, const DxbcContext& _dxbc);
|
int32_t write(bx::WriterSeekerI* _writer, const DxbcContext& _dxbc, bx::Error* _err);
|
||||||
|
|
||||||
/// Calculate DXBC hash from data.
|
/// Calculate DXBC hash from data.
|
||||||
void dxbcHash(const void* _data, uint32_t _size, void* _digest);
|
void dxbcHash(const void* _data, uint32_t _size, void* _digest);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -8,11 +8,14 @@
|
||||||
|
|
||||||
#include <bx/readerwriter.h>
|
#include <bx/readerwriter.h>
|
||||||
|
|
||||||
|
BX_ERROR_RESULT(BGFX_SHADER_SPIRV_INVALID_HEADER, BX_MAKEFOURCC('S', 'H', 0, 1) );
|
||||||
|
BX_ERROR_RESULT(BGFX_SHADER_SPIRV_INVALID_INSTRUCTION, BX_MAKEFOURCC('S', 'H', 0, 2) );
|
||||||
|
|
||||||
namespace bgfx
|
namespace bgfx
|
||||||
{
|
{
|
||||||
// Reference: https://www.khronos.org/registry/spir-v/specs/1.0/SPIRV.html
|
// Reference: https://www.khronos.org/registry/spir-v/specs/1.0/SPIRV.html
|
||||||
|
|
||||||
struct SpirvOpcode
|
struct SpvOpcode
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
|
@ -25,13 +28,16 @@ namespace bgfx
|
||||||
MemberName,
|
MemberName,
|
||||||
String,
|
String,
|
||||||
Line,
|
Line,
|
||||||
|
Invalid9,
|
||||||
Extension,
|
Extension,
|
||||||
ExtInstImport,
|
ExtInstImport,
|
||||||
ExtInst,
|
ExtInst,
|
||||||
|
Invalid13,
|
||||||
MemoryModel,
|
MemoryModel,
|
||||||
EntryPoint,
|
EntryPoint,
|
||||||
ExecutionMode,
|
ExecutionMode,
|
||||||
Capability,
|
Capability,
|
||||||
|
Invalid18,
|
||||||
TypeVoid,
|
TypeVoid,
|
||||||
TypeBool,
|
TypeBool,
|
||||||
TypeInt,
|
TypeInt,
|
||||||
|
@ -53,21 +59,25 @@ namespace bgfx
|
||||||
TypeQueue,
|
TypeQueue,
|
||||||
TypePipe,
|
TypePipe,
|
||||||
TypeForwardPointer,
|
TypeForwardPointer,
|
||||||
|
Invalid40,
|
||||||
ConstantTrue,
|
ConstantTrue,
|
||||||
ConstantFalse,
|
ConstantFalse,
|
||||||
Constant,
|
Constant,
|
||||||
ConstantComposite,
|
ConstantComposite,
|
||||||
ConstantSampler,
|
ConstantSampler,
|
||||||
ConstantNull,
|
ConstantNull,
|
||||||
|
Invalid47,
|
||||||
SpecConstantTrue,
|
SpecConstantTrue,
|
||||||
SpecConstantFalse,
|
SpecConstantFalse,
|
||||||
SpecConstant,
|
SpecConstant,
|
||||||
SpecConstantComposite,
|
SpecConstantComposite,
|
||||||
SpecConstantOp,
|
SpecConstantOp,
|
||||||
|
Invalid53,
|
||||||
Function,
|
Function,
|
||||||
FunctionParameter,
|
FunctionParameter,
|
||||||
FunctionEnd,
|
FunctionEnd,
|
||||||
FunctionCall,
|
FunctionCall,
|
||||||
|
Invalid58,
|
||||||
Variable,
|
Variable,
|
||||||
ImageTexelPointer,
|
ImageTexelPointer,
|
||||||
Load,
|
Load,
|
||||||
|
@ -85,6 +95,7 @@ namespace bgfx
|
||||||
DecorationGroup,
|
DecorationGroup,
|
||||||
GroupDecorate,
|
GroupDecorate,
|
||||||
GroupMemberDecorate,
|
GroupMemberDecorate,
|
||||||
|
Invalid76,
|
||||||
VectorExtractDynamic,
|
VectorExtractDynamic,
|
||||||
VectorInsertDynamic,
|
VectorInsertDynamic,
|
||||||
VectorShuffle,
|
VectorShuffle,
|
||||||
|
@ -93,6 +104,7 @@ namespace bgfx
|
||||||
CompositeInsert,
|
CompositeInsert,
|
||||||
CopyObject,
|
CopyObject,
|
||||||
Transpose,
|
Transpose,
|
||||||
|
Invalid85,
|
||||||
SampledImage,
|
SampledImage,
|
||||||
ImageSampleImplicitLod,
|
ImageSampleImplicitLod,
|
||||||
ImageSampleExplicitLod,
|
ImageSampleExplicitLod,
|
||||||
|
@ -115,6 +127,7 @@ namespace bgfx
|
||||||
ImageQueryLod,
|
ImageQueryLod,
|
||||||
ImageQueryLevels,
|
ImageQueryLevels,
|
||||||
ImageQuerySamples,
|
ImageQuerySamples,
|
||||||
|
Invalid108,
|
||||||
ConvertFToU,
|
ConvertFToU,
|
||||||
ConvertFToS,
|
ConvertFToS,
|
||||||
ConvertSToF,
|
ConvertSToF,
|
||||||
|
@ -131,6 +144,7 @@ namespace bgfx
|
||||||
GenericCastToPtr,
|
GenericCastToPtr,
|
||||||
GenericCastToPtrExplicit,
|
GenericCastToPtrExplicit,
|
||||||
Bitcast,
|
Bitcast,
|
||||||
|
Invalid125,
|
||||||
SNegate,
|
SNegate,
|
||||||
FNegate,
|
FNegate,
|
||||||
IAdd,
|
IAdd,
|
||||||
|
@ -158,6 +172,7 @@ namespace bgfx
|
||||||
ISubBorrow,
|
ISubBorrow,
|
||||||
UMulExtended,
|
UMulExtended,
|
||||||
SMulExtended,
|
SMulExtended,
|
||||||
|
Invalid153,
|
||||||
Any,
|
Any,
|
||||||
All,
|
All,
|
||||||
IsNan,
|
IsNan,
|
||||||
|
@ -196,6 +211,8 @@ namespace bgfx
|
||||||
FUnordLessThanEqual,
|
FUnordLessThanEqual,
|
||||||
FOrdGreaterThanEqual,
|
FOrdGreaterThanEqual,
|
||||||
FUnordGreaterThanEqual,
|
FUnordGreaterThanEqual,
|
||||||
|
Invalid192,
|
||||||
|
Invalid193,
|
||||||
ShiftRightLogical,
|
ShiftRightLogical,
|
||||||
ShiftRightArithmetic,
|
ShiftRightArithmetic,
|
||||||
ShiftLeftLogical,
|
ShiftLeftLogical,
|
||||||
|
@ -208,6 +225,7 @@ namespace bgfx
|
||||||
BitFieldUExtract,
|
BitFieldUExtract,
|
||||||
BitReverse,
|
BitReverse,
|
||||||
BitCount,
|
BitCount,
|
||||||
|
Invalid206,
|
||||||
DPdx,
|
DPdx,
|
||||||
DPdy,
|
DPdy,
|
||||||
Fwidth,
|
Fwidth,
|
||||||
|
@ -217,12 +235,17 @@ namespace bgfx
|
||||||
DPdxCoarse,
|
DPdxCoarse,
|
||||||
DPdyCoarse,
|
DPdyCoarse,
|
||||||
FwidthCoarse,
|
FwidthCoarse,
|
||||||
|
Invalid216,
|
||||||
|
Invalid217,
|
||||||
EmitVertex,
|
EmitVertex,
|
||||||
EndPrimitive,
|
EndPrimitive,
|
||||||
EmitStreamVertex,
|
EmitStreamVertex,
|
||||||
EndStreamPrimitive,
|
EndStreamPrimitive,
|
||||||
|
Invalid222,
|
||||||
|
Invalid223,
|
||||||
ControlBarrier,
|
ControlBarrier,
|
||||||
MemoryBarrier,
|
MemoryBarrier,
|
||||||
|
Invalid226,
|
||||||
AtomicLoad,
|
AtomicLoad,
|
||||||
AtomicStore,
|
AtomicStore,
|
||||||
AtomicExchange,
|
AtomicExchange,
|
||||||
|
@ -239,6 +262,8 @@ namespace bgfx
|
||||||
AtomicAnd,
|
AtomicAnd,
|
||||||
AtomicOr,
|
AtomicOr,
|
||||||
AtomicXor,
|
AtomicXor,
|
||||||
|
Invalid243,
|
||||||
|
Invalid244,
|
||||||
Phi,
|
Phi,
|
||||||
LoopMerge,
|
LoopMerge,
|
||||||
SelectionMerge,
|
SelectionMerge,
|
||||||
|
@ -252,6 +277,7 @@ namespace bgfx
|
||||||
Unreachable,
|
Unreachable,
|
||||||
LifetimeStart,
|
LifetimeStart,
|
||||||
LifetimeStop,
|
LifetimeStop,
|
||||||
|
Invalid258,
|
||||||
GroupAsyncCopy,
|
GroupAsyncCopy,
|
||||||
GroupWaitEvents,
|
GroupWaitEvents,
|
||||||
GroupAll,
|
GroupAll,
|
||||||
|
@ -265,6 +291,8 @@ namespace bgfx
|
||||||
GroupFMax,
|
GroupFMax,
|
||||||
GroupUMax,
|
GroupUMax,
|
||||||
GroupSMax,
|
GroupSMax,
|
||||||
|
Invalid272,
|
||||||
|
Invalid273,
|
||||||
ReadPipe,
|
ReadPipe,
|
||||||
WritePipe,
|
WritePipe,
|
||||||
ReservedReadPipe,
|
ReservedReadPipe,
|
||||||
|
@ -280,6 +308,8 @@ namespace bgfx
|
||||||
GroupReserveWritePipePackets,
|
GroupReserveWritePipePackets,
|
||||||
GroupCommitReadPipe,
|
GroupCommitReadPipe,
|
||||||
GroupCommitWritePipe,
|
GroupCommitWritePipe,
|
||||||
|
Invalid289,
|
||||||
|
Invalid290,
|
||||||
EnqueueMarker,
|
EnqueueMarker,
|
||||||
EnqueueKernel,
|
EnqueueKernel,
|
||||||
GetKernelNDrangeSubGroupCount,
|
GetKernelNDrangeSubGroupCount,
|
||||||
|
@ -360,10 +390,12 @@ namespace bgfx
|
||||||
SubgroupLocalInvocationId,
|
SubgroupLocalInvocationId,
|
||||||
VertexIndex,
|
VertexIndex,
|
||||||
InstanceIndex,
|
InstanceIndex,
|
||||||
|
|
||||||
|
Count
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpirvExecutionModel
|
struct SpvExecutionModel
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
|
@ -379,7 +411,19 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpirvMemoryModel
|
struct SpvAddressingModel
|
||||||
|
{
|
||||||
|
enum Enum
|
||||||
|
{
|
||||||
|
Logical,
|
||||||
|
Physical32,
|
||||||
|
Physical64,
|
||||||
|
|
||||||
|
Count
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SpvMemoryModel
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
|
@ -391,7 +435,7 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpirvStorageClass
|
struct SpvStorageClass
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
|
@ -407,10 +451,12 @@ namespace bgfx
|
||||||
PushConstant,
|
PushConstant,
|
||||||
AtomicCounter,
|
AtomicCounter,
|
||||||
Image,
|
Image,
|
||||||
|
|
||||||
|
Count
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpirvResourceDim
|
struct SpvResourceDim
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
|
@ -424,7 +470,7 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpirvDecoration
|
struct SpvDecoration
|
||||||
{
|
{
|
||||||
enum Enum
|
enum Enum
|
||||||
{
|
{
|
||||||
|
@ -476,52 +522,90 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SpirvOperand
|
struct SpvOperand
|
||||||
{
|
{
|
||||||
};
|
enum Enum
|
||||||
|
|
||||||
struct SpirvInstruction
|
|
||||||
{
|
|
||||||
SpirvOpcode::Enum opcode;
|
|
||||||
uint16_t length;
|
|
||||||
|
|
||||||
uint8_t numOperands;
|
|
||||||
SpirvOperand operand[6];
|
|
||||||
|
|
||||||
union
|
|
||||||
{
|
{
|
||||||
struct ResultTypeId
|
AccessQualifier,
|
||||||
{
|
AddressingModel,
|
||||||
uint32_t resultType;
|
Base,
|
||||||
uint32_t id;
|
Capability,
|
||||||
};
|
Component,
|
||||||
|
ComponentType,
|
||||||
|
Composite,
|
||||||
|
Condition,
|
||||||
|
Coordinate,
|
||||||
|
Decoration,
|
||||||
|
Dim,
|
||||||
|
Dref,
|
||||||
|
ExecutionModel,
|
||||||
|
Function,
|
||||||
|
FunctionControl,
|
||||||
|
Id,
|
||||||
|
IdRep,
|
||||||
|
ImageFormat,
|
||||||
|
ImageOperands,
|
||||||
|
LiteralNumber,
|
||||||
|
LiteralRep,
|
||||||
|
LiteralString,
|
||||||
|
Matrix,
|
||||||
|
MemoryAccess,
|
||||||
|
MemoryModel,
|
||||||
|
Object,
|
||||||
|
Pointer,
|
||||||
|
SampledType,
|
||||||
|
SampledImage,
|
||||||
|
SamplerAddressingMode,
|
||||||
|
SamplerFilterMode,
|
||||||
|
Scalar,
|
||||||
|
SourceLanguage,
|
||||||
|
StorageClass,
|
||||||
|
StructureType,
|
||||||
|
Vector,
|
||||||
|
|
||||||
ResultTypeId constant;
|
Count
|
||||||
ResultTypeId constantComposite;
|
};
|
||||||
|
|
||||||
uint32_t value[8];
|
Enum type;
|
||||||
} un;
|
uint32_t data[4];
|
||||||
|
|
||||||
|
uint32_t target;
|
||||||
|
stl::string literalString;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderI* _reader, SpirvInstruction& _instruction);
|
struct SpvInstruction
|
||||||
int32_t write(bx::WriterI* _writer, const SpirvInstruction& _instruction);
|
{
|
||||||
int32_t toString(char* _out, int32_t _size, const SpirvInstruction& _instruction);
|
SpvOpcode::Enum opcode;
|
||||||
|
uint16_t length;
|
||||||
|
uint16_t numOperands;
|
||||||
|
|
||||||
struct SpirvShader
|
uint32_t type;
|
||||||
|
uint32_t result;
|
||||||
|
bool hasType;
|
||||||
|
bool hasResult;
|
||||||
|
|
||||||
|
SpvOperand operand[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
int32_t read(bx::ReaderI* _reader, SpvInstruction& _instruction, bx::Error* _err);
|
||||||
|
int32_t write(bx::WriterI* _writer, const SpvInstruction& _instruction, bx::Error* _err);
|
||||||
|
int32_t toString(char* _out, int32_t _size, const SpvInstruction& _instruction);
|
||||||
|
|
||||||
|
struct SpvShader
|
||||||
{
|
{
|
||||||
stl::vector<uint8_t> byteCode;
|
stl::vector<uint8_t> byteCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, SpirvShader& _shader);
|
int32_t read(bx::ReaderSeekerI* _reader, SpvShader& _shader, bx::Error* _err);
|
||||||
int32_t write(bx::WriterI* _writer, const SpirvShader& _shader);
|
int32_t write(bx::WriterI* _writer, const SpvShader& _shader, bx::Error* _err);
|
||||||
|
|
||||||
typedef bool (*SpirvParseFn)(uint32_t _offset, const SpirvInstruction& _instruction, void* _userData);
|
typedef bool (*SpirvParseFn)(uint32_t _offset, const SpvInstruction& _instruction, void* _userData);
|
||||||
void parse(const SpirvShader& _src, SpirvParseFn _fn, void* _userData);
|
void parse(const SpvShader& _src, SpirvParseFn _fn, void* _userData, bx::Error* _err = NULL);
|
||||||
|
|
||||||
typedef void (*SpirvFilterFn)(SpirvInstruction& _instruction, void* _userData);
|
typedef void (*SpirvFilterFn)(SpvInstruction& _instruction, void* _userData);
|
||||||
void filter(SpirvShader& _dst, const SpirvShader& _src, SpirvFilterFn _fn, void* _userData);
|
void filter(SpvShader& _dst, const SpvShader& _src, SpirvFilterFn _fn, void* _userData, bx::Error* _err = NULL);
|
||||||
|
|
||||||
struct Spirv
|
struct SpirV
|
||||||
{
|
{
|
||||||
struct Header
|
struct Header
|
||||||
{
|
{
|
||||||
|
@ -533,11 +617,11 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
|
|
||||||
Header header;
|
Header header;
|
||||||
SpirvShader shader;
|
SpvShader shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t read(bx::ReaderSeekerI* _reader, Spirv& _spirv);
|
int32_t read(bx::ReaderSeekerI* _reader, SpirV& _spirv, bx::Error* _err);
|
||||||
int32_t write(bx::WriterSeekerI* _writer, const Spirv& _spirv);
|
int32_t write(bx::WriterSeekerI* _writer, const SpirV& _spirv, bx::Error* _err);
|
||||||
|
|
||||||
} // namespace bgfx
|
} // namespace bgfx
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue