From 7d4c9a07b52e27fa80bf321782f4ac27dd22dad3 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Mon, 23 Jul 2018 15:59:09 -0600 Subject: [PATCH] GLSL: Construct shadow texture from non-shadow sampler. Tracks https://github.com/KhronosGroup/GLSL/pull/22. --- Test/baseResults/vulkan.frag.out | 3 +- Test/vulkan.frag | 2 +- glslang/MachineIndependent/ParseHelper.cpp | 7 ++- hlsl/hlslParseHelper.cpp | 66 +--------------------- hlsl/hlslParseHelper.h | 1 - 5 files changed, 8 insertions(+), 71 deletions(-) mode change 100644 => 100755 Test/vulkan.frag diff --git a/Test/baseResults/vulkan.frag.out b/Test/baseResults/vulkan.frag.out index e46345ce95..735084ce91 100644 --- a/Test/baseResults/vulkan.frag.out +++ b/Test/baseResults/vulkan.frag.out @@ -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 diff --git a/Test/vulkan.frag b/Test/vulkan.frag old mode 100644 new mode 100755 index 74a5aa1af1..3cfbb82cb6 --- a/Test/vulkan.frag +++ b/Test/vulkan.frag @@ -22,7 +22,7 @@ void badConst() sampler2D(i2d, s); // ERROR, image instead of texture sampler2D(t3d[1], s); // ERROR, 3D not 2D sampler2D(t2d, sShadow); // ERROR, shadow mismatch - sampler2DShadow(t2d, s); // ERROR, shadow mismatch + sampler2DShadow(t2d, s); } sampler2D s2D = sampler2D(t2d, s); // ERROR, no sampler constructor diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index cb60bafb04..ce4e475d18 100755 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -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; } diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 9471f77468..1672365c08 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -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); diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index 32a1923940..7cb898cf4b 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -122,7 +122,6 @@ class HlslParseContext : public TParseContextBase { 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);