Merge pull request #897 from LoopDawg/remap-specconstop-fix.2
Remapper: handle embedded opcode in OpSpecConstantOp
This commit is contained in:
commit
ff164d87f1
@ -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 {
|
|||||||
|
|
||||||
// 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:
|
||||||
|
33
Test/baseResults/remap.specconst.comp.out
Normal file
33
Test/baseResults/remap.specconst.comp.out
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
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(
|
|||||||
{ "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 },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user