From 3e60a6ff13499ed516c7d1877895f53d8e166de2 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Mon, 14 Sep 2015 22:45:16 -0600 Subject: [PATCH] SPV OpAtomicCompareSwap: Generate correct operand order and number of operands. --- SPIRV/GlslangToSpv.cpp | 11 +++++++++-- Test/baseResults/spv.atomic.comp.out | 2 +- glslang/Include/revision.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 37ee52f..3dffceb 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -2526,14 +2526,21 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv // Sort out the operands // - mapping from glslang -> SPV // - 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 spvAtomicOperands; // hold the spv operands auto opIt = operands.begin(); // walk the glslang operands spvAtomicOperands.push_back(*(opIt++)); 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? + 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. - // For some ops, there are none, for some 1, for compare-exchange, 2. + // Add the rest of the operands, skipping any that were dealt with above. for (; opIt != operands.end(); ++opIt) spvAtomicOperands.push_back(*opIt); diff --git a/Test/baseResults/spv.atomic.comp.out b/Test/baseResults/spv.atomic.comp.out index 359d8da..55052ae 100755 --- a/Test/baseResults/spv.atomic.comp.out +++ b/Test/baseResults/spv.atomic.comp.out @@ -120,7 +120,7 @@ TBD functionality: Is atomic_uint an opaque handle in the uniform storage class, Store 38(origi) 64 65: 6(int) Load 46(atomu) 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 Return FunctionEnd diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index a223c3a..480cdc1 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // 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). -#define GLSLANG_REVISION "3.0.753" +#define GLSLANG_REVISION "3.0.754" #define GLSLANG_DATE "14-Sep-2015" -- 2.7.4