Skip to content

Commit

Permalink
spirv: Support initializers on uniforms
Browse files Browse the repository at this point in the history
If a uniform has an initializer it will now be given as the optional
initializer operand to the OpVariable instruction.

Fixes: #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>
  • Loading branch information
bpeel authored and Arcady Goldmints-Orlov committed Apr 24, 2020
1 parent 02c70ad commit 0b8bbed
Show file tree
Hide file tree
Showing 8 changed files with 193 additions and 1 deletion.
13 changes: 12 additions & 1 deletion SPIRV/GlslangToSpv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3524,7 +3524,18 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol*
if (glslang::IsAnonymous(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.
Expand Down
33 changes: 33 additions & 0 deletions Test/baseResults/spv.uniformInitializer.frag.out
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions Test/baseResults/spv.uniformInitializerSpecConstant.frag.out
Original file line number Diff line number Diff line change
@@ -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 changes: 96 additions & 0 deletions Test/baseResults/spv.uniformInitializerStruct.frag.out
Original file line number Diff line number Diff line change
@@ -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 changes: 10 additions & 0 deletions Test/spv.uniformInitializer.frag
Original file line number Diff line number Diff line change
@@ -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 changes: 14 additions & 0 deletions Test/spv.uniformInitializerSpecConstant.frag
Original file line number Diff line number Diff line change
@@ -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 changes: 19 additions & 0 deletions Test/spv.uniformInitializerStruct.frag
Original file line number Diff line number Diff line change
@@ -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;
}
}
3 changes: 3 additions & 0 deletions gtests/Spv.FromFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,9 @@ INSTANTIATE_TEST_CASE_P(
"spv.specConst.vert",
"spv.specTexture.frag",
"spv.OVR_multiview.vert",
"spv.uniformInitializer.frag",
"spv.uniformInitializerSpecConstant.frag",
"spv.uniformInitializerStruct.frag",
"spv.xfbOffsetOnBlockMembersAssignment.vert",
"spv.xfbOffsetOnStructMembersAssignment.vert",
"spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
Expand Down

0 comments on commit 0b8bbed

Please sign in to comment.