Commit 65c2eed6 by LoopDawg

Remapper: handle embedded opcode in OpSpecConstantOp

OpSpecConstantOp contains an embedded opcode which is given as a literal argument to the OpSpecConstantOp. The subsequent arguments are as the embedded op would expect, which may be a mixture of IDs and literals. This adds support for that to the remapper binary parser. Upon seeing such an embedded op, the parser flips over to parsing the argument list as appropriate for that opcode. Fixes #882.
parent 24e895b4
...@@ -464,8 +464,8 @@ namespace spv { ...@@ -464,8 +464,8 @@ namespace spv {
{ {
const auto instructionStart = word; const auto instructionStart = word;
const unsigned wordCount = asWordCount(instructionStart); const unsigned wordCount = asWordCount(instructionStart);
const spv::Op opCode = asOpCode(instructionStart);
const int nextInst = word++ + wordCount; const int nextInst = word++ + wordCount;
spv::Op opCode = asOpCode(instructionStart);
if (nextInst > int(spv.size())) if (nextInst > int(spv.size()))
error("spir instruction terminated too early"); error("spir instruction terminated too early");
...@@ -506,6 +506,18 @@ namespace spv { ...@@ -506,6 +506,18 @@ namespace spv {
// Store IDs from instruction in our map // Store IDs from instruction in our map
for (int op = 0; numOperands > 0; ++op, --numOperands) { for (int op = 0; numOperands > 0; ++op, --numOperands) {
// SpecConstantOp is special: it includes the operands of another opcode which is
// given as a literal in the 3rd word. We will switch over to pretending that the
// opcode being processed is the literal opcode value of the SpecConstantOp. See the
// SPIRV spec for details. This way we will handle IDs and literals as appropriate for
// the embedded op.
if (opCode == spv::OpSpecConstantOp) {
if (op == 0) {
opCode = asOpCode(word++); // this is the opcode embedded in the SpecConstantOp.
--numOperands;
}
}
switch (spv::InstructionDesc[opCode].operands.getClass(op)) { switch (spv::InstructionDesc[opCode].operands.getClass(op)) {
case spv::OperandId: case spv::OperandId:
case spv::OperandScope: case spv::OperandScope:
......
remap.specconst.comp
Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 16104
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint GLCompute 5663 "main"
ExecutionMode 5663 LocalSize 1 1 1
Decorate 2 SpecId 0
Decorate 3 SpecId 1
Decorate 4 SpecId 2
Decorate 5 BuiltIn WorkgroupSize
8: TypeVoid
1282: TypeFunction 8
11: TypeInt 32 0
2: 11(int) SpecConstant 1
3: 11(int) SpecConstant 1
4: 11(int) SpecConstant 1
20: TypeVector 11(int) 3
5: 20(ivec3) SpecConstantComposite 2 3 4
6: 11(int) SpecConstantOp 81 5 0
7: 11(int) SpecConstantOp 81 5 1(GLSL.std.450)
9: 11(int) SpecConstantOp 81 5 2
10: 11(int) SpecConstantOp 132 7 9
12: 11(int) SpecConstantOp 128 6 10
5663: 8 Function None 1282
16103: Label
Return
FunctionEnd
...@@ -89,6 +89,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -89,6 +89,7 @@ INSTANTIATE_TEST_CASE_P(
{ "remap.basic.everything.frag", "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING }, { "remap.basic.everything.frag", "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
{ "remap.basic.dcefunc.frag", "main", Source::GLSL, spv::spirvbin_t::DCE_FUNCS }, { "remap.basic.dcefunc.frag", "main", Source::GLSL, spv::spirvbin_t::DCE_FUNCS },
{ "remap.basic.strip.frag", "main", Source::GLSL, spv::spirvbin_t::STRIP }, { "remap.basic.strip.frag", "main", Source::GLSL, spv::spirvbin_t::STRIP },
{ "remap.specconst.comp", "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
{ "remap.switch.none.frag", "main", Source::GLSL, spv::spirvbin_t::NONE }, { "remap.switch.none.frag", "main", Source::GLSL, spv::spirvbin_t::NONE },
{ "remap.switch.everything.frag", "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING }, { "remap.switch.everything.frag", "main", Source::GLSL, spv::spirvbin_t::DO_EVERYTHING },
{ "remap.literal64.none.spv", "main", Source::GLSL, spv::spirvbin_t::NONE }, { "remap.literal64.none.spv", "main", Source::GLSL, spv::spirvbin_t::NONE },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment