spirv: Support initializers on uniforms (#1588)
If a uniform has an initializer it will now be given as the optional initializer operand to the OpVariable instruction. Fixes: https://github.com/KhronosGroup/glslang/issues/1259 Signed-off-by: Neil Roberts <nroberts@igalia.com> (the code) Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> (the tests) Signed-off-by: Arcady Goldmints-Orlov <agoldmints@igalia.com> Co-authored-by: Neil Roberts <nroberts@igalia.com>
This commit is contained in:
parent
232ba0d848
commit
ff6dcca575
@ -3525,7 +3525,18 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol*
|
|||||||
if (glslang::IsAnonymous(name))
|
if (glslang::IsAnonymous(name))
|
||||||
name = "";
|
name = "";
|
||||||
|
|
||||||
return builder.createVariable(storageClass, spvType, name);
|
spv::Id initializer = spv::NoResult;
|
||||||
|
|
||||||
|
if (node->getType().getQualifier().storage == glslang::EvqUniform &&
|
||||||
|
!node->getConstArray().empty()) {
|
||||||
|
int nextConst = 0;
|
||||||
|
initializer = createSpvConstantFromConstUnionArray(node->getType(),
|
||||||
|
node->getConstArray(),
|
||||||
|
nextConst,
|
||||||
|
false /* specConst */);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.createVariable(storageClass, spvType, name, initializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return type Id of the sampled type.
|
// Return type Id of the sampled type.
|
||||||
|
33
Test/baseResults/spv.uniformInitializer.frag.out
Normal file
33
Test/baseResults/spv.uniformInitializer.frag.out
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
spv.uniformInitializer.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80008
|
||||||
|
// Id's are bound by 16
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 9
|
||||||
|
ExecutionMode 4 OriginLowerLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "color"
|
||||||
|
Name 14 "in_color"
|
||||||
|
Decorate 9(color) Location 0
|
||||||
|
Decorate 14(in_color) Location 0
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypePointer Output 7(fvec4)
|
||||||
|
9(color): 8(ptr) Variable Output
|
||||||
|
10: 6(float) Constant 0
|
||||||
|
11: 6(float) Constant 1065353216
|
||||||
|
12: 7(fvec4) ConstantComposite 10 11 10 11
|
||||||
|
13: TypePointer UniformConstant 7(fvec4)
|
||||||
|
14(in_color): 13(ptr) Variable UniformConstant 12
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
15: 7(fvec4) Load 14(in_color)
|
||||||
|
Store 9(color) 15
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
@ -0,0 +1,6 @@
|
|||||||
|
spv.uniformInitializerSpecConstant.frag
|
||||||
|
ERROR: 0:9: '=' : uniform initializers must be constant 'layout( location=4) uniform float'
|
||||||
|
ERROR: 1 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
|
SPIR-V is not generated for failed compile or link
|
96
Test/baseResults/spv.uniformInitializerStruct.frag.out
Normal file
96
Test/baseResults/spv.uniformInitializerStruct.frag.out
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
spv.uniformInitializerStruct.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80008
|
||||||
|
// Id's are bound by 63
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 9
|
||||||
|
ExecutionMode 4 OriginLowerLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "color"
|
||||||
|
Name 15 "i"
|
||||||
|
Name 26 ""
|
||||||
|
MemberName 26 0 "r"
|
||||||
|
MemberName 26 1 "g"
|
||||||
|
MemberName 26 2 "b"
|
||||||
|
Name 34 "parts"
|
||||||
|
Decorate 9(color) Location 0
|
||||||
|
Decorate 34(parts) Location 0
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypePointer Output 7(fvec4)
|
||||||
|
9(color): 8(ptr) Variable Output
|
||||||
|
10: 6(float) Constant 0
|
||||||
|
11: 6(float) Constant 1065353216
|
||||||
|
12: 7(fvec4) ConstantComposite 10 10 10 11
|
||||||
|
13: TypeInt 32 1
|
||||||
|
14: TypePointer Function 13(int)
|
||||||
|
16: 13(int) Constant 0
|
||||||
|
23: 13(int) Constant 2
|
||||||
|
24: TypeBool
|
||||||
|
26: TypeStruct 6(float) 6(float) 6(float)
|
||||||
|
27: TypeInt 32 0
|
||||||
|
28: 27(int) Constant 2
|
||||||
|
29: TypeArray 26(struct) 28
|
||||||
|
30: 26(struct) ConstantComposite 11 11 11
|
||||||
|
31: 26(struct) ConstantComposite 10 11 10
|
||||||
|
32: 29 ConstantComposite 30 31
|
||||||
|
33: TypePointer UniformConstant 29
|
||||||
|
34(parts): 33(ptr) Variable UniformConstant 32
|
||||||
|
36: TypePointer UniformConstant 6(float)
|
||||||
|
39: 27(int) Constant 0
|
||||||
|
40: TypePointer Output 6(float)
|
||||||
|
46: 13(int) Constant 1
|
||||||
|
49: 27(int) Constant 1
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
15(i): 14(ptr) Variable Function
|
||||||
|
Store 9(color) 12
|
||||||
|
Store 15(i) 16
|
||||||
|
Branch 17
|
||||||
|
17: Label
|
||||||
|
LoopMerge 19 20 None
|
||||||
|
Branch 21
|
||||||
|
21: Label
|
||||||
|
22: 13(int) Load 15(i)
|
||||||
|
25: 24(bool) SLessThan 22 23
|
||||||
|
BranchConditional 25 18 19
|
||||||
|
18: Label
|
||||||
|
35: 13(int) Load 15(i)
|
||||||
|
37: 36(ptr) AccessChain 34(parts) 35 16
|
||||||
|
38: 6(float) Load 37
|
||||||
|
41: 40(ptr) AccessChain 9(color) 39
|
||||||
|
42: 6(float) Load 41
|
||||||
|
43: 6(float) FAdd 42 38
|
||||||
|
44: 40(ptr) AccessChain 9(color) 39
|
||||||
|
Store 44 43
|
||||||
|
45: 13(int) Load 15(i)
|
||||||
|
47: 36(ptr) AccessChain 34(parts) 45 46
|
||||||
|
48: 6(float) Load 47
|
||||||
|
50: 40(ptr) AccessChain 9(color) 49
|
||||||
|
51: 6(float) Load 50
|
||||||
|
52: 6(float) FAdd 51 48
|
||||||
|
53: 40(ptr) AccessChain 9(color) 49
|
||||||
|
Store 53 52
|
||||||
|
54: 13(int) Load 15(i)
|
||||||
|
55: 36(ptr) AccessChain 34(parts) 54 23
|
||||||
|
56: 6(float) Load 55
|
||||||
|
57: 40(ptr) AccessChain 9(color) 28
|
||||||
|
58: 6(float) Load 57
|
||||||
|
59: 6(float) FAdd 58 56
|
||||||
|
60: 40(ptr) AccessChain 9(color) 28
|
||||||
|
Store 60 59
|
||||||
|
Branch 20
|
||||||
|
20: Label
|
||||||
|
61: 13(int) Load 15(i)
|
||||||
|
62: 13(int) IAdd 61 46
|
||||||
|
Store 15(i) 62
|
||||||
|
Branch 17
|
||||||
|
19: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
10
Test/spv.uniformInitializer.frag
Normal file
10
Test/spv.uniformInitializer.frag
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout (location = 0) out vec4 color;
|
||||||
|
|
||||||
|
layout (location = 0) uniform vec4 in_color = vec4(0.0, 1.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
color = in_color;
|
||||||
|
}
|
14
Test/spv.uniformInitializerSpecConstant.frag
Normal file
14
Test/spv.uniformInitializerSpecConstant.frag
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout (location = 0) out vec4 color;
|
||||||
|
|
||||||
|
layout (constant_id = 1) const float opacity = 0.5;
|
||||||
|
|
||||||
|
layout (location = 0) uniform vec3 in_color = vec3(1.0, 0.5, 0);
|
||||||
|
|
||||||
|
layout (location = 4) uniform float foo = opacity;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
color = vec4(in_color, foo);
|
||||||
|
}
|
19
Test/spv.uniformInitializerStruct.frag
Normal file
19
Test/spv.uniformInitializerStruct.frag
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout (location = 0) out vec4 color;
|
||||||
|
|
||||||
|
layout (location = 0) uniform struct {
|
||||||
|
float r;
|
||||||
|
float g;
|
||||||
|
float b;
|
||||||
|
} parts[2] = { { 1.0, 1.0, 1.0}, { 0.0, 1.0, 0.0 } };
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
color.r += parts[i].r;
|
||||||
|
color.g += parts[i].g;
|
||||||
|
color.b += parts[i].b;
|
||||||
|
}
|
||||||
|
}
|
@ -604,6 +604,9 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
"spv.specConst.vert",
|
"spv.specConst.vert",
|
||||||
"spv.specTexture.frag",
|
"spv.specTexture.frag",
|
||||||
"spv.OVR_multiview.vert",
|
"spv.OVR_multiview.vert",
|
||||||
|
"spv.uniformInitializer.frag",
|
||||||
|
"spv.uniformInitializerSpecConstant.frag",
|
||||||
|
"spv.uniformInitializerStruct.frag",
|
||||||
"spv.xfbOffsetOnBlockMembersAssignment.vert",
|
"spv.xfbOffsetOnBlockMembersAssignment.vert",
|
||||||
"spv.xfbOffsetOnStructMembersAssignment.vert",
|
"spv.xfbOffsetOnStructMembersAssignment.vert",
|
||||||
"spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
|
"spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user