From 2fde45a1ebeeb2c85fe5291c2465b7aeb9562be9 Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Tue, 26 May 2015 01:36:50 +0000
Subject: [PATCH] Requesting input on Bug 1346: checking in, turned off,
 enum-based operators for texturing and image operations.  Please reply there
 with any input, thanks.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@31289 e7fa87d3-cd2b-0410-9028-fcbf551c1848
---
 glslang/Include/intermediate.h            | 46 ++++++++++++++++
 glslang/MachineIndependent/Initialize.cpp | 64 +++++++++++++++++++++++
 glslang/MachineIndependent/intermOut.cpp  | 35 +++++++++++++
 3 files changed, 145 insertions(+)

diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 46d5085ce..e488d7d4e 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -328,6 +328,52 @@ enum TOperator {
     //
 
     EOpArrayLength,      // "Array" distinguishes from length(v) built-in function, but it applies to vectors and matrices as well.
+
+    //
+    // Image operations
+    //
+
+    // N.B. The following is not being used yet, pending input, as switching
+    //      to it from the current text-based approach will break existing consumers.
+
+    EImageQuerySize,
+    EImageQuerySamples,
+    EImageLoad,
+    EImageStore,
+    EImageAtomicAdd,
+    EImageAtomicMin,
+    EImageAtomicMax,
+    EImageAtomicAnd,
+    EImageAtomicOr,
+    EImageAtomicXor,
+    EImageAtomicExchange,
+    EImageAtomicCompSwap,
+
+    //
+    // Texture operations
+    //
+
+    ETextureQuerySize,
+    ETextureQueryLod,
+    ETextureQueryLevels,
+    ETextureQuerySamples,
+    ETexture,
+    ETextureProj,
+    ETextureLod,
+    ETextureOffset,
+    ETextureFetch,
+    ETextureFetchOffset,
+    ETextureProjOffset,
+    ETextureLodOffset,
+    ETextureProjLod,
+    ETextureProjLodOffset,
+    ETextureGrad,
+    ETextureGradOffset,
+    ETextureProjGrad,
+    ETextureProjGradOffset,
+    ETextureGather,
+    ETextureGatherOffset,
+    ETextureGatherOffsets,
 };
 
 class TIntermTraverser;
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 225493654..f72de8acb 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -57,6 +57,7 @@ namespace glslang {
 bool ARBCompatibility = true;
 
 const bool ForwardCompatibility = false;
+const bool PureOperatorBuiltins = false;  // could break backward compatibility; pending feedback
 
 inline bool IncludeLegacy(int version, EProfile profile)
 {
@@ -2965,6 +2966,69 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
     symbolTable.relateToOperator("memoryBarrierBuffer",        EOpMemoryBarrierBuffer);
     symbolTable.relateToOperator("memoryBarrierImage",         EOpMemoryBarrierImage);
 
+    if (PureOperatorBuiltins) {
+        symbolTable.relateToOperator("imageQuerySize",          EImageQuerySize);
+        symbolTable.relateToOperator("imageQuerySamples",       EImageQuerySamples);
+        symbolTable.relateToOperator("imageLoad",               EImageLoad);
+        symbolTable.relateToOperator("imageStore",              EImageStore);
+        symbolTable.relateToOperator("imageAtomicAdd",          EImageAtomicAdd);
+        symbolTable.relateToOperator("imageAtomicMin",          EImageAtomicMin);
+        symbolTable.relateToOperator("imageAtomicMax",          EImageAtomicMax);
+        symbolTable.relateToOperator("imageAtomicAnd",          EImageAtomicAnd);
+        symbolTable.relateToOperator("imageAtomicOr",           EImageAtomicOr);
+        symbolTable.relateToOperator("imageAtomicXor",          EImageAtomicXor);
+        symbolTable.relateToOperator("imageAtomicExchange",     EImageAtomicExchange);
+        symbolTable.relateToOperator("imageAtomicCompSwap",     EImageAtomicCompSwap);
+
+        symbolTable.relateToOperator("textureSize",             ETextureQuerySize);
+        symbolTable.relateToOperator("textureQueryLod",         ETextureQueryLod);
+        symbolTable.relateToOperator("textureQueryLevels",      ETextureQueryLevels);
+        symbolTable.relateToOperator("textureSamples",          ETextureQuerySamples);
+        symbolTable.relateToOperator("texture",                 ETexture);
+        symbolTable.relateToOperator("textureProj",             ETextureProj);
+        symbolTable.relateToOperator("textureLod",              ETextureLod);
+        symbolTable.relateToOperator("textureOffset",           ETextureOffset);
+        symbolTable.relateToOperator("textureFetch",            ETextureFetch);
+        symbolTable.relateToOperator("textureFetchOffset",      ETextureFetchOffset);
+        symbolTable.relateToOperator("textureProjOffset",       ETextureProjOffset);
+        symbolTable.relateToOperator("textureLodOffset",        ETextureLodOffset);
+        symbolTable.relateToOperator("textureProjLod",          ETextureProjLod);
+        symbolTable.relateToOperator("textureProjLodOffset",    ETextureProjLodOffset);
+        symbolTable.relateToOperator("textureGrad",             ETextureGrad);
+        symbolTable.relateToOperator("textureGradOffset",       ETextureGradOffset);
+        symbolTable.relateToOperator("textureProjGrad",         ETextureProjGrad);
+        symbolTable.relateToOperator("textureProjGradOffset",   ETextureProjGradOffset);
+        symbolTable.relateToOperator("textureGather",           ETextureGather);
+        symbolTable.relateToOperator("textureGatherOffset",     ETextureGatherOffset);
+        symbolTable.relateToOperator("textureGatherOffsets",    ETextureGatherOffsets);
+
+        if (IncludeLegacy(version, profile)) {
+            // TBD: add ftransform(), any others?
+            symbolTable.relateToOperator("texture1D",         ETexture);
+            symbolTable.relateToOperator("texture1DProj",     ETextureProj);
+            symbolTable.relateToOperator("texture1DLod",      ETextureLod);
+            symbolTable.relateToOperator("texture1DProjLod",  ETextureProjLod);
+            symbolTable.relateToOperator("texture2D",         ETexture);
+            symbolTable.relateToOperator("texture2DProj",     ETextureProj);
+            symbolTable.relateToOperator("texture2DLod",      ETextureLod);
+            symbolTable.relateToOperator("texture2DProjLod",  ETextureProjLod);
+            symbolTable.relateToOperator("texture3D",         ETexture);
+            symbolTable.relateToOperator("texture3DProj",     ETextureProj);
+            symbolTable.relateToOperator("texture3DLod",      ETextureLod);
+            symbolTable.relateToOperator("texture3DProjLod",  ETextureProjLod);
+            symbolTable.relateToOperator("textureCube",       ETexture);
+            symbolTable.relateToOperator("textureCubeLod",    ETextureLod);
+            symbolTable.relateToOperator("shadow1D",          ETexture);
+            symbolTable.relateToOperator("shadow2D",          ETexture);
+            symbolTable.relateToOperator("shadow1DProj",      ETextureProj);
+            symbolTable.relateToOperator("shadow2DProj",      ETextureProj);
+            symbolTable.relateToOperator("shadow1DLod",       ETextureLod);
+            symbolTable.relateToOperator("shadow2DLod",       ETextureLod);
+            symbolTable.relateToOperator("shadow1DProjLod",   ETextureProjLod);
+            symbolTable.relateToOperator("shadow2DProjLod",   ETextureProjLod);
+        }
+    }
+
     switch(language) {
     case EShLangVertex:
         break;
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index c78443ae1..8bccbd6a7 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -395,6 +395,41 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
     case EOpMemoryBarrierShared:        out.debug << "MemoryBarrierShared";        break;
     case EOpGroupMemoryBarrier:         out.debug << "GroupMemoryBarrier";         break;
 
+    case EImageQuerySize:               out.debug << "imageQuerySize";        break;
+    case EImageQuerySamples:            out.debug << "imageQuerySamples";     break;
+    case EImageLoad:                    out.debug << "imageLoad";             break;
+    case EImageStore:                   out.debug << "imageStore";            break;
+    case EImageAtomicAdd:               out.debug << "imageAtomicAdd";        break;
+    case EImageAtomicMin:               out.debug << "imageAtomicMin";        break;
+    case EImageAtomicMax:               out.debug << "imageAtomicMax";        break;
+    case EImageAtomicAnd:               out.debug << "imageAtomicAnd";        break;
+    case EImageAtomicOr:                out.debug << "imageAtomicOr";         break;
+    case EImageAtomicXor:               out.debug << "imageAtomicXor";        break;
+    case EImageAtomicExchange:          out.debug << "imageAtomicExchange";   break;
+    case EImageAtomicCompSwap:          out.debug << "imageAtomicCompSwap";   break;
+
+    case ETextureQuerySize:             out.debug << "textureSize";           break;
+    case ETextureQueryLod:              out.debug << "textureQueryLod";       break;
+    case ETextureQueryLevels:           out.debug << "textureQueryLevels";    break;
+    case ETextureQuerySamples:          out.debug << "textureSamples";        break;
+    case ETexture:                      out.debug << "texture";               break;
+    case ETextureProj:                  out.debug << "textureProj";           break;
+    case ETextureLod:                   out.debug << "textureLod";            break;
+    case ETextureOffset:                out.debug << "textureOffset";         break;
+    case ETextureFetch:                 out.debug << "textureFetch";          break;
+    case ETextureFetchOffset:           out.debug << "textureFetchOffset";    break;
+    case ETextureProjOffset:            out.debug << "textureProjOffset";     break;
+    case ETextureLodOffset:             out.debug << "textureLodOffset";      break;
+    case ETextureProjLod:               out.debug << "textureProjLod";        break;
+    case ETextureProjLodOffset:         out.debug << "textureProjLodOffset";  break;
+    case ETextureGrad:                  out.debug << "textureGrad";           break;
+    case ETextureGradOffset:            out.debug << "textureGradOffset";     break;
+    case ETextureProjGrad:              out.debug << "textureProjGrad";       break;
+    case ETextureProjGradOffset:        out.debug << "textureProjGradOffset"; break;
+    case ETextureGather:                out.debug << "textureGather";         break;
+    case ETextureGatherOffset:          out.debug << "textureGatherOffset";   break;
+    case ETextureGatherOffsets:         out.debug << "textureGatherOffsets";  break;
+
     default: out.debug.message(EPrefixError, "Bad aggregation op");
     }
 
-- 
GitLab