GLSL: Construct shadow texture from non-shadow sampler.
Tracks https://github.com/KhronosGroup/GLSL/pull/22.
This commit is contained in:
		
							parent
							
								
									0339af3c1f
								
							
						
					
					
						commit
						7d4c9a07b5
					
				@ -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: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: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: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: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-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
 | 
					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:102: 'noise2' : no matching overloaded function found 
 | 
				
			||||||
ERROR: 0:103: 'noise3' : no matching overloaded function found 
 | 
					ERROR: 0:103: 'noise3' : no matching overloaded function found 
 | 
				
			||||||
ERROR: 0:104: 'noise4' : 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
 | 
					ERROR: Linking fragment stage: Only one push_constant block is allowed per stage
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								Test/vulkan.frag
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										2
									
								
								Test/vulkan.frag
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@ -22,7 +22,7 @@ void badConst()
 | 
				
			|||||||
    sampler2D(i2d, s);            // ERROR, image instead of texture
 | 
					    sampler2D(i2d, s);            // ERROR, image instead of texture
 | 
				
			||||||
    sampler2D(t3d[1], s);         // ERROR, 3D not 2D
 | 
					    sampler2D(t3d[1], s);         // ERROR, 3D not 2D
 | 
				
			||||||
    sampler2D(t2d, sShadow);      // ERROR, shadow mismatch
 | 
					    sampler2D(t2d, sShadow);      // ERROR, shadow mismatch
 | 
				
			||||||
    sampler2DShadow(t2d, s);      // ERROR, shadow mismatch
 | 
					    sampler2DShadow(t2d, s);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sampler2D s2D = sampler2D(t2d, s);            // ERROR, no sampler constructor
 | 
					sampler2D s2D = sampler2D(t2d, s);            // ERROR, no sampler constructor
 | 
				
			||||||
 | 
				
			|||||||
@ -2655,15 +2655,16 @@ bool TParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const
 | 
				
			|||||||
    // second argument
 | 
					    // second argument
 | 
				
			||||||
    //   * the constructor's second argument must be a scalar of type
 | 
					    //   * the constructor's second argument must be a scalar of type
 | 
				
			||||||
    //     *sampler* or *samplerShadow*
 | 
					    //     *sampler* or *samplerShadow*
 | 
				
			||||||
    //   * the presence or absence of depth comparison (Shadow) must match
 | 
					    //   * if the second argument is *samplerShadow* the constructor must be a
 | 
				
			||||||
    //     between the constructed sampler type and the type of the second argument
 | 
					    //     shadow constructor (however, shadow constructors are allowed to have
 | 
				
			||||||
 | 
					    //     a second argument of *sampler*)
 | 
				
			||||||
    if (  function[1].type->getBasicType() != EbtSampler ||
 | 
					    if (  function[1].type->getBasicType() != EbtSampler ||
 | 
				
			||||||
        ! function[1].type->getSampler().isPureSampler() ||
 | 
					        ! function[1].type->getSampler().isPureSampler() ||
 | 
				
			||||||
          function[1].type->isArray()) {
 | 
					          function[1].type->isArray()) {
 | 
				
			||||||
        error(loc, "sampler-constructor second argument must be a scalar type 'sampler'", token, "");
 | 
					        error(loc, "sampler-constructor second argument must be a scalar type 'sampler'", token, "");
 | 
				
			||||||
        return true;
 | 
					        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, "");
 | 
					        error(loc, "sampler-constructor second argument presence of shadow must match constructor presence of shadow", token, "");
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -6246,7 +6246,8 @@ bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node
 | 
				
			|||||||
    bool constructingMatrix = false;
 | 
					    bool constructingMatrix = false;
 | 
				
			||||||
    switch (op) {
 | 
					    switch (op) {
 | 
				
			||||||
    case EOpConstructTextureSampler:
 | 
					    case EOpConstructTextureSampler:
 | 
				
			||||||
        return constructorTextureSamplerError(loc, function);
 | 
					        error(loc, "unhandled texture constructor", "constructor", "");
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
    case EOpConstructMat2x2:
 | 
					    case EOpConstructMat2x2:
 | 
				
			||||||
    case EOpConstructMat2x3:
 | 
					    case EOpConstructMat2x3:
 | 
				
			||||||
    case EOpConstructMat2x4:
 | 
					    case EOpConstructMat2x4:
 | 
				
			||||||
@ -6438,67 +6439,6 @@ bool HlslParseContext::isScalarConstructor(const TIntermNode* node)
 | 
				
			|||||||
           (node->getAsAggregate() == nullptr || node->getAsAggregate()->getOp() != EOpNull);
 | 
					           (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
 | 
					// 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
 | 
					// returns true in case of an error
 | 
				
			||||||
@ -8175,8 +8115,6 @@ TIntermTyped* HlslParseContext::addConstructor(const TSourceLoc& loc, TIntermTyp
 | 
				
			|||||||
    TIntermAggregate* aggrNode = node->getAsAggregate();
 | 
					    TIntermAggregate* aggrNode = node->getAsAggregate();
 | 
				
			||||||
    TOperator op = intermediate.mapTypeToConstructorOp(type);
 | 
					    TOperator op = intermediate.mapTypeToConstructorOp(type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Combined texture-sampler constructors are completely semantic checked
 | 
					 | 
				
			||||||
    // in constructorTextureSamplerError()
 | 
					 | 
				
			||||||
    if (op == EOpConstructTextureSampler)
 | 
					    if (op == EOpConstructTextureSampler)
 | 
				
			||||||
        return intermediate.setAggregateOperator(aggrNode, op, type, loc);
 | 
					        return intermediate.setAggregateOperator(aggrNode, op, type, loc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -122,7 +122,6 @@ public:
 | 
				
			|||||||
    void integerCheck(const TIntermTyped* node, const char* token);
 | 
					    void integerCheck(const TIntermTyped* node, const char* token);
 | 
				
			||||||
    void globalCheck(const TSourceLoc&, const char* token);
 | 
					    void globalCheck(const TSourceLoc&, const char* token);
 | 
				
			||||||
    bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&);
 | 
					    bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&);
 | 
				
			||||||
    bool constructorTextureSamplerError(const TSourceLoc&, const TFunction&);
 | 
					 | 
				
			||||||
    void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&);
 | 
					    void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&);
 | 
				
			||||||
    void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
 | 
					    void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
 | 
				
			||||||
    void structArrayCheck(const TSourceLoc&, const TType& structure);
 | 
					    void structArrayCheck(const TSourceLoc&, const TType& structure);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user