GLSL: Construct shadow texture from non-shadow sampler.
authorJohn Kessenich <cepheus@frii.com>
Mon, 23 Jul 2018 21:59:09 +0000 (15:59 -0600)
committerJohn Kessenich <cepheus@frii.com>
Mon, 23 Jul 2018 21:59:09 +0000 (15:59 -0600)
Tracks https://github.com/KhronosGroup/GLSL/pull/22.

Test/baseResults/vulkan.frag.out
Test/vulkan.frag [changed mode: 0644->0755]
glslang/MachineIndependent/ParseHelper.cpp
hlsl/hlslParseHelper.cpp
hlsl/hlslParseHelper.h

index e46345c..735084c 100644 (file)
@@ -16,7 +16,6 @@ ERROR: 0:21: 'sampler3D' : sampler-constructor cannot make an array of samplers
 ERROR: 0:22: 'sampler2D' : sampler-constructor first argument must be a scalar textureXXX type 
 ERROR: 0:23: 'sampler2D' : sampler-constructor first argument must match type and dimensionality of constructor type 
 ERROR: 0:24: 'sampler2D' : sampler-constructor second argument presence of shadow must match constructor presence of shadow 
-ERROR: 0:25: 'sampler2DShadow' : sampler-constructor second argument presence of shadow must match constructor presence of shadow 
 ERROR: 0:28: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: s2D
 ERROR: 0:29: 'sampler3D' : sampler-constructor cannot make an array of samplers 
 ERROR: 0:29: 'sampler3D' : sampler/image types can only be used in uniform variables or function parameters: s3d
@@ -56,7 +55,7 @@ ERROR: 0:101: 'noise1' : no matching overloaded function found
 ERROR: 0:102: 'noise2' : no matching overloaded function found 
 ERROR: 0:103: 'noise3' : no matching overloaded function found 
 ERROR: 0:104: 'noise4' : no matching overloaded function found 
-ERROR: 55 compilation errors.  No code generated.
+ERROR: 54 compilation errors.  No code generated.
 
 
 ERROR: Linking fragment stage: Only one push_constant block is allowed per stage
old mode 100644 (file)
new mode 100755 (executable)
index 74a5aa1..3cfbb82
@@ -22,7 +22,7 @@ void badConst()
     sampler2D(i2d, s);            // ERROR, image instead of texture\r
     sampler2D(t3d[1], s);         // ERROR, 3D not 2D\r
     sampler2D(t2d, sShadow);      // ERROR, shadow mismatch\r
-    sampler2DShadow(t2d, s);      // ERROR, shadow mismatch\r
+    sampler2DShadow(t2d, s);\r
 }\r
 \r
 sampler2D s2D = sampler2D(t2d, s);            // ERROR, no sampler constructor\r
index cb60baf..ce4e475 100755 (executable)
@@ -2655,15 +2655,16 @@ bool TParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const
     // second argument
     //   * the constructor's second argument must be a scalar of type
     //     *sampler* or *samplerShadow*
-    //   * the presence or absence of depth comparison (Shadow) must match
-    //     between the constructed sampler type and the type of the second argument
+    //   * if the second argument is *samplerShadow* the constructor must be a
+    //     shadow constructor (however, shadow constructors are allowed to have
+    //     a second argument of *sampler*)
     if (  function[1].type->getBasicType() != EbtSampler ||
         ! function[1].type->getSampler().isPureSampler() ||
           function[1].type->isArray()) {
         error(loc, "sampler-constructor second argument must be a scalar type 'sampler'", token, "");
         return true;
     }
-    if (function.getType().getSampler().shadow != function[1].type->getSampler().shadow) {
+    if (!function.getType().getSampler().shadow && function[1].type->getSampler().shadow) {
         error(loc, "sampler-constructor second argument presence of shadow must match constructor presence of shadow", token, "");
         return true;
     }
index 9471f77..1672365 100755 (executable)
@@ -6246,7 +6246,8 @@ bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node
     bool constructingMatrix = false;
     switch (op) {
     case EOpConstructTextureSampler:
-        return constructorTextureSamplerError(loc, function);
+        error(loc, "unhandled texture constructor", "constructor", "");
+        return true;
     case EOpConstructMat2x2:
     case EOpConstructMat2x3:
     case EOpConstructMat2x4:
@@ -6438,67 +6439,6 @@ bool HlslParseContext::isScalarConstructor(const TIntermNode* node)
            (node->getAsAggregate() == nullptr || node->getAsAggregate()->getOp() != EOpNull);
 }
 
-// Verify all the correct semantics for constructing a combined texture/sampler.
-// Return true if the semantics are incorrect.
-bool HlslParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const TFunction& function)
-{
-    TString constructorName = function.getType().getBasicTypeString();  // TODO: performance: should not be making copy; interface needs to change
-    const char* token = constructorName.c_str();
-
-    // exactly two arguments needed
-    if (function.getParamCount() != 2) {
-        error(loc, "sampler-constructor requires two arguments", token, "");
-        return true;
-    }
-
-    // For now, not allowing arrayed constructors, the rest of this function
-    // is set up to allow them, if this test is removed:
-    if (function.getType().isArray()) {
-        error(loc, "sampler-constructor cannot make an array of samplers", token, "");
-        return true;
-    }
-
-    // first argument
-    //  * the constructor's first argument must be a texture type
-    //  * the dimensionality (1D, 2D, 3D, Cube, Rect, Buffer, MS, and Array)
-    //    of the texture type must match that of the constructed sampler type
-    //    (that is, the suffixes of the type of the first argument and the
-    //    type of the constructor will be spelled the same way)
-    if (function[0].type->getBasicType() != EbtSampler ||
-        ! function[0].type->getSampler().isTexture() ||
-        function[0].type->isArray()) {
-        error(loc, "sampler-constructor first argument must be a scalar textureXXX type", token, "");
-        return true;
-    }
-    // simulate the first argument's impact on the result type, so it can be compared with the encapsulated operator!=()
-    TSampler texture = function.getType().getSampler();
-    texture.combined = false;
-    texture.shadow = false;
-    if (texture != function[0].type->getSampler()) {
-        error(loc, "sampler-constructor first argument must match type and dimensionality of constructor type", token, "");
-        return true;
-    }
-
-    // second argument
-    //   * the constructor's second argument must be a scalar of type
-    //     *sampler* or *samplerShadow*
-    //   * the presence or absence of depth comparison (Shadow) must match
-    //     between the constructed sampler type and the type of the second argument
-    if (function[1].type->getBasicType() != EbtSampler ||
-        ! function[1].type->getSampler().isPureSampler() ||
-        function[1].type->isArray()) {
-        error(loc, "sampler-constructor second argument must be a scalar type 'sampler'", token, "");
-        return true;
-    }
-    if (function.getType().getSampler().shadow != function[1].type->getSampler().shadow) {
-        error(loc, "sampler-constructor second argument presence of shadow must match constructor presence of shadow",
-              token, "");
-        return true;
-    }
-
-    return false;
-}
-
 // Checks to see if a void variable has been declared and raise an error message for such a case
 //
 // returns true in case of an error
@@ -8175,8 +8115,6 @@ TIntermTyped* HlslParseContext::addConstructor(const TSourceLoc& loc, TIntermTyp
     TIntermAggregate* aggrNode = node->getAsAggregate();
     TOperator op = intermediate.mapTypeToConstructorOp(type);
 
-    // Combined texture-sampler constructors are completely semantic checked
-    // in constructorTextureSamplerError()
     if (op == EOpConstructTextureSampler)
         return intermediate.setAggregateOperator(aggrNode, op, type, loc);
 
index 32a1923..7cb898c 100755 (executable)
@@ -122,7 +122,6 @@ public:
     void integerCheck(const TIntermTyped* node, const char* token);
     void globalCheck(const TSourceLoc&, const char* token);
     bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&);
-    bool constructorTextureSamplerError(const TSourceLoc&, const TFunction&);
     void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&);
     void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
     void structArrayCheck(const TSourceLoc&, const TType& structure);