DXBC: Fixed custom data encoding. Fixed operand modifier parsing.

This commit is contained in:
Branimir Karadžić 2018-02-06 16:37:13 -08:00
parent f45d010b90
commit a0fd120bc5
3 changed files with 48 additions and 27 deletions

View File

@ -10,8 +10,9 @@
namespace bgfx
{
static bool printAsm(uint32_t, const DxbcInstruction& _instruction, void* _userData)
static bool printAsm(uint32_t _offset, const DxbcInstruction& _instruction, void* _userData)
{
BX_UNUSED(_offset);
bx::WriterI* writer = reinterpret_cast<bx::WriterI*>(_userData);
char temp[512];
toString(temp, sizeof(temp), _instruction);
@ -20,8 +21,9 @@ namespace bgfx
return true;
}
static bool printAsm(uint32_t, const Dx9bcInstruction& _instruction, void* _userData)
static bool printAsm(uint32_t _offset, const Dx9bcInstruction& _instruction, void* _userData)
{
BX_UNUSED(_offset);
bx::WriterI* writer = reinterpret_cast<bx::WriterI*>(_userData);
char temp[512];
toString(temp, sizeof(temp), _instruction);
@ -30,8 +32,9 @@ namespace bgfx
return true;
}
static bool printAsm(uint32_t, const SpvInstruction& _instruction, void* _userData)
static bool printAsm(uint32_t _offset, const SpvInstruction& _instruction, void* _userData)
{
BX_UNUSED(_offset);
bx::WriterI* writer = reinterpret_cast<bx::WriterI*>(_userData);
char temp[512];
toString(temp, sizeof(temp), _instruction);

View File

@ -905,7 +905,6 @@ namespace bgfx
// |+------------------------------- addressing mode 2
// +-------------------------------- extended
_operand.extended = 0 != (token & UINT32_C(0x80000000) );
_operand.numAddrModes = uint8_t( (token & UINT32_C(0x00300000) ) >> 20);
_operand.addrMode[0] = uint8_t( (token & UINT32_C(0x01c00000) ) >> 22);
_operand.addrMode[1] = uint8_t( (token & UINT32_C(0x0e000000) ) >> 25);
@ -915,9 +914,17 @@ namespace bgfx
_operand.modeBits = uint8_t( (token & UINT32_C(0x00000ff0) ) >> 4) & "\x0f\xff\x03\x00"[_operand.mode];
_operand.num = uint8_t( (token & UINT32_C(0x00000003) ) );
if (_operand.extended)
const bool extended = 0 != (token & UINT32_C(0x80000000) );
if (extended)
{
size += bx::read(_reader, _operand.extBits, _err);
uint32_t extBits = 0;
size += bx::read(_reader, extBits, _err);
_operand.modifier = DxbcOperandModifier::Enum( (extBits & UINT32_C(0x00003fc0) ) >> 6);
}
else
{
_operand.modifier = DxbcOperandModifier::None;
}
switch (_operand.type)
@ -972,8 +979,10 @@ namespace bgfx
{
int32_t size = 0;
const bool extended = _operand.modifier != DxbcOperandModifier::None;
uint32_t token = 0;
token |= _operand.extended ? UINT32_C(0x80000000) : 0;
token |= extended ? UINT32_C(0x80000000) : 0;
token |= (_operand.numAddrModes << 20) & UINT32_C(0x00300000);
token |= (_operand.addrMode[0] << 22) & UINT32_C(0x01c00000);
token |= (_operand.addrMode[1] << 25) & UINT32_C(0x0e000000);
@ -986,9 +995,13 @@ namespace bgfx
size += bx::write(_writer, token, _err);
if (_operand.extended)
if (extended)
{
size += bx::write(_writer, _operand.extBits, _err);
uint32_t extBits = 0
| ( (_operand.modifier << 6) & UINT32_C(0x00003fc0) )
| 1 /* 1 == has extended operand modifier */
;
size += bx::write(_writer, extBits, _err);
}
switch (_operand.type)
@ -1207,7 +1220,7 @@ namespace bgfx
// +-------------------------------- extended
uint32_t extBits;
size += bx::read(_reader, extBits);
size += bx::read(_reader, extBits, _err);
extended = 0 != (extBits & UINT32_C(0x80000000) );
_instruction.extended[ii ] = DxbcInstruction::ExtendedType::Enum(extBits & UINT32_C(0x0000001f) );
_instruction.extended[ii+1] = DxbcInstruction::ExtendedType::Count;
@ -1345,7 +1358,7 @@ namespace bgfx
size += bx::write(_writer, token);
uint32_t len = uint32_t(_instruction.customData.size() );
uint32_t len = uint32_t(_instruction.customData.size()*sizeof(uint32_t) );
size += bx::write(_writer, len/4+2, _err);
size += bx::write(_writer, _instruction.customData.data(), len, _err);
}
@ -1525,21 +1538,31 @@ namespace bgfx
{
int32_t size = 0;
if (DxbcOpcode::CUSTOMDATA == _instruction.opcode)
switch (_instruction.opcode)
{
case DxbcOpcode::CUSTOMDATA:
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, "%s"
, s_dxbcCustomDataClass[_instruction.customDataClass]
);
}
else
{
break;
case DxbcOpcode::IF:
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, "%s%s"
, getName(_instruction.opcode)
, _instruction.testNZ ? "_nz" : "_z"
);
break;
default:
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
, "%s%s%s"
, getName(_instruction.opcode)
, _instruction.saturate ? "_sat" : ""
, _instruction.testNZ ? "_nz" : ""
);
break;
}
if (DxbcResourceDim::Unknown != _instruction.srv)
@ -1570,15 +1593,12 @@ namespace bgfx
const char* preOperand = "";
const char* postOperand = "";
if (operand.extended)
switch (operand.modifier)
{
switch(DxbcOperandModifier::Enum(operand.extBits & UINT32_C(0x00000003) ) )
{
case DxbcOperandModifier::Neg: preOperand = "-"; postOperand = ""; break;
case DxbcOperandModifier::Abs: preOperand = "abs("; postOperand = ")"; break;
case DxbcOperandModifier::AbsNeg: preOperand = "-abs("; postOperand = ")"; break;
default: break;
}
case DxbcOperandModifier::Neg: preOperand = "-"; postOperand = ""; break;
case DxbcOperandModifier::Abs: preOperand = "abs("; postOperand = ")"; break;
case DxbcOperandModifier::AbsNeg: preOperand = "-abs("; postOperand = ")"; break;
default: break;
}
size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)

View File

@ -505,8 +505,7 @@ namespace bgfx
, mode(DxbcOperandMode::Mask)
, modeBits(0)
, num(0)
, extended(false)
, extBits(0)
, modifier(DxbcOperandModifier::None)
, numAddrModes(0)
{
bx::memSet(addrMode, 0, sizeof(addrMode) );
@ -518,8 +517,7 @@ namespace bgfx
DxbcOperandMode::Enum mode;
uint8_t modeBits;
uint8_t num;
bool extended;
uint32_t extBits;
DxbcOperandModifier::Enum modifier;
uint8_t numAddrModes;
uint8_t addrMode[3];