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
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
// 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;
}
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:
(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
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);