From 18b9fbd74279ae04d2522702a3662376b11ae85d Mon Sep 17 00:00:00 2001
From: Jason Ekstrand <jason.ekstrand@intel.com>
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 489fe8fe7..5fa1a9b7f 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 79665de85..f544f21ae 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 7a9f66619..de9686cd2 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.
-- 
GitLab