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)
  • Loading branch information
bpeel authored and infapi00 committed Mar 15, 2019
1 parent f925eef commit f953a02
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 3 deletions.
13 changes: 12 additions & 1 deletion SPIRV/GlslangToSpv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2996,7 +2996,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
5 changes: 4 additions & 1 deletion SPIRV/SpvBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1306,7 +1306,7 @@ void Builder::makeDiscard()
}

// Comments in header
Id Builder::createVariable(StorageClass storageClass, Id type, const char* name)
Id Builder::createVariable(StorageClass storageClass, Id type, const char* name, Id initializer)
{
Id pointerType = makePointer(storageClass, type);
Instruction* inst = new Instruction(getUniqueId(), pointerType, OpVariable);
Expand All @@ -1327,6 +1327,9 @@ Id Builder::createVariable(StorageClass storageClass, Id type, const char* name)
if (name)
addName(inst->getResultId(), name);

if (initializer != NoResult)
inst->addIdOperand(initializer);

return inst->getResultId();
}

Expand Down
2 changes: 1 addition & 1 deletion SPIRV/SpvBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ class Builder {
void makeDiscard();

// Create a global or function local or IO variable.
Id createVariable(StorageClass, Id type, const char* name = 0);
Id createVariable(StorageClass, Id type, const char* name = 0, Id initializer = NoResult);

// Create an intermediate with an undefined value.
Id createUndefined(Id 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): 80007
// 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
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;
}
1 change: 1 addition & 0 deletions gtests/Spv.FromFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,7 @@ INSTANTIATE_TEST_CASE_P(
"spv.rankShift.comp",
"spv.specConst.vert",
"spv.OVR_multiview.vert",
"spv.uniformInitializer.frag",
"spv.xfbOffsetOnBlockMembersAssignment.vert",
"spv.xfbOffsetOnStructMembersAssignment.vert",
"spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
Expand Down

0 comments on commit f953a02

Please sign in to comment.