From 18b9fbd74279ae04d2522702a3662376b11ae85d Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 5 Sep 2015 14:14:48 -0700 Subject: [PATCH] SPIRV: Add support for texelFetch There's nothing really special about texelFetch other than the opcode and some restrictions so adding it is pretty trivial. --- SPIRV/GlslangToSpv.cpp | 4 +--- SPIRV/SpvBuilder.cpp | 6 ++++-- SPIRV/SpvBuilder.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 489fe8fe..5fa1a9b7 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1666,8 +1666,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO // This is no longer a query.... - if (cracked.fetch) - spv::MissingFunctionality("texel fetch"); if (cracked.gather) spv::MissingFunctionality("texture gather"); @@ -1723,7 +1721,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ++extraArgs; } - return builder.createTextureCall(precision, convertGlslangToSpvType(node->getType()), cracked.proj, params); + return builder.createTextureCall(precision, convertGlslangToSpvType(node->getType()), cracked.fetch, cracked.proj, params); } spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAggregate* node) diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp index 79665de8..f544f21a 100755 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -1137,7 +1137,7 @@ Id Builder::createBuiltinCall(Decoration /*precision*/, Id resultType, Id builti // Accept all parameters needed to create a texture instruction. // Create the correct instruction based on the inputs, and make the call. -Id Builder::createTextureCall(Decoration precision, Id resultType, bool proj, const TextureParameters& parameters) +Id Builder::createTextureCall(Decoration precision, Id resultType, bool fetch, bool proj, const TextureParameters& parameters) { static const int maxTextureArgs = 10; Id texArgs[maxTextureArgs] = {}; @@ -1196,7 +1196,9 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool proj, co // Op opCode; opCode = OpImageSampleImplicitLod; - if (xplicit) { + if (fetch) { + opCode = OpImageFetch; + } else if (xplicit) { if (parameters.Dref) { if (proj) opCode = OpImageSampleProjDrefExplicitLod; diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index 7a9f6661..de9686cd 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -298,7 +298,7 @@ public: }; // Select the correct texture operation based on all inputs, and emit the correct instruction - Id createTextureCall(Decoration precision, Id resultType, bool proj, const TextureParameters&); + Id createTextureCall(Decoration precision, Id resultType, bool fetch, bool proj, const TextureParameters&); // Emit the OpTextureQuery* instruction that was passed in. // Figure out the right return value and type, and return it.