From 91cef52f634e70afa4e769689c6e107261b42322 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Thu, 5 May 2016 16:45:40 -0600 Subject: [PATCH] SPV: Non-functional: modularize createInvocationsOperation() from the previous commit. --- SPIRV/GlslangToSpv.cpp | 58 ++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 943743ad..7aa62fbd 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -142,6 +142,7 @@ protected: spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destTypeId, spv::Id operand); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); + spv::Id createInvocationsOperation(glslang::TOperator, spv::Id typeId, spv::Id operand); spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy); spv::Id createNoArgOperation(glslang::TOperator op); spv::Id getSymbolId(const glslang::TIntermSymbol* node); @@ -3253,16 +3254,9 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv: break; case glslang::EOpAnyInvocation: - builder.addCapability(spv::CapabilityGroups); - unaryOp = spv::OpGroupAny; - break; case glslang::EOpAllInvocations: - builder.addCapability(spv::CapabilityGroups); - unaryOp = spv::OpGroupAll; - break; case glslang::EOpAllInvocationsEqual: - builder.addCapability(spv::CapabilityGroups); - break; + return createInvocationsOperation(op, typeId, operand); default: return 0; @@ -3274,25 +3268,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv: args.push_back(operand); id = builder.createBuiltinCall(typeId, stdBuiltins, libCall, args); } else { - if (op == glslang::EOpAnyInvocation || op == glslang::EOpAllInvocations || op == glslang::EOpAllInvocationsEqual) { - std::vector operands; - operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); - operands.push_back(operand); - - if (op == glslang::EOpAnyInvocation || op == glslang::EOpAllInvocations) - id = builder.createOp(unaryOp, typeId, operands); - else if (op == glslang::EOpAllInvocationsEqual) { - spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, operands); - spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, operands); - - id = builder.createBinOp(spv::OpLogicalOr, - typeId, - groupAll, - builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny)); - } - } - else - id = builder.createUnaryOp(unaryOp, typeId, operand); + id = builder.createUnaryOp(unaryOp, typeId, operand); } return builder.setPrecision(id, precision); @@ -3592,6 +3568,34 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv return builder.createOp(opCode, typeId, spvAtomicOperands); } +// Create group invocation operations. +spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, spv::Id operand) +{ + builder.addCapability(spv::CapabilityGroups); + + std::vector operands; + operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); + operands.push_back(operand); + + switch (op) { + case glslang::EOpAnyInvocation: + case glslang::EOpAllInvocations: + return builder.createOp(op == glslang::EOpAnyInvocation ? spv::OpGroupAny : spv::OpGroupAll, typeId, operands); + + case glslang::EOpAllInvocationsEqual: + { + spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, operands); + spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, operands); + + return builder.createBinOp(spv::OpLogicalOr, typeId, groupAll, + builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny)); + } + default: + logger->missingFunctionality("invocation operation"); + return spv::NoResult; + } +} + spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy) { bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;