diff --git a/src/amalgamated.cpp b/src/amalgamated.cpp index 5dec77a69..e26f493c2 100644 --- a/src/amalgamated.cpp +++ b/src/amalgamated.cpp @@ -21,7 +21,5 @@ #include "renderer_vk.cpp" #include "renderer_webgpu.cpp" #include "shader.cpp" -#include "shader_dxbc.cpp" -#include "shader_spirv.cpp" #include "topology.cpp" #include "vertexlayout.cpp" diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index d9cbc5582..8ec1de1b5 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -4063,125 +4063,6 @@ namespace bgfx { namespace d3d11 BufferD3D11::create(_size, _data, _flags, stride, true); } - static bool hasDepthOp(const void* _code, uint32_t _size) - { - bx::MemoryReader rd(_code, _size); - - bx::Error err; - DxbcContext dxbc; - read(&rd, dxbc, &err); - - struct FindDepthOp - { - FindDepthOp() - : m_found(false) - { - } - - static bool find(uint32_t /*_offset*/, const DxbcInstruction& _instruction, void* _userData) - { - FindDepthOp& out = *reinterpret_cast(_userData); - if (_instruction.opcode == DxbcOpcode::DISCARD - || (0 != _instruction.numOperands && DxbcOperandType::OutputDepth == _instruction.operand[0].type) ) - { - out.m_found = true; - return false; - } - - return true; - } - - bool m_found; - - } find; - - parse(dxbc.shader, FindDepthOp::find, &find); - - return find.m_found; - } - - static void patchUAVRegisterByteCode(DxbcInstruction& _instruction, void* _userData) - { - BX_UNUSED(_userData); - - switch (_instruction.opcode) - { - case DxbcOpcode::DCL_UNORDERED_ACCESS_VIEW_TYPED: - { - DxbcOperand& operand = _instruction.operand[0]; - operand.regIndex[0] += 16; - - BX_ASSERT(operand.regIndex[1] == 0 && operand.regIndex[2] == 0, "Unexpected values"); - } - break; - - case DxbcOpcode::DCL_UNORDERED_ACCESS_VIEW_RAW: - BX_ASSERT(false, "Unsupported UAV access"); - break; - - case DxbcOpcode::DCL_UNORDERED_ACCESS_VIEW_STRUCTURED: - BX_ASSERT(false, "Unsupported UAV access"); - break; - - case DxbcOpcode::LD_UAV_TYPED: - { - DxbcOperand& operand = _instruction.operand[2]; - operand.regIndex[0] += 16; - - BX_ASSERT(operand.regIndex[1] == 0 && operand.regIndex[2] == 0, "Unexpected values"); - } - break; - - case DxbcOpcode::STORE_UAV_TYPED: - { - DxbcOperand& operand = _instruction.operand[0]; - operand.regIndex[0] += 16; - - BX_ASSERT(operand.regIndex[1] == 0 && operand.regIndex[2] == 0, "Unexpected values"); - } - break; - - default: - break; - } - } - - static void patchUAVRegisterDebugInfo(DxbcSPDB& _spdb) - { - if (!_spdb.debugCode.empty()) - { - // 'register( u[xx] )' - char* ptr = (char*)_spdb.debugCode.data(); - while (ptr < (char*)_spdb.debugCode.data() + _spdb.debugCode.size() - 3) - { - if (*(ptr+1) == ' ' - && *(ptr+2) == 'u' - && *(ptr+3) == '[') - { - char* startPtr = ptr+4; - char* endPtr = ptr+4; - - while (*endPtr != ']') - { - endPtr++; - } - - uint32_t regNum = 0; - uint32_t regLen = uint32_t(endPtr - startPtr); - bx::fromString(®Num, bx::StringView(startPtr, regLen)); - - regNum += 16; - uint32_t len = bx::toString(startPtr, regLen+2, regNum); - *(startPtr + len) = ']'; - - break; - } - - ++ptr; - } - } - } - void ShaderD3D11::create(const Memory* _mem) { bx::MemoryReader reader(_mem->data, _mem->size); @@ -4312,33 +4193,8 @@ namespace bgfx { namespace d3d11 const Memory* temp = NULL; - if (!isShaderType(magic, 'C')) - { - bx::MemoryReader rd(code, shaderSize); - - DxbcContext dxbc; - read(&rd, dxbc, bx::ErrorAssert{}); - - bool patchShader = !dxbc.shader.aon9; - if (patchShader) - { - union { uint32_t offset; void* ptr; } cast = { 0 }; - filter(dxbc.shader, dxbc.shader, patchUAVRegisterByteCode, cast.ptr); - patchUAVRegisterDebugInfo(dxbc.spdb); - - temp = alloc(shaderSize); - bx::StaticMemoryBlockWriter wr(temp->data, temp->size); - - int32_t size = write(&wr, dxbc, &err); - dxbcHash(temp->data + 20, size - 20, temp->data + 4); - - code = temp->data; - } - } - if (isShaderType(magic, 'F') ) { - m_hasDepthOp = hasDepthOp(code, shaderSize); DX_CHECK(s_renderD3D11->m_device->CreatePixelShader(code, shaderSize, NULL, &m_pixelShader) ); BGFX_FATAL(NULL != m_ptr, bgfx::Fatal::InvalidShader, "Failed to create fragment shader."); } @@ -6236,7 +6092,7 @@ namespace bgfx { namespace d3d11 const ShaderD3D11* fsh = program.m_fsh; if (NULL != fsh - && (NULL != m_currentColor || fsh->m_hasDepthOp) ) + && (NULL != m_currentColor) ) { deviceCtx->PSSetShader(fsh->m_pixelShader, NULL, 0); deviceCtx->PSSetConstantBuffers(0, 1, &fsh->m_buffer); diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index 31cf8f8b4..0324ac721 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -37,7 +37,6 @@ BX_PRAGMA_DIAGNOSTIC_POP() #include "renderer.h" #include "renderer_d3d.h" -#include "shader_dxbc.h" #include "debug_renderdoc.h" #include "nvapi.h" #include "dxgi.h" @@ -144,7 +143,6 @@ namespace bgfx { namespace d3d11 , m_hash(0) , m_numUniforms(0) , m_numPredefined(0) - , m_hasDepthOp(false) { } @@ -193,7 +191,6 @@ namespace bgfx { namespace d3d11 uint16_t m_numUniforms; uint8_t m_numPredefined; - bool m_hasDepthOp; }; struct ProgramD3D11 diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 68d01c567..b0e4d6704 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -3287,37 +3287,6 @@ namespace bgfx { namespace d3d12 return setInputLayout(_vertexElements, BX_COUNTOF(layouts), layouts, _program, _numInstanceData); } - static void patchCb0(DxbcInstruction& _instruction, void* _userData) - { - union { void* ptr; uint32_t offset; } cast = { _userData }; - - for (uint32_t ii = 0; ii < _instruction.numOperands; ++ii) - { - DxbcOperand& operand = _instruction.operand[ii]; - if (DxbcOperandType::ConstantBuffer == operand.type) - { - if (DxbcOperandAddrMode::Imm32 == operand.addrMode[0] - && 0 == operand.regIndex[0]) - { - for (uint32_t jj = 1; jj < operand.numAddrModes; ++jj) - { - if (DxbcOperandAddrMode::Imm32 == operand.addrMode[jj] - || DxbcOperandAddrMode::RegImm32 == operand.addrMode[jj]) - { - operand.regIndex[jj] += cast.offset; - } - else if (0 != cast.offset) - { - operand.subOperand[jj].regIndex = operand.regIndex[jj]; - operand.addrMode[jj] = DxbcOperandAddrMode::RegImm32; - operand.regIndex[jj] = cast.offset; - } - } - } - } - } - } - ID3D12PipelineState* getPipelineState(ProgramHandle _program) { ProgramD3D12& program = m_program[_program.idx]; @@ -3487,73 +3456,6 @@ namespace bgfx { namespace d3d12 { desc.PS.pShaderBytecode = program.m_fsh->m_code->data; desc.PS.BytecodeLength = program.m_fsh->m_code->size; - -#if 0 - bx::MemoryReader rd(program.m_fsh->m_code->data, program.m_fsh->m_code->size); - - DxbcContext dxbc; - bx::Error err; - read(&rd, dxbc, &err); - - bool patchShader = !dxbc.shader.aon9; - if (BX_ENABLED(BGFX_CONFIG_DEBUG) - && patchShader) - { - union { uint32_t offset; void* ptr; } cast = { 0 }; - filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); - - temp = alloc(uint32_t(dxbc.header.size) ); - bx::StaticMemoryBlockWriter wr(temp->data, temp->size); - - int32_t size = write(&wr, dxbc, &err); - dxbcHash(temp->data + 20, size - 20, temp->data + 4); - - patchShader = 0 == bx::memCmp(program.m_fsh->m_code->data, temp->data, 16); - BX_ASSERT(patchShader, "DXBC fragment shader patching error (ShaderHandle: %d).", program.m_fsh - m_shaders); - - if (!patchShader) - { - for (uint32_t ii = 20; ii < temp->size; ii += 16) - { - if (0 != bx::memCmp(&program.m_fsh->m_code->data[ii], &temp->data[ii], 16) ) - { - // bx::debugPrintfData(&program.m_fsh->m_code->data[ii], temp->size-ii, ""); - // bx::debugPrintfData(&temp->data[ii], temp->size-ii, ""); - break; - } - } - - desc.PS.pShaderBytecode = program.m_fsh->m_code->data; - desc.PS.BytecodeLength = program.m_fsh->m_code->size; - } - - release(temp); - temp = NULL; - } - - if (patchShader) - { - union { uint32_t offset; void* ptr; } cast = - { - uint32_t(program.m_vsh->m_size)/16 - }; - filter(dxbc.shader, dxbc.shader, patchCb0, cast.ptr); - - temp = alloc(uint32_t(dxbc.header.size) ); - bx::StaticMemoryBlockWriter wr(temp->data, temp->size); - - int32_t size = write(&wr, dxbc, &err); - dxbcHash(temp->data + 20, size - 20, temp->data + 4); - - desc.PS.pShaderBytecode = temp->data; - desc.PS.BytecodeLength = size; - } - else - { - desc.PS.pShaderBytecode = program.m_fsh->m_code->data; - desc.PS.BytecodeLength = program.m_fsh->m_code->size; - } -#endif // 0 } else { diff --git a/src/renderer_d3d12.h b/src/renderer_d3d12.h index cc20e1586..3324be906 100644 --- a/src/renderer_d3d12.h +++ b/src/renderer_d3d12.h @@ -22,7 +22,6 @@ #include "renderer.h" #include "renderer_d3d.h" -#include "shader_dxbc.h" #include "debug_renderdoc.h" #include "nvapi.h" #include "dxgi.h" diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index bd11f9ef8..bdbd28538 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -8,7 +8,6 @@ #if BGFX_CONFIG_RENDERER_VULKAN # include # include "renderer_vk.h" -# include "shader_spirv.h" #if BX_PLATFORM_OSX # import diff --git a/src/renderer_webgpu.h b/src/renderer_webgpu.h index 74d05c7e0..fe3aa46c4 100644 --- a/src/renderer_webgpu.h +++ b/src/renderer_webgpu.h @@ -15,7 +15,6 @@ ) #include "debug_renderdoc.h" -#include "shader_spirv.h" #define _WGPU_CHECK(_call) _call; BX_ASSERT(!wgpuErrorCheck(), "" #_call " failed!") diff --git a/src/shader.cpp b/src/shader.cpp index 738cb64b6..5d41f2228 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -4,8 +4,6 @@ */ #include "bgfx_p.h" -#include "shader_dxbc.h" -#include "shader_spirv.h" namespace bgfx { @@ -114,147 +112,4 @@ namespace bgfx return s_textureDimensionToId[_dim].id; } - static bool printAsm(uint32_t _offset, const DxbcInstruction& _instruction, void* _userData) - { - BX_UNUSED(_offset); - bx::WriterI* writer = reinterpret_cast(_userData); - char temp[512]; - toString(temp, sizeof(temp), _instruction); - - bx::Error err; - bx::write(writer, temp, (int32_t)bx::strLen(temp), &err); - bx::write(writer, '\n', &err); - return true; - } - - static bool printAsm(uint32_t _offset, const SpvInstruction& _instruction, void* _userData) - { - BX_UNUSED(_offset); - bx::WriterI* writer = reinterpret_cast(_userData); - char temp[512]; - toString(temp, sizeof(temp), _instruction); - - bx::Error err; - bx::write(writer, temp, (int32_t)bx::strLen(temp), &err); - bx::write(writer, '\n', &err); - return true; - } - - void disassembleByteCode(bx::WriterI* _writer, bx::ReaderSeekerI* _reader, bx::Error* _err) - { - uint32_t magic; - bx::peek(_reader, magic, _err); - - if (magic == SPV_CHUNK_HEADER) - { - SpirV spirv; - read(_reader, spirv, _err); - parse(spirv.shader, printAsm, _writer, _err); - } - else if (magic == DXBC_CHUNK_HEADER) - { - DxbcContext dxbc; - read(_reader, dxbc, _err); - parse(dxbc.shader, printAsm, _writer, _err); - } - else - { - BX_TRACE("Unrecognized shader binary format (magic: 0x%08x)!", magic); - BX_ERROR_SET(_err, kShaderInvalidHeader, "Failed to read shader binary. Invalid magic number."); - } - } - - void disassemble(bx::WriterI* _writer, bx::ReaderSeekerI* _reader, bx::Error* _err) - { - BX_ERROR_SCOPE(_err); - - uint32_t magic; - bx::peek(_reader, magic, _err); - - if (isShaderBin(magic) ) - { - bx::read(_reader, magic, _err); - - uint32_t hashIn; - bx::read(_reader, hashIn, _err); - - uint32_t hashOut; - - if (isShaderVerLess(magic, 6) ) - { - hashOut = hashIn; - } - else - { - bx::read(_reader, hashOut, _err); - } - - uint16_t count; - bx::read(_reader, count, _err); - - if (!_err->isOk() ) { return; } - - for (uint32_t ii = 0; ii < count; ++ii) - { - uint8_t nameSize = 0; - bx::read(_reader, nameSize, _err); - - if (!_err->isOk() ) { return; } - - char name[256]; - bx::read(_reader, &name, nameSize, _err); - name[nameSize] = '\0'; - - uint8_t type; - bx::read(_reader, type, _err); - - uint8_t num; - bx::read(_reader, num, _err); - - uint16_t regIndex; - bx::read(_reader, regIndex, _err); - - uint16_t regCount; - bx::read(_reader, regCount, _err); - - if (!isShaderVerLess(magic, 8) ) - { - uint16_t texInfo; - bx::read(_reader, texInfo, _err); - } - - if (!isShaderVerLess(magic, 10) ) - { - uint16_t texFormat = 0; - bx::read(_reader, texFormat, _err); - } - } - - uint32_t shaderSize; - bx::read(_reader, shaderSize, _err); - - if (!_err->isOk() ) { return; } - - uint8_t* shaderCode = (uint8_t*)bx::alloc(g_allocator, shaderSize); - bx::read(_reader, shaderCode, shaderSize, _err); - - bx::MemoryReader reader(shaderCode, shaderSize); - disassembleByteCode(_writer, &reader, _err); - - bx::write(_writer, '\0', _err); - - bx::free(g_allocator, shaderCode); - } - else - { - disassembleByteCode(_writer, _reader, _err); - } - } - - void disassemble(bx::WriterI* _writer, const void* _data, uint32_t _size, bx::Error* _err) - { - bx::MemoryReader reader(_data, _size); - disassemble(_writer, &reader, _err); - } - } // namespace bgfx diff --git a/src/shader.h b/src/shader.h index 74f46bf96..8e3d39d62 100644 --- a/src/shader.h +++ b/src/shader.h @@ -10,6 +10,18 @@ namespace bgfx { + static constexpr uint8_t kSpirvVertexBinding = 0; + static constexpr uint8_t kSpirvFragmentBinding = 1; + static constexpr uint8_t kSpirvBindShift = 2; + static constexpr uint8_t kSpirvSamplerShift = 16; + + static constexpr uint8_t kSpirvOldVertexBinding = 0; + static constexpr uint8_t kSpirvOldFragmentBinding = 48; + static constexpr uint8_t kSpirvOldFragmentShift = 48; + static constexpr uint8_t kSpirvOldBufferShift = 16; + static constexpr uint8_t kSpirvOldImageShift = 32; + static constexpr uint8_t kSpirvOldTextureShift = 16; + BX_ERROR_RESULT(kShaderInvalidHeader, BX_MAKEFOURCC('S', 'H', 0, 1) ); BX_ERROR_RESULT(kShaderInvalidInstruction, BX_MAKEFOURCC('S', 'H', 0, 2) ); diff --git a/src/shader_dxbc.cpp b/src/shader_dxbc.cpp deleted file mode 100644 index f00e4dc07..000000000 --- a/src/shader_dxbc.cpp +++ /dev/null @@ -1,2261 +0,0 @@ -/* - * Copyright 2011-2026 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE - */ - -#include "bgfx_p.h" -#include "shader_dxbc.h" - -namespace bgfx -{ - struct DxbcOpcodeInfo - { - uint8_t numOperands; - uint8_t numValues; - }; - - static const DxbcOpcodeInfo s_dxbcOpcodeInfo[] = - { - { 3, 0 }, // ADD - { 3, 0 }, // AND - { 0, 0 }, // BREAK - { 1, 0 }, // BREAKC - { 0, 0 }, // CALL - { 0, 0 }, // CALLC - { 1, 0 }, // CASE - { 0, 0 }, // CONTINUE - { 1, 0 }, // CONTINUEC - { 0, 0 }, // CUT - { 0, 0 }, // DEFAULT - { 2, 0 }, // DERIV_RTX - { 2, 0 }, // DERIV_RTY - { 1, 0 }, // DISCARD - { 3, 0 }, // DIV - { 3, 0 }, // DP2 - { 3, 0 }, // DP3 - { 3, 0 }, // DP4 - { 0, 0 }, // ELSE - { 0, 0 }, // EMIT - { 0, 0 }, // EMITTHENCUT - { 0, 0 }, // ENDIF - { 0, 0 }, // ENDLOOP - { 0, 0 }, // ENDSWITCH - { 3, 0 }, // EQ - { 2, 0 }, // EXP - { 2, 0 }, // FRC - { 2, 0 }, // FTOI - { 2, 0 }, // FTOU - { 3, 0 }, // GE - { 3, 0 }, // IADD - { 1, 0 }, // IF - { 3, 0 }, // IEQ - { 3, 0 }, // IGE - { 3, 0 }, // ILT - { 4, 0 }, // IMAD - { 3, 0 }, // IMAX - { 3, 0 }, // IMIN - { 4, 0 }, // IMUL - { 3, 0 }, // INE - { 2, 0 }, // INEG - { 3, 0 }, // ISHL - { 3, 0 }, // ISHR - { 2, 0 }, // ITOF - { 0, 0 }, // LABEL - { 3, 0 }, // LD - { 4, 0 }, // LD_MS - { 2, 0 }, // LOG - { 0, 0 }, // LOOP - { 3, 0 }, // LT - { 4, 0 }, // MAD - { 3, 0 }, // MIN - { 3, 0 }, // MAX - { 0, 1 }, // CUSTOMDATA - { 2, 0 }, // MOV - { 4, 0 }, // MOVC - { 3, 0 }, // MUL - { 3, 0 }, // NE - { 0, 0 }, // NOP - { 2, 0 }, // NOT - { 3, 0 }, // OR - { 3, 0 }, // RESINFO - { 0, 0 }, // RET - { 1, 0 }, // RETC - { 2, 0 }, // ROUND_NE - { 2, 0 }, // ROUND_NI - { 2, 0 }, // ROUND_PI - { 2, 0 }, // ROUND_Z - { 2, 0 }, // RSQ - { 4, 0 }, // SAMPLE - { 5, 0 }, // SAMPLE_C - { 5, 0 }, // SAMPLE_C_LZ - { 5, 0 }, // SAMPLE_L - { 6, 0 }, // SAMPLE_D - { 5, 0 }, // SAMPLE_B - { 2, 0 }, // SQRT - { 1, 0 }, // SWITCH - { 3, 0 }, // SINCOS - { 4, 0 }, // UDIV - { 3, 0 }, // ULT - { 3, 0 }, // UGE - { 4, 0 }, // UMUL - { 4, 0 }, // UMAD - { 3, 0 }, // UMAX - { 3, 0 }, // UMIN - { 3, 0 }, // USHR - { 2, 0 }, // UTOF - { 3, 0 }, // XOR - { 1, 1 }, // DCL_RESOURCE - { 1, 0 }, // DCL_CONSTANT_BUFFER - { 1, 0 }, // DCL_SAMPLER - { 1, 1 }, // DCL_INDEX_RANGE - { 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, 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, 1 }, // DCL_OUTPUT_SGV - { 1, 1 }, // DCL_OUTPUT_SIV - { 0, 1 }, // DCL_TEMPS - { 0, 3 }, // DCL_INDEXABLE_TEMP - { 0, 0 }, // DCL_GLOBAL_FLAGS - - { 0, 0 }, // InstrD3D10 - { 4, 0 }, // LOD - { 4, 0 }, // GATHER4 - { 0, 0 }, // SAMPLE_POS - { 0, 0 }, // SAMPLE_INFO - - { 0, 0 }, // InstrD3D10_1 - { 0, 0 }, // HS_DECLS - { 0, 0 }, // HS_CONTROL_POINT_PHASE - { 0, 0 }, // HS_FORK_PHASE - { 0, 0 }, // HS_JOIN_PHASE - { 1, 0 }, // EMIT_STREAM - { 1, 0 }, // CUT_STREAM - { 1, 0 }, // EMITTHENCUT_STREAM - { 1, 0 }, // INTERFACE_CALL - { 2, 0 }, // BUFINFO - { 2, 0 }, // DERIV_RTX_COARSE - { 2, 0 }, // DERIV_RTX_FINE - { 2, 0 }, // DERIV_RTY_COARSE - { 2, 0 }, // DERIV_RTY_FINE - { 5, 0 }, // GATHER4_C - { 5, 0 }, // GATHER4_PO - { 6, 0 }, // GATHER4_PO_C - { 2, 0 }, // RCP - { 2, 0 }, // F32TOF16 - { 2, 0 }, // F16TOF32 - { 4, 0 }, // UADDC - { 4, 0 }, // USUBB - { 2, 0 }, // COUNTBITS - { 2, 0 }, // FIRSTBIT_HI - { 2, 0 }, // FIRSTBIT_LO - { 2, 0 }, // FIRSTBIT_SHI - { 4, 0 }, // UBFE - { 4, 0 }, // IBFE - { 5, 0 }, // BFI - { 2, 0 }, // BFREV - { 5, 0 }, // SWAPC - { 1, 0 }, // DCL_STREAM - { 1, 0 }, // DCL_FUNCTION_BODY - { 0, 0 }, // DCL_FUNCTION_TABLE - { 0, 0 }, // DCL_INTERFACE - { 0, 0 }, // DCL_INPUT_CONTROL_POINT_COUNT - { 0, 0 }, // DCL_OUTPUT_CONTROL_POINT_COUNT - { 0, 0 }, // DCL_TESS_DOMAIN - { 0, 0 }, // DCL_TESS_PARTITIONING - { 0, 0 }, // DCL_TESS_OUTPUT_PRIMITIVE - { 0, 0 }, // DCL_HS_MAX_TESSFACTOR - { 0, 0 }, // DCL_HS_FORK_PHASE_INSTANCE_COUNT - { 0, 0 }, // DCL_HS_JOIN_PHASE_INSTANCE_COUNT - { 0, 3 }, // DCL_THREAD_GROUP - { 1, 1 }, // DCL_UNORDERED_ACCESS_VIEW_TYPED - { 1, 0 }, // DCL_UNORDERED_ACCESS_VIEW_RAW - { 1, 1 }, // DCL_UNORDERED_ACCESS_VIEW_STRUCTURED - { 1, 1 }, // DCL_THREAD_GROUP_SHARED_MEMORY_RAW - { 1, 2 }, // DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED - { 1, 0 }, // DCL_RESOURCE_RAW - { 1, 1 }, // DCL_RESOURCE_STRUCTURED - { 3, 0 }, // LD_UAV_TYPED - { 3, 0 }, // STORE_UAV_TYPED - { 3, 0 }, // LD_RAW - { 3, 0 }, // STORE_RAW - { 4, 0 }, // LD_STRUCTURED - { 4, 0 }, // STORE_STRUCTURED - { 3, 0 }, // ATOMIC_AND - { 3, 0 }, // ATOMIC_OR - { 3, 0 }, // ATOMIC_XOR - { 3, 0 }, // ATOMIC_CMP_STORE - { 3, 0 }, // ATOMIC_IADD - { 3, 0 }, // ATOMIC_IMAX - { 3, 0 }, // ATOMIC_IMIN - { 3, 0 }, // ATOMIC_UMAX - { 3, 0 }, // ATOMIC_UMIN - { 2, 0 }, // IMM_ATOMIC_ALLOC - { 2, 0 }, // IMM_ATOMIC_CONSUME - { 4, 0 }, // IMM_ATOMIC_IADD - { 4, 0 }, // IMM_ATOMIC_AND - { 4, 0 }, // IMM_ATOMIC_OR - { 4, 0 }, // IMM_ATOMIC_XOR - { 4, 0 }, // IMM_ATOMIC_EXCH - { 5, 0 }, // IMM_ATOMIC_CMP_EXCH - { 4, 0 }, // IMM_ATOMIC_IMAX - { 4, 0 }, // IMM_ATOMIC_IMIN - { 4, 0 }, // IMM_ATOMIC_UMAX - { 4, 0 }, // IMM_ATOMIC_UMIN - { 0, 0 }, // SYNC - { 3, 0 }, // DADD - { 3, 0 }, // DMAX - { 3, 0 }, // DMIN - { 3, 0 }, // DMUL - { 3, 0 }, // DEQ - { 3, 0 }, // DGE - { 3, 0 }, // DLT - { 3, 0 }, // DNE - { 2, 0 }, // DMOV - { 4, 0 }, // DMOVC - { 2, 0 }, // DTOF - { 2, 0 }, // FTOD - { 3, 0 }, // EVAL_SNAPPED - { 3, 0 }, // EVAL_SAMPLE_INDEX - { 2, 0 }, // EVAL_CENTROID - { 0, 1 }, // DCL_GS_INSTANCE_COUNT - { 0, 0 }, // ABORT - { 0, 0 }, // DEBUG_BREAK - - { 0, 0 }, // InstrD3D11 - { 0, 0 }, // DDIV - { 0, 0 }, // DFMA - { 0, 0 }, // DRCP - { 0, 0 }, // MSAD - { 0, 0 }, // DTOI - { 0, 0 }, // DTOU - { 0, 0 }, // ITOD - { 0, 0 }, // UTOD - }; - static_assert(BX_COUNTOF(s_dxbcOpcodeInfo) == DxbcOpcode::Count); - - static const char* s_dxbcOpcode[] = - { - "add", - "and", - "break", - "breakc", - "call", - "callc", - "case", - "continue", - "continuec", - "cut", - "default", - "deriv_rtx", - "deriv_rty", - "discard", - "div", - "dp2", - "dp3", - "dp4", - "else", - "emit", - "emitthencut", - "endif", - "endloop", - "endswitch", - "eq", - "exp", - "frc", - "ftoi", - "ftou", - "ge", - "iadd", - "if", - "ieq", - "ige", - "ilt", - "imad", - "imax", - "imin", - "imul", - "ine", - "ineg", - "ishl", - "ishr", - "itof", - "label", - "ld", - "ld_ms", - "log", - "loop", - "lt", - "mad", - "min", - "max", - "customdata", - "mov", - "movc", - "mul", - "ne", - "nop", - "not", - "or", - "resinfo", - "ret", - "retc", - "round_ne", - "round_ni", - "round_pi", - "round_z", - "rsq", - "sample", - "sample_c", - "sample_c_lz", - "sample_l", - "sample_d", - "sample_b", - "sqrt", - "switch", - "sincos", - "udiv", - "ult", - "uge", - "umul", - "umad", - "umax", - "umin", - "ushr", - "utof", - "xor", - "dcl_resource", - "dcl_constantbuffer", - "dcl_sampler", - "dcl_index_range", - "dcl_gs_output_primitive_topology", - "dcl_gs_input_primitive", - "dcl_max_output_vertex_count", - "dcl_input", - "dcl_input_sgv", - "dcl_input_siv", - "dcl_input_ps", - "dcl_input_ps_sgv", - "dcl_input_ps_siv", - "dcl_output", - "dcl_output_sgv", - "dcl_output_siv", - "dcl_temps", - "dcl_indexable_temp", - "dcl_global_flags", - - NULL, - "lod", - "gather4", - "sample_pos", - "sample_info", - - NULL, - "hs_decls", - "hs_control_point_phase", - "hs_fork_phase", - "hs_join_phase", - "emit_stream", - "cut_stream", - "emitthencut_stream", - "interface_call", - "bufinfo", - "deriv_rtx_coarse", - "deriv_rtx_fine", - "deriv_rty_coarse", - "deriv_rty_fine", - "gather4_c", - "gather4_po", - "gather4_po_c", - "rcp", - "f32tof16", - "f16tof32", - "uaddc", - "usubb", - "countbits", - "firstbit_hi", - "firstbit_lo", - "firstbit_shi", - "ubfe", - "ibfe", - "bfi", - "bfrev", - "swapc", - "dcl_stream", - "dcl_function_body", - "dcl_function_table", - "dcl_interface", - "dcl_input_control_point_count", - "dcl_output_control_point_count", - "dcl_tess_domain", - "dcl_tess_partitioning", - "dcl_tess_output_primitive", - "dcl_hs_max_tessfactor", - "dcl_hs_fork_phase_instance_count", - "dcl_hs_join_phase_instance_count", - "dcl_thread_group", - "dcl_unordered_access_view_typed", - "dcl_unordered_access_view_raw", - "dcl_unordered_access_view_structured", - "dcl_thread_group_shared_memory_raw", - "dcl_thread_group_shared_memory_structured", - "dcl_resource_raw", - "dcl_resource_structured", - "ld_uav_typed", - "store_uav_typed", - "ld_raw", - "store_raw", - "ld_structured", - "store_structured", - "atomic_and", - "atomic_or", - "atomic_xor", - "atomic_cmp_store", - "atomic_iadd", - "atomic_imax", - "atomic_imin", - "atomic_umax", - "atomic_umin", - "imm_atomic_alloc", - "imm_atomic_consume", - "imm_atomic_iadd", - "imm_atomic_and", - "imm_atomic_or", - "imm_atomic_xor", - "imm_atomic_exch", - "imm_atomic_cmp_exch", - "imm_atomic_imax", - "imm_atomic_imin", - "imm_atomic_umax", - "imm_atomic_umin", - "sync", - "dadd", - "dmax", - "dmin", - "dmul", - "deq", - "dge", - "dlt", - "dne", - "dmov", - "dmovc", - "dtof", - "ftod", - "eval_snapped", - "eval_sample_index", - "eval_centroid", - "dcl_gs_instance_count", - "abort", - "debug_break", - - NULL, - "ddiv", - "dfma", - "drcp", - "msad", - "dtoi", - "dtou", - "itod", - "utod", - }; - static_assert(BX_COUNTOF(s_dxbcOpcode) == DxbcOpcode::Count); - - const char* getName(DxbcOpcode::Enum _opcode) - { - BX_ASSERT(_opcode < DxbcOpcode::Count, "Unknown opcode id %d.", _opcode); - return s_dxbcOpcode[_opcode]; - } - - static const char* s_dxbcSrvType[] = - { - "", // Unknown - "Buffer", // Buffer - "Texture1D", // Texture1D - "Texture2D", // Texture2D - "Texture2DMS", // Texture2DMS - "Texture3D", // Texture3D - "TextureCube", // TextureCube - "Texture1DArray", // Texture1DArray - "Texture2DArray", // Texture2DArray - "Texture2DMSArray", // Texture2DMSArray - "TextureCubearray", // TextureCubearray - "RawBuffer", // RawBuffer - "StructuredBuffer", // StructuredBuffer - }; - static_assert(BX_COUNTOF(s_dxbcSrvType) == DxbcResourceDim::Count); - - const char* s_dxbcInterpolationName[] = - { - "", - "constant", - "linear", - "linear centroid", - "linear noperspective", - "linear noperspective centroid", - "linear sample", - "linear noperspective sample", - }; - static_assert(BX_COUNTOF(s_dxbcInterpolationName) == DxbcInterpolation::Count); - - const char *s_dxbcPrimitiveTopologyName[] = - { - "", - "PointList", - "LineList", - "LineStrip", - "TriangleList", - "TriangleStrip", - "", - "", - "", - "", - "LineListAdj", - "LineStripAdj", - "TriangleListAdj", - "TriangleStripAdj", - }; - 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", - }; - static_assert(BX_COUNTOF(s_dxbcPrimitiveName) == DxbcPrimitive::Count); - - // mesa/src/gallium/state_trackers/d3d1x/d3d1xshader/defs/shortfiles.txt - static const char* s_dxbcOperandType[] = - { - "r", // Temp - "v", // Input - "o", // Output - "x", // TempArray - "l", // Imm32 - "d", // Imm64 - "s", // Sampler - "t", // Resource - "cb", // ConstantBuffer - "icb", // ImmConstantBuffer - "label", // Label - "vPrim", // PrimitiveID - "oDepth", // OutputDepth - "null", // Null - "rasterizer", // Rasterizer - "oMask", // CoverageMask - "stream", // Stream - "function_body", // FunctionBody - "function_table", // FunctionTable - "interface", // Interface - "function_input", // FunctionInput - "function_output", // FunctionOutput - "vOutputControlPointID", // OutputControlPointId - "vForkInstanceID", // InputForkInstanceId - "vJoinInstanceID", // InputJoinInstanceId - "vicp", // InputControlPoint - "vocp", // OutputControlPoint - "vpc", // InputPatchConstant - "vDomain", // InputDomainPoint - "this", // ThisPointer - "u", // UnorderedAccessView - "g", // ThreadGroupSharedMemory - "vThreadID", // InputThreadId - "vThreadGrouID", // InputThreadGroupId - "vThreadIDInGroup", // InputThreadIdInGroup - "vCoverage", // InputCoverageMask - "vThreadIDInGroupFlattened", // InputThreadIdInGroupFlattened - "vGSInstanceID", // InputGsInstanceId - "oDepthGE", // OutputDepthGreaterEqual - "oDepthLE", // OutputDepthLessEqual - "vCycleCounter", // CycleCounter - }; - static_assert(BX_COUNTOF(s_dxbcOperandType) == DxbcOperandType::Count); - - static const char* s_dxbcCustomDataClass[] = - { - "Comment", - "DebugInfo", - "Opaque", - "dcl_immediateConstantBuffer", - "ShaderMessage", - "ClipPlaneConstantMappingsForDx9", - }; - static_assert(BX_COUNTOF(s_dxbcCustomDataClass) == DxbcCustomDataClass::Count); - -#define DXBC_MAX_NAME_STRING 512 - - int32_t readString(bx::ReaderSeekerI* _reader, int64_t _offset, char* _out, uint32_t _max, bx::Error* _err) - { - int64_t oldOffset = bx::seek(_reader); - bx::seek(_reader, _offset, bx::Whence::Begin); - - int32_t size = 0; - - for (uint32_t ii = 0; ii < _max-1; ++ii) - { - char ch; - size += bx::read(_reader, ch, _err); - *_out++ = ch; - - if ('\0' == ch) - { - break; - } - } - *_out = '\0'; - - bx::seek(_reader, oldOffset, bx::Whence::Begin); - - return size; - } - - inline uint32_t dxbcMixF(uint32_t _b, uint32_t _c, uint32_t _d) - { - const uint32_t tmp0 = bx::uint32_xor(_c, _d); - const uint32_t tmp1 = bx::uint32_and(_b, tmp0); - const uint32_t result = bx::uint32_xor(_d, tmp1); - - return result; - } - - inline uint32_t dxbcMixG(uint32_t _b, uint32_t _c, uint32_t _d) - { - return dxbcMixF(_d, _b, _c); - } - - inline uint32_t dxbcMixH(uint32_t _b, uint32_t _c, uint32_t _d) - { - const uint32_t tmp0 = bx::uint32_xor(_b, _c); - const uint32_t result = bx::uint32_xor(_d, tmp0); - - return result; - } - - inline uint32_t dxbcMixI(uint32_t _b, uint32_t _c, uint32_t _d) - { - const uint32_t tmp0 = bx::uint32_orc(_b, _d); - const uint32_t result = bx::uint32_xor(_c, tmp0); - - return result; - } - - void dxbcHashBlock(const uint32_t* data, uint32_t* hash) - { - const uint32_t d0 = data[ 0]; - const uint32_t d1 = data[ 1]; - const uint32_t d2 = data[ 2]; - const uint32_t d3 = data[ 3]; - const uint32_t d4 = data[ 4]; - const uint32_t d5 = data[ 5]; - const uint32_t d6 = data[ 6]; - const uint32_t d7 = data[ 7]; - const uint32_t d8 = data[ 8]; - const uint32_t d9 = data[ 9]; - const uint32_t d10 = data[10]; - const uint32_t d11 = data[11]; - const uint32_t d12 = data[12]; - const uint32_t d13 = data[13]; - const uint32_t d14 = data[14]; - const uint32_t d15 = data[15]; - - uint32_t aa = hash[0]; - uint32_t bb = hash[1]; - uint32_t cc = hash[2]; - uint32_t dd = hash[3]; - - aa = bb + bx::uint32_rol(aa + dxbcMixF(bb, cc, dd) + d0 + 0xd76aa478, 7); - dd = aa + bx::uint32_rol(dd + dxbcMixF(aa, bb, cc) + d1 + 0xe8c7b756, 12); - cc = dd + bx::uint32_ror(cc + dxbcMixF(dd, aa, bb) + d2 + 0x242070db, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixF(cc, dd, aa) + d3 + 0xc1bdceee, 10); - aa = bb + bx::uint32_rol(aa + dxbcMixF(bb, cc, dd) + d4 + 0xf57c0faf, 7); - dd = aa + bx::uint32_rol(dd + dxbcMixF(aa, bb, cc) + d5 + 0x4787c62a, 12); - cc = dd + bx::uint32_ror(cc + dxbcMixF(dd, aa, bb) + d6 + 0xa8304613, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixF(cc, dd, aa) + d7 + 0xfd469501, 10); - aa = bb + bx::uint32_rol(aa + dxbcMixF(bb, cc, dd) + d8 + 0x698098d8, 7); - dd = aa + bx::uint32_rol(dd + dxbcMixF(aa, bb, cc) + d9 + 0x8b44f7af, 12); - cc = dd + bx::uint32_ror(cc + dxbcMixF(dd, aa, bb) + d10 + 0xffff5bb1, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixF(cc, dd, aa) + d11 + 0x895cd7be, 10); - aa = bb + bx::uint32_rol(aa + dxbcMixF(bb, cc, dd) + d12 + 0x6b901122, 7); - dd = aa + bx::uint32_rol(dd + dxbcMixF(aa, bb, cc) + d13 + 0xfd987193, 12); - cc = dd + bx::uint32_ror(cc + dxbcMixF(dd, aa, bb) + d14 + 0xa679438e, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixF(cc, dd, aa) + d15 + 0x49b40821, 10); - - aa = bb + bx::uint32_rol(aa + dxbcMixG(bb, cc, dd) + d1 + 0xf61e2562, 5); - dd = aa + bx::uint32_rol(dd + dxbcMixG(aa, bb, cc) + d6 + 0xc040b340, 9); - cc = dd + bx::uint32_rol(cc + dxbcMixG(dd, aa, bb) + d11 + 0x265e5a51, 14); - bb = cc + bx::uint32_ror(bb + dxbcMixG(cc, dd, aa) + d0 + 0xe9b6c7aa, 12); - aa = bb + bx::uint32_rol(aa + dxbcMixG(bb, cc, dd) + d5 + 0xd62f105d, 5); - dd = aa + bx::uint32_rol(dd + dxbcMixG(aa, bb, cc) + d10 + 0x02441453, 9); - cc = dd + bx::uint32_rol(cc + dxbcMixG(dd, aa, bb) + d15 + 0xd8a1e681, 14); - bb = cc + bx::uint32_ror(bb + dxbcMixG(cc, dd, aa) + d4 + 0xe7d3fbc8, 12); - aa = bb + bx::uint32_rol(aa + dxbcMixG(bb, cc, dd) + d9 + 0x21e1cde6, 5); - dd = aa + bx::uint32_rol(dd + dxbcMixG(aa, bb, cc) + d14 + 0xc33707d6, 9); - cc = dd + bx::uint32_rol(cc + dxbcMixG(dd, aa, bb) + d3 + 0xf4d50d87, 14); - bb = cc + bx::uint32_ror(bb + dxbcMixG(cc, dd, aa) + d8 + 0x455a14ed, 12); - aa = bb + bx::uint32_rol(aa + dxbcMixG(bb, cc, dd) + d13 + 0xa9e3e905, 5); - dd = aa + bx::uint32_rol(dd + dxbcMixG(aa, bb, cc) + d2 + 0xfcefa3f8, 9); - cc = dd + bx::uint32_rol(cc + dxbcMixG(dd, aa, bb) + d7 + 0x676f02d9, 14); - bb = cc + bx::uint32_ror(bb + dxbcMixG(cc, dd, aa) + d12 + 0x8d2a4c8a, 12); - - aa = bb + bx::uint32_rol(aa + dxbcMixH(bb, cc, dd) + d5 + 0xfffa3942, 4); - dd = aa + bx::uint32_rol(dd + dxbcMixH(aa, bb, cc) + d8 + 0x8771f681, 11); - cc = dd + bx::uint32_rol(cc + dxbcMixH(dd, aa, bb) + d11 + 0x6d9d6122, 16); - bb = cc + bx::uint32_ror(bb + dxbcMixH(cc, dd, aa) + d14 + 0xfde5380c, 9); - aa = bb + bx::uint32_rol(aa + dxbcMixH(bb, cc, dd) + d1 + 0xa4beea44, 4); - dd = aa + bx::uint32_rol(dd + dxbcMixH(aa, bb, cc) + d4 + 0x4bdecfa9, 11); - cc = dd + bx::uint32_rol(cc + dxbcMixH(dd, aa, bb) + d7 + 0xf6bb4b60, 16); - bb = cc + bx::uint32_ror(bb + dxbcMixH(cc, dd, aa) + d10 + 0xbebfbc70, 9); - aa = bb + bx::uint32_rol(aa + dxbcMixH(bb, cc, dd) + d13 + 0x289b7ec6, 4); - dd = aa + bx::uint32_rol(dd + dxbcMixH(aa, bb, cc) + d0 + 0xeaa127fa, 11); - cc = dd + bx::uint32_rol(cc + dxbcMixH(dd, aa, bb) + d3 + 0xd4ef3085, 16); - bb = cc + bx::uint32_ror(bb + dxbcMixH(cc, dd, aa) + d6 + 0x04881d05, 9); - aa = bb + bx::uint32_rol(aa + dxbcMixH(bb, cc, dd) + d9 + 0xd9d4d039, 4); - dd = aa + bx::uint32_rol(dd + dxbcMixH(aa, bb, cc) + d12 + 0xe6db99e5, 11); - cc = dd + bx::uint32_rol(cc + dxbcMixH(dd, aa, bb) + d15 + 0x1fa27cf8, 16); - bb = cc + bx::uint32_ror(bb + dxbcMixH(cc, dd, aa) + d2 + 0xc4ac5665, 9); - - aa = bb + bx::uint32_rol(aa + dxbcMixI(bb, cc, dd) + d0 + 0xf4292244, 6); - dd = aa + bx::uint32_rol(dd + dxbcMixI(aa, bb, cc) + d7 + 0x432aff97, 10); - cc = dd + bx::uint32_rol(cc + dxbcMixI(dd, aa, bb) + d14 + 0xab9423a7, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixI(cc, dd, aa) + d5 + 0xfc93a039, 11); - aa = bb + bx::uint32_rol(aa + dxbcMixI(bb, cc, dd) + d12 + 0x655b59c3, 6); - dd = aa + bx::uint32_rol(dd + dxbcMixI(aa, bb, cc) + d3 + 0x8f0ccc92, 10); - cc = dd + bx::uint32_rol(cc + dxbcMixI(dd, aa, bb) + d10 + 0xffeff47d, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixI(cc, dd, aa) + d1 + 0x85845dd1, 11); - aa = bb + bx::uint32_rol(aa + dxbcMixI(bb, cc, dd) + d8 + 0x6fa87e4f, 6); - dd = aa + bx::uint32_rol(dd + dxbcMixI(aa, bb, cc) + d15 + 0xfe2ce6e0, 10); - cc = dd + bx::uint32_rol(cc + dxbcMixI(dd, aa, bb) + d6 + 0xa3014314, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixI(cc, dd, aa) + d13 + 0x4e0811a1, 11); - aa = bb + bx::uint32_rol(aa + dxbcMixI(bb, cc, dd) + d4 + 0xf7537e82, 6); - dd = aa + bx::uint32_rol(dd + dxbcMixI(aa, bb, cc) + d11 + 0xbd3af235, 10); - cc = dd + bx::uint32_rol(cc + dxbcMixI(dd, aa, bb) + d2 + 0x2ad7d2bb, 15); - bb = cc + bx::uint32_ror(bb + dxbcMixI(cc, dd, aa) + d9 + 0xeb86d391, 11); - - hash[0] += aa; - hash[1] += bb; - hash[2] += cc; - hash[3] += dd; - } - - // dxbc hash function is slightly modified version of MD5 hash. - // 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. - // - void dxbcHash(const void* _data, uint32_t _size, void* _digest) - { - uint32_t hash[4] = - { - 0x67452301, - 0xefcdab89, - 0x98badcfe, - 0x10325476, - }; - - const uint32_t* data = (const uint32_t*)_data; - for (uint32_t ii = 0, num = _size/64; ii < num; ++ii) - { - dxbcHashBlock(data, hash); - data += 16; - } - - uint32_t last[16]; - bx::memSet(last, 0, sizeof(last) ); - - const uint32_t remaining = _size & 0x3f; - - if (remaining >= 56) - { - bx::memCopy(&last[0], data, remaining); - last[remaining/4] = 0x80; - dxbcHashBlock(last, hash); - - bx::memSet(&last[1], 0, 56); - } - else - { - bx::memCopy(&last[1], data, remaining); - last[1 + remaining/4] = 0x80; - } - - last[ 0] = _size * 8; - last[15] = _size * 2 + 1; - dxbcHashBlock(last, hash); - - bx::memCopy(_digest, hash, 16); - } - - int32_t read(bx::ReaderI* _reader, DxbcSubOperand& _subOperand, bx::Error* _err) - { - uint32_t token; - int32_t size = 0; - - // 0 1 2 3 - // 76543210765432107654321076543210 - // e222111000nnttttttttssssssssmmoo - // ^^ ^ ^ ^ ^ ^ ^ ^-- number of operands - // || | | | | | +---- operand mode - // || | | | | +------------ operand mode bits - // || | | | +-------------------- type - // || | | +---------------------- number of addressing modes - // || | +------------------------- addressing mode 0 - // || +---------------------------- addressing mode 1 - // |+------------------------------- addressing mode 2 - // +-------------------------------- extended - - size += bx::read(_reader, token, _err); - _subOperand.type = DxbcOperandType::Enum( (token & UINT32_C(0x000ff000) ) >> 12); - _subOperand.numAddrModes = uint8_t( (token & UINT32_C(0x00300000) ) >> 20); - _subOperand.addrMode = uint8_t( (token & UINT32_C(0x01c00000) ) >> 22); - _subOperand.mode = DxbcOperandMode::Enum( (token & UINT32_C(0x0000000c) ) >> 2); - _subOperand.modeBits = uint8_t( (token & UINT32_C(0x00000ff0) ) >> 4) & "\x0f\xff\x03\x00"[_subOperand.mode]; - _subOperand.num = uint8_t( (token & UINT32_C(0x00000003) ) ); - - switch (_subOperand.addrMode) - { - case DxbcOperandAddrMode::Imm32: - size += bx::read(_reader, _subOperand.regIndex, _err); - break; - - case DxbcOperandAddrMode::Reg: - { - DxbcSubOperand subOperand; - size += read(_reader, subOperand, _err); - } - break; - - case DxbcOperandAddrMode::RegImm32: - { - size += bx::read(_reader, _subOperand.regIndex, _err); - - DxbcSubOperand subOperand; - size += read(_reader, subOperand, _err); - } - break; - - case DxbcOperandAddrMode::RegImm64: - { - size += bx::read(_reader, _subOperand.regIndex, _err); - size += bx::read(_reader, _subOperand.regIndex, _err); - - DxbcSubOperand subOperand; - size += read(_reader, subOperand, _err); - } - break; - - default: - BX_ASSERT(false, "sub operand addressing mode %d", _subOperand.addrMode); - break; - } - - return size; - } - - int32_t write(bx::WriterI* _writer, const DxbcSubOperand& _subOperand, bx::Error* _err) - { - int32_t size = 0; - - uint32_t token = 0; - token |= (_subOperand.type << 12) & UINT32_C(0x000ff000); - token |= (_subOperand.numAddrModes << 20) & UINT32_C(0x00300000); - token |= (_subOperand.addrMode << 22) & UINT32_C(0x01c00000); - token |= (_subOperand.mode << 2) & UINT32_C(0x0000000c); - token |= (_subOperand.modeBits << 4) & UINT32_C(0x00000ff0); - token |= _subOperand.num & UINT32_C(0x00000003); - size += bx::write(_writer, token, _err); - - switch (_subOperand.addrMode) - { - case DxbcOperandAddrMode::Imm32: - size += bx::write(_writer, _subOperand.regIndex, _err); - break; - - case DxbcOperandAddrMode::Reg: - { - DxbcSubOperand subOperand; - size += write(_writer, subOperand, _err); - } - break; - - case DxbcOperandAddrMode::RegImm32: - { - size += bx::write(_writer, _subOperand.regIndex, _err); - - DxbcSubOperand subOperand; - size += write(_writer, subOperand, _err); - } - break; - - case DxbcOperandAddrMode::RegImm64: - { - size += bx::write(_writer, _subOperand.regIndex, _err); - size += bx::write(_writer, _subOperand.regIndex, _err); - - DxbcSubOperand subOperand; - size += write(_writer, subOperand, _err); - } - break; - - default: - BX_ASSERT(false, "sub operand addressing mode %d", _subOperand.addrMode); - break; - } - - return size; - } - - int32_t read(bx::ReaderI* _reader, DxbcOperand& _operand, bx::Error* _err) - { - int32_t size = 0; - - uint32_t token; - size += bx::read(_reader, token, _err); - - // 0 1 2 3 - // 76543210765432107654321076543210 - // e222111000nnttttttttssssssssmmoo - // ^^ ^ ^ ^ ^ ^ ^ ^-- number of operands - // || | | | | | +---- operand mode - // || | | | | +------------ operand mode bits - // || | | | +-------------------- type - // || | | +---------------------- number of addressing modes - // || | +------------------------- addressing mode 0 - // || +---------------------------- addressing mode 1 - // |+------------------------------- addressing mode 2 - // +-------------------------------- extended - - _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); - _operand.addrMode[2] = uint8_t( (token & UINT32_C(0x70000000) ) >> 28); - _operand.type = DxbcOperandType::Enum( (token & UINT32_C(0x000ff000) ) >> 12); - _operand.mode = DxbcOperandMode::Enum( (token & UINT32_C(0x0000000c) ) >> 2); - _operand.modeBits = uint8_t( (token & UINT32_C(0x00000ff0) ) >> 4) & "\x0f\xff\x03\x00"[_operand.mode]; - _operand.num = uint8_t( (token & UINT32_C(0x00000003) ) ); - - const bool extended = 0 != (token & UINT32_C(0x80000000) ); - if (extended) - { - 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) - { - case DxbcOperandType::Imm32: - _operand.num = 2 == _operand.num ? 4 : _operand.num; - for (uint32_t ii = 0; ii < _operand.num; ++ii) - { - size += bx::read(_reader, _operand.un.imm32[ii], _err); - } - break; - - case DxbcOperandType::Imm64: - _operand.num = 2 == _operand.num ? 4 : _operand.num; - for (uint32_t ii = 0; ii < _operand.num; ++ii) - { - size += bx::read(_reader, _operand.un.imm64[ii], _err); - } - break; - - default: - break; - } - - for (uint32_t ii = 0; ii < _operand.numAddrModes; ++ii) - { - switch (_operand.addrMode[ii]) - { - case DxbcOperandAddrMode::Imm32: - size += bx::read(_reader, _operand.regIndex[ii], _err); - break; - - case DxbcOperandAddrMode::Reg: - size += read(_reader, _operand.subOperand[ii], _err); - break; - - case DxbcOperandAddrMode::RegImm32: - size += bx::read(_reader, _operand.regIndex[ii], _err); - size += read(_reader, _operand.subOperand[ii], _err); - break; - - default: - BX_ASSERT(false, "operand %d addressing mode %d", ii, _operand.addrMode[ii]); - break; - } - } - - return size; - } - - int32_t write(bx::WriterI* _writer, const DxbcOperand& _operand, bx::Error* _err) - { - int32_t size = 0; - - const bool extended = _operand.modifier != DxbcOperandModifier::None; - - uint32_t token = 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); - token |= (_operand.addrMode[2] << 28) & UINT32_C(0x70000000); - token |= (_operand.type << 12) & UINT32_C(0x000ff000); - token |= (_operand.mode << 2) & UINT32_C(0x0000000c); - - token |= (4 == _operand.num ? 2 : _operand.num) & UINT32_C(0x00000003); - token |= ( (_operand.modeBits & "\x0f\xff\x03\x00"[_operand.mode]) << 4) & UINT32_C(0x00000ff0); - - size += bx::write(_writer, token, _err); - - if (extended) - { - 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) - { - case DxbcOperandType::Imm32: - for (uint32_t ii = 0; ii < _operand.num; ++ii) - { - size += bx::write(_writer, _operand.un.imm32[ii], _err); - } - break; - - case DxbcOperandType::Imm64: - for (uint32_t ii = 0; ii < _operand.num; ++ii) - { - size += bx::write(_writer, _operand.un.imm64[ii], _err); - } - break; - - default: - break; - } - - for (uint32_t ii = 0, num = bx::uint32_min(_operand.numAddrModes, BX_COUNTOF(_operand.addrMode) ); ii < num; ++ii) - { - switch (_operand.addrMode[ii]) - { - case DxbcOperandAddrMode::Imm32: - size += bx::write(_writer, _operand.regIndex[ii], _err); - break; - - case DxbcOperandAddrMode::Reg: - size += write(_writer, _operand.subOperand[ii], _err); - break; - - case DxbcOperandAddrMode::RegImm32: - size += bx::write(_writer, _operand.regIndex[ii], _err); - size += write(_writer, _operand.subOperand[ii], _err); - break; - - default: - BX_ASSERT(false, "operand %d addressing mode %d", ii, _operand.addrMode[ii]); - break; - } - } - - return size; - } - - int32_t read(bx::ReaderI* _reader, DxbcInstruction& _instruction, bx::Error* _err) - { - int32_t size = 0; - - uint32_t token; - size += bx::read(_reader, token, _err); - - // 0 1 2 3 - // 76543210765432107654321076543210 - // elllllll.............ooooooooooo - // ^^ ^----------- opcode - // |+------------------------------- length - // +-------------------------------- 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) ); - - _instruction.srv = DxbcResourceDim::Unknown; - _instruction.samples = 0; - - _instruction.shadow = false; - _instruction.mono = false; - - _instruction.allowRefactoring = false; - _instruction.fp64 = false; - _instruction.earlyDepth = false; - _instruction.enableBuffers = false; - _instruction.skipOptimization = false; - _instruction.enableMinPrecision = false; - _instruction.enableDoubleExtensions = false; - _instruction.enableShaderExtensions = false; - - _instruction.threadsInGroup = false; - _instruction.sharedMemory = false; - _instruction.uavGroup = false; - _instruction.uavGlobal = false; - - _instruction.saturate = false; - _instruction.testNZ = false; - _instruction.retType = DxbcResourceReturnType::Unused; - - _instruction.customDataClass = DxbcCustomDataClass::Comment; - _instruction.customData.clear(); - - switch (_instruction.opcode) - { - case DxbcOpcode::CUSTOMDATA: - { - _instruction.customDataClass = DxbcCustomDataClass::Enum( (token & UINT32_C(0xfffff800) ) >> 11); - - _instruction.numOperands = 0; - size += bx::read(_reader, _instruction.length, _err); - for (uint32_t ii = 0, num = (_instruction.length-2); ii < num && _err->isOk(); ++ii) - { - uint32_t temp; - size += bx::read(_reader, temp, _err); - if (_err->isOk() ) - { - _instruction.customData.push_back(temp); - } - } - } - return size; - - case DxbcOpcode::DCL_CONSTANT_BUFFER: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ a........... - // ^------------ Allow refactoring - - _instruction.allowRefactoring = 0 != (token & UINT32_C(0x00000800) ); - break; - - case DxbcOpcode::DCL_GLOBAL_FLAGS: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ sxmoudfa........... - // ^^^^^^^^------------ Allow refactoring - // ||||||+------------- FP64 - // |||||+-------------- Force early depth/stencil - // ||||+--------------- Enable raw and structured buffers - // |||+---------------- Skip optimizations - // ||+----------------- Enable minimum precision - // |+------------------ Enable double extension - // +------------------- Enable shader extension - - _instruction.allowRefactoring = 0 != (token & UINT32_C(0x00000800) ); - _instruction.fp64 = 0 != (token & UINT32_C(0x00001000) ); - _instruction.earlyDepth = 0 != (token & UINT32_C(0x00002000) ); - _instruction.enableBuffers = 0 != (token & UINT32_C(0x00004000) ); - _instruction.skipOptimization = 0 != (token & UINT32_C(0x00008000) ); - _instruction.enableMinPrecision = 0 != (token & UINT32_C(0x00010000) ); - _instruction.enableDoubleExtensions = 0 != (token & UINT32_C(0x00020000) ); - _instruction.enableShaderExtensions = 0 != (token & UINT32_C(0x00040000) ); - break; - - 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: [[fallthrough]]; - case DxbcOpcode::DCL_INPUT_PS_SIV: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ iiiii........... - // ^---------------- Interpolation - - _instruction.interpolation = DxbcInterpolation::Enum( (token & UINT32_C(0x0000f800) ) >> 11); - break; - - case DxbcOpcode::DCL_RESOURCE: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ sssssssrrrrr........... - // ^ ^---------------- SRV - // +----------------------- MSAA samples - - _instruction.srv = DxbcResourceDim::Enum( (token & UINT32_C(0x0000f800) ) >> 11); - _instruction.samples = uint8_t( (token & UINT32_C(0x007f0000) ) >> 16); - break; - - case DxbcOpcode::DCL_SAMPLER: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ ms........... - // ^^------------ Shadow sampler - // +------------- Mono - - _instruction.shadow = 0 != (token & UINT32_C(0x00000800) ); - _instruction.mono = 0 != (token & UINT32_C(0x00001000) ); - break; - - case DxbcOpcode::SYNC: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ gust........... - // ^^^^------------ Threads in group - // ||+------------- Shared memory - // |+-------------- UAV group - // +--------------- UAV global - - _instruction.threadsInGroup = 0 != (token & UINT32_C(0x00000800) ); - _instruction.sharedMemory = 0 != (token & UINT32_C(0x00001000) ); - _instruction.uavGroup = 0 != (token & UINT32_C(0x00002000) ); - _instruction.uavGlobal = 0 != (token & UINT32_C(0x00004000) ); - break; - - default: - // 0 1 2 3 - // 76543210765432107654321076543210 - // ........ ppppn stt........... - // ^ ^ ^^------------- Resource info return type - // | | +-------------- Saturate - // | +------------------- Test not zero - // +----------------------- Precise mask - - _instruction.retType = DxbcResourceReturnType::Enum( (token & UINT32_C(0x00001800) ) >> 11); - _instruction.saturate = 0 != (token & UINT32_C(0x00002000) ); - _instruction.testNZ = 0 != (token & UINT32_C(0x00040000) ); -// _instruction.precise = uint8_t( (token & UINT32_C(0x00780000) ) >> 19); - break; - } - - _instruction.extended[0] = DxbcInstruction::ExtendedType::Count; - for (uint32_t ii = 0; extended; ++ii) - { - // 0 1 2 3 - // 76543210765432107654321076543210 - // e..........................ttttt - // ^ ^ - // | +----- type - // +-------------------------------- extended - - uint32_t 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; - - switch (_instruction.extended[ii]) - { - case DxbcInstruction::ExtendedType::SampleControls: - // 0 1 2 3 - // 76543210765432107654321076543210 - // . zzzzyyyyxxxx ..... - // ^ ^ ^ - // | | +------------- x - // | +----------------- y - // +--------------------- z - - _instruction.sampleOffsets[0] = uint8_t( (extBits & UINT32_C(0x00001e00) ) >> 9); - _instruction.sampleOffsets[1] = uint8_t( (extBits & UINT32_C(0x0001e000) ) >> 13); - _instruction.sampleOffsets[2] = uint8_t( (extBits & UINT32_C(0x001e0000) ) >> 17); - break; - - case DxbcInstruction::ExtendedType::ResourceDim: - // 0 1 2 3 - // 76543210765432107654321076543210 - // . ..... - // - - _instruction.resourceTarget = uint8_t( (extBits & UINT32_C(0x000003e0) ) >> 6); - _instruction.resourceStride = uint8_t( (extBits & UINT32_C(0x0000f800) ) >> 11); - break; - - case DxbcInstruction::ExtendedType::ResourceReturnType: - // 0 1 2 3 - // 76543210765432107654321076543210 - // . 3333222211110000..... - // ^ ^ ^ - // | | +------------- x - // | +----------------- y - // +--------------------- z - - _instruction.resourceReturnTypes[0] = DxbcResourceReturnType::Enum( (extBits & UINT32_C(0x000001e0) ) >> 6); - _instruction.resourceReturnTypes[1] = DxbcResourceReturnType::Enum( (extBits & UINT32_C(0x00001e00) ) >> 9); - _instruction.resourceReturnTypes[2] = DxbcResourceReturnType::Enum( (extBits & UINT32_C(0x0001e000) ) >> 13); - _instruction.resourceReturnTypes[3] = DxbcResourceReturnType::Enum( (extBits & UINT32_C(0x001e0000) ) >> 17); - break; - - default: - break; - } - } - - switch (_instruction.opcode) - { - case DxbcOpcode::DCL_FUNCTION_TABLE: - { - uint32_t tableId; - size += read(_reader, tableId, _err); - - uint32_t num; - size += read(_reader, num, _err); - - for (uint32_t ii = 0; ii < num; ++ii) - { - uint32_t bodyId; - size += read(_reader, bodyId, _err); - } - } - break; - - case DxbcOpcode::DCL_INTERFACE: - { - uint32_t interfaceId; - size += read(_reader, interfaceId, _err); - - uint32_t num; - size += read(_reader, num, _err); - - BX_ASSERT(false, "not implemented."); - } - break; - - default: - break; - }; - - uint32_t currOp = 0; - - const DxbcOpcodeInfo& info = s_dxbcOpcodeInfo[_instruction.opcode]; - _instruction.numOperands = info.numOperands; - switch (info.numOperands) - { - case 6: size += read(_reader, _instruction.operand[currOp++], _err); [[fallthrough]]; - case 5: size += read(_reader, _instruction.operand[currOp++], _err); [[fallthrough]]; - case 4: size += read(_reader, _instruction.operand[currOp++], _err); [[fallthrough]]; - case 3: size += read(_reader, _instruction.operand[currOp++], _err); [[fallthrough]]; - case 2: size += read(_reader, _instruction.operand[currOp++], _err); [[fallthrough]]; - case 1: size += read(_reader, _instruction.operand[currOp++], _err); [[fallthrough]]; - case 0: - if (0 < info.numValues) - { - size += read(_reader, _instruction.value, info.numValues*sizeof(uint32_t), _err); - } - break; - - default: - BX_ASSERT(false, "Instruction %s with invalid number of operands %d (numValues %d)." - , getName(_instruction.opcode) - , info.numOperands - , info.numValues - ); - break; - } - - return size; - } - - int32_t write(bx::WriterI* _writer, const DxbcInstruction& _instruction, bx::Error* _err) - { - uint32_t token = 0; - token |= (_instruction.opcode ) & UINT32_C(0x000007ff); - token |= (_instruction.length << 24) & UINT32_C(0x7f000000); - - token |= DxbcInstruction::ExtendedType::Count != _instruction.extended[0] - ? UINT32_C(0x80000000) - : 0 - ; - - int32_t size =0; - - switch (_instruction.opcode) - { - case DxbcOpcode::CUSTOMDATA: - { - token &= UINT32_C(0x000007ff); - token |= _instruction.customDataClass << 11; - - 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); - size += bx::write(_writer, _instruction.customData.data(), len, _err); - } - return size; - - case DxbcOpcode::DCL_CONSTANT_BUFFER: - token |= _instruction.allowRefactoring ? UINT32_C(0x00000800) : 0; - break; - - case DxbcOpcode::DCL_GLOBAL_FLAGS: - token |= _instruction.allowRefactoring ? UINT32_C(0x00000800) : 0; - token |= _instruction.fp64 ? UINT32_C(0x00001000) : 0; - token |= _instruction.earlyDepth ? UINT32_C(0x00002000) : 0; - token |= _instruction.enableBuffers ? UINT32_C(0x00004000) : 0; - token |= _instruction.skipOptimization ? UINT32_C(0x00008000) : 0; - token |= _instruction.enableMinPrecision ? UINT32_C(0x00010000) : 0; - token |= _instruction.enableDoubleExtensions ? UINT32_C(0x00020000) : 0; - token |= _instruction.enableShaderExtensions ? UINT32_C(0x00040000) : 0; - break; - - 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: [[fallthrough]]; - case DxbcOpcode::DCL_INPUT_PS_SIV: - token |= (_instruction.interpolation << 11) & UINT32_C(0x0000f800); - break; - - case DxbcOpcode::DCL_RESOURCE: - token |= (_instruction.srv << 11) & UINT32_C(0x0000f800); - token |= (_instruction.samples << 16) & UINT32_C(0x007f0000); - break; - - case DxbcOpcode::DCL_SAMPLER: - token |= _instruction.shadow ? (0x00000800) : 0; - token |= _instruction.mono ? (0x00001000) : 0; - break; - - case DxbcOpcode::SYNC: - token |= _instruction.threadsInGroup ? UINT32_C(0x00000800) : 0; - token |= _instruction.sharedMemory ? UINT32_C(0x00001000) : 0; - token |= _instruction.uavGroup ? UINT32_C(0x00002000) : 0; - token |= _instruction.uavGlobal ? UINT32_C(0x00004000) : 0; - break; - - default: - token |= (_instruction.retType << 11) & UINT32_C(0x00001800); - token |= _instruction.saturate ? UINT32_C(0x00002000) : 0; - token |= _instruction.testNZ ? UINT32_C(0x00040000) : 0; -// _instruction.precise = uint8_t( (token & UINT32_C(0x00780000) ) >> 19); - break; - } - - size += bx::write(_writer, token, _err); - - for (uint32_t ii = 0; _instruction.extended[ii] != DxbcInstruction::ExtendedType::Count; ++ii) - { - // 0 1 2 3 - // 76543210765432107654321076543210 - // e..........................ttttt - // ^ ^ - // | +----- type - // +-------------------------------- extended - - token = _instruction.extended[ii+1] == DxbcInstruction::ExtendedType::Count - ? 0 - : UINT32_C(0x80000000) - ; - token |= uint8_t(_instruction.extended[ii]); - - switch (_instruction.extended[ii]) - { - case DxbcInstruction::ExtendedType::SampleControls: - // 0 1 2 3 - // 76543210765432107654321076543210 - // . zzzzyyyyxxxx ..... - // ^ ^ ^ - // | | +------------- x - // | +----------------- y - // +--------------------- z - - token |= (uint32_t(_instruction.sampleOffsets[0]) << 9) & UINT32_C(0x00001e00); - token |= (uint32_t(_instruction.sampleOffsets[1]) << 13) & UINT32_C(0x0001e000); - token |= (uint32_t(_instruction.sampleOffsets[2]) << 17) & UINT32_C(0x001e0000); - break; - - case DxbcInstruction::ExtendedType::ResourceDim: - // 0 1 2 3 - // 76543210765432107654321076543210 - // . ..... - // - - token |= (uint32_t(_instruction.resourceTarget << 6) & UINT32_C(0x000003e0) ); - token |= (uint32_t(_instruction.resourceStride << 11) & UINT32_C(0x0000f800) ); - break; - - case DxbcInstruction::ExtendedType::ResourceReturnType: - // 0 1 2 3 - // 76543210765432107654321076543210 - // . 3333222211110000..... - // ^ ^ ^ - // | | +------------- x - // | +----------------- y - // +--------------------- z - - token |= (uint32_t(_instruction.resourceReturnTypes[0]) << 6) & UINT32_C(0x000001e0); - token |= (uint32_t(_instruction.resourceReturnTypes[1]) << 9) & UINT32_C(0x00001e00); - token |= (uint32_t(_instruction.resourceReturnTypes[2]) << 13) & UINT32_C(0x0001e000); - token |= (uint32_t(_instruction.resourceReturnTypes[3]) << 17) & UINT32_C(0x001e0000); - break; - - default: - break; - } - - size += bx::write(_writer, token, _err); - } - - for (uint32_t ii = 0; ii < _instruction.numOperands; ++ii) - { - size += write(_writer, _instruction.operand[ii], _err); - } - - const DxbcOpcodeInfo& info = s_dxbcOpcodeInfo[_instruction.opcode]; - if (0 < info.numValues) - { - size += bx::write(_writer, _instruction.value, info.numValues*sizeof(uint32_t), _err); - } - - return size; - } - - int32_t toString(char* _out, int32_t _size, DxbcOperandMode::Enum _mode, uint8_t _modeBits) - { - int32_t size = 0; - - switch (_mode) - { - case DxbcOperandMode::Mask: - if (0xf > _modeBits - && 0 < _modeBits) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , ".%s%s%s%s" - , 0 == (_modeBits & 1) ? "" : "x" - , 0 == (_modeBits & 2) ? "" : "y" - , 0 == (_modeBits & 4) ? "" : "z" - , 0 == (_modeBits & 8) ? "" : "w" - ); - } - break; - - case DxbcOperandMode::Swizzle: - if (0xe4 != _modeBits) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , ".%c%c%c%c" - , "xyzw"[(_modeBits )&0x3] - , "xyzw"[(_modeBits>>2)&0x3] - , "xyzw"[(_modeBits>>4)&0x3] - , "xyzw"[(_modeBits>>6)&0x3] - ); - } - break; - - case DxbcOperandMode::Scalar: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , ".%c" - , "xyzw"[_modeBits] - ); - break; - - default: - break; - } - - return size; - } - - int32_t toString(char* _out, int32_t _size, const DxbcInstruction& _instruction) - { - int32_t size = 0; - - switch (_instruction.opcode) - { - case DxbcOpcode::CUSTOMDATA: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s" - , s_dxbcCustomDataClass[_instruction.customDataClass] - ); - 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" - , 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) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , " %s<%x>" - , s_dxbcSrvType[_instruction.srv] - , _instruction.value[0] - ); - } - else if (0 < s_dxbcOpcodeInfo[_instruction.opcode].numValues) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , " %d" - , _instruction.value[0] - ); - } - - for (uint32_t ii = 0; ii < _instruction.numOperands; ++ii) - { - const DxbcOperand& operand = _instruction.operand[ii]; - - const bool array = false - || 1 < operand.numAddrModes - || DxbcOperandAddrMode::Imm32 != operand.addrMode[0] - ; - - const char* preOperand = ""; - const char* postOperand = ""; - - switch (operand.modifier) - { - 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) - , "%s%s%s" - , 0 == ii ? " " : ", " - , preOperand - , s_dxbcOperandType[operand.type] - ); - - switch (operand.type) - { - case DxbcOperandType::Imm32: - case DxbcOperandType::Imm64: - for (uint32_t jj = 0; jj < operand.num; ++jj) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s%f" - , 0 == jj ? "(" : ", " - , bx::bitCast(operand.un.imm32[jj]) - ); - } - - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , ")" - ); - break; - - default: - break; - } - - const uint32_t first = false - || DxbcOperandType::ImmConstantBuffer == operand.type - || DxbcOperandAddrMode::RegImm32 == operand.addrMode[0] - ? 0 : 1 - ; - if (0 == first) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "[" - ); - } - else - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%d%s" - , operand.regIndex[0] - , array ? "[" : "" - ); - } - - for (uint32_t jj = first, num = bx::uint32_min(operand.numAddrModes, BX_COUNTOF(operand.addrMode) ); jj < num; ++jj) - { - switch (operand.addrMode[jj]) - { - case DxbcOperandAddrMode::Imm32: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%d" - , operand.regIndex[jj] - ); - break; - - case DxbcOperandAddrMode::Reg: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s%d" - , s_dxbcOperandType[operand.subOperand[jj].type] - , operand.subOperand[jj].regIndex - ); - size += toString(&_out[size], bx::uint32_imax(0, _size-size) - , DxbcOperandMode::Enum(operand.subOperand[jj].mode) - , operand.subOperand[jj].modeBits - ); - break; - - case DxbcOperandAddrMode::RegImm32: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%d + %s%d" - , operand.regIndex[jj] - , s_dxbcOperandType[operand.subOperand[jj].type] - , operand.subOperand[jj].regIndex - ); - size += toString(&_out[size], bx::uint32_imax(0, _size-size) - , DxbcOperandMode::Enum(operand.subOperand[jj].mode) - , operand.subOperand[jj].modeBits - ); - break; - - default: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size), "???"); - break; - } - } - - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s" - , array ? "]" : "" - ); - - size += toString(&_out[size], bx::uint32_imax(0, _size-size), operand.mode, operand.modeBits); - - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s" - , postOperand - ); - } - - if (_instruction.opcode == DxbcOpcode::DCL_CONSTANT_BUFFER - && _instruction.allowRefactoring) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , ", dynamicIndexed" - ); - } - - return size; - } - - int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bx::Error* _err) - { - int32_t size = 0; - - int64_t offset = bx::seek(_reader); - - uint32_t num; - size += bx::read(_reader, num, _err); - size += bx::read(_reader, _signature.key, _err); - - for (uint32_t ii = 0; ii < num; ++ii) - { - DxbcSignature::Element element; - - uint32_t nameOffset; - size += bx::read(_reader, nameOffset, _err); - - char name[DXBC_MAX_NAME_STRING]; - readString(_reader, offset + nameOffset, name, DXBC_MAX_NAME_STRING, _err); - element.name = name; - - size += bx::read(_reader, element.semanticIndex, _err); - size += bx::read(_reader, element.valueType, _err); - size += bx::read(_reader, element.componentType, _err); - size += bx::read(_reader, element.registerIndex, _err); - size += bx::read(_reader, element.mask, _err); - size += bx::read(_reader, element.readWriteMask, _err); - size += bx::read(_reader, element.stream, _err); - - // padding - uint8_t padding; - size += bx::read(_reader, padding, _err); - - _signature.elements.push_back(element); - } - - return size; - } - - int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bx::Error* _err) - { - int32_t size = 0; - - const uint32_t num = uint32_t(_signature.elements.size() ); - size += bx::write(_writer, num, _err); - size += bx::write(_writer, _signature.key, _err); - - typedef stl::unordered_map NameOffsetMap; - NameOffsetMap nom; - - const uint8_t pad = 0; - uint32_t nameOffset = num * 24 + 8; - for (uint32_t ii = 0; ii < num; ++ii) - { - const DxbcSignature::Element& element = _signature.elements[ii]; - - NameOffsetMap::iterator it = nom.find(element.name); - if (it == nom.end() ) - { - nom.insert(stl::make_pair(element.name, nameOffset) ); - size += bx::write(_writer, nameOffset, _err); - nameOffset += uint32_t(element.name.size() + 1); - } - else - { - size += bx::write(_writer, it->second, _err); - } - - size += bx::write(_writer, element.semanticIndex, _err); - size += bx::write(_writer, element.valueType, _err); - size += bx::write(_writer, element.componentType, _err); - size += bx::write(_writer, element.registerIndex, _err); - size += bx::write(_writer, element.mask, _err); - size += bx::write(_writer, element.readWriteMask, _err); - size += bx::write(_writer, element.stream, _err); - size += bx::write(_writer, pad, _err); - } - - uint32_t len = 0; - for (uint32_t ii = 0; ii < num; ++ii) - { - const DxbcSignature::Element& element = _signature.elements[ii]; - NameOffsetMap::iterator it = nom.find(element.name); - if (it != nom.end() ) - { - nom.erase(it); - size += bx::write(_writer, element.name.c_str(), uint32_t(element.name.size() + 1), _err); - len += uint32_t(element.name.size() + 1); - } - } - - // align 4 bytes - size += bx::writeRep(_writer, 0xab, (len+3)/4*4 - len, _err); - - return size; - } - - int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader, bx::Error* _err) - { - int32_t size = 0; - - size += bx::read(_reader, _shader.version, _err); - - uint32_t bcLength; - size += bx::read(_reader, bcLength, _err); - - uint32_t len = (bcLength-2)*sizeof(uint32_t); - _shader.byteCode.resize(len); - size += bx::read(_reader, _shader.byteCode.data(), len, _err); - - return size; - } - - int32_t write(bx::WriterI* _writer, const DxbcShader& _shader, bx::Error* _err) - { - const uint32_t len = uint32_t(_shader.byteCode.size() ); - const uint32_t bcLength = len / sizeof(uint32_t) + 2; - - int32_t size = 0; - size += bx::write(_writer, _shader.version, _err); - size += bx::write(_writer, bcLength, _err); - size += bx::write(_writer, _shader.byteCode.data(), len, _err); - - return size; - } - -#define DXBC_CHUNK_SHADER BX_MAKEFOURCC('S', 'H', 'D', 'R') -#define DXBC_CHUNK_SHADER_EX BX_MAKEFOURCC('S', 'H', 'E', 'X') - -#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; - size += bx::read(_reader, _dxbc.header, _err); - _dxbc.shader.shex = false; - _dxbc.shader.aon9 = false; - - for (uint32_t ii = 0; ii < _dxbc.header.numChunks; ++ii) - { - bx::seek(_reader, sizeof(DxbcContext::Header) + ii*sizeof(uint32_t), bx::Whence::Begin); - - uint32_t chunkOffset; - size += bx::read(_reader, chunkOffset, _err); - - bx::seek(_reader, chunkOffset, bx::Whence::Begin); - - uint32_t fourcc; - size += bx::read(_reader, fourcc, _err); - _dxbc.chunksFourcc[ii] = fourcc; - - uint32_t chunkSize; - size += bx::read(_reader, chunkSize, _err); - - switch (fourcc) - { - case DXBC_CHUNK_SHADER_EX: - _dxbc.shader.shex = true; - [[fallthrough]]; - - case DXBC_CHUNK_SHADER: - size += read(_reader, _dxbc.shader, _err); - break; - - case BX_MAKEFOURCC('I', 'S', 'G', '1'): - case DXBC_CHUNK_INPUT_SIGNATURE: - size += read(_reader, _dxbc.inputSignature, _err); - break; - - case BX_MAKEFOURCC('O', 'S', 'G', '1'): - case BX_MAKEFOURCC('O', 'S', 'G', '5'): - case DXBC_CHUNK_OUTPUT_SIGNATURE: - size += read(_reader, _dxbc.outputSignature, _err); - break; - - case BX_MAKEFOURCC('A', 'o', 'n', '9'): // Contains DX9BC for feature level 9.x (*s_4_0_level_9_*) shaders. - _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('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'): // ? - size += chunkSize; - break; - - default: - size += chunkSize; - BX_ASSERT(false, "UNKNOWN FOURCC %c%c%c%c %d" - , ( (char*)&fourcc)[0] - , ( (char*)&fourcc)[1] - , ( (char*)&fourcc)[2] - , ( (char*)&fourcc)[3] - , size - ); - break; - } - } - - return size; - } - - int32_t write(bx::WriterSeekerI* _writer, const DxbcContext& _dxbc, bx::Error* _err) - { - 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, _err); - - size += bx::writeRep(_writer, 0, 16, _err); - - size += bx::write(_writer, UINT32_C(1), _err); - - int64_t sizeOffset = bx::seek(_writer); - size += bx::writeRep(_writer, 0, 4, _err); - - size += bx::write(_writer, numSupportedChunks, _err); - - int64_t chunksOffsets = bx::seek(_writer); - 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); - - bx::seek(_writer, sizeOffset, bx::Whence::Begin); - bx::write(_writer, size, _err); - - bx::seek(_writer, chunksOffsets, bx::Whence::Begin); - bx::write(_writer, chunkOffset, numSupportedChunks*sizeof(chunkOffset[0]), _err); - - for (uint32_t ii = 0; ii < numSupportedChunks; ++ii) - { - bx::seek(_writer, chunkOffset[ii]+4, bx::Whence::Begin); - bx::write(_writer, chunkSize[ii], _err); - } - - bx::seek(_writer, eof, bx::Whence::Begin); - - return size; - } - - 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() ) ); - - for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;) - { - DxbcInstruction instruction; - uint32_t size = read(&reader, instruction, _err); - 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) - { - return; - } - - token += instruction.length; - } - } - - 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::MemoryBlock mb(g_allocator); - bx::MemoryWriter writer(&mb); - - int32_t total = 0; - - for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;) - { - DxbcInstruction instruction; - uint32_t size = read(&reader, instruction, _err); - BX_ASSERT(size/4 == instruction.length, "read %d, expected %d", size/4, instruction.length); BX_UNUSED(size); - - _fn(instruction, _userData); - - bx::SizerWriter sw; - uint32_t length = instruction.length; - instruction.length = uint32_t(write(&sw, instruction, _err)/4); - - total += write(&writer, instruction, _err); - token += length; - } - - uint8_t* data = (uint8_t*)mb.more(); - _dst.byteCode.resize(total); - bx::memCopy(_dst.byteCode.data(), data, total); - } - -} // namespace bgfx diff --git a/src/shader_dxbc.h b/src/shader_dxbc.h deleted file mode 100644 index 3eb6deeb4..000000000 --- a/src/shader_dxbc.h +++ /dev/null @@ -1,769 +0,0 @@ -/* - * Copyright 2011-2026 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE - */ - -#ifndef BGFX_SHADER_DXBC_H -#define BGFX_SHADER_DXBC_H - -#include - -#define DXBC_CHUNK_HEADER BX_MAKEFOURCC('D', 'X', 'B', 'C') - -namespace bgfx -{ - struct DxbcOpcode - { - enum Enum - { - ADD, - AND, - BREAK, - BREAKC, - CALL, - CALLC, - CASE, - CONTINUE, - CONTINUEC, - CUT, - DEFAULT, - DERIV_RTX, - DERIV_RTY, - DISCARD, - DIV, - DP2, - DP3, - DP4, - ELSE, - EMIT, - EMITTHENCUT, - ENDIF, - ENDLOOP, - ENDSWITCH, - EQ, - EXP, - FRC, - FTOI, - FTOU, - GE, - IADD, - IF, - IEQ, - IGE, - ILT, - IMAD, - IMAX, - IMIN, - IMUL, - INE, - INEG, - ISHL, - ISHR, - ITOF, - LABEL, - LD, - LD_MS, - LOG, - LOOP, - LT, - MAD, - MIN, - MAX, - CUSTOMDATA, - MOV, - MOVC, - MUL, - NE, - NOP, - NOT, - OR, - RESINFO, - RET, - RETC, - ROUND_NE, - ROUND_NI, - ROUND_PI, - ROUND_Z, - RSQ, - SAMPLE, - SAMPLE_C, - SAMPLE_C_LZ, - SAMPLE_L, - SAMPLE_D, - SAMPLE_B, - SQRT, - SWITCH, - SINCOS, - UDIV, - ULT, - UGE, - UMUL, - UMAD, - UMAX, - UMIN, - USHR, - UTOF, - XOR, - DCL_RESOURCE, - DCL_CONSTANT_BUFFER, - DCL_SAMPLER, - DCL_INDEX_RANGE, - DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY, - DCL_GS_INPUT_PRIMITIVE, - DCL_MAX_OUTPUT_VERTEX_COUNT, - DCL_INPUT, - DCL_INPUT_SGV, - DCL_INPUT_SIV, - DCL_INPUT_PS, - DCL_INPUT_PS_SGV, - DCL_INPUT_PS_SIV, - DCL_OUTPUT, - DCL_OUTPUT_SGV, - DCL_OUTPUT_SIV, - DCL_TEMPS, - DCL_INDEXABLE_TEMP, - DCL_GLOBAL_FLAGS, - - UnknownD3D10, - LOD, - GATHER4, - SAMPLE_POS, - SAMPLE_INFO, - - UnknownD3D10_1, - HS_DECLS, - HS_CONTROL_POINT_PHASE, - HS_FORK_PHASE, - HS_JOIN_PHASE, - EMIT_STREAM, - CUT_STREAM, - EMITTHENCUT_STREAM, - INTERFACE_CALL, - BUFINFO, - DERIV_RTX_COARSE, - DERIV_RTX_FINE, - DERIV_RTY_COARSE, - DERIV_RTY_FINE, - GATHER4_C, - GATHER4_PO, - GATHER4_PO_C, - RCP, - F32TOF16, - F16TOF32, - UADDC, - USUBB, - COUNTBITS, - FIRSTBIT_HI, - FIRSTBIT_LO, - FIRSTBIT_SHI, - UBFE, - IBFE, - BFI, - BFREV, - SWAPC, - DCL_STREAM, - DCL_FUNCTION_BODY, - DCL_FUNCTION_TABLE, - DCL_INTERFACE, - DCL_INPUT_CONTROL_POINT_COUNT, - DCL_OUTPUT_CONTROL_POINT_COUNT, - DCL_TESS_DOMAIN, - DCL_TESS_PARTITIONING, - DCL_TESS_OUTPUT_PRIMITIVE, - DCL_HS_MAX_TESSFACTOR, - DCL_HS_FORK_PHASE_INSTANCE_COUNT, - DCL_HS_JOIN_PHASE_INSTANCE_COUNT, - DCL_THREAD_GROUP, - DCL_UNORDERED_ACCESS_VIEW_TYPED, - DCL_UNORDERED_ACCESS_VIEW_RAW, - DCL_UNORDERED_ACCESS_VIEW_STRUCTURED, - DCL_THREAD_GROUP_SHARED_MEMORY_RAW, - DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED, - DCL_RESOURCE_RAW, - DCL_RESOURCE_STRUCTURED, - LD_UAV_TYPED, - STORE_UAV_TYPED, - LD_RAW, - STORE_RAW, - LD_STRUCTURED, - STORE_STRUCTURED, - ATOMIC_AND, - ATOMIC_OR, - ATOMIC_XOR, - ATOMIC_CMP_STORE, - ATOMIC_IADD, - ATOMIC_IMAX, - ATOMIC_IMIN, - ATOMIC_UMAX, - ATOMIC_UMIN, - IMM_ATOMIC_ALLOC, - IMM_ATOMIC_CONSUME, - IMM_ATOMIC_IADD, - IMM_ATOMIC_AND, - IMM_ATOMIC_OR, - IMM_ATOMIC_XOR, - IMM_ATOMIC_EXCH, - IMM_ATOMIC_CMP_EXCH, - IMM_ATOMIC_IMAX, - IMM_ATOMIC_IMIN, - IMM_ATOMIC_UMAX, - IMM_ATOMIC_UMIN, - SYNC, - DADD, - DMAX, - DMIN, - DMUL, - DEQ, - DGE, - DLT, - DNE, - DMOV, - DMOVC, - DTOF, - FTOD, - EVAL_SNAPPED, - EVAL_SAMPLE_INDEX, - EVAL_CENTROID, - DCL_GS_INSTANCE_COUNT, - ABORT, - DEBUG_BREAK, - - UnknownD3D11, - DDIV, - DFMA, - DRCP, - MSAD, - DTOI, - DTOU, - ITOD, - UTOD, - - Count - }; - }; - - const char* getName(DxbcOpcode::Enum _opcode); - - struct DxbcBuiltin - { - // D3D_NAME - // https://msdn.microsoft.com/en-us/library/windows/desktop/ff728724%28v=vs.85%29.aspx - // mesa/src/gallium/state_trackers/d3d1x/d3d1xshader/defs/svs.txt - enum Enum - { - Undefined, - Position, - ClipDistance, - CullDistance, - RenderTargetArrayIndex, - ViewportArrayIndex, - VertexId, - PrimitiveId, - InstanceId, - IsFrontFace, - SampleIndex, - FinalQuadUEq0EdgeTessFactor, - FinalQuadVEq0EdgeTessFactor, - FinalQuadUEq1EdgeTessFactor, - FinalQuadVEq1EdgeTessFactor, - FinalQuadUInsideTessFactor, - FinalQuadVInsideTessFactor, - FinalTriUEq0EdgeTessFactor, - FinalTriVEq0EdgeTessFactor, - FinalTriWEq0EdgeTessFactor, - FinalTriInsideTessFactor, - FinalLineDetailTessFactor, - FinalLineDensityTessFactor, - Target = 64, - Depth, - Coverage, - DepthGreaterEqual, - DepthLessEqual, - StencilRef, - InnerCoverage, - }; - }; - - struct DxbcResourceDim - { - // D3D_SRV_DIMENSION - // https://msdn.microsoft.com/en-us/library/windows/desktop/ff728736%28v=vs.85%29.aspx - // mesa/src/gallium/state_trackers/d3d1x/d3d1xshader/defs/targets.txt - enum Enum - { - Unknown, - Buffer, - Texture1D, - Texture2D, - Texture2DMS, - Texture3D, - TextureCube, - Texture1DArray, - Texture2DArray, - Texture2DMSArray, - TextureCubearray, - RawBuffer, - StructuredBuffer, - - Count - }; - }; - - struct DxbcInterpolation - { - enum Enum - { - Unknown, - Constant, - Linear, - LinearCentroid, - LinearNoPerspective, - LinearNoPerspectiveCentroid, - LinearSample, - LinearNoPerspectiveSample, - - Count - }; - }; - - struct DxbcPrimitiveTopology - { - enum Enum - { - Unknown, - PointList, - LineList, - LineStrip, - TriangleList, - TriangleStrip, - LineListAdj = 10, - LineStripAdj, - TriangleListAdj, - TriangleStripAdj, - - Count - }; - }; - - struct DxbcPrimitive - { - enum Enum - { - Unknown, - Point, - Line, - Triangle, - LineAdj = 6, - 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, - - Count - }; - }; - - struct DxbcResourceReturnType - { - enum Enum - { - Unorm, - Snorm, - Sint, - Uint, - Float, - Mixed, - Double, - Continued, - Unused, - - Count - }; - }; - - struct DxbcComponentType - { - enum Enum - { - Unknown, - Uint32, - Int32, - Float, - - Count - }; - }; - - struct DxbcPrecision - { - enum Enum - { - Default, - Half, - Float2_8, - Reserved, - Int16, - Uint16, - Any16 = 0xf0, - Any10 = 0xf1, - }; - }; - - struct DxbcOperandType - { - enum Enum - { - Temp, - Input, - Output, - TempArray, - Imm32, - Imm64, - Sampler, - Resource, - ConstantBuffer, - ImmConstantBuffer, - Label, - PrimitiveID, - OutputDepth, - Null, - Rasterizer, - CoverageMask, - Stream, - FunctionBody, - FunctionTable, - Interface, - FunctionInput, - FunctionOutput, - OutputControlPointId, - InputForkInstanceId, - InputJoinInstanceId, - InputControlPoint, - OutputControlPoint, - InputPatchConstant, - InputDomainPoint, - ThisPointer, - UnorderedAccessView, - ThreadGroupSharedMemory, - InputThreadId, - InputThreadGroupId, - InputThreadIdInGroup, - InputCoverageMask, - InputThreadIdInGroupFlattened, - InputGsInstanceId, - OutputDepthGreaterEqual, - OutputDepthLessEqual, - CycleCounter, - - Count - }; - }; - - struct DxbcOperandAddrMode - { - enum Enum - { - Imm32, - Imm64, - Reg, - RegImm32, - RegImm64, - - Count - }; - }; - - struct DxbcOperandMode - { - enum Enum - { - Mask, - Swizzle, - Scalar, - - Count - }; - }; - - struct DxbcOperandModifier - { - enum Enum - { - None, - Neg, - Abs, - AbsNeg, - - Count - }; - }; - - struct DxbcCustomDataClass - { - enum Enum - { - Comment, - DebugInfo, - Opaque, - ImmConstantBuffer, - ShaderMessage, - ClipPlaneConstantMappingsForDx9, - - Count - }; - }; - - struct DxbcSubOperand - { - DxbcSubOperand() - : type(DxbcOperandType::Temp) - , mode(0) - , modeBits(0) - , num(0) - , numAddrModes(0) - , addrMode(0) - , regIndex(0) - { - } - - DxbcOperandType::Enum type; - uint8_t mode; - uint8_t modeBits; - uint8_t num; - uint8_t numAddrModes; - uint8_t addrMode; - uint32_t regIndex; - }; - - struct DxbcOperand - { - DxbcOperand() - : type(DxbcOperandType::Temp) - , mode(DxbcOperandMode::Mask) - , modeBits(0) - , num(0) - , modifier(DxbcOperandModifier::None) - , numAddrModes(0) - { - bx::memSet(addrMode, 0, sizeof(addrMode) ); - bx::memSet(regIndex, 0, sizeof(regIndex) ); - bx::memSet(un.imm64, 0, sizeof(un.imm64) ); - } - - DxbcOperandType::Enum type; - DxbcOperandMode::Enum mode; - uint8_t modeBits; - uint8_t num; - DxbcOperandModifier::Enum modifier; - - uint8_t numAddrModes; - uint8_t addrMode[3]; - uint32_t regIndex[3]; - DxbcSubOperand subOperand[3]; - - union - { - uint32_t imm32[4]; - uint64_t imm64[4]; - } un; - }; - - struct DxbcInstruction - { - DxbcInstruction() { /* not pod */ } - - struct ExtendedType - { - enum Enum - { - Empty, - SampleControls, - ResourceDim, - ResourceReturnType, - - Count - }; - }; - - DxbcOpcode::Enum opcode; - uint32_t value[3]; - uint32_t length; - uint8_t numOperands; - ExtendedType::Enum extended[3]; - - // - DxbcResourceDim::Enum srv; - uint8_t samples; - - // - DxbcInterpolation::Enum interpolation; - - // - DxbcPrimitiveTopology::Enum primitiveTopology; - - // - DxbcPrimitive::Enum primitive; - - // - bool shadow; - bool mono; - - // - bool allowRefactoring; - bool fp64; - bool earlyDepth; - bool enableBuffers; - bool skipOptimization; - bool enableMinPrecision; - bool enableDoubleExtensions; - bool enableShaderExtensions; - - // - bool threadsInGroup; - bool sharedMemory; - bool uavGroup; - bool uavGlobal; - - // - DxbcResourceReturnType::Enum retType; - bool saturate; - uint8_t testNZ; - - // - uint8_t sampleOffsets[3]; - uint8_t resourceTarget; - uint8_t resourceStride; - DxbcResourceReturnType::Enum resourceReturnTypes[4]; - - DxbcOperand operand[6]; - - DxbcCustomDataClass::Enum customDataClass; - stl::vector customData; - }; - - int32_t read(bx::ReaderI* _reader, DxbcInstruction& _instruction, bx::Error* _err); - int32_t write(bx::WriterI* _writer, const DxbcInstruction& _instruction, bx::Error* _err); - int32_t toString(char* _out, int32_t _size, const DxbcInstruction& _instruction); - - struct DxbcSignature - { - DxbcSignature() { /* not pod */ } - - struct Element - { - stl::string name; - uint32_t semanticIndex; - DxbcBuiltin::Enum valueType; - DxbcComponentType::Enum componentType; - uint32_t registerIndex; - uint8_t mask; - uint8_t readWriteMask; - uint8_t stream; - }; - - uint32_t key; - stl::vector elements; - }; - - int32_t read(bx::ReaderSeekerI* _reader, DxbcSignature& _signature, bx::Error* _err); - int32_t write(bx::WriterI* _writer, const DxbcSignature& _signature, bx::Error* _err); - - struct DxbcShader - { - uint32_t version; - stl::vector byteCode; - bool shex; - bool aon9; - }; - - struct DxbcSFI0 - { - uint64_t data; - }; - - struct DxbcSPDB - { - stl::vector debugCode; - }; - - struct DxbcRDEF - { - stl::vector rdefCode; - }; - - struct DxbcSTAT - { - stl::vector statCode; - }; - - int32_t read(bx::ReaderSeekerI* _reader, DxbcShader& _shader, bx::Error* _err); - int32_t write(bx::WriterI* _writer, const DxbcShader& _shader, bx::Error* _err); - - typedef bool (*DxbcParseFn)(uint32_t _offset, const DxbcInstruction& _instruction, void* _userData); - void parse(const DxbcShader& _src, DxbcParseFn _fn, void* _userData, bx::Error* _err = NULL); - - typedef void (*DxbcFilterFn)(DxbcInstruction& _instruction, void* _userData); - void filter(DxbcShader& _dst, const DxbcShader& _src, DxbcFilterFn _fn, void* _userData, bx::Error* _err = NULL); - -#define DXBC_MAX_CHUNKS 32 - - struct DxbcContext - { - struct Header - { - uint32_t magic; - uint8_t hash[16]; - uint32_t version; - uint32_t size; - uint32_t numChunks; - }; - - Header header; - DxbcSignature inputSignature; - DxbcSignature outputSignature; - DxbcShader shader; - DxbcSFI0 sfi0; - DxbcSPDB spdb; - DxbcRDEF rdef; - DxbcSTAT stat; - uint32_t chunksFourcc[DXBC_MAX_CHUNKS]; - }; - - int32_t read(bx::ReaderSeekerI* _reader, DxbcContext& _dxbc, bx::Error* _err); - int32_t write(bx::WriterSeekerI* _writer, const DxbcContext& _dxbc, bx::Error* _err); - - /// Calculate DXBC hash from data. - void dxbcHash(const void* _data, uint32_t _size, void* _digest); - -} // namespace bgfx - -#endif // BGFX_SHADER_DXBC_H diff --git a/src/shader_spirv.cpp b/src/shader_spirv.cpp deleted file mode 100644 index 73c1748d7..000000000 --- a/src/shader_spirv.cpp +++ /dev/null @@ -1,1211 +0,0 @@ -/* - * Copyright 2011-2026 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE - */ - -#include "bgfx_p.h" -#include "shader_spirv.h" - -namespace bgfx -{ -#define SPV_OPERAND_1(_a0) SpvOperand::_a0 -#define SPV_OPERAND_2(_a0, _a1) SPV_OPERAND_1(_a0), SPV_OPERAND_1(_a1) -#define SPV_OPERAND_3(_a0, _a1, _a2) SPV_OPERAND_1(_a0), SPV_OPERAND_2(_a1, _a2) -#define SPV_OPERAND_4(_a0, _a1, _a2, _a3) SPV_OPERAND_1(_a0), SPV_OPERAND_3(_a1, _a2, _a3) -#define SPV_OPERAND_5(_a0, _a1, _a2, _a3, _a4) SPV_OPERAND_1(_a0), SPV_OPERAND_4(_a1, _a2, _a3, _a4) -#define SPV_OPERAND_6(_a0, _a1, _a2, _a3, _a4, _a5) SPV_OPERAND_1(_a0), SPV_OPERAND_5(_a1, _a2, _a3, _a4, _a5) -#define SPV_OPERAND_7(_a0, _a1, _a2, _a3, _a4, _a5, _a6) SPV_OPERAND_1(_a0), SPV_OPERAND_6(_a1, _a2, _a3, _a4, _a5, _a6) -#define SPV_OPERAND_8(_a0, _a1, _a2, _a3, _a4, _a5, _a6, _a7) SPV_OPERAND_1(_a0), SPV_OPERAND_7(_a1, _a2, _a3, _a4, _a5, _a6, _a7) -#define SPV_OPERAND_9(_a0, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) SPV_OPERAND_1(_a0), SPV_OPERAND_8(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) -#define SPV_OPERAND(...) { BX_MACRO_DISPATCHER(SPV_OPERAND_, __VA_ARGS__)(__VA_ARGS__) } - -#define _ Count - - bool isDebug(SpvOpcode::Enum _opcode) - { - return (SpvOpcode::SourceContinued <= _opcode && SpvOpcode::Line >= _opcode) - || SpvOpcode::NoLine == _opcode - ; - } - - struct SpvOpcodeInfo - { - bool hasType; - bool hasResult; - SpvOperand::Enum operands[8]; - }; - - static const SpvOpcodeInfo s_spvOpcodeInfo[] = - { - { false, false, /* Nop, // 0 */ SPV_OPERAND(_) }, - { true, true, /* Undef, // 1 */ SPV_OPERAND(_) }, - { false, false, /* SourceContinued, // 2 */ SPV_OPERAND(_) }, - { false, false, /* Source, // 3 */ SPV_OPERAND(SourceLanguage, LiteralNumber, Id, LiteralString) }, - { false, false, /* SourceExtension, // 4 */ SPV_OPERAND(LiteralString) }, - { false, true, /* Name, // 5 */ SPV_OPERAND(LiteralString) }, - { false, true, /* MemberName, // 6 */ SPV_OPERAND(LiteralNumber, LiteralString) }, - { false, false, /* String, // 7 */ SPV_OPERAND(_) }, - { false, false, /* Line, // 8 */ SPV_OPERAND(_) }, - { false, false, /* ------------------------------- Invalid9 // 9 */ SPV_OPERAND(_) }, - { false, false, /* Extension, // 10 */ SPV_OPERAND(LiteralString) }, - { false, true, /* ExtInstImport, // 11 */ SPV_OPERAND(LiteralString) }, - { true, true, /* ExtInst, // 12 */ SPV_OPERAND(LiteralNumber) }, - { false, false, /* ------------------------------ Invalid13 // 13 */ SPV_OPERAND(_) }, - { false, false, /* MemoryModel, // 14 */ SPV_OPERAND(AddressingModel, MemoryModel) }, - { false, false, /* EntryPoint, // 15 */ SPV_OPERAND(ExecutionModel, Id, LiteralString) }, - { true, true, /* ExecutionMode, // 16 */ SPV_OPERAND(_) }, - { false, false, /* Capability, // 17 */ SPV_OPERAND(Capability ) }, - { false, false, /* ------------------------------ Invalid18 // 18 */ SPV_OPERAND(_) }, - { false, true, /* TypeVoid, // 19 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeBool, // 20 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeInt, // 21 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeFloat, // 22 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeVector, // 23 */ SPV_OPERAND(ComponentType, LiteralNumber) }, - { false, true, /* TypeMatrix, // 24 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeImage, // 25 */ SPV_OPERAND(SampledType, Dim, LiteralNumber, LiteralNumber, LiteralNumber, LiteralNumber, ImageFormat, AccessQualifier) }, - { false, true, /* TypeSampler, // 26 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeSampledImage, // 27 */ SPV_OPERAND(LiteralNumber) }, - { false, true, /* TypeArray, // 28 */ SPV_OPERAND(ElementType, LiteralNumber) }, - { false, true, /* TypeRuntimeArray, // 29 */ SPV_OPERAND(ElementType) }, - { false, true, /* TypeStruct, // 30 */ SPV_OPERAND(IdRep) }, - { false, true, /* TypeOpaque, // 31 */ SPV_OPERAND(LiteralString) }, - { false, true, /* TypePointer, // 32 */ SPV_OPERAND(StorageClass, Id) }, - { false, true, /* TypeFunction, // 33 */ SPV_OPERAND(Id, Id, Id, Id, Id) }, - { false, true, /* TypeEvent, // 34 */ SPV_OPERAND(_) }, - { false, true, /* TypeDeviceEvent, // 35 */ SPV_OPERAND(_) }, - { false, true, /* TypeReserveId, // 36 */ SPV_OPERAND(_) }, - { false, true, /* TypeQueue, // 37 */ SPV_OPERAND(_) }, - { false, true, /* TypePipe, // 38 */ SPV_OPERAND(_) }, - { false, true, /* TypeForwardPointer, // 39 */ SPV_OPERAND(_) }, - { false, false, /* ------------------------------ Invalid40 // 40 */ SPV_OPERAND(_) }, - { true, true, /* ConstantTrue, // 41 */ SPV_OPERAND(_) }, - { true, true, /* ConstantFalse, // 42 */ SPV_OPERAND(_) }, - { true, true, /* Constant, // 43 */ SPV_OPERAND(LiteralRep) }, - { true, true, /* ConstantComposite, // 44 */ SPV_OPERAND(LiteralRep) }, - { true, true, /* ConstantSampler, // 45 */ SPV_OPERAND(SamplerAddressingMode, LiteralNumber, SamplerFilterMode) }, - { true, true, /* ConstantNull, // 46 */ SPV_OPERAND(_) }, - { false, false, /* ------------------------------ Invalid47 // 47 */ SPV_OPERAND(_) }, - { true, true, /* SpecConstantTrue, // 48 */ SPV_OPERAND(_) }, - { true, true, /* SpecConstantFalse, // 49 */ SPV_OPERAND(_) }, - { true, true, /* SpecConstant, // 50 */ SPV_OPERAND(_) }, - { true, true, /* SpecConstantComposite, // 51 */ SPV_OPERAND(_) }, - { true, true, /* SpecConstantOp, // 52 */ SPV_OPERAND(_) }, - { false, false, /* ------------------------------ Invalid53 // 53 */ SPV_OPERAND(_) }, - { true, true, /* Function, // 54 */ SPV_OPERAND(FunctionControl, Id) }, - { true, true, /* FunctionParameter, // 55 */ SPV_OPERAND(_) }, - { false, false, /* FunctionEnd, // 56 */ SPV_OPERAND(_) }, - { true, true, /* FunctionCall, // 57 */ SPV_OPERAND(Function, IdRep) }, - { false, false, /* ------------------------------ Invalid58 // 58 */ SPV_OPERAND(_) }, - { true, true, /* Variable, // 59 */ SPV_OPERAND(StorageClass, Id) }, - { true, true, /* ImageTexelPointer, // 60 */ SPV_OPERAND(_) }, - { true, true, /* Load, // 61 */ SPV_OPERAND(Pointer, MemoryAccess) }, - { false, false, /* Store, // 62 */ SPV_OPERAND(Pointer, Object, MemoryAccess) }, - { false, false, /* CopyMemory, // 63 */ SPV_OPERAND(_) }, - { false, false, /* CopyMemorySized, // 64 */ SPV_OPERAND(_) }, - { true, true, /* AccessChain, // 65 */ SPV_OPERAND(Base, IdRep) }, - { true, true, /* InBoundsAccessChain, // 66 */ SPV_OPERAND(Base, IdRep) }, - { true, true, /* PtrAccessChain, // 67 */ SPV_OPERAND(_) }, - { true, true, /* ArrayLength, // 68 */ SPV_OPERAND(_) }, - { true, true, /* GenericPtrMemSemantics, // 69 */ SPV_OPERAND(_) }, - { true, true, /* InBoundsPtrAccessChain, // 70 */ SPV_OPERAND(_) }, - { false, false, /* Decorate, // 71 */ SPV_OPERAND(Id, Decoration, LiteralRep) }, - { false, false, /* MemberDecorate, // 72 */ SPV_OPERAND(StructureType, LiteralNumber, Decoration, LiteralRep) }, - { false, false, /* DecorationGroup, // 73 */ SPV_OPERAND(_) }, - { false, false, /* GroupDecorate, // 74 */ SPV_OPERAND(_) }, - { false, false, /* GroupMemberDecorate, // 75 */ SPV_OPERAND(_) }, - { false, false, /* ------------------------------ Invalid76 // 76 */ SPV_OPERAND(_) }, - { true, true, /* VectorExtractDynamic, // 77 */ SPV_OPERAND(_) }, - { true, true, /* VectorInsertDynamic, // 78 */ SPV_OPERAND(_) }, - { true, true, /* VectorShuffle, // 79 */ SPV_OPERAND(Id, Id, LiteralRep) }, - { true, true, /* CompositeConstruct, // 80 */ SPV_OPERAND(IdRep) }, - { true, true, /* CompositeExtract, // 81 */ SPV_OPERAND(Composite, LiteralRep) }, - { true, true, /* CompositeInsert, // 82 */ SPV_OPERAND(Id, Composite, LiteralRep) }, - { true, true, /* CopyObject, // 83 */ SPV_OPERAND(Id) }, - { true, true, /* Transpose, // 84 */ SPV_OPERAND(Matrix) }, - { false, false, /* ------------------------------ Invalid85 // 85 */ SPV_OPERAND(_) }, - { true, true, /* SampledImage, // 86 */ SPV_OPERAND(_) }, - { true, true, /* ImageSampleImplicitLod, // 87 */ SPV_OPERAND(SampledImage, Coordinate, ImageOperands, IdRep) }, - { true, true, /* ImageSampleExplicitLod, // 88 */ SPV_OPERAND(SampledImage, Coordinate, ImageOperands, Id, IdRep) }, - { true, true, /* ImageSampleDrefImplicitLod, // 89 */ SPV_OPERAND(_) }, - { true, true, /* ImageSampleDrefExplicitLod, // 90 */ SPV_OPERAND(_) }, - { true, true, /* ImageSampleProjImplicitLod, // 91 */ SPV_OPERAND(_) }, - { true, true, /* ImageSampleProjExplicitLod, // 92 */ SPV_OPERAND(_) }, - { true, true, /* ImageSampleProjDrefImplicitLod, // 93 */ SPV_OPERAND(_) }, - { true, true, /* ImageSampleProjDrefExplicitLod, // 94 */ SPV_OPERAND(_) }, - { true, true, /* ImageFetch, // 95 */ SPV_OPERAND(_) }, - { true, true, /* ImageGather, // 96 */ SPV_OPERAND(SampledImage, Coordinate, Component, ImageOperands, IdRep) }, - { true, true, /* ImageDrefGather, // 97 */ SPV_OPERAND(SampledImage, Coordinate, Dref, ImageOperands, IdRep) }, - { true, true, /* ImageRead, // 98 */ SPV_OPERAND(_) }, - { false, false, /* ImageWrite, // 99 */ SPV_OPERAND(_) }, - { true, true, /* Image, // 100 */ SPV_OPERAND(_) }, - { true, true, /* ImageQueryFormat, // 101 */ SPV_OPERAND(_) }, - { true, true, /* ImageQueryOrder, // 102 */ SPV_OPERAND(_) }, - { true, true, /* ImageQuerySizeLod, // 103 */ SPV_OPERAND(_) }, - { true, true, /* ImageQuerySize, // 104 */ SPV_OPERAND(_) }, - { true, true, /* ImageQueryLod, // 105 */ SPV_OPERAND(_) }, - { true, true, /* ImageQueryLevels, // 106 */ SPV_OPERAND(_) }, - { true, true, /* ImageQuerySamples, // 107 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid108 // 108 */ SPV_OPERAND(_) }, - { true, true, /* ConvertFToU, // 109 */ SPV_OPERAND(_) }, - { true, true, /* ConvertFToS, // 110 */ SPV_OPERAND(_) }, - { true, true, /* ConvertSToF, // 111 */ SPV_OPERAND(_) }, - { true, true, /* ConvertUToF, // 112 */ SPV_OPERAND(_) }, - { true, true, /* UConvert, // 113 */ SPV_OPERAND(Id) }, - { true, true, /* SConvert, // 114 */ SPV_OPERAND(Id) }, - { true, true, /* FConvert, // 115 */ SPV_OPERAND(Id) }, - { true, true, /* QuantizeToF16, // 116 */ SPV_OPERAND(_) }, - { true, true, /* ConvertPtrToU, // 117 */ SPV_OPERAND(_) }, - { true, true, /* SatConvertSToU, // 118 */ SPV_OPERAND(_) }, - { true, true, /* SatConvertUToS, // 119 */ SPV_OPERAND(_) }, - { true, true, /* ConvertUToPtr, // 120 */ SPV_OPERAND(_) }, - { true, true, /* PtrCastToGeneric, // 121 */ SPV_OPERAND(_) }, - { true, true, /* GenericCastToPtr, // 122 */ SPV_OPERAND(_) }, - { true, true, /* GenericCastToPtrExplicit, // 123 */ SPV_OPERAND(_) }, - { true, true, /* Bitcast, // 124 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid125 // 125 */ SPV_OPERAND(_) }, - { true, true, /* SNegate, // 126 */ SPV_OPERAND(Id) }, - { true, true, /* FNegate, // 127 */ SPV_OPERAND(Id) }, - { true, true, /* IAdd, // 128 */ SPV_OPERAND(Id, Id) }, - { true, true, /* FAdd, // 129 */ SPV_OPERAND(Id, Id) }, - { true, true, /* ISub, // 130 */ SPV_OPERAND(Id, Id) }, - { true, true, /* FSub, // 131 */ SPV_OPERAND(Id, Id) }, - { true, true, /* IMul, // 132 */ SPV_OPERAND(Id, Id) }, - { true, true, /* FMul, // 133 */ SPV_OPERAND(Id, Id) }, - { true, true, /* UDiv, // 134 */ SPV_OPERAND(Id, Id) }, - { true, true, /* SDiv, // 135 */ SPV_OPERAND(Id, Id) }, - { true, true, /* FDiv, // 136 */ SPV_OPERAND(Id, Id) }, - { true, true, /* UMod, // 137 */ SPV_OPERAND(Id, Id) }, - { true, true, /* SRem, // 138 */ SPV_OPERAND(Id, Id) }, - { true, true, /* SMod, // 139 */ SPV_OPERAND(Id, Id) }, - { true, true, /* FRem, // 140 */ SPV_OPERAND(Id, Id) }, - { true, true, /* FMod, // 141 */ SPV_OPERAND(Id, Id) }, - { true, true, /* VectorTimesScalar, // 142 */ SPV_OPERAND(Vector, Scalar) }, - { true, true, /* MatrixTimesScalar, // 143 */ SPV_OPERAND(Matrix, Scalar) }, - { true, true, /* VectorTimesMatrix, // 144 */ SPV_OPERAND(Vector, Matrix) }, - { true, true, /* MatrixTimesVector, // 145 */ SPV_OPERAND(Matrix, Vector) }, - { true, true, /* MatrixTimesMatrix, // 146 */ SPV_OPERAND(Matrix, Matrix) }, - { true, true, /* OuterProduct, // 147 */ SPV_OPERAND(Vector, Vector) }, - { true, true, /* Dot, // 148 */ SPV_OPERAND(Vector, Vector) }, - { true, true, /* IAddCarry, // 149 */ SPV_OPERAND(Id, Id) }, - { true, true, /* ISubBorrow, // 150 */ SPV_OPERAND(Id, Id) }, - { true, true, /* UMulExtended, // 151 */ SPV_OPERAND(Id, Id) }, - { true, true, /* SMulExtended, // 152 */ SPV_OPERAND(Id, Id) }, - { false, false, /* ----------------------------- Invalid153 // 153 */ SPV_OPERAND(_) }, - { true, true, /* Any, // 154 */ SPV_OPERAND(Vector) }, - { true, true, /* All, // 155 */ SPV_OPERAND(Vector) }, - { true, true, /* IsNan, // 156 */ SPV_OPERAND(Id) }, - { true, true, /* IsInf, // 157 */ SPV_OPERAND(Id) }, - { true, true, /* IsFinite, // 158 */ SPV_OPERAND(Id) }, - { true, true, /* IsNormal, // 159 */ SPV_OPERAND(Id) }, - { true, true, /* SignBitSet, // 160 */ SPV_OPERAND(Id) }, - { true, true, /* LessOrGreater, // 161 */ SPV_OPERAND(Id, Id) }, - { true, true, /* Ordered, // 162 */ SPV_OPERAND(Id, Id) }, - { true, true, /* Unordered, // 163 */ SPV_OPERAND(_) }, - { true, true, /* LogicalEqual, // 164 */ SPV_OPERAND(_) }, - { true, true, /* LogicalNotEqual, // 165 */ SPV_OPERAND(_) }, - { true, true, /* LogicalOr, // 166 */ SPV_OPERAND(_) }, - { true, true, /* LogicalAnd, // 167 */ SPV_OPERAND(_) }, - { true, true, /* LogicalNot, // 168 */ SPV_OPERAND(_) }, - { true, true, /* Select, // 169 */ SPV_OPERAND(Condition, Id, Id) }, - { true, true, /* IEqual, // 170 */ SPV_OPERAND(_) }, - { true, true, /* INotEqual, // 171 */ SPV_OPERAND(_) }, - { true, true, /* UGreaterThan, // 172 */ SPV_OPERAND(_) }, - { true, true, /* SGreaterThan, // 173 */ SPV_OPERAND(_) }, - { true, true, /* UGreaterThanEqual, // 174 */ SPV_OPERAND(_) }, - { true, true, /* SGreaterThanEqual, // 175 */ SPV_OPERAND(_) }, - { true, true, /* ULessThan, // 176 */ SPV_OPERAND(_) }, - { true, true, /* SLessThan, // 177 */ SPV_OPERAND(_) }, - { true, true, /* ULessThanEqual, // 178 */ SPV_OPERAND(_) }, - { true, true, /* SLessThanEqual, // 179 */ SPV_OPERAND(_) }, - { true, true, /* FOrdEqual, // 180 */ SPV_OPERAND(_) }, - { true, true, /* FUnordEqual, // 181 */ SPV_OPERAND(_) }, - { true, true, /* FOrdNotEqual, // 182 */ SPV_OPERAND(_) }, - { true, true, /* FUnordNotEqual, // 183 */ SPV_OPERAND(_) }, - { true, true, /* FOrdLessThan, // 184 */ SPV_OPERAND(_) }, - { true, true, /* FUnordLessThan, // 185 */ SPV_OPERAND(_) }, - { true, true, /* FOrdGreaterThan, // 186 */ SPV_OPERAND(_) }, - { true, true, /* FUnordGreaterThan, // 187 */ SPV_OPERAND(_) }, - { true, true, /* FOrdLessThanEqual, // 188 */ SPV_OPERAND(_) }, - { true, true, /* FUnordLessThanEqual, // 189 */ SPV_OPERAND(_) }, - { true, true, /* FOrdGreaterThanEqual, // 190 */ SPV_OPERAND(_) }, - { true, true, /* FUnordGreaterThanEqual, // 191 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid192 // 192 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid193 // 193 */ SPV_OPERAND(_) }, - { true, true, /* ShiftRightLogical, // 194 */ SPV_OPERAND(_) }, - { true, true, /* ShiftRightArithmetic, // 195 */ SPV_OPERAND(_) }, - { true, true, /* ShiftLeftLogical, // 196 */ SPV_OPERAND(_) }, - { true, true, /* BitwiseOr, // 197 */ SPV_OPERAND(_) }, - { true, true, /* BitwiseXor, // 198 */ SPV_OPERAND(_) }, - { true, true, /* BitwiseAnd, // 199 */ SPV_OPERAND(_) }, - { true, true, /* Not, // 200 */ SPV_OPERAND(_) }, - { true, true, /* BitFieldInsert, // 201 */ SPV_OPERAND(_) }, - { true, true, /* BitFieldSExtract, // 202 */ SPV_OPERAND(_) }, - { true, true, /* BitFieldUExtract, // 203 */ SPV_OPERAND(_) }, - { true, true, /* BitReverse, // 204 */ SPV_OPERAND(_) }, - { true, true, /* BitCount, // 205 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid206 // 206 */ SPV_OPERAND(_) }, - { true, true, /* DPdx, // 207 */ SPV_OPERAND(_) }, - { true, true, /* DPdy, // 208 */ SPV_OPERAND(_) }, - { true, true, /* Fwidth, // 209 */ SPV_OPERAND(_) }, - { true, true, /* DPdxFine, // 210 */ SPV_OPERAND(_) }, - { true, true, /* DPdyFine, // 211 */ SPV_OPERAND(_) }, - { true, true, /* FwidthFine, // 212 */ SPV_OPERAND(_) }, - { true, true, /* DPdxCoarse, // 213 */ SPV_OPERAND(_) }, - { true, true, /* DPdyCoarse, // 214 */ SPV_OPERAND(_) }, - { true, true, /* FwidthCoarse, // 215 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid216 // 216 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid217 // 217 */ SPV_OPERAND(_) }, - { false, false, /* EmitVertex, // 218 */ SPV_OPERAND(_) }, - { false, false, /* EndPrimitive, // 219 */ SPV_OPERAND(_) }, - { false, false, /* EmitStreamVertex, // 220 */ SPV_OPERAND(_) }, - { false, false, /* EndStreamPrimitive, // 221 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid222 // 222 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid223 // 223 */ SPV_OPERAND(_) }, - { false, false, /* ControlBarrier, // 224 */ SPV_OPERAND(_) }, - { false, false, /* MemoryBarrier, // 225 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid226 // 226 */ SPV_OPERAND(_) }, - { true, true, /* AtomicLoad, // 227 */ SPV_OPERAND(_) }, - { false, false, /* AtomicStore, // 228 */ SPV_OPERAND(_) }, - { true, true, /* AtomicExchange, // 229 */ SPV_OPERAND(_) }, - { true, true, /* AtomicCompareExchange, // 230 */ SPV_OPERAND(_) }, - { true, true, /* AtomicCompareExchangeWeak, // 231 */ SPV_OPERAND(_) }, - { true, true, /* AtomicIIncrement, // 232 */ SPV_OPERAND(_) }, - { true, true, /* AtomicIDecrement, // 233 */ SPV_OPERAND(_) }, - { true, true, /* AtomicIAdd, // 234 */ SPV_OPERAND(_) }, - { true, true, /* AtomicISub, // 235 */ SPV_OPERAND(_) }, - { true, true, /* AtomicSMin, // 236 */ SPV_OPERAND(_) }, - { true, true, /* AtomicUMin, // 237 */ SPV_OPERAND(_) }, - { true, true, /* AtomicSMax, // 238 */ SPV_OPERAND(_) }, - { true, true, /* AtomicUMax, // 239 */ SPV_OPERAND(_) }, - { true, true, /* AtomicAnd, // 240 */ SPV_OPERAND(_) }, - { true, true, /* AtomicOr, // 241 */ SPV_OPERAND(_) }, - { true, true, /* AtomicXor, // 242 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid243 // 243 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid244 // 244 */ SPV_OPERAND(_) }, - { true, true, /* Phi, // 245 */ SPV_OPERAND(_) }, - { false, false, /* LoopMerge, // 246 */ SPV_OPERAND(_) }, - { false, false, /* SelectionMerge, // 247 */ SPV_OPERAND(_) }, - { false, true, /* Label, // 248 */ SPV_OPERAND(_) }, - { false, false, /* Branch, // 249 */ SPV_OPERAND(Id) }, - { false, false, /* BranchConditional, // 250 */ SPV_OPERAND(Condition, Id, Id, LiteralRep) }, - { false, false, /* Switch, // 251 */ SPV_OPERAND(_) }, - { false, false, /* Kill, // 252 */ SPV_OPERAND(_) }, - { false, false, /* Return, // 253 */ SPV_OPERAND(_) }, - { false, false, /* ReturnValue, // 254 */ SPV_OPERAND(Id) }, - { false, false, /* Unreachable, // 255 */ SPV_OPERAND(_) }, - { false, false, /* LifetimeStart, // 256 */ SPV_OPERAND(_) }, - { false, false, /* LifetimeStop, // 257 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid258 // 258 */ SPV_OPERAND(_) }, - { true, true, /* GroupAsyncCopy, // 259 */ SPV_OPERAND(_) }, - { false, false, /* GroupWaitEvents, // 260 */ SPV_OPERAND(_) }, - { true, true, /* GroupAll, // 261 */ SPV_OPERAND(_) }, - { true, true, /* GroupAny, // 262 */ SPV_OPERAND(_) }, - { true, true, /* GroupBroadcast, // 263 */ SPV_OPERAND(_) }, - { true, true, /* GroupIAdd, // 264 */ SPV_OPERAND(_) }, - { true, true, /* GroupFAdd, // 265 */ SPV_OPERAND(_) }, - { true, true, /* GroupFMin, // 266 */ SPV_OPERAND(_) }, - { true, true, /* GroupUMin, // 267 */ SPV_OPERAND(_) }, - { true, true, /* GroupSMin, // 268 */ SPV_OPERAND(_) }, - { true, true, /* GroupFMax, // 269 */ SPV_OPERAND(_) }, - { true, true, /* GroupUMax, // 270 */ SPV_OPERAND(_) }, - { true, true, /* GroupSMax, // 271 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid272 // 272 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid273 // 273 */ SPV_OPERAND(_) }, - { true, true, /* ReadPipe, // 274 */ SPV_OPERAND(_) }, - { true, true, /* WritePipe, // 275 */ SPV_OPERAND(_) }, - { true, true, /* ReservedReadPipe, // 276 */ SPV_OPERAND(_) }, - { true, true, /* ReservedWritePipe, // 277 */ SPV_OPERAND(_) }, - { true, true, /* ReserveReadPipePackets, // 278 */ SPV_OPERAND(_) }, - { true, true, /* ReserveWritePipePackets, // 279 */ SPV_OPERAND(_) }, - { false, false, /* CommitReadPipe, // 280 */ SPV_OPERAND(_) }, - { false, false, /* CommitWritePipe, // 281 */ SPV_OPERAND(_) }, - { true, true, /* IsValidReserveId, // 282 */ SPV_OPERAND(_) }, - { true, true, /* GetNumPipePackets, // 283 */ SPV_OPERAND(_) }, - { true, true, /* GetMaxPipePackets, // 284 */ SPV_OPERAND(_) }, - { true, true, /* GroupReserveReadPipePackets, // 285 */ SPV_OPERAND(_) }, - { true, true, /* GroupReserveWritePipePackets, // 286 */ SPV_OPERAND(_) }, - { false, false, /* GroupCommitReadPipe, // 287 */ SPV_OPERAND(_) }, - { false, false, /* GroupCommitWritePipe, // 288 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid289 // 289 */ SPV_OPERAND(_) }, - { false, false, /* ----------------------------- Invalid290 // 290 */ SPV_OPERAND(_) }, - { true, true, /* EnqueueMarker, // 291 */ SPV_OPERAND(_) }, - { true, true, /* EnqueueKernel, // 292 */ SPV_OPERAND(_) }, - { true, true, /* GetKernelNDrangeSubGroupCount, // 293 */ SPV_OPERAND(_) }, - { true, true, /* GetKernelNDrangeMaxSubGroupSize, // 294 */ SPV_OPERAND(_) }, - { true, true, /* GetKernelWorkGroupSize, // 295 */ SPV_OPERAND(_) }, - { true, true, /* GetKernelPreferredWorkGroupSizeMultiple, // 296 */ SPV_OPERAND(_) }, - { false, false, /* RetainEvent, // 297 */ SPV_OPERAND(_) }, - { false, false, /* ReleaseEvent, // 298 */ SPV_OPERAND(_) }, - { true, true, /* CreateUserEvent, // 299 */ SPV_OPERAND(_) }, - { true, true, /* IsValidEvent, // 300 */ SPV_OPERAND(_) }, - { false, false, /* SetUserEventStatus, // 301 */ SPV_OPERAND(_) }, - { false, false, /* CaptureEventProfilingInfo, // 302 */ SPV_OPERAND(_) }, - { true, true, /* GetDefaultQueue, // 303 */ SPV_OPERAND(_) }, - { true, true, /* BuildNDRange, // 304 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleImplicitLod, // 305 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleExplicitLod, // 306 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleDrefImplicitLod, // 307 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleDrefExplicitLod, // 308 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleProjImplicitLod, // 309 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleProjExplicitLod, // 310 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleProjDrefImplicitLod, // 311 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseSampleProjDrefExplicitLod, // 312 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseFetch, // 313 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseGather, // 314 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseDrefGather, // 315 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseTexelsResident, // 316 */ SPV_OPERAND(_) }, - { false, false, /* NoLine, // 317 */ SPV_OPERAND(_) }, - { true, true, /* AtomicFlagTestAndSet, // 318 */ SPV_OPERAND(_) }, - { false, false, /* AtomicFlagClear, // 319 */ SPV_OPERAND(_) }, - { true, true, /* ImageSparseRead, // 320 */ SPV_OPERAND(_) }, - }; - static_assert(BX_COUNTOF(s_spvOpcodeInfo) == SpvOpcode::Count); - - const char* s_spvOpcode[] = - { - "Nop", - "Undef", - "SourceContinued", - "Source", - "SourceExtension", - "Name", - "MemberName", - "String", - "Line", - "Invalid9", - "Extension", - "ExtInstImport", - "ExtInst", - "Invalid13", - "MemoryModel", - "EntryPoint", - "ExecutionMode", - "Capability", - "Invalid18", - "TypeVoid", - "TypeBool", - "TypeInt", - "TypeFloat", - "TypeVector", - "TypeMatrix", - "TypeImage", - "TypeSampler", - "TypeSampledImage", - "TypeArray", - "TypeRuntimeArray", - "TypeStruct", - "TypeOpaque", - "TypePointer", - "TypeFunction", - "TypeEvent", - "TypeDeviceEvent", - "TypeReserveId", - "TypeQueue", - "TypePipe", - "TypeForwardPointer", - "Invalid40", - "ConstantTrue", - "ConstantFalse", - "Constant", - "ConstantComposite", - "ConstantSampler", - "ConstantNull", - "Invalid47", - "SpecConstantTrue", - "SpecConstantFalse", - "SpecConstant", - "SpecConstantComposite", - "SpecConstantOp", - "Invalid53", - "Function", - "FunctionParameter", - "FunctionEnd", - "FunctionCall", - "Invalid58", - "Variable", - "ImageTexelPointer", - "Load", - "Store", - "CopyMemory", - "CopyMemorySized", - "AccessChain", - "InBoundsAccessChain", - "PtrAccessChain", - "ArrayLength", - "GenericPtrMemSemantics", - "InBoundsPtrAccessChain", - "Decorate", - "MemberDecorate", - "DecorationGroup", - "GroupDecorate", - "GroupMemberDecorate", - "Invalid76", - "VectorExtractDynamic", - "VectorInsertDynamic", - "VectorShuffle", - "CompositeConstruct", - "CompositeExtract", - "CompositeInsert", - "CopyObject", - "Transpose", - "Invalid85", - "SampledImage", - "ImageSampleImplicitLod", - "ImageSampleExplicitLod", - "ImageSampleDrefImplicitLod", - "ImageSampleDrefExplicitLod", - "ImageSampleProjImplicitLod", - "ImageSampleProjExplicitLod", - "ImageSampleProjDrefImplicitLod", - "ImageSampleProjDrefExplicitLod", - "ImageFetch", - "ImageGather", - "ImageDrefGather", - "ImageRead", - "ImageWrite", - "Image", - "ImageQueryFormat", - "ImageQueryOrder", - "ImageQuerySizeLod", - "ImageQuerySize", - "ImageQueryLod", - "ImageQueryLevels", - "ImageQuerySamples", - "Invalid108", - "ConvertFToU", - "ConvertFToS", - "ConvertSToF", - "ConvertUToF", - "UConvert", - "SConvert", - "FConvert", - "QuantizeToF16", - "ConvertPtrToU", - "SatConvertSToU", - "SatConvertUToS", - "ConvertUToPtr", - "PtrCastToGeneric", - "GenericCastToPtr", - "GenericCastToPtrExplicit", - "Bitcast", - "Invalid125", - "SNegate", - "FNegate", - "IAdd", - "FAdd", - "ISub", - "FSub", - "IMul", - "FMul", - "UDiv", - "SDiv", - "FDiv", - "UMod", - "SRem", - "SMod", - "FRem", - "FMod", - "VectorTimesScalar", - "MatrixTimesScalar", - "VectorTimesMatrix", - "MatrixTimesVector", - "MatrixTimesMatrix", - "OuterProduct", - "Dot", - "IAddCarry", - "ISubBorrow", - "UMulExtended", - "SMulExtended", - "Invalid153", - "Any", - "All", - "IsNan", - "IsInf", - "IsFinite", - "IsNormal", - "SignBitSet", - "LessOrGreater", - "Ordered", - "Unordered", - "LogicalEqual", - "LogicalNotEqual", - "LogicalOr", - "LogicalAnd", - "LogicalNot", - "Select", - "IEqual", - "INotEqual", - "UGreaterThan", - "SGreaterThan", - "UGreaterThanEqual", - "SGreaterThanEqual", - "ULessThan", - "SLessThan", - "ULessThanEqual", - "SLessThanEqual", - "FOrdEqual", - "FUnordEqual", - "FOrdNotEqual", - "FUnordNotEqual", - "FOrdLessThan", - "FUnordLessThan", - "FOrdGreaterThan", - "FUnordGreaterThan", - "FOrdLessThanEqual", - "FUnordLessThanEqual", - "FOrdGreaterThanEqual", - "FUnordGreaterThanEqual", - "Invalid192", - "Invalid193", - "ShiftRightLogical", - "ShiftRightArithmetic", - "ShiftLeftLogical", - "BitwiseOr", - "BitwiseXor", - "BitwiseAnd", - "Not", - "BitFieldInsert", - "BitFieldSExtract", - "BitFieldUExtract", - "BitReverse", - "BitCount", - "Invalid206", - "DPdx", - "DPdy", - "Fwidth", - "DPdxFine", - "DPdyFine", - "FwidthFine", - "DPdxCoarse", - "DPdyCoarse", - "FwidthCoarse", - "Invalid216", - "Invalid217", - "EmitVertex", - "EndPrimitive", - "EmitStreamVertex", - "Invalid222", - "Invalid223", - "EndStreamPrimitive", - "ControlBarrier", - "MemoryBarrier", - "Invalid226", - "AtomicLoad", - "AtomicStore", - "AtomicExchange", - "AtomicCompareExchange", - "AtomicCompareExchangeWeak", - "AtomicIIncrement", - "AtomicIDecrement", - "AtomicIAdd", - "AtomicISub", - "AtomicSMin", - "AtomicUMin", - "AtomicSMax", - "AtomicUMax", - "AtomicAnd", - "AtomicOr", - "AtomicXor", - "Invalid243", - "Invalid244", - "Phi", - "LoopMerge", - "SelectionMerge", - "Label", - "Branch", - "BranchConditional", - "Switch", - "Kill", - "Return", - "ReturnValue", - "Unreachable", - "LifetimeStart", - "LifetimeStop", - "Invalid258", - "GroupAsyncCopy", - "GroupWaitEvents", - "GroupAll", - "GroupAny", - "GroupBroadcast", - "GroupIAdd", - "GroupFAdd", - "GroupFMin", - "GroupUMin", - "GroupSMin", - "GroupFMax", - "GroupUMax", - "GroupSMax", - "Invalid272", - "Invalid273", - "ReadPipe", - "WritePipe", - "ReservedReadPipe", - "ReservedWritePipe", - "ReserveReadPipePackets", - "ReserveWritePipePackets", - "CommitReadPipe", - "CommitWritePipe", - "IsValidReserveId", - "GetNumPipePackets", - "GetMaxPipePackets", - "GroupReserveReadPipePackets", - "GroupReserveWritePipePackets", - "GroupCommitReadPipe", - "GroupCommitWritePipe", - "Invalid289", - "Invalid290", - "EnqueueMarker", - "EnqueueKernel", - "GetKernelNDrangeSubGroupCount", - "GetKernelNDrangeMaxSubGroupSize", - "GetKernelWorkGroupSize", - "GetKernelPreferredWorkGroupSizeMultiple", - "RetainEvent", - "ReleaseEvent", - "CreateUserEvent", - "IsValidEvent", - "SetUserEventStatus", - "CaptureEventProfilingInfo", - "GetDefaultQueue", - "BuildNDRange", - "ImageSparseSampleImplicitLod", - "ImageSparseSampleExplicitLod", - "ImageSparseSampleDrefImplicitLod", - "ImageSparseSampleDrefExplicitLod", - "ImageSparseSampleProjImplicitLod", - "ImageSparseSampleProjExplicitLod", - "ImageSparseSampleProjDrefImplicitLod", - "ImageSparseSampleProjDrefExplicitLod", - "ImageSparseFetch", - "ImageSparseGather", - "ImageSparseDrefGather", - "ImageSparseTexelsResident", - "NoLine", - "AtomicFlagTestAndSet", - "AtomicFlagClear", - "ImageSparseRead", - "", - }; - static_assert(BX_COUNTOF(s_spvOpcode)-1 == SpvOpcode::Count); - - const char* getName(SpvOpcode::Enum _opcode) - { - BX_WARN(_opcode <= SpvOpcode::Count, "Unknown opcode id %d.", _opcode); - return _opcode <= SpvOpcode::Count - ? s_spvOpcode[_opcode] - : "?SpvOpcode?" - ; - } - - struct SpvDecorationInfo - { - SpvOperand::Enum operands[2]; - }; - - static const SpvDecorationInfo s_spvDecorationInfo[] = - { - { /* RelaxedPrecision */ SPV_OPERAND(_) }, - { /* SpecId */ SPV_OPERAND(LiteralNumber) }, - { /* Block */ SPV_OPERAND(_) }, - { /* BufferBlock */ SPV_OPERAND(_) }, - { /* RowMajor */ SPV_OPERAND(_) }, - { /* ColMajor */ SPV_OPERAND(_) }, - { /* ArrayStride */ SPV_OPERAND(LiteralNumber) }, - { /* MatrixStride */ SPV_OPERAND(LiteralNumber) }, - { /* GLSLShared */ SPV_OPERAND(_) }, - { /* GLSLPacked */ SPV_OPERAND(_) }, - { /* CPacked */ SPV_OPERAND(_) }, - { /* BuiltIn */ SPV_OPERAND(LiteralNumber) }, - { /* Unknown12 */ SPV_OPERAND(_) }, - { /* NoPerspective */ SPV_OPERAND(_) }, - { /* Flat */ SPV_OPERAND(_) }, - { /* Patch */ SPV_OPERAND(_) }, - { /* Centroid */ SPV_OPERAND(_) }, - { /* Sample */ SPV_OPERAND(_) }, - { /* Invariant */ SPV_OPERAND(_) }, - { /* Restrict */ SPV_OPERAND(_) }, - { /* Aliased */ SPV_OPERAND(_) }, - { /* Volatile */ SPV_OPERAND(_) }, - { /* Constant */ SPV_OPERAND(_) }, - { /* Coherent */ SPV_OPERAND(_) }, - { /* NonWritable */ SPV_OPERAND(_) }, - { /* NonReadable */ SPV_OPERAND(_) }, - { /* Uniform */ SPV_OPERAND(_) }, - { /* Unknown27 */ SPV_OPERAND(_) }, - { /* SaturatedConversion */ SPV_OPERAND(_) }, - { /* Stream */ SPV_OPERAND(LiteralNumber) }, - { /* Location */ SPV_OPERAND(LiteralNumber) }, - { /* Component */ SPV_OPERAND(LiteralNumber) }, - { /* Index */ SPV_OPERAND(LiteralNumber) }, - { /* Binding */ SPV_OPERAND(LiteralNumber) }, - { /* DescriptorSet */ SPV_OPERAND(LiteralNumber) }, - { /* Offset */ SPV_OPERAND(LiteralNumber) }, - { /* XfbBuffer */ SPV_OPERAND(LiteralNumber) }, - { /* XfbStride */ SPV_OPERAND(LiteralNumber) }, - { /* FuncParamAttr */ SPV_OPERAND(_) }, - { /* FPRoundingMode */ SPV_OPERAND(_) }, - { /* FPFastMathMode */ SPV_OPERAND(_) }, - { /* LinkageAttributes */ SPV_OPERAND(LiteralString, LinkageType) }, - { /* NoContraction */ SPV_OPERAND(_) }, - { /* InputAttachmentIndex */ SPV_OPERAND(LiteralNumber) }, - { /* Alignment */ SPV_OPERAND(LiteralNumber) }, - }; - - static const char* s_spvDecoration[] = - { - "RelaxedPrecision", - "SpecId", - "Block", - "BufferBlock", - "RowMajor", - "ColMajor", - "ArrayStride", - "MatrixStride", - "GLSLShared", - "GLSLPacked", - "CPacked", - "BuiltIn", - "Unknown12", - "NoPerspective", - "Flat", - "Patch", - "Centroid", - "Sample", - "Invariant", - "Restrict", - "Aliased", - "Volatile", - "Constant", - "Coherent", - "NonWritable", - "NonReadable", - "Uniform", - "Unknown27", - "SaturatedConversion", - "Stream", - "Location", - "Component", - "Index", - "Binding", - "DescriptorSet", - "Offset", - "XfbBuffer", - "XfbStride", - "FuncParamAttr", - "FPRoundingMode", - "FPFastMathMode", - "LinkageAttributes", - "NoContraction", - "InputAttachmentIndex", - "Alignment", - "" - }; - static_assert(BX_COUNTOF(s_spvDecoration)-1 == SpvDecoration::Count); - - const char* getName(SpvDecoration::Enum _enum) - { - BX_UNUSED(s_spvDecorationInfo); - BX_ASSERT(_enum <= SpvDecoration::Count, "Unknown decoration id %d.", _enum); - return _enum <= SpvDecoration::Count - ? s_spvDecoration[_enum] - : "?SpvDecoration?" - ; - } - -#undef _ -#undef SPV_OPERAND - - static const char* s_spvStorageClass[] = - { - "UniformConstant", - "Input", - "Uniform", - "Output", - "Workgroup", - "CrossWorkgroup", - "Private", - "Function", - "Generic", - "PushConstant", - "AtomicCounter", - "Image", - "" - }; - static_assert(BX_COUNTOF(s_spvStorageClass)-1 == SpvStorageClass::Count); - - const char* getName(SpvStorageClass::Enum _enum) - { - BX_ASSERT(_enum <= SpvStorageClass::Count, "Unknown storage class id %d.", _enum); - return _enum <= SpvStorageClass::Count - ? s_spvStorageClass[_enum] - : "?SpvStorageClass?" - ; - } - - static const char* s_spvBuiltin[] = - { - "Position", - "PointSize", - "ClipDistance", - "CullDistance", - "VertexId", - "InstanceId", - "PrimitiveId", - "InvocationId", - "Layer", - "ViewportIndex", - "TessLevelOuter", - "TessLevelInner", - "TessCoord", - "PatchVertices", - "FragCoord", - "PointCoord", - "FrontFacing", - "SampleId", - "SamplePosition", - "SampleMask", - "FragDepth", - "HelperInvocation", - "NumWorkgroups", - "WorkgroupSize", - "WorkgroupId", - "LocalInvocationId", - "GlobalInvocationId", - "LocalInvocationIndex", - "WorkDim", - "GlobalSize", - "EnqueuedWorkgroupSize", - "GlobalOffset", - "GlobalLinearId", - "SubgroupSize", - "SubgroupMaxSize", - "NumSubgroups", - "NumEnqueuedSubgroups", - "SubgroupId", - "SubgroupLocalInvocationId", - "VertexIndex", - "InstanceIndex", - "", - }; - static_assert(BX_COUNTOF(s_spvBuiltin)-1 == SpvBuiltin::Count); - - const char* getName(SpvBuiltin::Enum _enum) - { - BX_ASSERT(_enum <= SpvBuiltin::Count, "Unknown builtin id %d.", _enum); - return _enum <= SpvBuiltin::Count - ? s_spvBuiltin[_enum] - : "?SpvBuiltin?" - ; - } - - int32_t read(bx::ReaderI* _reader, SpvOperand& _operand, bx::Error* _err) - { - int32_t size = 0; - - uint32_t token; - _operand.literalString = ""; - - switch (_operand.type) - { - case SpvOperand::LiteralString: - do - { - size += bx::read(_reader, token, _err); - _operand.literalString.append( (char*)&token, (char*)&token + sizeof(token) ); - } - while (0 != (token & 0xff000000) && _err->isOk() ); - break; - - default: - size += bx::read(_reader, _operand.data, _err); - break; - } - - return size; - } - - int32_t read(bx::ReaderI* _reader, SpvInstruction& _instruction, bx::Error* _err) - { - int32_t size = 0; - - uint32_t token; - size += bx::read(_reader, token, _err); - - _instruction.opcode = SpvOpcode::Enum( (token & UINT32_C(0x0000ffff) ) ); - _instruction.length = uint16_t( (token & UINT32_C(0xffff0000) ) >> 16); - - if (_instruction.opcode >= SpvOpcode::Count) - { - BX_ERROR_SET(_err, kShaderInvalidInstruction, "SPIR-V: Invalid instruction."); - return size; - } - - if (0 == _instruction.length) - { - return size; - } - - const SpvOpcodeInfo& info = s_spvOpcodeInfo[_instruction.opcode]; - _instruction.hasType = info.hasType; - _instruction.hasResult = info.hasResult; - - if (info.hasType) - { - size += read(_reader, _instruction.type, _err); - } - else - { - _instruction.type = UINT32_MAX; - } - - if (info.hasResult) - { - size += read(_reader, _instruction.result, _err); - } - else - { - _instruction.result = UINT32_MAX; - } - - uint16_t currOp = 0; - switch (_instruction.opcode) - { - case SpvOpcode::EntryPoint: - _instruction.operand[currOp].type = info.operands[currOp]; - size += read(_reader, _instruction.operand[currOp++], _err); - _instruction.operand[currOp].type = info.operands[currOp]; - size += read(_reader, _instruction.operand[currOp++], _err); - _instruction.operand[currOp].type = info.operands[currOp]; - size += read(_reader, _instruction.operand[currOp++], _err); - - _instruction.operand[currOp].type = SpvOperand::Id; - for (uint32_t ii = 0, num = _instruction.length - size/4; ii < num; ++ii) - { - size += read(_reader, _instruction.operand[currOp], _err); - } - break; - - default: - for ( - ; size/4 != _instruction.length - && _err->isOk() - && currOp < BX_COUNTOF(_instruction.operand) - ; ++currOp) - { - _instruction.operand[currOp].type = info.operands[currOp]; - size += read(_reader, _instruction.operand[currOp], _err); - } - break; - } - - _instruction.numOperands = currOp; - - return size; - } - - int32_t write(bx::WriterI* _writer, const SpvInstruction& _instruction, bx::Error* _err) - { - int32_t size = 0; - BX_UNUSED(_writer, _instruction, _err); - return size; - } - - int32_t toString(char* _out, int32_t _size, const SpvInstruction& _instruction) - { - int32_t size = 0; - - if (_instruction.hasResult) - { - if (_instruction.hasType) - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , " r%d.t%d = " - , _instruction.result - , _instruction.type - ); - } - else - { - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , " r%d = " - , _instruction.result - ); - } - } - - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s" - , getName(_instruction.opcode) - ); - - for (uint32_t ii = 0, num = _instruction.numOperands; ii < num; ++ii) - { - const SpvOperand& operand = _instruction.operand[ii]; - switch (operand.type) - { - case SpvOperand::AddressingModel: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%sAddressingModel(%d)" - , 0 == ii ? " " : ", " - , operand.data - ); - break; - - case SpvOperand::Decoration: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s%s" - , 0 == ii ? " " : ", " - , getName(SpvDecoration::Enum(operand.data) ) - ); - break; - - case SpvOperand::FunctionControl: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s0x%08x" - , 0 == ii ? " " : ", " - , operand.data - ); - break; - - case SpvOperand::LiteralNumber: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s%d" - , 0 == ii ? " " : ", " - , operand.data - ); - break; - - case SpvOperand::LiteralString: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s%s" - , 0 == ii ? " " : ", " - , operand.literalString.c_str() - ); - break; - - case SpvOperand::MemoryModel: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%sMemoryModel(%d)" - , 0 == ii ? " " : ", " - , operand.data - ); - break; - - case SpvOperand::StorageClass: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s%s" - , 0 == ii ? " " : ", " - , getName(SpvStorageClass::Enum(operand.data) ) - ); - break; - - case SpvOperand::Count: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%s__%d__" - , 0 == ii ? " " : ", " - , operand.data - ); - break; - - default: - size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size) - , "%sr%d" - , 0 == ii ? " " : ", " - , operand.data - ); - break; - - } - } - - return size; - } - - int32_t read(bx::ReaderSeekerI* _reader, SpvShader& _shader, bx::Error* _err) - { - int32_t size = 0; - - uint32_t numBytes = uint32_t(bx::getSize(_reader) - bx::seek(_reader) ); - _shader.byteCode.resize(numBytes); - size += bx::read(_reader, _shader.byteCode.data(), numBytes, _err); - - return size; - } - - int32_t write(bx::WriterI* _writer, const SpvShader& _shader, bx::Error* _err) - { - int32_t size = 0; - BX_UNUSED(_writer, _shader, _err); - return size; - } - -#define SPIRV_MAGIC 0x07230203 - - int32_t read(bx::ReaderSeekerI* _reader, SpirV& _spirv, bx::Error* _err) - { - BX_ERROR_SCOPE(_err); - - int32_t size = 0; - - size += bx::read(_reader, _spirv.header, _err); - - if (!_err->isOk() - || size != sizeof(SpirV::Header) - || _spirv.header.magic != SPIRV_MAGIC - ) - { - BX_ERROR_SET(_err, kShaderInvalidHeader, "SPIR-V: Invalid header."); - return size; - } - - size += read(_reader, _spirv.shader, _err); - - return size; - } - - int32_t write(bx::WriterSeekerI* _writer, const SpirV& _spirv, bx::Error* _err) - { - int32_t size = 0; - BX_UNUSED(_writer, _spirv, _err); - return size; - } - - void parse(const SpvShader& _src, SpvParseFn _fn, void* _userData, bx::Error* _err) - { - BX_ERROR_SCOPE(_err); - - uint32_t numBytes = uint32_t(_src.byteCode.size() ); - bx::MemoryReader reader(_src.byteCode.data(), numBytes); - - for (uint32_t token = 0, numTokens = uint32_t(_src.byteCode.size() / sizeof(uint32_t) ); token < numTokens;) - { - SpvInstruction instruction; - uint32_t size = read(&reader, instruction, _err); - - if (!_err->isOk() ) - { - return; - } - - if (size/4 != instruction.length) - { - BX_TRACE("read %d, expected %d, %s" - , size/4 - , instruction.length - , getName(instruction.opcode) - ); - BX_ERROR_SET(_err, kShaderInvalidInstruction, "SPIR-V: Invalid instruction."); - return; - } - - bool cont = _fn(token * sizeof(uint32_t), instruction, _userData); - if (!cont) - { - return; - } - - token += instruction.length; - } - } - -} // namespace bgfx diff --git a/src/shader_spirv.h b/src/shader_spirv.h deleted file mode 100644 index 2118287b1..000000000 --- a/src/shader_spirv.h +++ /dev/null @@ -1,659 +0,0 @@ -/* - * Copyright 2011-2026 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE - */ - -#ifndef BGFX_SHADER_SPIRV_H -#define BGFX_SHADER_SPIRV_H - -#include - -#define SPV_CHUNK_HEADER BX_MAKEFOURCC(0x03, 0x02, 0x23, 0x07) - -namespace bgfx -{ - constexpr uint8_t kSpirvVertexBinding = 0; - constexpr uint8_t kSpirvFragmentBinding = 1; - constexpr uint8_t kSpirvBindShift = 2; - constexpr uint8_t kSpirvSamplerShift = 16; - - constexpr uint8_t kSpirvOldVertexBinding = 0; - constexpr uint8_t kSpirvOldFragmentBinding = 48; - constexpr uint8_t kSpirvOldFragmentShift = 48; - constexpr uint8_t kSpirvOldBufferShift = 16; - constexpr uint8_t kSpirvOldImageShift = 32; - constexpr uint8_t kSpirvOldTextureShift = 16; - - // Reference(s): - // - https://web.archive.org/web/20181126035927/https://www.khronos.org/registry/spir-v/specs/1.0/SPIRV.html - // - struct SpvOpcode - { - enum Enum - { - Nop, - Undef, - SourceContinued, - Source, - SourceExtension, - Name, - MemberName, - String, - Line, - Invalid9, - Extension, - ExtInstImport, - ExtInst, - Invalid13, - MemoryModel, - EntryPoint, - ExecutionMode, - Capability, - Invalid18, - TypeVoid, - TypeBool, - TypeInt, - TypeFloat, - TypeVector, - TypeMatrix, - TypeImage, - TypeSampler, - TypeSampledImage, - TypeArray, - TypeRuntimeArray, - TypeStruct, - TypeOpaque, - TypePointer, - TypeFunction, - TypeEvent, - TypeDeviceEvent, - TypeReserveId, - TypeQueue, - TypePipe, - TypeForwardPointer, - Invalid40, - ConstantTrue, - ConstantFalse, - Constant, - ConstantComposite, - ConstantSampler, - ConstantNull, - Invalid47, - SpecConstantTrue, - SpecConstantFalse, - SpecConstant, - SpecConstantComposite, - SpecConstantOp, - Invalid53, - Function, - FunctionParameter, - FunctionEnd, - FunctionCall, - Invalid58, - Variable, - ImageTexelPointer, - Load, - Store, - CopyMemory, - CopyMemorySized, - AccessChain, - InBoundsAccessChain, - PtrAccessChain, - ArrayLength, - GenericPtrMemSemantics, - InBoundsPtrAccessChain, - Decorate, - MemberDecorate, - DecorationGroup, - GroupDecorate, - GroupMemberDecorate, - Invalid76, - VectorExtractDynamic, - VectorInsertDynamic, - VectorShuffle, - CompositeConstruct, - CompositeExtract, - CompositeInsert, - CopyObject, - Transpose, - Invalid85, - SampledImage, - ImageSampleImplicitLod, - ImageSampleExplicitLod, - ImageSampleDrefImplicitLod, - ImageSampleDrefExplicitLod, - ImageSampleProjImplicitLod, - ImageSampleProjExplicitLod, - ImageSampleProjDrefImplicitLod, - ImageSampleProjDrefExplicitLod, - ImageFetch, - ImageGather, - ImageDrefGather, - ImageRead, - ImageWrite, - Image, - ImageQueryFormat, - ImageQueryOrder, - ImageQuerySizeLod, - ImageQuerySize, - ImageQueryLod, - ImageQueryLevels, - ImageQuerySamples, - Invalid108, - ConvertFToU, - ConvertFToS, - ConvertSToF, - ConvertUToF, - UConvert, - SConvert, - FConvert, - QuantizeToF16, - ConvertPtrToU, - SatConvertSToU, - SatConvertUToS, - ConvertUToPtr, - PtrCastToGeneric, - GenericCastToPtr, - GenericCastToPtrExplicit, - Bitcast, - Invalid125, - SNegate, - FNegate, - IAdd, - FAdd, - ISub, - FSub, - IMul, - FMul, - UDiv, - SDiv, - FDiv, - UMod, - SRem, - SMod, - FRem, - FMod, - VectorTimesScalar, - MatrixTimesScalar, - VectorTimesMatrix, - MatrixTimesVector, - MatrixTimesMatrix, - OuterProduct, - Dot, - IAddCarry, - ISubBorrow, - UMulExtended, - SMulExtended, - Invalid153, - Any, - All, - IsNan, - IsInf, - IsFinite, - IsNormal, - SignBitSet, - LessOrGreater, - Ordered, - Unordered, - LogicalEqual, - LogicalNotEqual, - LogicalOr, - LogicalAnd, - LogicalNot, - Select, - IEqual, - INotEqual, - UGreaterThan, - SGreaterThan, - UGreaterThanEqual, - SGreaterThanEqual, - ULessThan, - SLessThan, - ULessThanEqual, - SLessThanEqual, - FOrdEqual, - FUnordEqual, - FOrdNotEqual, - FUnordNotEqual, - FOrdLessThan, - FUnordLessThan, - FOrdGreaterThan, - FUnordGreaterThan, - FOrdLessThanEqual, - FUnordLessThanEqual, - FOrdGreaterThanEqual, - FUnordGreaterThanEqual, - Invalid192, - Invalid193, - ShiftRightLogical, - ShiftRightArithmetic, - ShiftLeftLogical, - BitwiseOr, - BitwiseXor, - BitwiseAnd, - Not, - BitFieldInsert, - BitFieldSExtract, - BitFieldUExtract, - BitReverse, - BitCount, - Invalid206, - DPdx, - DPdy, - Fwidth, - DPdxFine, - DPdyFine, - FwidthFine, - DPdxCoarse, - DPdyCoarse, - FwidthCoarse, - Invalid216, - Invalid217, - EmitVertex, - EndPrimitive, - EmitStreamVertex, - EndStreamPrimitive, - Invalid222, - Invalid223, - ControlBarrier, - MemoryBarrier, - Invalid226, - AtomicLoad, - AtomicStore, - AtomicExchange, - AtomicCompareExchange, - AtomicCompareExchangeWeak, - AtomicIIncrement, - AtomicIDecrement, - AtomicIAdd, - AtomicISub, - AtomicSMin, - AtomicUMin, - AtomicSMax, - AtomicUMax, - AtomicAnd, - AtomicOr, - AtomicXor, - Invalid243, - Invalid244, - Phi, - LoopMerge, - SelectionMerge, - Label, - Branch, - BranchConditional, - Switch, - Kill, - Return, - ReturnValue, - Unreachable, - LifetimeStart, - LifetimeStop, - Invalid258, - GroupAsyncCopy, - GroupWaitEvents, - GroupAll, - GroupAny, - GroupBroadcast, - GroupIAdd, - GroupFAdd, - GroupFMin, - GroupUMin, - GroupSMin, - GroupFMax, - GroupUMax, - GroupSMax, - Invalid272, - Invalid273, - ReadPipe, - WritePipe, - ReservedReadPipe, - ReservedWritePipe, - ReserveReadPipePackets, - ReserveWritePipePackets, - CommitReadPipe, - CommitWritePipe, - IsValidReserveId, - GetNumPipePackets, - GetMaxPipePackets, - GroupReserveReadPipePackets, - GroupReserveWritePipePackets, - GroupCommitReadPipe, - GroupCommitWritePipe, - Invalid289, - Invalid290, - EnqueueMarker, - EnqueueKernel, - GetKernelNDrangeSubGroupCount, - GetKernelNDrangeMaxSubGroupSize, - GetKernelWorkGroupSize, - GetKernelPreferredWorkGroupSizeMultiple, - RetainEvent, - ReleaseEvent, - CreateUserEvent, - IsValidEvent, - SetUserEventStatus, - CaptureEventProfilingInfo, - GetDefaultQueue, - BuildNDRange, - ImageSparseSampleImplicitLod, - ImageSparseSampleExplicitLod, - ImageSparseSampleDrefImplicitLod, - ImageSparseSampleDrefExplicitLod, - ImageSparseSampleProjImplicitLod, - ImageSparseSampleProjExplicitLod, - ImageSparseSampleProjDrefImplicitLod, - ImageSparseSampleProjDrefExplicitLod, - ImageSparseFetch, - ImageSparseGather, - ImageSparseDrefGather, - ImageSparseTexelsResident, - NoLine, - AtomicFlagTestAndSet, - AtomicFlagClear, - ImageSparseRead, - - Count - }; - }; - - const char* getName(SpvOpcode::Enum _opcode); - - struct SpvBuiltin - { - enum Enum - { - Position, - PointSize, - ClipDistance, - CullDistance, - VertexId, - InstanceId, - PrimitiveId, - InvocationId, - Layer, - ViewportIndex, - TessLevelOuter, - TessLevelInner, - TessCoord, - PatchVertices, - FragCoord, - PointCoord, - FrontFacing, - SampleId, - SamplePosition, - SampleMask, - FragDepth, - HelperInvocation, - NumWorkgroups, - WorkgroupSize, - WorkgroupId, - LocalInvocationId, - GlobalInvocationId, - LocalInvocationIndex, - WorkDim, - GlobalSize, - EnqueuedWorkgroupSize, - GlobalOffset, - GlobalLinearId, - SubgroupSize, - SubgroupMaxSize, - NumSubgroups, - NumEnqueuedSubgroups, - SubgroupId, - SubgroupLocalInvocationId, - VertexIndex, - InstanceIndex, - - Count - }; - }; - - const char* getName(SpvBuiltin::Enum _enum); - - struct SpvExecutionModel - { - enum Enum - { - Vertex, - TessellationControl, - TessellationEvaluation, - Geometry, - Fragment, - GLCompute, - Kernel, - - Count - }; - }; - - struct SpvAddressingModel - { - enum Enum - { - Logical, - Physical32, - Physical64, - - Count - }; - }; - - struct SpvMemoryModel - { - enum Enum - { - Simple, - GLSL450, - OpenCL, - - Count - }; - }; - - struct SpvStorageClass - { - enum Enum - { - UniformConstant, - Input, - Uniform, - Output, - Workgroup, - CrossWorkgroup, - Private, - Function, - Generic, - PushConstant, - AtomicCounter, - Image, - - Count - }; - }; - - const char* getName(SpvStorageClass::Enum _enum); - - struct SpvResourceDim - { - enum Enum - { - Texture1D, - Texture2D, - Texture3D, - TextureCube, - TextureRect, - Buffer, - SubpassData, - }; - }; - - struct SpvDecoration - { - enum Enum - { - RelaxedPrecision, - SpecId, - Block, - BufferBlock, - RowMajor, - ColMajor, - ArrayStride, - MatrixStride, - GLSLShared, - GLSLPacked, - CPacked, - BuiltIn, - Unknown12, - NoPerspective, - Flat, - Patch, - Centroid, - Sample, - Invariant, - Restrict, - Aliased, - Volatile, - Constant, - Coherent, - NonWritable, - NonReadable, - Uniform, - Unknown27, - SaturatedConversion, - Stream, - Location, - Component, - Index, - Binding, - DescriptorSet, - Offset, - XfbBuffer, - XfbStride, - FuncParamAttr, - FPRoundingMode, - FPFastMathMode, - LinkageAttributes, - NoContraction, - InputAttachmentIndex, - Alignment, - - Count - }; - }; - - const char* getName(SpvDecoration::Enum _enum); - - struct SpvOperand - { - SpvOperand() { /* not pod */ } - - enum Enum - { - AccessQualifier, - AddressingModel, - Base, - Capability, - Component, - ComponentType, - Composite, - Condition, - Coordinate, - Decoration, - Dim, - Dref, - ElementType, - ExecutionModel, - Function, - FunctionControl, - Id, - IdRep, - ImageFormat, - ImageOperands, - LinkageType, - LiteralNumber, - LiteralRep, - LiteralString, - Matrix, - MemoryAccess, - MemoryModel, - Object, - Pointer, - SampledType, - SampledImage, - SamplerAddressingMode, - SamplerFilterMode, - Scalar, - SourceLanguage, - StorageClass, - StructureType, - Vector, - - Count - }; - - Enum type; - uint32_t data; - - stl::string literalString; - }; - - struct SpvInstruction - { - SpvInstruction() { /* not pod */ } - - SpvOpcode::Enum opcode; - uint16_t length; - uint16_t numOperands; - - uint32_t type; - uint32_t result; - bool hasType; - bool hasResult; - - SpvOperand operand[32]; - }; - - 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 - { - SpvShader() { /* not pod */ } - - stl::vector byteCode; - }; - - int32_t read(bx::ReaderSeekerI* _reader, SpvShader& _shader, bx::Error* _err); - int32_t write(bx::WriterI* _writer, const SpvShader& _shader, bx::Error* _err); - - typedef bool (*SpvParseFn)(uint32_t _offset, const SpvInstruction& _instruction, void* _userData); - void parse(const SpvShader& _src, SpvParseFn _fn, void* _userData, bx::Error* _err = NULL); - - typedef void (*SpvFilterFn)(SpvInstruction& _instruction, void* _userData); - void filter(SpvShader& _dst, const SpvShader& _src, SpvFilterFn _fn, void* _userData, bx::Error* _err = NULL); - - struct SpirV - { - SpirV() { /* not pod */ } - - struct Header - { - uint32_t magic; - uint32_t version; - uint32_t generator; - uint32_t bound; - uint32_t schema; - }; - - Header header; - SpvShader shader; - }; - - int32_t read(bx::ReaderSeekerI* _reader, SpirV& _spirv, bx::Error* _err); - int32_t write(bx::WriterSeekerI* _writer, const SpirV& _spirv, bx::Error* _err); - -} // namespace bgfx - -#endif // BGFX_SHADER_SPIRV_H diff --git a/tools/shaderc/shaderc_spirv.cpp b/tools/shaderc/shaderc_spirv.cpp index 148271a10..0ee4b3e0e 100644 --- a/tools/shaderc/shaderc_spirv.cpp +++ b/tools/shaderc/shaderc_spirv.cpp @@ -62,8 +62,6 @@ namespace bgfx namespace stl = tinystl; #include "../../src/shader.h" -#include "../../src/shader_spirv.h" -#include "../../3rdparty/khronos/vulkan-local/vulkan.h" namespace bgfx { namespace spirv { diff --git a/tools/shaderc/shaderc_wgsl.cpp b/tools/shaderc/shaderc_wgsl.cpp index 849e6337b..16ec4db67 100644 --- a/tools/shaderc/shaderc_wgsl.cpp +++ b/tools/shaderc/shaderc_wgsl.cpp @@ -51,8 +51,6 @@ namespace bgfx namespace stl = tinystl; #include "../../src/shader.h" -#include "../../src/shader_spirv.h" -#include "../../3rdparty/khronos/vulkan-local/vulkan.h" namespace bgfx { namespace wgsl {