SPV OpAtomicCompareSwap: Generate correct operand order and number of operands.
This commit is contained in:
@@ -2526,14 +2526,21 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
|
|||||||
// Sort out the operands
|
// Sort out the operands
|
||||||
// - mapping from glslang -> SPV
|
// - mapping from glslang -> SPV
|
||||||
// - there are extra SPV operands with no glslang source
|
// - there are extra SPV operands with no glslang source
|
||||||
|
// - compare-exchange swaps the value and comparator
|
||||||
|
// - compare-exchange has an extra memory semantics
|
||||||
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(builder.makeUintConstant(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(builder.makeUintConstant(spv::MemorySemanticsMaskNone)); // TBD: what are the correct memory semantics?
|
||||||
|
if (opCode == spv::OpAtomicCompareExchange) {
|
||||||
|
spvAtomicOperands.push_back(builder.makeUintConstant(spv::MemorySemanticsMaskNone)); // TBD: what are the correct memory semantics?
|
||||||
|
spvAtomicOperands.push_back(*(opIt + 1));
|
||||||
|
spvAtomicOperands.push_back(*opIt);
|
||||||
|
opIt += 2;
|
||||||
|
}
|
||||||
|
|
||||||
// Add the rest of the operands, skipping the first one, which was dealt with above.
|
// Add the rest of the operands, skipping any that were dealt with above.
|
||||||
// For some ops, there are none, for some 1, for compare-exchange, 2.
|
|
||||||
for (; opIt != operands.end(); ++opIt)
|
for (; opIt != operands.end(); ++opIt)
|
||||||
spvAtomicOperands.push_back(*opIt);
|
spvAtomicOperands.push_back(*opIt);
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ TBD functionality: Is atomic_uint an opaque handle in the uniform storage class,
|
|||||||
Store 38(origi) 64
|
Store 38(origi) 64
|
||||||
65: 6(int) Load 46(atomu)
|
65: 6(int) Load 46(atomu)
|
||||||
67: 6(int) Load 48(value)
|
67: 6(int) Load 48(value)
|
||||||
68: 6(int) AtomicCompareExchange 65 15 16 66 67
|
68: 6(int) AtomicCompareExchange 65 15 16 16 67 66
|
||||||
Store 44(origu) 68
|
Store 44(origu) 68
|
||||||
Return
|
Return
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|||||||
@@ -2,5 +2,5 @@
|
|||||||
// For the version, it uses the latest git tag followed by the number of commits.
|
// For the version, it uses the latest git tag followed by the number of commits.
|
||||||
// For the date, it uses the current date (when then script is run).
|
// For the date, it uses the current date (when then script is run).
|
||||||
|
|
||||||
#define GLSLANG_REVISION "3.0.753"
|
#define GLSLANG_REVISION "3.0.754"
|
||||||
#define GLSLANG_DATE "14-Sep-2015"
|
#define GLSLANG_DATE "14-Sep-2015"
|
||||||
|
|||||||
Reference in New Issue
Block a user