Commit acc10498 by John Kessenich

SPV: Implement NonUniformEXT decoration: pass through, and load propagation.

This implements the SPV side of the GLSL commit 033ae528.
parent 033ae528
......@@ -2268,7 +2268,7 @@ void Builder::accessChainStore(Id rvalue)
}
// Comments in header
Id Builder::accessChainLoad(Decoration precision, Id resultType)
Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resultType)
{
Id id;
......@@ -2314,6 +2314,7 @@ Id Builder::accessChainLoad(Decoration precision, Id resultType)
// load through the access chain
id = createLoad(collapseAccessChain());
setPrecision(id, precision);
addDecoration(id, nonUniform);
}
// Done, unless there are swizzles to do
......@@ -2334,6 +2335,7 @@ Id Builder::accessChainLoad(Decoration precision, Id resultType)
if (accessChain.component != NoResult)
id = setPrecision(createVectorExtractDynamic(id, resultType, accessChain.component), precision);
addDecoration(id, nonUniform);
return id;
}
......
......@@ -550,7 +550,7 @@ public:
void accessChainStore(Id rvalue);
// use accessChain and swizzle to load an r-value
Id accessChainLoad(Decoration precision, Id ResultType);
Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType);
// get the direct pointer for an l-value
Id accessChainGetLValue();
......
......@@ -269,6 +269,8 @@ const char* DecorationString(int decoration)
case 5252: return "ViewportRelativeNV";
case 5256: return "SecondaryViewportRelativeNV";
#endif
case DecorationNonUniformEXT: return "DecorationNonUniformEXT";
}
}
......
spv.nonuniform.frag
// Module Version 10000
// Generated by (magic number): 80005
// Id's are bound by 36
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 27
ExecutionMode 4 OriginUpperLeft
Source GLSL 450
Name 4 "main"
Name 10 "foo(i1;"
Name 9 "nupi"
Name 12 "nu_li"
Name 13 "param"
Name 16 "a"
Name 24 "b"
Name 27 "nu_inv4"
Name 33 "nu_gf"
Decorate 12(nu_li) DecorationNonUniformEXT
Decorate 14 DecorationNonUniformEXT
Decorate 16(a) DecorationNonUniformEXT
Decorate 17 DecorationNonUniformEXT
Decorate 20 DecorationNonUniformEXT
Decorate 27(nu_inv4) Location 0
Decorate 27(nu_inv4) DecorationNonUniformEXT
Decorate 33(nu_gf) DecorationNonUniformEXT
Decorate 34 DecorationNonUniformEXT
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
8: TypeFunction 2 7(ptr)
19: 6(int) Constant 2
22: TypeFloat 32
23: TypePointer Function 22(float)
25: TypeVector 22(float) 4
26: TypePointer Input 25(fvec4)
27(nu_inv4): 26(ptr) Variable Input
28: TypeInt 32 0
29: 28(int) Constant 0
30: TypePointer Input 22(float)
4(main): 2 Function None 3
5: Label
12(nu_li): 7(ptr) Variable Function
13(param): 7(ptr) Variable Function
16(a): 7(ptr) Variable Function
24(b): 23(ptr) Variable Function
33(nu_gf): 23(ptr) Variable Function
14: 6(int) Load 12(nu_li)
Store 13(param) 14
15: 2 FunctionCall 10(foo(i1;) 13(param)
17: 6(int) Load 16(a)
18: 6(int) Load 16(a)
20: 6(int) IMul 18 19
21: 6(int) IAdd 17 20
Store 12(nu_li) 21
31: 30(ptr) AccessChain 27(nu_inv4) 29
32: 22(float) Load 31
34: 22(float) Load 33(nu_gf)
35: 22(float) FMul 32 34
Store 24(b) 35
Return
FunctionEnd
10(foo(i1;): 2 Function None 8
9(nupi): 7(ptr) FunctionParameter
11: Label
Return
FunctionEnd
#version 450
layout(location=0) nonuniformEXT in vec4 nu_inv4;
nonuniformEXT float nu_gf;
void foo(nonuniformEXT int nupi)
{
}
void main()
{
nonuniformEXT int nu_li;
foo(nu_li);
int a;
nu_li = nonuniformEXT(a) + nonuniformEXT(a * 2);
float b;
b = nu_inv4.x * nu_gf;
}
\ No newline at end of file
......@@ -282,6 +282,7 @@ INSTANTIATE_TEST_CASE_P(
"spv.newTexture.frag",
"spv.noDeadDecorations.vert",
"spv.nonSquare.vert",
"spv.nonuniform.frag",
"spv.noWorkgroup.comp",
"spv.offsets.frag",
"spv.Operations.frag",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment