From 230168d5d96d9f49393e2d5333fe1090aa9a336f Mon Sep 17 00:00:00 2001 From: Greg Fischer Date: Tue, 8 Jun 2021 19:10:48 -0600 Subject: [PATCH] Add support for float spec const vector initialization Fixes #2025 --- Test/baseResults/vulkan.ast.vert.out | 18 +++++++++--------- Test/vulkan.ast.vert | 2 +- glslang/MachineIndependent/ParseHelper.cpp | 12 ++++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Test/baseResults/vulkan.ast.vert.out b/Test/baseResults/vulkan.ast.vert.out index d19c9633..05a63553 100644 --- a/Test/baseResults/vulkan.ast.vert.out +++ b/Test/baseResults/vulkan.ast.vert.out @@ -102,18 +102,18 @@ Shader version: 450 0:38 2 (const int) 0:38 'sci2' ( specialization-constant const highp int) 0:38 2 (const int) -0:40 Construct vec2 ( temp 2-component vector of float) +0:40 Construct vec2 ( specialization-constant const 2-component vector of float) 0:40 'scf1' ( specialization-constant const highp float) 0:40 1.000000 0:40 'scf1' ( specialization-constant const highp float) 0:40 1.000000 0:41 Construct vec2 ( temp 2-element array of 2-component vector of float) -0:41 Construct vec2 ( temp 2-component vector of float) +0:41 Construct vec2 ( specialization-constant const 2-component vector of float) 0:41 'scf1' ( specialization-constant const highp float) 0:41 1.000000 0:41 'scf1' ( specialization-constant const highp float) 0:41 1.000000 -0:41 Construct vec2 ( temp 2-component vector of float) +0:41 Construct vec2 ( specialization-constant const 2-component vector of float) 0:41 'scf1' ( specialization-constant const highp float) 0:41 1.000000 0:41 'scf1' ( specialization-constant const highp float) @@ -233,18 +233,18 @@ Shader version: 450 0:38 2 (const int) 0:38 'sci2' ( specialization-constant const highp int) 0:38 2 (const int) -0:40 Construct vec2 ( temp 2-component vector of float) +0:40 Construct vec2 ( specialization-constant const 2-component vector of float) 0:40 'scf1' ( specialization-constant const highp float) 0:40 1.000000 0:40 'scf1' ( specialization-constant const highp float) 0:40 1.000000 0:41 Construct vec2 ( temp 2-element array of 2-component vector of float) -0:41 Construct vec2 ( temp 2-component vector of float) +0:41 Construct vec2 ( specialization-constant const 2-component vector of float) 0:41 'scf1' ( specialization-constant const highp float) 0:41 1.000000 0:41 'scf1' ( specialization-constant const highp float) 0:41 1.000000 -0:41 Construct vec2 ( temp 2-component vector of float) +0:41 Construct vec2 ( specialization-constant const 2-component vector of float) 0:41 'scf1' ( specialization-constant const highp float) 0:41 1.000000 0:41 'scf1' ( specialization-constant const highp float) @@ -303,6 +303,9 @@ Shader version: 450 41: 14(int) Constant 2 42: TypeArray 37(ivec2) 41 44: TypeVector 6(float) 2 + 45: 44(fvec2) SpecConstantComposite 7(scf1) 7(scf1) + 46: 44(fvec2) SpecConstantComposite 7(scf1) 7(scf1) + 47: 44(fvec2) SpecConstantComposite 7(scf1) 7(scf1) 48: TypeArray 44(fvec2) 41 4(main): 2 Function None 3 5: Label @@ -317,9 +320,6 @@ Shader version: 450 32: 8(bool) FOrdGreaterThan 7(scf1) 7(scf1) 34: 8(bool) FUnordNotEqual 7(scf1) 7(scf1) 43: 42 CompositeConstruct 39 40 - 45: 44(fvec2) CompositeConstruct 7(scf1) 7(scf1) - 46: 44(fvec2) CompositeConstruct 7(scf1) 7(scf1) - 47: 44(fvec2) CompositeConstruct 7(scf1) 7(scf1) 49: 48 CompositeConstruct 46 47 Return FunctionEnd diff --git a/Test/vulkan.ast.vert b/Test/vulkan.ast.vert index c5a6a42c..b9e3e28b 100644 --- a/Test/vulkan.ast.vert +++ b/Test/vulkan.ast.vert @@ -37,6 +37,6 @@ void main() ivec2(sci2, sci2); // spec-const ivec2[2](ivec2(sci2, sci2), ivec2(sci2, sci2)); // not a spec-const - vec2(scf1, scf1); // not spec-const + vec2(scf1, scf1); // spec-const vec2[2](vec2(scf1, scf1), vec2(scf1, scf1)); // not a spec-const } diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 45c9362b..3c08c658 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -3115,6 +3115,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T bool matrixInMatrix = false; bool arrayArg = false; bool floatArgument = false; + bool intArgument = false; for (int arg = 0; arg < function.getParamCount(); ++arg) { if (function[arg].type->isArray()) { if (function[arg].type->isUnsizedArray()) { @@ -3145,6 +3146,8 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T specConstType = true; if (function[arg].type->isFloatingDomain()) floatArgument = true; + if (function[arg].type->isIntegerDomain()) + intArgument = true; if (type.isStruct()) { if (function[arg].type->contains16BitFloat()) { requireFloat16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type"); @@ -3250,6 +3253,15 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T // and aren't making an array. makeSpecConst = ! floatArgument && ! type.isArray(); break; + + case EOpConstructVec2: + case EOpConstructVec3: + case EOpConstructVec4: + // This was the list of valid ones, if they aren't converting from int + // and aren't making an array. + makeSpecConst = ! intArgument && !type.isArray(); + break; + default: // anything else wasn't white-listed in the spec as a conversion makeSpecConst = false;