Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
glslang
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
glslang
Commits
15fa7ef5
Commit
15fa7ef5
authored
Sep 07, 2017
by
John Kessenich
Committed by
GregF
Sep 29, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HLSL: Remove workarounds for assigning to opaques.
This assumes it will be combined with optimizing transforms that eliminate assignments to opaques.
parent
dabd1bf2
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
313 additions
and
234 deletions
+313
-234
hlsl.aliasOpaque.frag.out
Test/baseResults/hlsl.aliasOpaque.frag.out
+60
-37
hlsl.array.flatten.frag.out
Test/baseResults/hlsl.array.flatten.frag.out
+1
-0
hlsl.flattenOpaqueInit.vert.out
Test/baseResults/hlsl.flattenOpaqueInit.vert.out
+117
-48
hlsl.flattenOpaqueInitMix.vert.out
Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
+106
-34
localintermediate.h
glslang/MachineIndependent/localintermediate.h
+7
-1
hlslParseHelper.cpp
hlsl/hlslParseHelper.cpp
+22
-111
hlslParseHelper.h
hlsl/hlslParseHelper.h
+0
-3
No files found.
Test/baseResults/hlsl.aliasOpaque.frag.out
View file @
15fa7ef5
hlsl.aliasOpaque.frag
WARNING: AST will form illegal SPIR-V; need to transform to legalize
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
...
...
@@ -21,18 +22,24 @@ gl_FragCoord origin is upper left
0:17 Function Definition: @main( ( temp 4-component vector of float)
0:17 Function Parameters:
0:? Sequence
0:19 'gss2' ( uniform sampler)
0:20 'gss' ( uniform sampler)
0:21 'gtex' ( uniform texture2D)
0:19 move second child to first child ( temp sampler)
0:? 'os.ss' ( temp sampler)
0:19 'gss2' ( uniform sampler)
0:20 move second child to first child ( temp sampler)
0:? 'os.ss' ( temp sampler)
0:20 'gss' ( uniform sampler)
0:21 move second child to first child ( temp texture2D)
0:? 'os.tex' ( temp texture2D)
0:21 'gtex' ( uniform texture2D)
0:22 move second child to first child ( temp float)
0:? 'os.a' ( temp float)
0:22 Constant:
0:22 3.000000
0:28 Branch: Return with expression
0:28 Function Call: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
0:? '
gss' ( uniform
sampler)
0:? '
os.ss' ( temp
sampler)
0:? 'os.a' ( temp float)
0:? '
gtex' ( uniform
texture2D)
0:? '
os.tex' ( temp
texture2D)
0:17 Function Definition: main( ( temp void)
0:17 Function Parameters:
0:? Sequence
...
...
@@ -71,18 +78,24 @@ gl_FragCoord origin is upper left
0:17 Function Definition: @main( ( temp 4-component vector of float)
0:17 Function Parameters:
0:? Sequence
0:19 'gss2' ( uniform sampler)
0:20 'gss' ( uniform sampler)
0:21 'gtex' ( uniform texture2D)
0:19 move second child to first child ( temp sampler)
0:? 'os.ss' ( temp sampler)
0:19 'gss2' ( uniform sampler)
0:20 move second child to first child ( temp sampler)
0:? 'os.ss' ( temp sampler)
0:20 'gss' ( uniform sampler)
0:21 move second child to first child ( temp texture2D)
0:? 'os.tex' ( temp texture2D)
0:21 'gtex' ( uniform texture2D)
0:22 move second child to first child ( temp float)
0:? 'os.a' ( temp float)
0:22 Constant:
0:22 3.000000
0:28 Branch: Return with expression
0:28 Function Call: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
0:? '
gss' ( uniform
sampler)
0:? '
os.ss' ( temp
sampler)
0:? 'os.a' ( temp float)
0:? '
gtex' ( uniform
texture2D)
0:? '
os.tex' ( temp
texture2D)
0:17 Function Definition: main( ( temp void)
0:17 Function Parameters:
0:? Sequence
...
...
@@ -97,12 +110,12 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by
48
// Id's are bound by
53
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main"
46
EntryPoint Fragment 4 "main"
51
ExecutionMode 4 OriginUpperLeft
Source HLSL 500
Name 4 "main"
...
...
@@ -111,16 +124,18 @@ gl_FragCoord origin is upper left
Name 15 "s.a"
Name 16 "s.tex"
Name 20 "@main("
Name 35 "gss2"
Name 36 "gss"
Name 37 "gtex"
Name 38 "os.a"
Name 40 "param"
Name 46 "@entryPointOutput"
Decorate 35(gss2) DescriptorSet 0
Decorate 36(gss) DescriptorSet 0
Decorate 37(gtex) DescriptorSet 0
Decorate 46(@entryPointOutput) Location 0
Name 35 "os.ss"
Name 36 "gss2"
Name 38 "gss"
Name 40 "os.tex"
Name 41 "gtex"
Name 43 "os.a"
Name 45 "param"
Name 51 "@entryPointOutput"
Decorate 36(gss2) DescriptorSet 0
Decorate 38(gss) DescriptorSet 0
Decorate 41(gtex) DescriptorSet 0
Decorate 51(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeSampler
...
...
@@ -137,16 +152,18 @@ gl_FragCoord origin is upper left
28: 8(float) Constant 1045220557
29: 8(float) Constant 1050253722
30: 27(fvec2) ConstantComposite 28 29
35(gss2): 7(ptr) Variable UniformConstant
36(gss): 7(ptr) Variable UniformConstant
37(gtex): 11(ptr) Variable UniformConstant
39: 8(float) Constant 1077936128
45: TypePointer Output 12(fvec4)
46(@entryPointOutput): 45(ptr) Variable Output
35(os.ss): 7(ptr) Variable UniformConstant
36(gss2): 7(ptr) Variable UniformConstant
38(gss): 7(ptr) Variable UniformConstant
40(os.tex): 11(ptr) Variable UniformConstant
41(gtex): 11(ptr) Variable UniformConstant
44: 8(float) Constant 1077936128
50: TypePointer Output 12(fvec4)
51(@entryPointOutput): 50(ptr) Variable Output
4(main): 2 Function None 3
5: Label
47
: 12(fvec4) FunctionCall 20(@main()
Store
46(@entryPointOutput) 47
52
: 12(fvec4) FunctionCall 20(@main()
Store
51(@entryPointOutput) 52
Return
FunctionEnd
17(osCall(struct-OS-p1-f1-t211;): 12(fvec4) Function None 13
...
...
@@ -164,11 +181,17 @@ gl_FragCoord origin is upper left
FunctionEnd
20(@main(): 12(fvec4) Function None 19
21: Label
38(os.a): 9(ptr) Variable Function
40(param): 9(ptr) Variable Function
Store 38(os.a) 39
41: 8(float) Load 38(os.a)
Store 40(param) 41
42: 12(fvec4) FunctionCall 17(osCall(struct-OS-p1-f1-t211;) 36(gss) 40(param) 37(gtex)
ReturnValue 42
43(os.a): 9(ptr) Variable Function
45(param): 9(ptr) Variable Function
37: 6 Load 36(gss2)
Store 35(os.ss) 37
39: 6 Load 38(gss)
Store 35(os.ss) 39
42: 10 Load 41(gtex)
Store 40(os.tex) 42
Store 43(os.a) 44
46: 8(float) Load 43(os.a)
Store 45(param) 46
47: 12(fvec4) FunctionCall 17(osCall(struct-OS-p1-f1-t211;) 35(os.ss) 45(param) 40(os.tex)
ReturnValue 47
FunctionEnd
Test/baseResults/hlsl.array.flatten.frag.out
View file @
15fa7ef5
hlsl.array.flatten.frag
WARNING: AST will form illegal SPIR-V; need to transform to legalize
Shader version: 500
gl_FragCoord origin is upper left
0:? Sequence
...
...
Test/baseResults/hlsl.flattenOpaqueInit.vert.out
View file @
15fa7ef5
hlsl.flattenOpaqueInit.vert
WARNING: 0:20: '=' : cannot do member-wise aliasing for opaque members with this initializer
WARNING: AST will form illegal SPIR-V; need to transform to legalize
Shader version: 500
0:? Sequence
0:5 Function Definition: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
...
...
@@ -19,13 +18,36 @@ Shader version: 500
0:10 Function Definition: fillOpaque( ( temp structure{ temp sampler smpl, temp texture2D tex})
0:10 Function Parameters:
0:? Sequence
0:12 'g_tInputTexture_sampler' ( uniform sampler)
0:13 'g_tInputTexture' ( uniform texture2D)
0:12 move second child to first child ( temp sampler)
0:? 't.smpl' ( temp sampler)
0:12 'g_tInputTexture_sampler' ( uniform sampler)
0:13 move second child to first child ( temp texture2D)
0:? 't.tex' ( temp texture2D)
0:13 'g_tInputTexture' ( uniform texture2D)
0:14 Branch: Return with expression
0:14 't' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:18 Function Definition: @main( ( temp 4-component vector of float)
0:18 Function Parameters:
0:? Sequence
0:19 Sequence
0:19 Sequence
0:19 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 Construct structure ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 'g_tInputTexture_sampler' ( uniform sampler)
0:19 'g_tInputTexture' ( uniform texture2D)
0:19 move second child to first child ( temp sampler)
0:? 'tex1.smpl' ( temp sampler)
0:19 smpl: direct index for structure ( temp sampler)
0:19 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 Constant:
0:19 0 (const int)
0:19 move second child to first child ( temp texture2D)
0:? 'tex1.tex' ( temp texture2D)
0:19 tex: direct index for structure ( temp texture2D)
0:19 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 Constant:
0:19 1 (const int)
0:20 Sequence
0:20 Sequence
0:20 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex})
...
...
@@ -45,8 +67,8 @@ Shader version: 500
0:20 1 (const int)
0:21 Branch: Return with expression
0:21 Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
0:? '
g_tInputTexture_sampler' ( uniform
sampler)
0:? '
g_tInputTexture' ( uniform
texture2D)
0:? '
tex1.smpl' ( temp
sampler)
0:? '
tex1.tex' ( temp
texture2D)
0:18 Function Definition: main( ( temp void)
0:18 Function Parameters:
0:? Sequence
...
...
@@ -80,13 +102,36 @@ Shader version: 500
0:10 Function Definition: fillOpaque( ( temp structure{ temp sampler smpl, temp texture2D tex})
0:10 Function Parameters:
0:? Sequence
0:12 'g_tInputTexture_sampler' ( uniform sampler)
0:13 'g_tInputTexture' ( uniform texture2D)
0:12 move second child to first child ( temp sampler)
0:? 't.smpl' ( temp sampler)
0:12 'g_tInputTexture_sampler' ( uniform sampler)
0:13 move second child to first child ( temp texture2D)
0:? 't.tex' ( temp texture2D)
0:13 'g_tInputTexture' ( uniform texture2D)
0:14 Branch: Return with expression
0:14 't' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:18 Function Definition: @main( ( temp 4-component vector of float)
0:18 Function Parameters:
0:? Sequence
0:19 Sequence
0:19 Sequence
0:19 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 Construct structure ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 'g_tInputTexture_sampler' ( uniform sampler)
0:19 'g_tInputTexture' ( uniform texture2D)
0:19 move second child to first child ( temp sampler)
0:? 'tex1.smpl' ( temp sampler)
0:19 smpl: direct index for structure ( temp sampler)
0:19 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 Constant:
0:19 0 (const int)
0:19 move second child to first child ( temp texture2D)
0:? 'tex1.tex' ( temp texture2D)
0:19 tex: direct index for structure ( temp texture2D)
0:19 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex})
0:19 Constant:
0:19 1 (const int)
0:20 Sequence
0:20 Sequence
0:20 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex})
...
...
@@ -106,8 +151,8 @@ Shader version: 500
0:20 1 (const int)
0:21 Branch: Return with expression
0:21 Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
0:? '
g_tInputTexture_sampler' ( uniform
sampler)
0:? '
g_tInputTexture' ( uniform
texture2D)
0:? '
tex1.smpl' ( temp
sampler)
0:? '
tex1.tex' ( temp
texture2D)
0:18 Function Definition: main( ( temp void)
0:18 Function Parameters:
0:? Sequence
...
...
@@ -121,12 +166,12 @@ Shader version: 500
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by
60
// Id's are bound by
74
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main"
58
EntryPoint Vertex 4 "main"
72
Source HLSL 500
Name 4 "main"
Name 15 "lookUp(struct-FxaaTex-p1-t211;"
...
...
@@ -137,16 +182,21 @@ Shader version: 500
MemberName 17(FxaaTex) 1 "tex"
Name 19 "fillOpaque("
Name 22 "@main("
Name 36 "g_tInputTexture_sampler"
Name 37 "g_tInputTexture"
Name 39 "t"
Name 43 "flattenTemp"
Name 45 "tex2.smpl"
Name 50 "tex2.tex"
Name 58 "@entryPointOutput"
Decorate 36(g_tInputTexture_sampler) DescriptorSet 0
Decorate 37(g_tInputTexture) DescriptorSet 0
Decorate 58(@entryPointOutput) Location 0
Name 36 "t.smpl"
Name 37 "g_tInputTexture_sampler"
Name 39 "t.tex"
Name 40 "g_tInputTexture"
Name 43 "t"
Name 47 "flattenTemp"
Name 51 "tex1.smpl"
Name 56 "tex1.tex"
Name 60 "flattenTemp"
Name 62 "tex2.smpl"
Name 65 "tex2.tex"
Name 72 "@entryPointOutput"
Decorate 37(g_tInputTexture_sampler) DescriptorSet 0
Decorate 40(g_tInputTexture) DescriptorSet 0
Decorate 72(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeSampler
...
...
@@ -165,22 +215,27 @@ Shader version: 500
30: 8(float) Constant 1053609165
31: 28(fvec2) ConstantComposite 29 30
32: 8(float) Constant 0
36(g_tInputTexture_sampler): 7(ptr) Variable UniformConstant
37(g_tInputTexture): 10(ptr) Variable UniformConstant
38: TypePointer UniformConstant 17(FxaaTex)
39(t): 38(ptr) Variable UniformConstant
43(flattenTemp): 38(ptr) Variable UniformConstant
45(tex2.smpl): 7(ptr) Variable UniformConstant
46: TypeInt 32 1
47: 46(int) Constant 0
50(tex2.tex): 10(ptr) Variable UniformConstant
51: 46(int) Constant 1
57: TypePointer Output 11(fvec4)
58(@entryPointOutput): 57(ptr) Variable Output
36(t.smpl): 7(ptr) Variable UniformConstant
37(g_tInputTexture_sampler): 7(ptr) Variable UniformConstant
39(t.tex): 10(ptr) Variable UniformConstant
40(g_tInputTexture): 10(ptr) Variable UniformConstant
42: TypePointer UniformConstant 17(FxaaTex)
43(t): 42(ptr) Variable UniformConstant
47(flattenTemp): 42(ptr) Variable UniformConstant
51(tex1.smpl): 7(ptr) Variable UniformConstant
52: TypeInt 32 1
53: 52(int) Constant 0
56(tex1.tex): 10(ptr) Variable UniformConstant
57: 52(int) Constant 1
60(flattenTemp): 42(ptr) Variable UniformConstant
62(tex2.smpl): 7(ptr) Variable UniformConstant
65(tex2.tex): 10(ptr) Variable UniformConstant
71: TypePointer Output 11(fvec4)
72(@entryPointOutput): 71(ptr) Variable Output
4(main): 2 Function None 3
5: Label
59
: 11(fvec4) FunctionCall 22(@main()
Store
58(@entryPointOutput) 59
73
: 11(fvec4) FunctionCall 22(@main()
Store
72(@entryPointOutput) 73
Return
FunctionEnd
15(lookUp(struct-FxaaTex-p1-t211;): 11(fvec4) Function None 12
...
...
@@ -195,19 +250,33 @@ Shader version: 500
FunctionEnd
19(fillOpaque(): 17(FxaaTex) Function None 18
20: Label
40: 17(FxaaTex) Load 39(t)
ReturnValue 40
38: 6 Load 37(g_tInputTexture_sampler)
Store 36(t.smpl) 38
41: 9 Load 40(g_tInputTexture)
Store 39(t.tex) 41
44: 17(FxaaTex) Load 43(t)
ReturnValue 44
FunctionEnd
22(@main(): 11(fvec4) Function None 21
23: Label
44: 17(FxaaTex) FunctionCall 19(fillOpaque()
Store 43(flattenTemp) 44
48: 7(ptr) AccessChain 43(flattenTemp) 47
49: 6 Load 48
Store 45(tex2.smpl) 49
52: 10(ptr) AccessChain 43(flattenTemp) 51
53: 9 Load 52
Store 50(tex2.tex) 53
54: 11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 36(g_tInputTexture_sampler) 37(g_tInputTexture)
ReturnValue 54
48: 6 Load 37(g_tInputTexture_sampler)
49: 9 Load 40(g_tInputTexture)
50: 17(FxaaTex) CompositeConstruct 48 49
Store 47(flattenTemp) 50
54: 7(ptr) AccessChain 47(flattenTemp) 53
55: 6 Load 54
Store 51(tex1.smpl) 55
58: 10(ptr) AccessChain 47(flattenTemp) 57
59: 9 Load 58
Store 56(tex1.tex) 59
61: 17(FxaaTex) FunctionCall 19(fillOpaque()
Store 60(flattenTemp) 61
63: 7(ptr) AccessChain 60(flattenTemp) 53
64: 6 Load 63
Store 62(tex2.smpl) 64
66: 10(ptr) AccessChain 60(flattenTemp) 57
67: 9 Load 66
Store 65(tex2.tex) 67
68: 11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 51(tex1.smpl) 56(tex1.tex)
ReturnValue 68
FunctionEnd
Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
View file @
15fa7ef5
hlsl.flattenOpaqueInitMix.vert
WARNING: AST will form illegal SPIR-V; need to transform to legalize
Shader version: 500
0:? Sequence
0:5 Function Definition: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
...
...
@@ -19,15 +20,36 @@ Shader version: 500
0:10 Function Parameters:
0:? Sequence
0:11 Sequence
0:? Sequence
0:11 Sequence
0:11 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Construct structure ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 'g_tInputTexture_sampler' ( uniform sampler)
0:11 'g_tInputTexture' ( uniform texture2D)
0:11 Constant:
0:11 0.500000
0:11 move second child to first child ( temp sampler)
0:? 'tex.smpl' ( temp sampler)
0:11 smpl: direct index for structure ( temp sampler)
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Constant:
0:11 0 (const int)
0:11 move second child to first child ( temp texture2D)
0:? 'tex.tex' ( temp texture2D)
0:11 tex: direct index for structure ( temp texture2D)
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Constant:
0:11 1 (const int)
0:11 move second child to first child ( temp float)
0:? 'tex.f' ( temp float)
0:11 Constant:
0:11 0.500000
0:11 f: direct index for structure ( temp float)
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Constant:
0:11 2 (const int)
0:12 Branch: Return with expression
0:12 Function Call: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
0:? '
g_tInputTexture_sampler' ( uniform
sampler)
0:? '
g_tInputTexture' ( uniform
texture2D)
0:? '
tex.smpl' ( temp
sampler)
0:? '
tex.tex' ( temp
texture2D)
0:? 'tex.f' ( temp float)
0:10 Function Definition: main( ( temp void)
0:10 Function Parameters:
...
...
@@ -64,15 +86,36 @@ Shader version: 500
0:10 Function Parameters:
0:? Sequence
0:11 Sequence
0:? Sequence
0:11 Sequence
0:11 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Construct structure ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 'g_tInputTexture_sampler' ( uniform sampler)
0:11 'g_tInputTexture' ( uniform texture2D)
0:11 Constant:
0:11 0.500000
0:11 move second child to first child ( temp sampler)
0:? 'tex.smpl' ( temp sampler)
0:11 smpl: direct index for structure ( temp sampler)
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Constant:
0:11 0 (const int)
0:11 move second child to first child ( temp texture2D)
0:? 'tex.tex' ( temp texture2D)
0:11 tex: direct index for structure ( temp texture2D)
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Constant:
0:11 1 (const int)
0:11 move second child to first child ( temp float)
0:? 'tex.f' ( temp float)
0:11 Constant:
0:11 0.500000
0:11 f: direct index for structure ( temp float)
0:11 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex, temp float f})
0:11 Constant:
0:11 2 (const int)
0:12 Branch: Return with expression
0:12 Function Call: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
0:? '
g_tInputTexture_sampler' ( uniform
sampler)
0:? '
g_tInputTexture' ( uniform
texture2D)
0:? '
tex.smpl' ( temp
sampler)
0:? '
tex.tex' ( temp
texture2D)
0:? 'tex.f' ( temp float)
0:10 Function Definition: main( ( temp void)
0:10 Function Parameters:
...
...
@@ -87,12 +130,12 @@ Shader version: 500
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by
46
// Id's are bound by
65
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main"
44
EntryPoint Vertex 4 "main"
63
Source HLSL 500
Name 4 "main"
Name 17 "lookUp(struct-FxaaTex-p1-t21-f11;"
...
...
@@ -100,14 +143,21 @@ Shader version: 500
Name 15 "tex.tex"
Name 16 "tex.f"
Name 20 "@main("
Name 34 "tex.f"
Name 36 "g_tInputTexture_sampler"
Name 37 "g_tInputTexture"
Name 38 "param"
Name 44 "@entryPointOutput"
Decorate 36(g_tInputTexture_sampler) DescriptorSet 0
Decorate 37(g_tInputTexture) DescriptorSet 0
Decorate 44(@entryPointOutput) Location 0
Name 34 "FxaaTex"
MemberName 34(FxaaTex) 0 "smpl"
MemberName 34(FxaaTex) 1 "tex"
MemberName 34(FxaaTex) 2 "f"
Name 36 "flattenTemp"
Name 37 "g_tInputTexture_sampler"
Name 39 "g_tInputTexture"
Name 43 "tex.smpl"
Name 48 "tex.tex"
Name 52 "tex.f"
Name 57 "param"
Name 63 "@entryPointOutput"
Decorate 37(g_tInputTexture_sampler) DescriptorSet 0
Decorate 39(g_tInputTexture) DescriptorSet 0
Decorate 63(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeSampler
...
...
@@ -122,15 +172,25 @@ Shader version: 500
24: TypeSampledImage 9
28: TypeVector 8(float) 2
30: 8(float) Constant 0
35: 8(float) Constant 1056964608
36(g_tInputTexture_sampler): 7(ptr) Variable UniformConstant
37(g_tInputTexture): 10(ptr) Variable UniformConstant
43: TypePointer Output 12(fvec4)
44(@entryPointOutput): 43(ptr) Variable Output
34(FxaaTex): TypeStruct 6 9 8(float)
35: TypePointer UniformConstant 34(FxaaTex)
36(flattenTemp): 35(ptr) Variable UniformConstant
37(g_tInputTexture_sampler): 7(ptr) Variable UniformConstant
39(g_tInputTexture): 10(ptr) Variable UniformConstant
41: 8(float) Constant 1056964608
43(tex.smpl): 7(ptr) Variable UniformConstant
44: TypeInt 32 1
45: 44(int) Constant 0
48(tex.tex): 10(ptr) Variable UniformConstant
49: 44(int) Constant 1
53: 44(int) Constant 2
54: TypePointer UniformConstant 8(float)
62: TypePointer Output 12(fvec4)
63(@entryPointOutput): 62(ptr) Variable Output
4(main): 2 Function None 3
5: Label
45
: 12(fvec4) FunctionCall 20(@main()
Store
44(@entryPointOutput) 45
64
: 12(fvec4) FunctionCall 20(@main()
Store
63(@entryPointOutput) 64
Return
FunctionEnd
17(lookUp(struct-FxaaTex-p1-t21-f11;): 12(fvec4) Function None 13
...
...
@@ -149,11 +209,23 @@ Shader version: 500
FunctionEnd
20(@main(): 12(fvec4) Function None 19
21: Label
34(tex.f): 11(ptr) Variable Function
38(param): 11(ptr) Variable Function
Store 34(tex.f) 35
39: 8(float) Load 34(tex.f)
Store 38(param) 39
40: 12(fvec4) FunctionCall 17(lookUp(struct-FxaaTex-p1-t21-f11;) 36(g_tInputTexture_sampler) 37(g_tInputTexture) 38(param)
ReturnValue 40
52(tex.f): 11(ptr) Variable Function
57(param): 11(ptr) Variable Function
38: 6 Load 37(g_tInputTexture_sampler)
40: 9 Load 39(g_tInputTexture)
42: 34(FxaaTex) CompositeConstruct 38 40 41
Store 36(flattenTemp) 42
46: 7(ptr) AccessChain 36(flattenTemp) 45
47: 6 Load 46
Store 43(tex.smpl) 47
50: 10(ptr) AccessChain 36(flattenTemp) 49
51: 9 Load 50
Store 48(tex.tex) 51
55: 54(ptr) AccessChain 36(flattenTemp) 53
56: 8(float) Load 55
Store 52(tex.f) 56
58: 8(float) Load 52(tex.f)
Store 57(param) 58
59: 12(fvec4) FunctionCall 17(lookUp(struct-FxaaTex-p1-t21-f11;) 43(tex.smpl) 48(tex.tex) 57(param)
ReturnValue 59
FunctionEnd
glslang/MachineIndependent/localintermediate.h
View file @
15fa7ef5
...
...
@@ -234,7 +234,8 @@ public:
hlslOffsets
(
false
),
useStorageBuffer
(
false
),
hlslIoMapping
(
false
),
textureSamplerTransformMode
(
EShTexSampTransKeep
)
textureSamplerTransformMode
(
EShTexSampTransKeep
),
needToLegalize
(
false
)
{
localSize
[
0
]
=
1
;
localSize
[
1
]
=
1
;
...
...
@@ -610,6 +611,9 @@ public:
void
addProcessArgument
(
const
std
::
string
&
arg
)
{
processes
.
addArgument
(
arg
);
}
const
std
::
vector
<
std
::
string
>&
getProcesses
()
const
{
return
processes
.
getProcesses
();
}
void
setNeedsLegalization
()
{
needToLegalize
=
true
;
}
bool
needsLegalization
()
const
{
return
needToLegalize
;
}
const
char
*
const
implicitThisName
;
protected
:
...
...
@@ -708,6 +712,8 @@ protected:
// for OpModuleProcessed, or equivalent
TProcesses
processes
;
bool
needToLegalize
;
private
:
void
operator
=
(
TIntermediate
&
);
// prevent assignments
};
...
...
hlsl/hlslParseHelper.cpp
View file @
15fa7ef5
...
...
@@ -166,11 +166,6 @@ bool HlslParseContext::shouldConvertLValue(const TIntermNode* node) const
if
(
lhsAsAggregate
!=
nullptr
&&
lhsAsAggregate
->
getOp
()
==
EOpImageLoad
)
return
true
;
// If it's a syntactic write to a sampler, we will use that to establish
// a compile-time alias.
if
(
node
->
getAsTyped
()
->
getBasicType
()
==
EbtSampler
)
return
true
;
return
false
;
}
...
...
@@ -239,6 +234,13 @@ bool HlslParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, T
}
}
// We tolerate samplers as l-values, even though they are nominally
// illegal, because we expect a later optimization to eliminate them.
if
(
node
->
getType
().
getBasicType
()
==
EbtSampler
)
{
intermediate
.
setNeedsLegalization
();
return
false
;
}
// Let the base class check errors
return
TParseContextBase
::
lValueErrorCheck
(
loc
,
op
,
node
);
}
...
...
@@ -274,10 +276,6 @@ TIntermTyped* HlslParseContext::handleLvalue(const TSourceLoc& loc, const char*
// *** If we get here, we're going to apply some conversion to an l-value.
// Spin off sampler aliasing
if
(
node
->
getAsTyped
()
->
getBasicType
()
==
EbtSampler
)
return
handleSamplerLvalue
(
loc
,
op
,
node
);
// Helper to create a load.
const
auto
makeLoad
=
[
&
](
TIntermSymbol
*
rhsTmp
,
TIntermTyped
*
object
,
TIntermTyped
*
coord
,
const
TType
&
derefType
)
{
TIntermAggregate
*
loadOp
=
new
TIntermAggregate
(
EOpImageLoad
);
...
...
@@ -524,58 +522,6 @@ TIntermTyped* HlslParseContext::handleLvalue(const TSourceLoc& loc, const char*
return
node
;
}
// Deal with sampler aliasing: turning assignments into aliases
// Return a placeholder node for higher-level code that think assignments must
// generate code.
TIntermTyped
*
HlslParseContext
::
handleSamplerLvalue
(
const
TSourceLoc
&
loc
,
const
char
*
op
,
TIntermTyped
*&
node
)
{
// Can only alias an assignment: "s1 = s2"
TIntermBinary
*
binary
=
node
->
getAsBinaryNode
();
if
(
binary
==
nullptr
||
node
->
getAsOperator
()
->
getOp
()
!=
EOpAssign
||
binary
->
getLeft
()
->
getAsSymbolNode
()
==
nullptr
||
binary
->
getRight
()
->
getAsSymbolNode
()
==
nullptr
)
{
error
(
loc
,
"can't modify sampler"
,
op
,
""
);
return
node
;
}
if
(
controlFlowNestingLevel
>
0
)
warn
(
loc
,
"sampler or image aliased under control flow; consumption must be in same path"
,
op
,
""
);
TIntermTyped
*
set
=
setOpaqueLvalue
(
binary
->
getLeft
(),
binary
->
getRight
());
if
(
set
==
nullptr
)
warn
(
loc
,
"could not create alias for sampler"
,
op
,
""
);
else
node
=
set
;
return
node
;
}
// Do an opaque assignment that needs to turn into an alias.
// Return nullptr if it can't be done, otherwise return a placeholder
// node for higher-level code that think assignments must generate code.
TIntermTyped
*
HlslParseContext
::
setOpaqueLvalue
(
TIntermTyped
*
leftTyped
,
TIntermTyped
*
rightTyped
)
{
// Best is if we are aliasing a flattened struct member "S.s1 = s2",
// in which case we want to update the flattening information with the alias,
// making everything else work seamlessly.
TIntermSymbol
*
left
=
leftTyped
->
getAsSymbolNode
();
TIntermSymbol
*
right
=
rightTyped
->
getAsSymbolNode
();
for
(
auto
fit
=
flattenMap
.
begin
();
fit
!=
flattenMap
.
end
();
++
fit
)
{
for
(
auto
mit
=
fit
->
second
.
members
.
begin
();
mit
!=
fit
->
second
.
members
.
end
();
++
mit
)
{
if
((
*
mit
)
->
getUniqueId
()
==
left
->
getId
())
{
// found it: update with alias to the existing variable, and don't emit any code
(
*
mit
)
=
new
TVariable
(
&
right
->
getName
(),
right
->
getType
());
(
*
mit
)
->
setUniqueId
(
right
->
getId
());
// replace node (rest of compiler expects either an error or code to generate)
// with pointless access
return
right
;
}
}
}
return
nullptr
;
}
void
HlslParseContext
::
handlePragma
(
const
TSourceLoc
&
loc
,
const
TVector
<
TString
>&
tokens
)
{
if
(
pragmaCallback
)
...
...
@@ -2513,41 +2459,6 @@ TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc
return
assignList
;
}
// For a declaration with an initializer, where the initialized symbol is flattened,
// and possibly contains opaque values, such that the initializer should never exist
// as emitted code, because even creating the initializer would write opaques.
//
// If possible, decompose this into individual member-wise assignments, which themselves
// are expected to then not exist for opaque types, because they will turn into aliases.
//
// Return a node that contains the non-aliased assignments that must continue to exist.
TIntermTyped
*
HlslParseContext
::
executeFlattenedInitializer
(
const
TSourceLoc
&
loc
,
TIntermSymbol
*
symbol
,
TIntermAggregate
&
initializer
)
{
// We need individual RHS initializers per member to do this
const
TTypeList
*
typeList
=
symbol
->
getType
().
getStruct
();
if
(
typeList
==
nullptr
||
initializer
.
getSequence
().
size
()
!=
typeList
->
size
())
{
warn
(
loc
,
"cannot do member-wise aliasing for opaque members with this initializer"
,
"="
,
""
);
return
handleAssign
(
loc
,
EOpAssign
,
symbol
,
&
initializer
);
}
TIntermAggregate
*
initList
=
nullptr
;
// synthesize an access to each member, and then an assignment to it
for
(
int
member
=
0
;
member
<
(
int
)
typeList
->
size
();
++
member
)
{
TIntermTyped
*
memberInitializer
=
initializer
.
getSequence
()[
member
]
->
getAsTyped
();
TIntermTyped
*
flattenedMember
=
flattenAccess
(
symbol
,
member
);
if
(
flattenedMember
->
getType
().
containsOpaque
())
setOpaqueLvalue
(
flattenedMember
,
memberInitializer
);
else
initList
=
intermediate
.
growAggregate
(
initList
,
handleAssign
(
loc
,
EOpAssign
,
flattenedMember
,
memberInitializer
));
}
if
(
initList
)
initList
->
setOperator
(
EOpSequence
);
return
initList
;
}
// Some simple source assignments need to be flattened to a sequence
// of AST assignments. Catch these and flatten, otherwise, pass through
// to intermediate.addAssign().
...
...
@@ -2560,6 +2471,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
if
(
left
==
nullptr
||
right
==
nullptr
)
return
nullptr
;
// writing to opaques will require fixing transforms
if
(
left
->
getType
().
containsOpaque
())
intermediate
.
setNeedsLegalization
();
if
(
left
->
getAsOperator
()
&&
left
->
getAsOperator
()
->
getOp
()
==
EOpMatrixSwizzle
)
return
handleAssignToMatrixSwizzle
(
loc
,
op
,
left
,
right
);
...
...
@@ -2720,7 +2635,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
const
int
elementsL
=
left
->
getType
().
isArray
()
?
left
->
getType
().
getOuterArraySize
()
:
1
;
const
int
elementsR
=
right
->
getType
().
isArray
()
?
right
->
getType
().
getOuterArraySize
()
:
1
;
// The arrays may not be the same size, e.g, if the size has been forced for EbvTessLevelInner or Outer.
// The arrays might not be the same size,
// e.g., if the size has been forced for EbvTessLevelInner/Outer.
const
int
elementsToCopy
=
std
::
min
(
elementsL
,
elementsR
);
// array case
...
...
@@ -7616,20 +7532,10 @@ TIntermNode* HlslParseContext::executeInitializer(const TSourceLoc& loc, TInterm
// normal assigning of a value to a variable...
specializationCheck
(
loc
,
initializer
->
getType
(),
"initializer"
);
TIntermSymbol
*
intermSymbol
=
intermediate
.
addSymbol
(
*
variable
,
loc
);
// If we are flattening, it could be due to setting opaques, which must be handled
// as aliases, and the 'initializer' node cannot actually be emitted, because it
// itself stores the result of the constructor, and we can't store to opaques.
// handleAssign() will emit the initializer.
TIntermNode
*
initNode
=
nullptr
;
if
(
flattened
&&
intermSymbol
->
getType
().
containsOpaque
())
return
executeFlattenedInitializer
(
loc
,
intermSymbol
,
*
initializer
->
getAsAggregate
());
else
{
initNode
=
handleAssign
(
loc
,
EOpAssign
,
intermSymbol
,
initializer
);
if
(
initNode
==
nullptr
)
assignError
(
loc
,
"="
,
intermSymbol
->
getCompleteString
(),
initializer
->
getCompleteString
());
return
initNode
;
}
TIntermNode
*
initNode
=
handleAssign
(
loc
,
EOpAssign
,
intermSymbol
,
initializer
);
if
(
initNode
==
nullptr
)
assignError
(
loc
,
"="
,
intermSymbol
->
getCompleteString
(),
initializer
->
getCompleteString
());
return
initNode
;
}
return
nullptr
;
...
...
@@ -9517,6 +9423,11 @@ void HlslParseContext::finish()
error
(
mipsOperatorMipArg
.
back
().
loc
,
"unterminated mips operator:"
,
""
,
""
);
}
// Communicate out (esp. for command line) that we formed AST that will make
// illegal AST SPIR-V and it needs transforms to legalize it.
if
(
intermediate
.
needsLegalization
())
infoSink
.
info
<<
"WARNING: AST will form illegal SPIR-V; need to transform to legalize"
;
removeUnusedStructBufferCounters
();
addPatchConstantInvocation
();
fixTextureShadowModes
();
...
...
hlsl/hlslParseHelper.h
View file @
15fa7ef5
...
...
@@ -88,7 +88,6 @@ public:
void
remapNonEntryPointIO
(
TFunction
&
function
);
TIntermNode
*
handleReturnValue
(
const
TSourceLoc
&
,
TIntermTyped
*
);
void
handleFunctionArgument
(
TFunction
*
,
TIntermTyped
*&
arguments
,
TIntermTyped
*
newArg
);
TIntermTyped
*
executeFlattenedInitializer
(
const
TSourceLoc
&
,
TIntermSymbol
*
,
TIntermAggregate
&
);
TIntermTyped
*
handleAssign
(
const
TSourceLoc
&
,
TOperator
,
TIntermTyped
*
left
,
TIntermTyped
*
right
);
TIntermTyped
*
handleAssignToMatrixSwizzle
(
const
TSourceLoc
&
,
TOperator
,
TIntermTyped
*
left
,
TIntermTyped
*
right
);
TIntermTyped
*
handleFunctionCall
(
const
TSourceLoc
&
,
TFunction
*
,
TIntermTyped
*
);
...
...
@@ -191,8 +190,6 @@ public:
// Apply L-value conversions. E.g, turning a write to a RWTexture into an ImageStore.
TIntermTyped
*
handleLvalue
(
const
TSourceLoc
&
,
const
char
*
op
,
TIntermTyped
*&
node
);
TIntermTyped
*
handleSamplerLvalue
(
const
TSourceLoc
&
,
const
char
*
op
,
TIntermTyped
*&
node
);
TIntermTyped
*
setOpaqueLvalue
(
TIntermTyped
*
left
,
TIntermTyped
*
right
);
bool
lValueErrorCheck
(
const
TSourceLoc
&
,
const
char
*
op
,
TIntermTyped
*
)
override
;
TLayoutFormat
getLayoutFromTxType
(
const
TSourceLoc
&
,
const
TType
&
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment