SPIRV: Token layout of OpAtomicXXX instructions is incorrect #70
This commit is contained in:
parent
0c81156c2d
commit
d4782c10d4
2 changed files with 13 additions and 4 deletions
|
|
@ -1064,6 +1064,17 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
||||||
if (arg == 1)
|
if (arg == 1)
|
||||||
lvalue = true;
|
lvalue = true;
|
||||||
break;
|
break;
|
||||||
|
case glslang::EOpAtomicAdd:
|
||||||
|
case glslang::EOpAtomicMin:
|
||||||
|
case glslang::EOpAtomicMax:
|
||||||
|
case glslang::EOpAtomicAnd:
|
||||||
|
case glslang::EOpAtomicOr:
|
||||||
|
case glslang::EOpAtomicXor:
|
||||||
|
case glslang::EOpAtomicExchange:
|
||||||
|
case glslang::EOpAtomicCompSwap:
|
||||||
|
if (arg == 0)
|
||||||
|
lvalue = true;
|
||||||
|
break;
|
||||||
//case glslang::EOpUAddCarry:
|
//case glslang::EOpUAddCarry:
|
||||||
//case glslang::EOpUSubBorrow:
|
//case glslang::EOpUSubBorrow:
|
||||||
//case glslang::EOpUMulExtended:
|
//case glslang::EOpUMulExtended:
|
||||||
|
|
@ -2470,8 +2481,8 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
|
||||||
std::vector<spv::Id> spvAtomicOperands; // hold the spv operands
|
std::vector<spv::Id> spvAtomicOperands; // hold the spv operands
|
||||||
auto opIt = operands.begin(); // walk the glslang operands
|
auto opIt = operands.begin(); // walk the glslang operands
|
||||||
spvAtomicOperands.push_back(*(opIt++));
|
spvAtomicOperands.push_back(*(opIt++));
|
||||||
spvAtomicOperands.push_back(builder.makeUintConstant(spv::ScopeDevice)); // TBD: what is the correct scope?
|
spvAtomicOperands.push_back(spv::ScopeDevice); // TBD: what is the correct scope?
|
||||||
spvAtomicOperands.push_back(builder.makeUintConstant(spv::MemorySemanticsMaskNone)); // TBD: what are the correct memory semantics?
|
spvAtomicOperands.push_back(spv::MemorySemanticsMaskNone); // TBD: what are the correct memory semantics?
|
||||||
|
|
||||||
// Add the rest of the operands, skipping the first one, which was dealt with above.
|
// Add the rest of the operands, skipping the first one, which was dealt with above.
|
||||||
// For some ops, there are none, for some 1, for compare-exchange, 2.
|
// For some ops, there are none, for some 1, for compare-exchange, 2.
|
||||||
|
|
|
||||||
|
|
@ -386,8 +386,6 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode,
|
||||||
OperandClass operandClass = InstructionDesc[opCode].operands.getClass(op);
|
OperandClass operandClass = InstructionDesc[opCode].operands.getClass(op);
|
||||||
switch (operandClass) {
|
switch (operandClass) {
|
||||||
case OperandId:
|
case OperandId:
|
||||||
case OperandScope:
|
|
||||||
case OperandMemorySemantics:
|
|
||||||
disassembleIds(1);
|
disassembleIds(1);
|
||||||
// Get names for printing "(XXX)" for readability, *after* this id
|
// Get names for printing "(XXX)" for readability, *after* this id
|
||||||
if (opCode == OpName)
|
if (opCode == OpName)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue