From 86e608133ce3b5e6dbdfb3176fa70cbdbbf6de6b Mon Sep 17 00:00:00 2001 From: Rex Xu Date: Sun, 11 Oct 2015 19:37:48 +0800 Subject: [PATCH] Generate correct image operand mask for Offset and ConstOffset(#77) --- SPIRV/SpvBuilder.cpp | 5 ++++- SPIRV/SpvBuilder.h | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp index 8b209b6..52c5a31 100755 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -1188,7 +1188,10 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool fetch, b xplicit = true; } if (parameters.offset) { - mask = (ImageOperandsMask)(mask | ImageOperandsOffsetMask); + if (isConstant(parameters.offset)) + mask = (ImageOperandsMask)(mask | ImageOperandsConstOffsetMask); + else + mask = (ImageOperandsMask)(mask | ImageOperandsOffsetMask); texArgs[numArgs++] = parameters.offset; } // TBD: if Offset is constant, use ImageOperandsConstOffsetMask diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index 1a6be6a..cadea66 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -136,6 +136,11 @@ public: bool isSamplerType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampler; } bool isSampledImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampledImage; } + bool isConstant(Id resultId) const + { + Op opCode = getOpCode(resultId); + return opCode == OpConstantTrue || opCode == OpConstantFalse || opCode == OpConstant || opCode == OpConstantComposite || opCode == OpConstantNull; + } bool isConstantScalar(Id resultId) const { return getOpCode(resultId) == OpConstant; } unsigned int getConstantScalar(Id resultId) const { return module.getInstruction(resultId)->getImmediateOperand(0); } -- 2.7.4