HLSL: use prefix for builtin functions names to avoid namespace collisions
It would have been possible for globally scoped user functions to collide with builtin method names. This adds a prefix to avoid polluting the namespace. Ideally this would be an invalid character to use in user identifiers, but as that requires changing the scanner, for the moment it's an unlikely yet valid prefix.
This commit is contained in:
		
							parent
							
								
									4960baaf66
								
							
						
					
					
						commit
						e7d0752a33
					
				| @ -2785,11 +2785,13 @@ bool HlslGrammar::acceptFunctionCall(HlslToken callToken, TIntermTyped*& node, T | |||||||
| { | { | ||||||
|     // name
 |     // name
 | ||||||
|     TString* functionName = nullptr; |     TString* functionName = nullptr; | ||||||
|     if ((baseObject == nullptr && scope == nullptr) || |     if ((baseObject == nullptr && scope == nullptr)) { | ||||||
|         parseContext.isBuiltInMethod(callToken.loc, baseObject, *callToken.string)) { |         functionName = callToken.string; | ||||||
|  |     } else if (parseContext.isBuiltInMethod(callToken.loc, baseObject, *callToken.string)) { | ||||||
|         // Built-in methods are not in the symbol table as methods, but as global functions
 |         // Built-in methods are not in the symbol table as methods, but as global functions
 | ||||||
|         // taking an explicit 'this' as the first argument.
 |         // taking an explicit 'this' as the first argument.
 | ||||||
|         functionName = callToken.string; |         functionName = NewPoolTString(BUILTIN_PREFIX); | ||||||
|  |         functionName->append(*callToken.string); | ||||||
|     } else { |     } else { | ||||||
|         functionName = NewPoolTString(""); |         functionName = NewPoolTString(""); | ||||||
|         if (baseObject != nullptr) |         if (baseObject != nullptr) | ||||||
|  | |||||||
| @ -956,7 +956,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt | |||||||
| // Return true if the field should be treated as a built-in method.
 | // Return true if the field should be treated as a built-in method.
 | ||||||
| // Return false otherwise.
 | // Return false otherwise.
 | ||||||
| //
 | //
 | ||||||
| bool HlslParseContext::isBuiltInMethod(const TSourceLoc& loc, TIntermTyped* base, const TString& field) | bool HlslParseContext::isBuiltInMethod(const TSourceLoc&, TIntermTyped* base, const TString& field) | ||||||
| { | { | ||||||
|     if (base == nullptr) |     if (base == nullptr) | ||||||
|         return false; |         return false; | ||||||
| @ -3734,7 +3734,10 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct | |||||||
|         // It will have false positives, since it doesn't check arg counts or types.
 |         // It will have false positives, since it doesn't check arg counts or types.
 | ||||||
|         if (arguments && arguments->getAsAggregate()) { |         if (arguments && arguments->getAsAggregate()) { | ||||||
|             if (isStructBufferType(arguments->getAsAggregate()->getSequence()[0]->getAsTyped()->getType())) { |             if (isStructBufferType(arguments->getAsAggregate()->getSequence()[0]->getAsTyped()->getType())) { | ||||||
|                 if (isStructBufferMethod(function->getName())) { |                 static const int methodPrefixSize = sizeof(BUILTIN_PREFIX)-1; | ||||||
|  | 
 | ||||||
|  |                 if (function->getName().length() > methodPrefixSize && | ||||||
|  |                     isStructBufferMethod(function->getName().substr(methodPrefixSize))) { | ||||||
|                     const TString mangle = function->getName() + "("; |                     const TString mangle = function->getName() + "("; | ||||||
|                     TSymbol* symbol = symbolTable.find(mangle, &builtIn); |                     TSymbol* symbol = symbolTable.find(mangle, &builtIn); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -390,6 +390,12 @@ protected: | |||||||
|     TVector<TString> currentTypePrefix; |     TVector<TString> currentTypePrefix; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | // This is the prefix we use for builtin methods to avoid namespace collisions with
 | ||||||
|  | // global scope user functions.
 | ||||||
|  | // TODO: this would be better as a nonparseable character, but that would
 | ||||||
|  | // require changing the scanner.
 | ||||||
|  | #define BUILTIN_PREFIX "__BI_" | ||||||
|  | 
 | ||||||
| } // end namespace glslang
 | } // end namespace glslang
 | ||||||
| 
 | 
 | ||||||
| #endif // HLSL_PARSE_INCLUDED_
 | #endif // HLSL_PARSE_INCLUDED_
 | ||||||
|  | |||||||
| @ -49,6 +49,7 @@ | |||||||
| //
 | //
 | ||||||
| 
 | 
 | ||||||
| #include "hlslParseables.h" | #include "hlslParseables.h" | ||||||
|  | #include "hlslParseHelper.h" | ||||||
| #include <cctype> | #include <cctype> | ||||||
| #include <utility> | #include <utility> | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| @ -543,335 +544,336 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c | |||||||
|         const char*   argOrder;  // argument order key
 |         const char*   argOrder;  // argument order key
 | ||||||
|         const char*   argType;   // argument type key
 |         const char*   argType;   // argument type key
 | ||||||
|         unsigned int  stage;     // stage mask
 |         unsigned int  stage;     // stage mask
 | ||||||
|  |         bool          method;    // true if it's a method.
 | ||||||
|     } hlslIntrinsics[] = { |     } hlslIntrinsics[] = { | ||||||
|         // name                               retOrd   retType    argOrder          argType   stage mask
 |         // name                               retOrd   retType    argOrder          argType   stage mask
 | ||||||
|         // -----------------------------------------------------------------------------------------------
 |         // -----------------------------------------------------------------------------------------------
 | ||||||
|         { "abort",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "abort",                            nullptr, nullptr,   "-",              "-",             EShLangAll,    false }, | ||||||
|         { "abs",                              nullptr, nullptr,   "SVM",            "DFUI",          EShLangAll }, |         { "abs",                              nullptr, nullptr,   "SVM",            "DFUI",          EShLangAll,    false }, | ||||||
|         { "acos",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "acos",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "all",                              "S",    "B",        "SVM",            "BFIU",          EShLangAll }, |         { "all",                              "S",    "B",        "SVM",            "BFIU",          EShLangAll,    false }, | ||||||
|         { "AllMemoryBarrier",                 nullptr, nullptr,   "-",              "-",             EShLangCS }, |         { "AllMemoryBarrier",                 nullptr, nullptr,   "-",              "-",             EShLangCS,     false }, | ||||||
|         { "AllMemoryBarrierWithGroupSync",    nullptr, nullptr,   "-",              "-",             EShLangCS }, |         { "AllMemoryBarrierWithGroupSync",    nullptr, nullptr,   "-",              "-",             EShLangCS,     false }, | ||||||
|         { "any",                              "S",     "B",       "SVM",            "BFIU",          EShLangAll }, |         { "any",                              "S",     "B",       "SVM",            "BFIU",          EShLangAll,    false }, | ||||||
|         { "asdouble",                         "S",     "D",       "S,",             "UI,",           EShLangAll }, |         { "asdouble",                         "S",     "D",       "S,",             "UI,",           EShLangAll,    false }, | ||||||
|         { "asdouble",                         "V2",    "D",       "V2,",            "UI,",           EShLangAll }, |         { "asdouble",                         "V2",    "D",       "V2,",            "UI,",           EShLangAll,    false }, | ||||||
|         { "asfloat",                          nullptr, "F",       "SVM",            "BFIU",          EShLangAll }, |         { "asfloat",                          nullptr, "F",       "SVM",            "BFIU",          EShLangAll,    false }, | ||||||
|         { "asin",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "asin",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "asint",                            nullptr, "I",       "SVM",            "FU",            EShLangAll }, |         { "asint",                            nullptr, "I",       "SVM",            "FU",            EShLangAll,    false }, | ||||||
|         { "asuint",                           nullptr, "U",       "SVM",            "FU",            EShLangAll }, |         { "asuint",                           nullptr, "U",       "SVM",            "FU",            EShLangAll,    false }, | ||||||
|         { "atan",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "atan",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "atan2",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll }, |         { "atan2",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false }, | ||||||
|         { "ceil",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "ceil",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "CheckAccessFullyMapped",           "S",     "B" ,      "S",              "U",             EShLangPSCS }, |         { "CheckAccessFullyMapped",           "S",     "B" ,      "S",              "U",             EShLangPSCS,   false }, | ||||||
|         { "clamp",                            nullptr, nullptr,   "SVM,,",          "FUI,,",         EShLangAll }, |         { "clamp",                            nullptr, nullptr,   "SVM,,",          "FUI,,",         EShLangAll,    false }, | ||||||
|         { "clip",                             "-",     "-",       "SVM",            "F",             EShLangPS }, |         { "clip",                             "-",     "-",       "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "cos",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "cos",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "cosh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "cosh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "countbits",                        nullptr, nullptr,   "SV",             "UI",            EShLangAll }, |         { "countbits",                        nullptr, nullptr,   "SV",             "UI",            EShLangAll,    false }, | ||||||
|         { "cross",                            nullptr, nullptr,   "V3,",            "F,",            EShLangAll }, |         { "cross",                            nullptr, nullptr,   "V3,",            "F,",            EShLangAll,    false }, | ||||||
|         { "D3DCOLORtoUBYTE4",                 "V4",    "I",       "V4",             "F",             EShLangAll }, |         { "D3DCOLORtoUBYTE4",                 "V4",    "I",       "V4",             "F",             EShLangAll,    false }, | ||||||
|         { "ddx",                              nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "ddx",                              nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "ddx_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "ddx_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "ddx_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "ddx_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "ddy",                              nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "ddy",                              nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "ddy_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "ddy_coarse",                       nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "ddy_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "ddy_fine",                         nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "degrees",                          nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "degrees",                          nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "determinant",                      "S",     "F",       "M",              "F",             EShLangAll }, |         { "determinant",                      "S",     "F",       "M",              "F",             EShLangAll,    false }, | ||||||
|         { "DeviceMemoryBarrier",              nullptr, nullptr,   "-",              "-",             EShLangPSCS }, |         { "DeviceMemoryBarrier",              nullptr, nullptr,   "-",              "-",             EShLangPSCS,   false }, | ||||||
|         { "DeviceMemoryBarrierWithGroupSync", nullptr, nullptr,   "-",              "-",             EShLangCS }, |         { "DeviceMemoryBarrierWithGroupSync", nullptr, nullptr,   "-",              "-",             EShLangCS,     false }, | ||||||
|         { "distance",                         "S",     "F",       "V,",             "F,",            EShLangAll }, |         { "distance",                         "S",     "F",       "V,",             "F,",            EShLangAll,    false }, | ||||||
|         { "dot",                              "S",     nullptr,   "SV,",            "FI,",           EShLangAll }, |         { "dot",                              "S",     nullptr,   "SV,",            "FI,",           EShLangAll,    false }, | ||||||
|         { "dst",                              nullptr, nullptr,   "V4,",            "F,",            EShLangAll }, |         { "dst",                              nullptr, nullptr,   "V4,",            "F,",            EShLangAll,    false }, | ||||||
|         // { "errorf",                           "-",     "-",       "",             "",             EShLangAll }, TODO: varargs
 |         // { "errorf",                           "-",     "-",       "",             "",             EShLangAll,    false }, TODO: varargs
 | ||||||
|         { "EvaluateAttributeAtCentroid",      nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "EvaluateAttributeAtCentroid",      nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "EvaluateAttributeAtSample",        nullptr, nullptr,   "SVM,S",          "F,U",           EShLangPS }, |         { "EvaluateAttributeAtSample",        nullptr, nullptr,   "SVM,S",          "F,U",           EShLangPS,     false }, | ||||||
|         { "EvaluateAttributeSnapped",         nullptr, nullptr,   "SVM,V2",         "F,I",           EShLangPS }, |         { "EvaluateAttributeSnapped",         nullptr, nullptr,   "SVM,V2",         "F,I",           EShLangPS,     false }, | ||||||
|         { "exp",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "exp",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "exp2",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "exp2",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "f16tof32",                         nullptr, "F",       "SV",             "U",             EShLangAll }, |         { "f16tof32",                         nullptr, "F",       "SV",             "U",             EShLangAll,    false }, | ||||||
|         { "f32tof16",                         nullptr, "U",       "SV",             "F",             EShLangAll }, |         { "f32tof16",                         nullptr, "U",       "SV",             "F",             EShLangAll,    false }, | ||||||
|         { "faceforward",                      nullptr, nullptr,   "V,,",            "F,,",           EShLangAll }, |         { "faceforward",                      nullptr, nullptr,   "V,,",            "F,,",           EShLangAll,    false }, | ||||||
|         { "firstbithigh",                     nullptr, nullptr,   "SV",             "UI",            EShLangAll }, |         { "firstbithigh",                     nullptr, nullptr,   "SV",             "UI",            EShLangAll,    false }, | ||||||
|         { "firstbitlow",                      nullptr, nullptr,   "SV",             "UI",            EShLangAll }, |         { "firstbitlow",                      nullptr, nullptr,   "SV",             "UI",            EShLangAll,    false }, | ||||||
|         { "floor",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "floor",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "fma",                              nullptr, nullptr,   "SVM,,",          "D,,",           EShLangAll }, |         { "fma",                              nullptr, nullptr,   "SVM,,",          "D,,",           EShLangAll,    false }, | ||||||
|         { "fmod",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll }, |         { "fmod",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false }, | ||||||
|         { "frac",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "frac",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "frexp",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll }, |         { "frexp",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false }, | ||||||
|         { "fwidth",                           nullptr, nullptr,   "SVM",            "F",             EShLangPS }, |         { "fwidth",                           nullptr, nullptr,   "SVM",            "F",             EShLangPS,     false }, | ||||||
|         { "GetRenderTargetSampleCount",       "S",     "U",       "-",              "-",             EShLangAll }, |         { "GetRenderTargetSampleCount",       "S",     "U",       "-",              "-",             EShLangAll,    false }, | ||||||
|         { "GetRenderTargetSamplePosition",    "V2",    "F",       "V1",             "I",             EShLangAll }, |         { "GetRenderTargetSamplePosition",    "V2",    "F",       "V1",             "I",             EShLangAll,    false }, | ||||||
|         { "GroupMemoryBarrier",               nullptr, nullptr,   "-",              "-",             EShLangCS }, |         { "GroupMemoryBarrier",               nullptr, nullptr,   "-",              "-",             EShLangCS,     false }, | ||||||
|         { "GroupMemoryBarrierWithGroupSync",  nullptr, nullptr,   "-",              "-",             EShLangCS }, |         { "GroupMemoryBarrierWithGroupSync",  nullptr, nullptr,   "-",              "-",             EShLangCS,     false }, | ||||||
|         { "InterlockedAdd",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedAdd",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedAdd",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS }, |         { "InterlockedAdd",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS,   false }, | ||||||
|         { "InterlockedAnd",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedAnd",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedAnd",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS }, |         { "InterlockedAnd",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS,   false }, | ||||||
|         { "InterlockedCompareExchange",       "-",     "-",       "SVM,,,>",        "UI,,,",         EShLangPSCS }, |         { "InterlockedCompareExchange",       "-",     "-",       "SVM,,,>",        "UI,,,",         EShLangPSCS,   false }, | ||||||
|         { "InterlockedCompareStore",          "-",     "-",       "SVM,,",          "UI,,",          EShLangPSCS }, |         { "InterlockedCompareStore",          "-",     "-",       "SVM,,",          "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedExchange",              "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedExchange",              "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedMax",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedMax",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedMax",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS }, |         { "InterlockedMax",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS,   false }, | ||||||
|         { "InterlockedMin",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedMin",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedMin",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS }, |         { "InterlockedMin",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS,   false }, | ||||||
|         { "InterlockedOr",                    "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedOr",                    "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedOr",                    "-",     "-",       "SVM,",           "UI,",           EShLangPSCS }, |         { "InterlockedOr",                    "-",     "-",       "SVM,",           "UI,",           EShLangPSCS,   false }, | ||||||
|         { "InterlockedXor",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS }, |         { "InterlockedXor",                   "-",     "-",       "SVM,,>",         "UI,,",          EShLangPSCS,   false }, | ||||||
|         { "InterlockedXor",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS }, |         { "InterlockedXor",                   "-",     "-",       "SVM,",           "UI,",           EShLangPSCS,   false }, | ||||||
|         { "isfinite",                         nullptr, "B" ,      "SVM",            "F",             EShLangAll }, |         { "isfinite",                         nullptr, "B" ,      "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "isinf",                            nullptr, "B" ,      "SVM",            "F",             EShLangAll }, |         { "isinf",                            nullptr, "B" ,      "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "isnan",                            nullptr, "B" ,      "SVM",            "F",             EShLangAll }, |         { "isnan",                            nullptr, "B" ,      "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "ldexp",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll }, |         { "ldexp",                            nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false }, | ||||||
|         { "length",                           "S",     "F",       "V",              "F",             EShLangAll }, |         { "length",                           "S",     "F",       "V",              "F",             EShLangAll,    false }, | ||||||
|         { "lerp",                             nullptr, nullptr,   "VM,,",           "F,,",           EShLangAll }, |         { "lerp",                             nullptr, nullptr,   "VM,,",           "F,,",           EShLangAll,    false }, | ||||||
|         { "lerp",                             nullptr, nullptr,   "SVM,,S",         "F,,",           EShLangAll }, |         { "lerp",                             nullptr, nullptr,   "SVM,,S",         "F,,",           EShLangAll,    false }, | ||||||
|         { "lit",                              "V4",    "F",       "S,,",            "F,,",           EShLangAll }, |         { "lit",                              "V4",    "F",       "S,,",            "F,,",           EShLangAll,    false }, | ||||||
|         { "log",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "log",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "log10",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "log10",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "log2",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "log2",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "mad",                              nullptr, nullptr,   "SVM,,",          "DFUI,,",        EShLangAll }, |         { "mad",                              nullptr, nullptr,   "SVM,,",          "DFUI,,",        EShLangAll,    false }, | ||||||
|         { "max",                              nullptr, nullptr,   "SVM,",           "FIU,",          EShLangAll }, |         { "max",                              nullptr, nullptr,   "SVM,",           "FIU,",          EShLangAll,    false }, | ||||||
|         { "min",                              nullptr, nullptr,   "SVM,",           "FIU,",          EShLangAll }, |         { "min",                              nullptr, nullptr,   "SVM,",           "FIU,",          EShLangAll,    false }, | ||||||
|         { "modf",                             nullptr, nullptr,   "SVM,>",          "FIU,",          EShLangAll }, |         { "modf",                             nullptr, nullptr,   "SVM,>",          "FIU,",          EShLangAll,    false }, | ||||||
|         { "msad4",                            "V4",    "U",       "S,V2,V4",        "U,,",           EShLangAll }, |         { "msad4",                            "V4",    "U",       "S,V2,V4",        "U,,",           EShLangAll,    false }, | ||||||
|         { "mul",                              "S",     nullptr,   "S,S",            "FI,",           EShLangAll }, |         { "mul",                              "S",     nullptr,   "S,S",            "FI,",           EShLangAll,    false }, | ||||||
|         { "mul",                              "V",     nullptr,   "S,V",            "FI,",           EShLangAll }, |         { "mul",                              "V",     nullptr,   "S,V",            "FI,",           EShLangAll,    false }, | ||||||
|         { "mul",                              "M",     nullptr,   "S,M",            "FI,",           EShLangAll }, |         { "mul",                              "M",     nullptr,   "S,M",            "FI,",           EShLangAll,    false }, | ||||||
|         { "mul",                              "V",     nullptr,   "V,S",            "FI,",           EShLangAll }, |         { "mul",                              "V",     nullptr,   "V,S",            "FI,",           EShLangAll,    false }, | ||||||
|         { "mul",                              "S",     nullptr,   "V,V",            "FI,",           EShLangAll }, |         { "mul",                              "S",     nullptr,   "V,V",            "FI,",           EShLangAll,    false }, | ||||||
|         { "mul",                              "M",     nullptr,   "M,S",            "FI,",           EShLangAll }, |         { "mul",                              "M",     nullptr,   "M,S",            "FI,",           EShLangAll,    false }, | ||||||
|         // mat*mat form of mul is handled in createMatTimesMat()
 |         // mat*mat form of mul is handled in createMatTimesMat()
 | ||||||
|         { "noise",                            "S",     "F",       "V",              "F",             EShLangPS }, |         { "noise",                            "S",     "F",       "V",              "F",             EShLangPS,     false }, | ||||||
|         { "normalize",                        nullptr, nullptr,   "V",              "F",             EShLangAll }, |         { "normalize",                        nullptr, nullptr,   "V",              "F",             EShLangAll,    false }, | ||||||
|         { "pow",                              nullptr, nullptr,   "SVM,",           "F,",            EShLangAll }, |         { "pow",                              nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false }, | ||||||
|         // { "printf",                           "-",     "-",       "",            "",              EShLangAll }, TODO: varargs
 |         // { "printf",                           "-",     "-",       "",            "",              EShLangAll,    false }, TODO: varargs
 | ||||||
|         { "Process2DQuadTessFactorsAvg",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS }, |         { "Process2DQuadTessFactorsAvg",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS,     false }, | ||||||
|         { "Process2DQuadTessFactorsMax",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS }, |         { "Process2DQuadTessFactorsMax",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS,     false }, | ||||||
|         { "Process2DQuadTessFactorsMin",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS }, |         { "Process2DQuadTessFactorsMin",      "-",     "-",       "V4,V2,>V4,>V2,", "F,,,,",         EShLangHS,     false }, | ||||||
|         { "ProcessIsolineTessFactors",        "-",     "-",       "S,,>,>",         "F,,,",          EShLangHS }, |         { "ProcessIsolineTessFactors",        "-",     "-",       "S,,>,>",         "F,,,",          EShLangHS,     false }, | ||||||
|         { "ProcessQuadTessFactorsAvg",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS }, |         { "ProcessQuadTessFactorsAvg",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS,     false }, | ||||||
|         { "ProcessQuadTessFactorsMax",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS }, |         { "ProcessQuadTessFactorsMax",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS,     false }, | ||||||
|         { "ProcessQuadTessFactorsMin",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS }, |         { "ProcessQuadTessFactorsMin",        "-",     "-",       "V4,S,>V4,>V2,",  "F,,,,",         EShLangHS,     false }, | ||||||
|         { "ProcessTriTessFactorsAvg",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS }, |         { "ProcessTriTessFactorsAvg",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS,     false }, | ||||||
|         { "ProcessTriTessFactorsMax",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS }, |         { "ProcessTriTessFactorsMax",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS,     false }, | ||||||
|         { "ProcessTriTessFactorsMin",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS }, |         { "ProcessTriTessFactorsMin",         "-",     "-",       "V3,S,>V3,>S,",   "F,,,,",         EShLangHS,     false }, | ||||||
|         { "radians",                          nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "radians",                          nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "rcp",                              nullptr, nullptr,   "SVM",            "FD",            EShLangAll }, |         { "rcp",                              nullptr, nullptr,   "SVM",            "FD",            EShLangAll,    false }, | ||||||
|         { "reflect",                          nullptr, nullptr,   "V,",             "F,",            EShLangAll }, |         { "reflect",                          nullptr, nullptr,   "V,",             "F,",            EShLangAll,    false }, | ||||||
|         { "refract",                          nullptr, nullptr,   "V,V,S",          "F,,",           EShLangAll }, |         { "refract",                          nullptr, nullptr,   "V,V,S",          "F,,",           EShLangAll,    false }, | ||||||
|         { "reversebits",                      nullptr, nullptr,   "SV",             "UI",            EShLangAll }, |         { "reversebits",                      nullptr, nullptr,   "SV",             "UI",            EShLangAll,    false }, | ||||||
|         { "round",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "round",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "rsqrt",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "rsqrt",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "saturate",                         nullptr, nullptr ,  "SVM",            "F",             EShLangAll }, |         { "saturate",                         nullptr, nullptr ,  "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "sign",                             nullptr, nullptr,   "SVM",            "FI",            EShLangAll }, |         { "sign",                             nullptr, nullptr,   "SVM",            "FI",            EShLangAll,    false }, | ||||||
|         { "sin",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "sin",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "sincos",                           "-",     "-",       "SVM,>,>",        "F,,",           EShLangAll }, |         { "sincos",                           "-",     "-",       "SVM,>,>",        "F,,",           EShLangAll,    false }, | ||||||
|         { "sinh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "sinh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "smoothstep",                       nullptr, nullptr,   "SVM,,",          "F,,",           EShLangAll }, |         { "smoothstep",                       nullptr, nullptr,   "SVM,,",          "F,,",           EShLangAll,    false }, | ||||||
|         { "sqrt",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "sqrt",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "step",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll }, |         { "step",                             nullptr, nullptr,   "SVM,",           "F,",            EShLangAll,    false }, | ||||||
|         { "tan",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "tan",                              nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "tanh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "tanh",                             nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
|         { "tex1D",                            "V4",    "F",       "V1,S",           "S,F",           EShLangPS }, |         { "tex1D",                            "V4",    "F",       "V1,S",           "S,F",           EShLangPS,     false }, | ||||||
|         { "tex1D",                            "V4",    "F",       "V1,S,V1,",       "S,F,,",         EShLangPS }, |         { "tex1D",                            "V4",    "F",       "V1,S,V1,",       "S,F,,",         EShLangPS,     false }, | ||||||
|         { "tex1Dbias",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS }, |         { "tex1Dbias",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex1Dgrad",                        "V4",    "F",       "V1,,,",          "S,F,,",         EShLangPS }, |         { "tex1Dgrad",                        "V4",    "F",       "V1,,,",          "S,F,,",         EShLangPS,     false }, | ||||||
|         { "tex1Dlod",                         "V4",    "F",       "V1,V4",          "S,F",           EShLangPS }, |         { "tex1Dlod",                         "V4",    "F",       "V1,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex1Dproj",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS }, |         { "tex1Dproj",                        "V4",    "F",       "V1,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex2D",                            "V4",    "F",       "V2,",            "S,F",           EShLangPS }, |         { "tex2D",                            "V4",    "F",       "V2,",            "S,F",           EShLangPS,     false }, | ||||||
|         { "tex2D",                            "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS }, |         { "tex2D",                            "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS,     false }, | ||||||
|         { "tex2Dbias",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS }, |         { "tex2Dbias",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex2Dgrad",                        "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS }, |         { "tex2Dgrad",                        "V4",    "F",       "V2,,,",          "S,F,,",         EShLangPS,     false }, | ||||||
|         { "tex2Dlod",                         "V4",    "F",       "V2,V4",          "S,F",           EShLangPS }, |         { "tex2Dlod",                         "V4",    "F",       "V2,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex2Dproj",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS }, |         { "tex2Dproj",                        "V4",    "F",       "V2,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex3D",                            "V4",    "F",       "V3,",            "S,F",           EShLangPS }, |         { "tex3D",                            "V4",    "F",       "V3,",            "S,F",           EShLangPS,     false }, | ||||||
|         { "tex3D",                            "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS }, |         { "tex3D",                            "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS,     false }, | ||||||
|         { "tex3Dbias",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangPS }, |         { "tex3Dbias",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex3Dgrad",                        "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS }, |         { "tex3Dgrad",                        "V4",    "F",       "V3,,,",          "S,F,,",         EShLangPS,     false }, | ||||||
|         { "tex3Dlod",                         "V4",    "F",       "V3,V4",          "S,F",           EShLangPS }, |         { "tex3Dlod",                         "V4",    "F",       "V3,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "tex3Dproj",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangPS }, |         { "tex3Dproj",                        "V4",    "F",       "V3,V4",          "S,F",           EShLangPS,     false }, | ||||||
|         { "texCUBE",                          "V4",    "F",       "V4,V3",          "S,F",           EShLangPS }, |         { "texCUBE",                          "V4",    "F",       "V4,V3",          "S,F",           EShLangPS,     false }, | ||||||
|         { "texCUBE",                          "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangPS }, |         { "texCUBE",                          "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangPS,     false }, | ||||||
|         { "texCUBEbias",                      "V4",    "F",       "V4,",            "S,F",           EShLangPS }, |         { "texCUBEbias",                      "V4",    "F",       "V4,",            "S,F",           EShLangPS,     false }, | ||||||
|         { "texCUBEgrad",                      "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangPS }, |         { "texCUBEgrad",                      "V4",    "F",       "V4,V3,,",        "S,F,,",         EShLangPS,     false }, | ||||||
|         { "texCUBElod",                       "V4",    "F",       "V4,",            "S,F",           EShLangPS }, |         { "texCUBElod",                       "V4",    "F",       "V4,",            "S,F",           EShLangPS,     false }, | ||||||
|         { "texCUBEproj",                      "V4",    "F",       "V4,",            "S,F",           EShLangPS }, |         { "texCUBEproj",                      "V4",    "F",       "V4,",            "S,F",           EShLangPS,     false }, | ||||||
|         { "transpose",                        "^M",    nullptr,   "M",              "FUIB",          EShLangAll }, |         { "transpose",                        "^M",    nullptr,   "M",              "FUIB",          EShLangAll,    false }, | ||||||
|         { "trunc",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll }, |         { "trunc",                            nullptr, nullptr,   "SVM",            "F",             EShLangAll,    false }, | ||||||
| 
 | 
 | ||||||
|         // Texture object methods.  Return type can be overridden by shader declaration.
 |         // Texture object methods.  Return type can be overridden by shader declaration.
 | ||||||
|         // !O = no offset, O = offset
 |         // !O = no offset, O = offset
 | ||||||
|         { "Sample",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangPS }, |         { "Sample",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",        EShLangPS,    true }, | ||||||
|         { "Sample",             /* O*/        "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangPS }, |         { "Sample",             /* O*/        "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",      EShLangPS,    true }, | ||||||
| 
 | 
 | ||||||
|         { "SampleBias",         /*!O*/        "V4",    nullptr,   "%@,S,V,S",       "FIU,S,F,",      EShLangPS }, |         { "SampleBias",         /*!O*/        "V4",    nullptr,   "%@,S,V,S",       "FIU,S,F,",       EShLangPS,    true }, | ||||||
|         { "SampleBias",         /* O*/        "V4",    nullptr,   "%@,S,V,S,V",     "FIU,S,F,,I",    EShLangPS }, |         { "SampleBias",         /* O*/        "V4",    nullptr,   "%@,S,V,S,V",     "FIU,S,F,,I",     EShLangPS,    true }, | ||||||
| 
 | 
 | ||||||
|         // TODO: FXC accepts int/uint samplers here.  unclear what that means.
 |         // TODO: FXC accepts int/uint samplers here.  unclear what that means.
 | ||||||
|         { "SampleCmp",          /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,",      EShLangPS }, |         { "SampleCmp",          /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,",       EShLangPS,    true }, | ||||||
|         { "SampleCmp",          /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,,I",    EShLangPS }, |         { "SampleCmp",          /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangPS,    true }, | ||||||
| 
 | 
 | ||||||
|         // TODO: FXC accepts int/uint samplers here.  unclear what that means.
 |         // TODO: FXC accepts int/uint samplers here.  unclear what that means.
 | ||||||
|         { "SampleCmpLevelZero", /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,F",     EShLangPS }, |         { "SampleCmpLevelZero", /*!O*/        "S",     "F",       "%@,S,V,S",       "FIU,s,F,F",      EShLangPS,    true }, | ||||||
|         { "SampleCmpLevelZero", /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,F,I",   EShLangPS }, |         { "SampleCmpLevelZero", /* O*/        "S",     "F",       "%@,S,V,S,V",     "FIU,s,F,F,I",    EShLangPS,    true }, | ||||||
| 
 | 
 | ||||||
|         { "SampleGrad",         /*!O*/        "V4",    nullptr,   "%@,S,V,,",       "FIU,S,F,,",     EShLangAll }, |         { "SampleGrad",         /*!O*/        "V4",    nullptr,   "%@,S,V,,",       "FIU,S,F,,",      EShLangAll,   true }, | ||||||
|         { "SampleGrad",         /* O*/        "V4",    nullptr,   "%@,S,V,,,",      "FIU,S,F,,,I",   EShLangAll }, |         { "SampleGrad",         /* O*/        "V4",    nullptr,   "%@,S,V,,,",      "FIU,S,F,,,I",    EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "SampleLevel",        /*!O*/        "V4",    nullptr,   "%@,S,V,S",       "FIU,S,F,",      EShLangAll }, |         { "SampleLevel",        /*!O*/        "V4",    nullptr,   "%@,S,V,S",       "FIU,S,F,",       EShLangAll,   true }, | ||||||
|         { "SampleLevel",        /* O*/        "V4",    nullptr,   "%@,S,V,S,V",     "FIU,S,F,,I",    EShLangAll }, |         { "SampleLevel",        /* O*/        "V4",    nullptr,   "%@,S,V,S,V",     "FIU,S,F,,I",     EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "Load",               /*!O*/        "V4",    nullptr,   "%@,V",           "FIU,I",         EShLangAll }, |         { "Load",               /*!O*/        "V4",    nullptr,   "%@,V",           "FIU,I",          EShLangAll,   true }, | ||||||
|         { "Load",               /* O*/        "V4",    nullptr,   "%@,V,V",         "FIU,I,I",       EShLangAll }, |         { "Load",               /* O*/        "V4",    nullptr,   "%@,V,V",         "FIU,I,I",        EShLangAll,   true }, | ||||||
|         { "Load", /* +sampleidex*/            "V4",    nullptr,   "$&,V,S",         "FIU,I,I",       EShLangAll }, |         { "Load", /* +sampleidex*/            "V4",    nullptr,   "$&,V,S",         "FIU,I,I",        EShLangAll,   true }, | ||||||
|         { "Load", /* +samplindex, offset*/    "V4",    nullptr,   "$&,V,S,V",       "FIU,I,I,I",     EShLangAll }, |         { "Load", /* +samplindex, offset*/    "V4",    nullptr,   "$&,V,S,V",       "FIU,I,I,I",      EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // RWTexture loads
 |         // RWTexture loads
 | ||||||
|         { "Load",                             "V4",    nullptr,   "!#,V",           "FIU,I",         EShLangAll }, |         { "Load",                             "V4",    nullptr,   "!#,V",           "FIU,I",          EShLangAll,   true }, | ||||||
|         // (RW)Buffer loads
 |         // (RW)Buffer loads
 | ||||||
|         { "Load",                             "V4",    nullptr,   "~*1,V",          "FIU,I",         EShLangAll }, |         { "Load",                             "V4",    nullptr,   "~*1,V",          "FIU,I",          EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "Gather",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll }, |         { "Gather",             /*!O*/        "V4",    nullptr,   "%@,S,V",         "FIU,S,F",        EShLangAll,   true }, | ||||||
|         { "Gather",             /* O*/        "V4",    nullptr,   "%@,S,V,V",       "FIU,S,F,I",     EShLangAll }, |         { "Gather",             /* O*/        "V4",    nullptr,   "%@,S,V,V",       "FIU,S,F,I",      EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "CalculateLevelOfDetail",           "S",     "F",       "%@,S,V",         "FUI,S,F",       EShLangPS }, |         { "CalculateLevelOfDetail",           "S",     "F",       "%@,S,V",         "FUI,S,F",        EShLangPS,    true }, | ||||||
|         { "CalculateLevelOfDetailUnclamped",  "S",     "F",       "%@,S,V",         "FUI,S,F",       EShLangPS }, |         { "CalculateLevelOfDetailUnclamped",  "S",     "F",       "%@,S,V",         "FUI,S,F",        EShLangPS,    true }, | ||||||
| 
 | 
 | ||||||
|         { "GetSamplePosition",                "V2",    "F",       "$&2,S",          "FUI,I",         EShLangVSPSGS }, |         { "GetSamplePosition",                "V2",    "F",       "$&2,S",          "FUI,I",          EShLangVSPSGS,true }, | ||||||
| 
 | 
 | ||||||
|         //
 |         //
 | ||||||
|         // UINT Width
 |         // UINT Width
 | ||||||
|         // UINT MipLevel, UINT Width, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* 1D */         "-",     "-",       "%!~1,>S",        "FUI,U",         EShLangAll }, |         { "GetDimensions",   /* 1D */         "-",     "-",       "%!~1,>S",        "FUI,U",          EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 1D */         "-",     "-",       "%!~1,>S",        "FUI,F",         EShLangAll }, |         { "GetDimensions",   /* 1D */         "-",     "-",       "%!~1,>S",        "FUI,F",          EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 1D */         "-",     "-",       "%1,S,>S,",       "FUI,U,,",       EShLangAll }, |         { "GetDimensions",   /* 1D */         "-",     "-",       "%1,S,>S,",       "FUI,U,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 1D */         "-",     "-",       "%1,S,>S,",       "FUI,U,F,",      EShLangAll }, |         { "GetDimensions",   /* 1D */         "-",     "-",       "%1,S,>S,",       "FUI,U,F,",       EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Elements
 |         // UINT Width, UINT Elements
 | ||||||
|         // UINT MipLevel, UINT Width, UINT Elements, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT Elements, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@#1,>S,",        "FUI,U,",        EShLangAll }, |         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@#1,>S,",        "FUI,U,",         EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@#1,>S,",        "FUI,F,",        EShLangAll }, |         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@#1,>S,",        "FUI,F,",         EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@1,S,>S,,",      "FUI,U,,,",      EShLangAll }, |         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@1,S,>S,,",      "FUI,U,,,",       EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@1,S,>S,,",      "FUI,U,F,,",     EShLangAll }, |         { "GetDimensions",   /* 1DArray */    "-",     "-",       "@1,S,>S,,",      "FUI,U,F,,",      EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Height
 |         // UINT Width, UINT Height
 | ||||||
|         // UINT MipLevel, UINT Width, UINT Height, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT Height, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* 2D */         "-",     "-",       "%!2,>S,",        "FUI,U,",        EShLangAll }, |         { "GetDimensions",   /* 2D */         "-",     "-",       "%!2,>S,",        "FUI,U,",         EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2D */         "-",     "-",       "%!2,>S,",        "FUI,F,",        EShLangAll }, |         { "GetDimensions",   /* 2D */         "-",     "-",       "%!2,>S,",        "FUI,F,",         EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2D */         "-",     "-",       "%2,S,>S,,",      "FUI,U,,,",      EShLangAll }, |         { "GetDimensions",   /* 2D */         "-",     "-",       "%2,S,>S,,",      "FUI,U,,,",       EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2D */         "-",     "-",       "%2,S,>S,,",      "FUI,U,F,,",     EShLangAll }, |         { "GetDimensions",   /* 2D */         "-",     "-",       "%2,S,>S,,",      "FUI,U,F,,",      EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Height, UINT Elements
 |         // UINT Width, UINT Height, UINT Elements
 | ||||||
|         // UINT MipLevel, UINT Width, UINT Height, UINT Elements, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT Height, UINT Elements, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@#2,>S,,",       "FUI,U,,",       EShLangAll }, |         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@#2,>S,,",       "FUI,U,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@#2,>S,,",       "FUI,F,F,F",     EShLangAll }, |         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@#2,>S,,",       "FUI,F,F,F",      EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@2,S,>S,,,",     "FUI,U,,,,",     EShLangAll }, |         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@2,S,>S,,,",     "FUI,U,,,,",      EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@2,S,>S,,,",     "FUI,U,F,,,",    EShLangAll }, |         { "GetDimensions",   /* 2DArray */    "-",     "-",       "@2,S,>S,,,",     "FUI,U,F,,,",     EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Height, UINT Depth
 |         // UINT Width, UINT Height, UINT Depth
 | ||||||
|         // UINT MipLevel, UINT Width, UINT Height, UINT Depth, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT Height, UINT Depth, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* 3D */         "-",     "-",       "%!3,>S,,",       "FUI,U,,",       EShLangAll }, |         { "GetDimensions",   /* 3D */         "-",     "-",       "%!3,>S,,",       "FUI,U,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 3D */         "-",     "-",       "%!3,>S,,",       "FUI,F,,",       EShLangAll }, |         { "GetDimensions",   /* 3D */         "-",     "-",       "%!3,>S,,",       "FUI,F,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 3D */         "-",     "-",       "%3,S,>S,,,",     "FUI,U,,,,",     EShLangAll }, |         { "GetDimensions",   /* 3D */         "-",     "-",       "%3,S,>S,,,",     "FUI,U,,,,",      EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 3D */         "-",     "-",       "%3,S,>S,,,",     "FUI,U,F,,,",    EShLangAll }, |         { "GetDimensions",   /* 3D */         "-",     "-",       "%3,S,>S,,,",     "FUI,U,F,,,",     EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Height
 |         // UINT Width, UINT Height
 | ||||||
|         // UINT MipLevel, UINT Width, UINT Height, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT Height, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,>S,",         "FUI,U,",        EShLangAll }, |         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,>S,",         "FUI,U,",         EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,>S,",         "FUI,F,",        EShLangAll }, |         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,>S,",         "FUI,F,",         EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,S,>S,,",      "FUI,U,,,",      EShLangAll }, |         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,S,>S,,",      "FUI,U,,,",       EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,S,>S,,",      "FUI,U,F,,",     EShLangAll }, |         { "GetDimensions",   /* Cube */       "-",     "-",       "%4,S,>S,,",      "FUI,U,F,,",      EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Height, UINT Elements
 |         // UINT Width, UINT Height, UINT Elements
 | ||||||
|         // UINT MipLevel, UINT Width, UINT Height, UINT Elements, UINT NumberOfLevels
 |         // UINT MipLevel, UINT Width, UINT Height, UINT Elements, UINT NumberOfLevels
 | ||||||
|         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,>S,,",        "FUI,U,,",       EShLangAll }, |         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,>S,,",        "FUI,U,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,>S,,",        "FUI,F,,",       EShLangAll }, |         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,>S,,",        "FUI,F,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,S,>S,,,",     "FUI,U,,,,",     EShLangAll }, |         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,S,>S,,,",     "FUI,U,,,,",      EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,S,>S,,,",     "FUI,U,F,,,",    EShLangAll }, |         { "GetDimensions",   /* CubeArray */  "-",     "-",       "@4,S,>S,,,",     "FUI,U,F,,,",     EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // UINT Width, UINT Height, UINT Samples
 |         // UINT Width, UINT Height, UINT Samples
 | ||||||
|         // UINT Width, UINT Height, UINT Elements, UINT Samples
 |         // UINT Width, UINT Height, UINT Elements, UINT Samples
 | ||||||
|         { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",       EShLangAll }, |         { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",       EShLangAll }, |         { "GetDimensions",   /* 2DMS */       "-",     "-",       "$2,>S,,",        "FUI,U,,",        EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",      EShLangAll }, |         { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",       EShLangAll,   true }, | ||||||
|         { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",      EShLangAll }, |         { "GetDimensions",   /* 2DMSArray */  "-",     "-",       "&2,>S,,,",       "FUI,U,,,",       EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // SM5 texture methods
 |         // SM5 texture methods
 | ||||||
|         { "GatherRed",       /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll }, |         { "GatherRed",       /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",        EShLangAll,   true }, | ||||||
|         { "GatherRed",       /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll }, |         { "GatherRed",       /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",      EShLangAll,   true }, | ||||||
|         { "GatherRed",       /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll }, |         { "GatherRed",       /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",    EShLangAll,   true }, | ||||||
|         { "GatherRed",       /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll }, |         { "GatherRed",       /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",   EShLangAll,   true }, | ||||||
|         { "GatherRed",       /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll }, |         { "GatherRed",       /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U", EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherGreen",     /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll }, |         { "GatherGreen",     /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",        EShLangAll,   true }, | ||||||
|         { "GatherGreen",     /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll }, |         { "GatherGreen",     /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",      EShLangAll,   true }, | ||||||
|         { "GatherGreen",     /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll }, |         { "GatherGreen",     /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",    EShLangAll,   true }, | ||||||
|         { "GatherGreen",     /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll }, |         { "GatherGreen",     /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",   EShLangAll,   true }, | ||||||
|         { "GatherGreen",     /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll }, |         { "GatherGreen",     /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U", EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherBlue",      /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll }, |         { "GatherBlue",      /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",        EShLangAll,   true }, | ||||||
|         { "GatherBlue",      /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll }, |         { "GatherBlue",      /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",      EShLangAll,   true }, | ||||||
|         { "GatherBlue",      /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll }, |         { "GatherBlue",      /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",    EShLangAll,   true }, | ||||||
|         { "GatherBlue",      /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll }, |         { "GatherBlue",      /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",   EShLangAll,   true }, | ||||||
|         { "GatherBlue",      /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll }, |         { "GatherBlue",      /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U", EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherAlpha",     /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",       EShLangAll }, |         { "GatherAlpha",     /*!O*/           "V4",    nullptr,   "%@,S,V",         "FIU,S,F",        EShLangAll,   true }, | ||||||
|         { "GatherAlpha",     /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",     EShLangAll }, |         { "GatherAlpha",     /* O*/           "V4",    nullptr,   "%@,S,V,",        "FIU,S,F,I",      EShLangAll,   true }, | ||||||
|         { "GatherAlpha",     /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",   EShLangAll }, |         { "GatherAlpha",     /* O, status*/   "V4",    nullptr,   "%@,S,V,,>S",     "FIU,S,F,I,U",    EShLangAll,   true }, | ||||||
|         { "GatherAlpha",     /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",  EShLangAll }, |         { "GatherAlpha",     /* O-4 */        "V4",    nullptr,   "%@,S,V,,,,",     "FIU,S,F,I,,,",   EShLangAll,   true }, | ||||||
|         { "GatherAlpha",     /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U",EShLangAll }, |         { "GatherAlpha",     /* O-4, status */"V4",    nullptr,   "%@,S,V,,,,,S",   "FIU,S,F,I,,,,U", EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherCmpRed",    /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll }, |         { "GatherCmpRed",    /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll,   true }, | ||||||
|         { "GatherCmpRed",    /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll }, |         { "GatherCmpRed",    /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll,   true }, | ||||||
|         { "GatherCmpRed",    /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll }, |         { "GatherCmpRed",    /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll,   true }, | ||||||
|         { "GatherCmpRed",    /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll }, |         { "GatherCmpRed",    /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll,   true }, | ||||||
|         { "GatherCmpRed",    /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,V,S","FIU,s,F,,I,,,,U",EShLangAll }, |         { "GatherCmpRed",    /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,V,S","FIU,s,F,,I,,,,U",EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherCmpGreen",  /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll }, |         { "GatherCmpGreen",  /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll,   true }, | ||||||
|         { "GatherCmpGreen",  /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll }, |         { "GatherCmpGreen",  /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll,   true }, | ||||||
|         { "GatherCmpGreen",  /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll }, |         { "GatherCmpGreen",  /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll,   true }, | ||||||
|         { "GatherCmpGreen",  /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll }, |         { "GatherCmpGreen",  /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll,   true }, | ||||||
|         { "GatherCmpGreen",  /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll }, |         { "GatherCmpGreen",  /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherCmpBlue",   /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll }, |         { "GatherCmpBlue",   /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll,   true }, | ||||||
|         { "GatherCmpBlue",   /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll }, |         { "GatherCmpBlue",   /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll,   true }, | ||||||
|         { "GatherCmpBlue",   /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll }, |         { "GatherCmpBlue",   /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll,   true }, | ||||||
|         { "GatherCmpBlue",   /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll }, |         { "GatherCmpBlue",   /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll,   true }, | ||||||
|         { "GatherCmpBlue",   /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll }, |         { "GatherCmpBlue",   /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         { "GatherCmpAlpha",  /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll }, |         { "GatherCmpAlpha",  /*!O*/           "V4",    nullptr,   "%@,S,V,S",       "FIU,s,F,",       EShLangAll,   true }, | ||||||
|         { "GatherCmpAlpha",  /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll }, |         { "GatherCmpAlpha",  /* O*/           "V4",    nullptr,   "%@,S,V,S,V",     "FIU,s,F,,I",     EShLangAll,   true }, | ||||||
|         { "GatherCmpAlpha",  /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll }, |         { "GatherCmpAlpha",  /* O, status*/   "V4",    nullptr,   "%@,S,V,S,V,>S",  "FIU,s,F,,I,U",   EShLangAll,   true }, | ||||||
|         { "GatherCmpAlpha",  /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll }, |         { "GatherCmpAlpha",  /* O-4 */        "V4",    nullptr,   "%@,S,V,S,V,,,",  "FIU,s,F,,I,,,",  EShLangAll,   true }, | ||||||
|         { "GatherCmpAlpha",  /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll }, |         { "GatherCmpAlpha",  /* O-4, status */"V4",    nullptr,   "%@,S,V,S,V,,,,S","FIU,s,F,,I,,,,U",EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // geometry methods
 |         // geometry methods
 | ||||||
|         { "Append",                           "-",     "-",       "-",              "-",              EShLangGS  }, |         { "Append",                           "-",     "-",       "-",              "-",              EShLangGS ,   true }, | ||||||
|         { "RestartStrip",                     "-",     "-",       "-",              "-",              EShLangGS  }, |         { "RestartStrip",                     "-",     "-",       "-",              "-",              EShLangGS ,   true }, | ||||||
| 
 | 
 | ||||||
|         // Methods for structurebuffers.  TODO: wildcard type matching.
 |         // Methods for structurebuffers.  TODO: wildcard type matching.
 | ||||||
|         { "Load",                             nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Load",                             nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Load2",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Load2",                            nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Load3",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Load3",                            nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Load4",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Load4",                            nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Store",                            nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Store",                            nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Store2",                           nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Store2",                           nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Store3",                           nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Store3",                           nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "Store4",                           nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "Store4",                           nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "GetDimensions",                    nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "GetDimensions",                    nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedAdd",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedAdd",                   nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedAnd",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedAnd",                   nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedCompareExchange",       nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedCompareExchange",       nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedCompareStore",          nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedCompareStore",          nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedExchange",              nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedExchange",              nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedMax",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedMax",                   nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedMin",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedMin",                   nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedOr",                    nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedOr",                    nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
|         { "InterlockedXor",                   nullptr, nullptr,   "-",              "-",             EShLangAll }, |         { "InterlockedXor",                   nullptr, nullptr,   "-",              "-",              EShLangAll,   true }, | ||||||
| 
 | 
 | ||||||
|         // Mark end of list, since we want to avoid a range-based for, as some compilers don't handle it yet.
 |         // Mark end of list, since we want to avoid a range-based for, as some compilers don't handle it yet.
 | ||||||
|         { nullptr,                            nullptr, nullptr,   nullptr,      nullptr,  0 }, |         { nullptr,                            nullptr, nullptr,   nullptr,      nullptr,  0, false }, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     // Create prototypes for the intrinsics.  TODO: Avoid ranged based for until all compilers can handle it.
 |     // Create prototypes for the intrinsics.  TODO: Avoid ranged based for until all compilers can handle it.
 | ||||||
| @ -918,6 +920,12 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c | |||||||
| 
 | 
 | ||||||
|                             AppendTypeName(s, retOrder, retType, dim0, dim1);  // add return type
 |                             AppendTypeName(s, retOrder, retType, dim0, dim1);  // add return type
 | ||||||
|                             s.append(" ");                                     // space between type and name
 |                             s.append(" ");                                     // space between type and name
 | ||||||
|  | 
 | ||||||
|  |                             // methods have a prefix.  TODO: it would be better as an invalid identifier character,
 | ||||||
|  |                             // but that requires a scanner change.
 | ||||||
|  |                             if (intrinsic.method) | ||||||
|  |                                 s.append(BUILTIN_PREFIX); | ||||||
|  | 
 | ||||||
|                             s.append(intrinsic.name);                          // intrinsic name
 |                             s.append(intrinsic.name);                          // intrinsic name
 | ||||||
|                             s.append("(");                                     // open paren
 |                             s.append("(");                                     // open paren
 | ||||||
| 
 | 
 | ||||||
| @ -1151,41 +1159,51 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int /*version*/, EProfile /*profil | |||||||
|     symbolTable.relateToOperator("trunc",                       EOpTrunc); |     symbolTable.relateToOperator("trunc",                       EOpTrunc); | ||||||
| 
 | 
 | ||||||
|     // Texture methods
 |     // Texture methods
 | ||||||
|     symbolTable.relateToOperator("Sample",                      EOpMethodSample); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Sample",                      EOpMethodSample); | ||||||
|     symbolTable.relateToOperator("SampleBias",                  EOpMethodSampleBias); |     symbolTable.relateToOperator(BUILTIN_PREFIX "SampleBias",                  EOpMethodSampleBias); | ||||||
|     symbolTable.relateToOperator("SampleCmp",                   EOpMethodSampleCmp); |     symbolTable.relateToOperator(BUILTIN_PREFIX "SampleCmp",                   EOpMethodSampleCmp); | ||||||
|     symbolTable.relateToOperator("SampleCmpLevelZero",          EOpMethodSampleCmpLevelZero); |     symbolTable.relateToOperator(BUILTIN_PREFIX "SampleCmpLevelZero",          EOpMethodSampleCmpLevelZero); | ||||||
|     symbolTable.relateToOperator("SampleGrad",                  EOpMethodSampleGrad); |     symbolTable.relateToOperator(BUILTIN_PREFIX "SampleGrad",                  EOpMethodSampleGrad); | ||||||
|     symbolTable.relateToOperator("SampleLevel",                 EOpMethodSampleLevel); |     symbolTable.relateToOperator(BUILTIN_PREFIX "SampleLevel",                 EOpMethodSampleLevel); | ||||||
|     symbolTable.relateToOperator("Load",                        EOpMethodLoad); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Load",                        EOpMethodLoad); | ||||||
|     symbolTable.relateToOperator("GetDimensions",               EOpMethodGetDimensions); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GetDimensions",               EOpMethodGetDimensions); | ||||||
|     symbolTable.relateToOperator("GetSamplePosition",           EOpMethodGetSamplePosition); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GetSamplePosition",           EOpMethodGetSamplePosition); | ||||||
|     symbolTable.relateToOperator("Gather",                      EOpMethodGather); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Gather",                      EOpMethodGather); | ||||||
|     symbolTable.relateToOperator("CalculateLevelOfDetail",      EOpMethodCalculateLevelOfDetail); |     symbolTable.relateToOperator(BUILTIN_PREFIX "CalculateLevelOfDetail",      EOpMethodCalculateLevelOfDetail); | ||||||
|     symbolTable.relateToOperator("CalculateLevelOfDetailUnclamped", EOpMethodCalculateLevelOfDetailUnclamped); |     symbolTable.relateToOperator(BUILTIN_PREFIX "CalculateLevelOfDetailUnclamped", EOpMethodCalculateLevelOfDetailUnclamped); | ||||||
| 
 | 
 | ||||||
|     // Structure buffer methods (excluding associations already made above for texture methods w/ same name)
 |     // Structure buffer methods (excluding associations already made above for texture methods w/ same name)
 | ||||||
|     symbolTable.relateToOperator("Load2",                       EOpMethodLoad2); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Load2",                       EOpMethodLoad2); | ||||||
|     symbolTable.relateToOperator("Load3",                       EOpMethodLoad3); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Load3",                       EOpMethodLoad3); | ||||||
|     symbolTable.relateToOperator("Load4",                       EOpMethodLoad4); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Load4",                       EOpMethodLoad4); | ||||||
|     symbolTable.relateToOperator("Store",                       EOpMethodStore); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Store",                       EOpMethodStore); | ||||||
|     symbolTable.relateToOperator("Store2",                      EOpMethodStore2); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Store2",                      EOpMethodStore2); | ||||||
|     symbolTable.relateToOperator("Store3",                      EOpMethodStore3); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Store3",                      EOpMethodStore3); | ||||||
|     symbolTable.relateToOperator("Store4",                      EOpMethodStore4); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Store4",                      EOpMethodStore4); | ||||||
|  | 
 | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedAdd",              EOpInterlockedAdd); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedAnd",              EOpInterlockedAnd); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedCompareExchange",  EOpInterlockedCompareExchange); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedCompareStore",     EOpInterlockedCompareStore); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedExchange",         EOpInterlockedExchange); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedMax",              EOpInterlockedMax); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedMin",              EOpInterlockedMin); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedOr",               EOpInterlockedOr); | ||||||
|  |     symbolTable.relateToOperator(BUILTIN_PREFIX "InterlockedXor",              EOpInterlockedXor); | ||||||
| 
 | 
 | ||||||
|     // SM5 Texture methods
 |     // SM5 Texture methods
 | ||||||
|     symbolTable.relateToOperator("GatherRed",                   EOpMethodGatherRed); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherRed",                   EOpMethodGatherRed); | ||||||
|     symbolTable.relateToOperator("GatherGreen",                 EOpMethodGatherGreen); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherGreen",                 EOpMethodGatherGreen); | ||||||
|     symbolTable.relateToOperator("GatherBlue",                  EOpMethodGatherBlue); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherBlue",                  EOpMethodGatherBlue); | ||||||
|     symbolTable.relateToOperator("GatherAlpha",                 EOpMethodGatherAlpha); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherAlpha",                 EOpMethodGatherAlpha); | ||||||
|     symbolTable.relateToOperator("GatherCmpRed",                EOpMethodGatherCmpRed); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherCmpRed",                EOpMethodGatherCmpRed); | ||||||
|     symbolTable.relateToOperator("GatherCmpGreen",              EOpMethodGatherCmpGreen); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherCmpGreen",              EOpMethodGatherCmpGreen); | ||||||
|     symbolTable.relateToOperator("GatherCmpBlue",               EOpMethodGatherCmpBlue); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherCmpBlue",               EOpMethodGatherCmpBlue); | ||||||
|     symbolTable.relateToOperator("GatherCmpAlpha",              EOpMethodGatherCmpAlpha); |     symbolTable.relateToOperator(BUILTIN_PREFIX "GatherCmpAlpha",              EOpMethodGatherCmpAlpha); | ||||||
| 
 | 
 | ||||||
|     // GS methods
 |     // GS methods
 | ||||||
|     symbolTable.relateToOperator("Append",                      EOpMethodAppend); |     symbolTable.relateToOperator(BUILTIN_PREFIX "Append",                      EOpMethodAppend); | ||||||
|     symbolTable.relateToOperator("RestartStrip",                EOpMethodRestartStrip); |     symbolTable.relateToOperator(BUILTIN_PREFIX "RestartStrip",                EOpMethodRestartStrip); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //
 | //
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 steve-lunarg
						steve-lunarg