Skip to content

Commit

Permalink
Merge pull request #2662 from greg-lunarg/spec1
Browse files Browse the repository at this point in the history
Add support for float spec const vector initialization
  • Loading branch information
greg-lunarg authored Jun 9, 2021
2 parents 3d935ea + 230168d commit fe15158
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
18 changes: 9 additions & 9 deletions Test/baseResults/vulkan.ast.vert.out
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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
2 changes: 1 addition & 1 deletion Test/vulkan.ast.vert
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
12 changes: 12 additions & 0 deletions glslang/MachineIndependent/ParseHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit fe15158

Please sign in to comment.