HLSL: Flesh out the loop grammar and productions.
This commit is contained in:
parent
0d2b6de45b
commit
119f8f6906
116
Test/baseResults/hlsl.doLoop.frag.out
Executable file
116
Test/baseResults/hlsl.doLoop.frag.out
Executable file
@ -0,0 +1,116 @@
|
|||||||
|
hlsl.doLoop.frag
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:7 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
|
||||||
|
0:2 Function Parameters:
|
||||||
|
0:2 'input' (temp 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Loop with condition not tested first
|
||||||
|
0:3 Loop Condition
|
||||||
|
0:3 Constant:
|
||||||
|
0:3 false (const bool)
|
||||||
|
0:3 No loop body
|
||||||
|
0:4 Loop with condition not tested first
|
||||||
|
0:4 Loop Condition
|
||||||
|
0:4 Constant:
|
||||||
|
0:4 false (const bool)
|
||||||
|
0:4 No loop body
|
||||||
|
0:5 Loop with condition not tested first
|
||||||
|
0:5 Loop Condition
|
||||||
|
0:5 Compare Equal (temp bool)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 Loop Body
|
||||||
|
0:5 Branch: Return with expression
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:? Linker Objects
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:7 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
|
||||||
|
0:2 Function Parameters:
|
||||||
|
0:2 'input' (temp 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Loop with condition not tested first
|
||||||
|
0:3 Loop Condition
|
||||||
|
0:3 Constant:
|
||||||
|
0:3 false (const bool)
|
||||||
|
0:3 No loop body
|
||||||
|
0:4 Loop with condition not tested first
|
||||||
|
0:4 Loop Condition
|
||||||
|
0:4 Constant:
|
||||||
|
0:4 false (const bool)
|
||||||
|
0:4 No loop body
|
||||||
|
0:5 Loop with condition not tested first
|
||||||
|
0:5 Loop Condition
|
||||||
|
0:5 Compare Equal (temp bool)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 Loop Body
|
||||||
|
0:5 Branch: Return with expression
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:? Linker Objects
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 31
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "PixelShaderFunction"
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 450
|
||||||
|
Name 4 "PixelShaderFunction"
|
||||||
|
Name 23 "input"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
10: TypeBool
|
||||||
|
11: 10(bool) ConstantFalse
|
||||||
|
20: TypeFloat 32
|
||||||
|
21: TypeVector 20(float) 4
|
||||||
|
22: TypePointer Function 21(fvec4)
|
||||||
|
28: TypeVector 10(bool) 4
|
||||||
|
4(PixelShaderFunction): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
23(input): 22(ptr) Variable Function
|
||||||
|
Branch 6
|
||||||
|
6: Label
|
||||||
|
LoopMerge 8 9 None
|
||||||
|
Branch 7
|
||||||
|
7: Label
|
||||||
|
Branch 9
|
||||||
|
9: Label
|
||||||
|
BranchConditional 11 6 8
|
||||||
|
8: Label
|
||||||
|
Branch 12
|
||||||
|
12: Label
|
||||||
|
LoopMerge 14 15 None
|
||||||
|
Branch 13
|
||||||
|
13: Label
|
||||||
|
Branch 15
|
||||||
|
15: Label
|
||||||
|
BranchConditional 11 12 14
|
||||||
|
14: Label
|
||||||
|
Branch 16
|
||||||
|
16: Label
|
||||||
|
LoopMerge 18 19 None
|
||||||
|
Branch 17
|
||||||
|
17: Label
|
||||||
|
24: 21(fvec4) Load 23(input)
|
||||||
|
ReturnValue 24
|
||||||
|
19: Label
|
||||||
|
26: 21(fvec4) Load 23(input)
|
||||||
|
27: 21(fvec4) Load 23(input)
|
||||||
|
29: 28(bvec4) FOrdEqual 26 27
|
||||||
|
30: 10(bool) All 29
|
||||||
|
BranchConditional 30 16 18
|
||||||
|
18: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
220
Test/baseResults/hlsl.forLoop.frag.out
Executable file
220
Test/baseResults/hlsl.forLoop.frag.out
Executable file
@ -0,0 +1,220 @@
|
|||||||
|
hlsl.forLoop.frag
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:9 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
|
||||||
|
0:2 Function Parameters:
|
||||||
|
0:2 'input' (temp 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Loop with condition tested first
|
||||||
|
0:3 No loop condition
|
||||||
|
0:3 No loop body
|
||||||
|
0:4 Sequence
|
||||||
|
0:4 Pre-Increment (temp 4-component vector of float)
|
||||||
|
0:4 'input' (temp 4-component vector of float)
|
||||||
|
0:4 Loop with condition tested first
|
||||||
|
0:4 No loop condition
|
||||||
|
0:4 No loop body
|
||||||
|
0:? Sequence
|
||||||
|
0:5 Loop with condition tested first
|
||||||
|
0:5 Loop Condition
|
||||||
|
0:5 Compare Not Equal (temp bool)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 No loop body
|
||||||
|
0:? Sequence
|
||||||
|
0:6 Loop with condition tested first
|
||||||
|
0:6 Loop Condition
|
||||||
|
0:6 Compare Not Equal (temp bool)
|
||||||
|
0:6 'input' (temp 4-component vector of float)
|
||||||
|
0:6 'input' (temp 4-component vector of float)
|
||||||
|
0:6 Loop Body
|
||||||
|
0:? Sequence
|
||||||
|
0:6 Branch: Return with expression
|
||||||
|
0:6 Negate value (temp 4-component vector of float)
|
||||||
|
0:6 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Sequence
|
||||||
|
0:7 Pre-Decrement (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Loop with condition tested first
|
||||||
|
0:7 Loop Condition
|
||||||
|
0:7 Compare Not Equal (temp bool)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Loop Body
|
||||||
|
0:? Sequence
|
||||||
|
0:7 Branch: Return with expression
|
||||||
|
0:7 Negate value (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Loop Terminal Expression
|
||||||
|
0:7 add second child into first child (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Constant:
|
||||||
|
0:7 2.000000
|
||||||
|
0:? Linker Objects
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:9 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
|
||||||
|
0:2 Function Parameters:
|
||||||
|
0:2 'input' (temp 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Loop with condition tested first
|
||||||
|
0:3 No loop condition
|
||||||
|
0:3 No loop body
|
||||||
|
0:4 Sequence
|
||||||
|
0:4 Pre-Increment (temp 4-component vector of float)
|
||||||
|
0:4 'input' (temp 4-component vector of float)
|
||||||
|
0:4 Loop with condition tested first
|
||||||
|
0:4 No loop condition
|
||||||
|
0:4 No loop body
|
||||||
|
0:? Sequence
|
||||||
|
0:5 Loop with condition tested first
|
||||||
|
0:5 Loop Condition
|
||||||
|
0:5 Compare Not Equal (temp bool)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 'input' (temp 4-component vector of float)
|
||||||
|
0:5 No loop body
|
||||||
|
0:? Sequence
|
||||||
|
0:6 Loop with condition tested first
|
||||||
|
0:6 Loop Condition
|
||||||
|
0:6 Compare Not Equal (temp bool)
|
||||||
|
0:6 'input' (temp 4-component vector of float)
|
||||||
|
0:6 'input' (temp 4-component vector of float)
|
||||||
|
0:6 Loop Body
|
||||||
|
0:? Sequence
|
||||||
|
0:6 Branch: Return with expression
|
||||||
|
0:6 Negate value (temp 4-component vector of float)
|
||||||
|
0:6 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Sequence
|
||||||
|
0:7 Pre-Decrement (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Loop with condition tested first
|
||||||
|
0:7 Loop Condition
|
||||||
|
0:7 Compare Not Equal (temp bool)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Loop Body
|
||||||
|
0:? Sequence
|
||||||
|
0:7 Branch: Return with expression
|
||||||
|
0:7 Negate value (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Loop Terminal Expression
|
||||||
|
0:7 add second child into first child (temp 4-component vector of float)
|
||||||
|
0:7 'input' (temp 4-component vector of float)
|
||||||
|
0:7 Constant:
|
||||||
|
0:7 2.000000
|
||||||
|
0:? Linker Objects
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 64
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "PixelShaderFunction"
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 450
|
||||||
|
Name 4 "PixelShaderFunction"
|
||||||
|
Name 13 "input"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
10: TypeFloat 32
|
||||||
|
11: TypeVector 10(float) 4
|
||||||
|
12: TypePointer Function 11(fvec4)
|
||||||
|
15: 10(float) Constant 1065353216
|
||||||
|
29: TypeBool
|
||||||
|
30: TypeVector 29(bool) 4
|
||||||
|
60: 10(float) Constant 1073741824
|
||||||
|
4(PixelShaderFunction): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
13(input): 12(ptr) Variable Function
|
||||||
|
Branch 6
|
||||||
|
6: Label
|
||||||
|
LoopMerge 8 9 None
|
||||||
|
Branch 7
|
||||||
|
7: Label
|
||||||
|
Branch 9
|
||||||
|
9: Label
|
||||||
|
Branch 6
|
||||||
|
8: Label
|
||||||
|
14: 11(fvec4) Load 13(input)
|
||||||
|
16: 11(fvec4) CompositeConstruct 15 15 15 15
|
||||||
|
17: 11(fvec4) FAdd 14 16
|
||||||
|
Store 13(input) 17
|
||||||
|
Branch 18
|
||||||
|
18: Label
|
||||||
|
LoopMerge 20 21 None
|
||||||
|
Branch 19
|
||||||
|
19: Label
|
||||||
|
Branch 21
|
||||||
|
21: Label
|
||||||
|
Branch 18
|
||||||
|
20: Label
|
||||||
|
Branch 22
|
||||||
|
22: Label
|
||||||
|
LoopMerge 24 25 None
|
||||||
|
Branch 26
|
||||||
|
26: Label
|
||||||
|
27: 11(fvec4) Load 13(input)
|
||||||
|
28: 11(fvec4) Load 13(input)
|
||||||
|
31: 30(bvec4) FOrdNotEqual 27 28
|
||||||
|
32: 29(bool) Any 31
|
||||||
|
BranchConditional 32 23 24
|
||||||
|
23: Label
|
||||||
|
Branch 25
|
||||||
|
25: Label
|
||||||
|
Branch 22
|
||||||
|
24: Label
|
||||||
|
Branch 33
|
||||||
|
33: Label
|
||||||
|
LoopMerge 35 36 None
|
||||||
|
Branch 37
|
||||||
|
37: Label
|
||||||
|
38: 11(fvec4) Load 13(input)
|
||||||
|
39: 11(fvec4) Load 13(input)
|
||||||
|
40: 30(bvec4) FOrdNotEqual 38 39
|
||||||
|
41: 29(bool) Any 40
|
||||||
|
BranchConditional 41 34 35
|
||||||
|
34: Label
|
||||||
|
42: 11(fvec4) Load 13(input)
|
||||||
|
43: 11(fvec4) FNegate 42
|
||||||
|
ReturnValue 43
|
||||||
|
36: Label
|
||||||
|
Branch 33
|
||||||
|
35: Label
|
||||||
|
45: 11(fvec4) Load 13(input)
|
||||||
|
46: 11(fvec4) CompositeConstruct 15 15 15 15
|
||||||
|
47: 11(fvec4) FSub 45 46
|
||||||
|
Store 13(input) 47
|
||||||
|
Branch 48
|
||||||
|
48: Label
|
||||||
|
LoopMerge 50 51 None
|
||||||
|
Branch 52
|
||||||
|
52: Label
|
||||||
|
53: 11(fvec4) Load 13(input)
|
||||||
|
54: 11(fvec4) Load 13(input)
|
||||||
|
55: 30(bvec4) FOrdNotEqual 53 54
|
||||||
|
56: 29(bool) Any 55
|
||||||
|
BranchConditional 56 49 50
|
||||||
|
49: Label
|
||||||
|
57: 11(fvec4) Load 13(input)
|
||||||
|
58: 11(fvec4) FNegate 57
|
||||||
|
ReturnValue 58
|
||||||
|
51: Label
|
||||||
|
61: 11(fvec4) Load 13(input)
|
||||||
|
62: 11(fvec4) CompositeConstruct 60 60 60 60
|
||||||
|
63: 11(fvec4) FAdd 61 62
|
||||||
|
Store 13(input) 63
|
||||||
|
Branch 48
|
||||||
|
50: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
145
Test/baseResults/hlsl.whileLoop.frag.out
Executable file
145
Test/baseResults/hlsl.whileLoop.frag.out
Executable file
@ -0,0 +1,145 @@
|
|||||||
|
hlsl.whileLoop.frag
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:8 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
|
||||||
|
0:2 Function Parameters:
|
||||||
|
0:2 'input' (temp 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Loop with condition tested first
|
||||||
|
0:3 Loop Condition
|
||||||
|
0:3 Compare Not Equal (temp bool)
|
||||||
|
0:3 'input' (temp 4-component vector of float)
|
||||||
|
0:3 'input' (temp 4-component vector of float)
|
||||||
|
0:3 Loop Body
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Branch: Return with expression
|
||||||
|
0:3 'input' (temp 4-component vector of float)
|
||||||
|
0:4 Loop with condition tested first
|
||||||
|
0:4 Loop Condition
|
||||||
|
0:4 Constant:
|
||||||
|
0:4 false (const bool)
|
||||||
|
0:4 No loop body
|
||||||
|
0:5 Loop with condition tested first
|
||||||
|
0:5 Loop Condition
|
||||||
|
0:5 Constant:
|
||||||
|
0:5 false (const bool)
|
||||||
|
0:5 No loop body
|
||||||
|
0:6 Loop with condition tested first
|
||||||
|
0:6 Loop Condition
|
||||||
|
0:6 Constant:
|
||||||
|
0:6 false (const bool)
|
||||||
|
0:6 No loop body
|
||||||
|
0:? Linker Objects
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:8 Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
|
||||||
|
0:2 Function Parameters:
|
||||||
|
0:2 'input' (temp 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Loop with condition tested first
|
||||||
|
0:3 Loop Condition
|
||||||
|
0:3 Compare Not Equal (temp bool)
|
||||||
|
0:3 'input' (temp 4-component vector of float)
|
||||||
|
0:3 'input' (temp 4-component vector of float)
|
||||||
|
0:3 Loop Body
|
||||||
|
0:? Sequence
|
||||||
|
0:3 Branch: Return with expression
|
||||||
|
0:3 'input' (temp 4-component vector of float)
|
||||||
|
0:4 Loop with condition tested first
|
||||||
|
0:4 Loop Condition
|
||||||
|
0:4 Constant:
|
||||||
|
0:4 false (const bool)
|
||||||
|
0:4 No loop body
|
||||||
|
0:5 Loop with condition tested first
|
||||||
|
0:5 Loop Condition
|
||||||
|
0:5 Constant:
|
||||||
|
0:5 false (const bool)
|
||||||
|
0:5 No loop body
|
||||||
|
0:6 Loop with condition tested first
|
||||||
|
0:6 Loop Condition
|
||||||
|
0:6 Constant:
|
||||||
|
0:6 false (const bool)
|
||||||
|
0:6 No loop body
|
||||||
|
0:? Linker Objects
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 39
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "PixelShaderFunction"
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 450
|
||||||
|
Name 4 "PixelShaderFunction"
|
||||||
|
Name 14 "input"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
11: TypeFloat 32
|
||||||
|
12: TypeVector 11(float) 4
|
||||||
|
13: TypePointer Function 12(fvec4)
|
||||||
|
17: TypeBool
|
||||||
|
18: TypeVector 17(bool) 4
|
||||||
|
28: 17(bool) ConstantFalse
|
||||||
|
4(PixelShaderFunction): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
14(input): 13(ptr) Variable Function
|
||||||
|
Branch 6
|
||||||
|
6: Label
|
||||||
|
LoopMerge 8 9 None
|
||||||
|
Branch 10
|
||||||
|
10: Label
|
||||||
|
15: 12(fvec4) Load 14(input)
|
||||||
|
16: 12(fvec4) Load 14(input)
|
||||||
|
19: 18(bvec4) FOrdNotEqual 15 16
|
||||||
|
20: 17(bool) Any 19
|
||||||
|
BranchConditional 20 7 8
|
||||||
|
7: Label
|
||||||
|
21: 12(fvec4) Load 14(input)
|
||||||
|
ReturnValue 21
|
||||||
|
9: Label
|
||||||
|
Branch 6
|
||||||
|
8: Label
|
||||||
|
Branch 23
|
||||||
|
23: Label
|
||||||
|
LoopMerge 25 26 None
|
||||||
|
Branch 27
|
||||||
|
27: Label
|
||||||
|
BranchConditional 28 24 25
|
||||||
|
24: Label
|
||||||
|
Branch 26
|
||||||
|
26: Label
|
||||||
|
Branch 23
|
||||||
|
25: Label
|
||||||
|
Branch 29
|
||||||
|
29: Label
|
||||||
|
LoopMerge 31 32 None
|
||||||
|
Branch 33
|
||||||
|
33: Label
|
||||||
|
BranchConditional 28 30 31
|
||||||
|
30: Label
|
||||||
|
Branch 32
|
||||||
|
32: Label
|
||||||
|
Branch 29
|
||||||
|
31: Label
|
||||||
|
Branch 34
|
||||||
|
34: Label
|
||||||
|
LoopMerge 36 37 None
|
||||||
|
Branch 38
|
||||||
|
38: Label
|
||||||
|
BranchConditional 28 35 36
|
||||||
|
35: Label
|
||||||
|
Branch 37
|
||||||
|
37: Label
|
||||||
|
Branch 34
|
||||||
|
36: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
6
Test/hlsl.doLoop.frag
Normal file
6
Test/hlsl.doLoop.frag
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
float4 PixelShaderFunction(float4 input) : COLOR0
|
||||||
|
{
|
||||||
|
[unroll] do {} while (false);
|
||||||
|
[unroll] do {;} while (false);
|
||||||
|
do { return input; } while (input == input);
|
||||||
|
}
|
8
Test/hlsl.forLoop.frag
Normal file
8
Test/hlsl.forLoop.frag
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
float4 PixelShaderFunction(float4 input) : COLOR0
|
||||||
|
{
|
||||||
|
for (;;) ;
|
||||||
|
for (++input; ; ) ;
|
||||||
|
[unroll] for (; input != input; ) {}
|
||||||
|
for (; input != input; ) { return -input; }
|
||||||
|
for (--input; input != input; input += 2) { return -input; }
|
||||||
|
}
|
7
Test/hlsl.whileLoop.frag
Normal file
7
Test/hlsl.whileLoop.frag
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
float4 PixelShaderFunction(float4 input) : COLOR0
|
||||||
|
{
|
||||||
|
while (input != input) { return input; }
|
||||||
|
while (false) ;
|
||||||
|
[unroll] while (false) { }
|
||||||
|
while ((false)) { }
|
||||||
|
}
|
@ -1028,7 +1028,7 @@ const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create loop nodes.
|
// Create while and do-while loop nodes.
|
||||||
//
|
//
|
||||||
TIntermLoop* TIntermediate::addLoop(TIntermNode* body, TIntermTyped* test, TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc)
|
TIntermLoop* TIntermediate::addLoop(TIntermNode* body, TIntermTyped* test, TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc)
|
||||||
{
|
{
|
||||||
@ -1038,6 +1038,22 @@ TIntermLoop* TIntermediate::addLoop(TIntermNode* body, TIntermTyped* test, TInte
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create a for-loop sequence.
|
||||||
|
//
|
||||||
|
TIntermAggregate* TIntermediate::addForLoop(TIntermNode* body, TIntermNode* initializer, TIntermTyped* test, TIntermTyped* terminal, bool testFirst, const TSourceLoc& loc)
|
||||||
|
{
|
||||||
|
TIntermLoop* node = new TIntermLoop(body, test, terminal, testFirst);
|
||||||
|
node->setLoc(loc);
|
||||||
|
|
||||||
|
// make a sequence of the initializer and statement
|
||||||
|
TIntermAggregate* loopSequence = makeAggregate(initializer, loc);
|
||||||
|
loopSequence = growAggregate(loopSequence, node);
|
||||||
|
loopSequence->setOperator(EOpSequence);
|
||||||
|
|
||||||
|
return loopSequence;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Add branches.
|
// Add branches.
|
||||||
//
|
//
|
||||||
|
@ -198,6 +198,7 @@ public:
|
|||||||
TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) const;
|
TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) const;
|
||||||
bool parseConstTree(TIntermNode*, TConstUnionArray, TOperator, const TType&, bool singleConstantParam = false);
|
bool parseConstTree(TIntermNode*, TConstUnionArray, TOperator, const TType&, bool singleConstantParam = false);
|
||||||
TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&);
|
TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&);
|
||||||
|
TIntermAggregate* addForLoop(TIntermNode*, TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, const TSourceLoc&);
|
||||||
TIntermBranch* addBranch(TOperator, const TSourceLoc&);
|
TIntermBranch* addBranch(TOperator, const TSourceLoc&);
|
||||||
TIntermBranch* addBranch(TOperator, TIntermTyped*, const TSourceLoc&);
|
TIntermBranch* addBranch(TOperator, TIntermTyped*, const TSourceLoc&);
|
||||||
TIntermTyped* addSwizzle(TVectorFields&, const TSourceLoc&);
|
TIntermTyped* addSwizzle(TVectorFields&, const TSourceLoc&);
|
||||||
|
@ -75,8 +75,10 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
{"hlsl.assoc.frag", "PixelShaderFunction"},
|
{"hlsl.assoc.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.attribute.frag", "PixelShaderFunction"},
|
{"hlsl.attribute.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.cast.frag", "PixelShaderFunction"},
|
{"hlsl.cast.frag", "PixelShaderFunction"},
|
||||||
|
{"hlsl.doLoop.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.float1.frag", "PixelShaderFunction"},
|
{"hlsl.float1.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.float4.frag", "PixelShaderFunction"},
|
{"hlsl.float4.frag", "PixelShaderFunction"},
|
||||||
|
{"hlsl.forLoop.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.if.frag", "PixelShaderFunction"},
|
{"hlsl.if.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.intrinsics.frag", "PixelShaderFunction"},
|
{"hlsl.intrinsics.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
|
{"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
|
||||||
@ -87,6 +89,7 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
{"hlsl.precedence.frag", "PixelShaderFunction"},
|
{"hlsl.precedence.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.precedence2.frag", "PixelShaderFunction"},
|
{"hlsl.precedence2.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.sin.frag", "PixelShaderFunction"},
|
{"hlsl.sin.frag", "PixelShaderFunction"},
|
||||||
|
{"hlsl.whileLoop.frag", "PixelShaderFunction"},
|
||||||
}),
|
}),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
@ -1119,9 +1119,128 @@ bool HlslGrammar::acceptSwitchStatement(TIntermNode*& statement)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// iteration_statement
|
||||||
|
// : WHILE LEFT_PAREN condition RIGHT_PAREN statement
|
||||||
|
// | DO LEFT_BRACE statement RIGHT_BRACE WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON
|
||||||
|
// | FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement
|
||||||
|
//
|
||||||
|
// Non-speculative, only call if it needs to be found; WHILE or DO or FOR already seen.
|
||||||
bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement)
|
bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement)
|
||||||
{
|
{
|
||||||
return false;
|
TSourceLoc loc = token.loc;
|
||||||
|
TIntermTyped* condition = nullptr;
|
||||||
|
|
||||||
|
EHlslTokenClass loop = peek();
|
||||||
|
assert(loop == EHTokDo || loop == EHTokFor || loop == EHTokWhile);
|
||||||
|
|
||||||
|
// WHILE or DO or FOR
|
||||||
|
advanceToken();
|
||||||
|
|
||||||
|
switch (loop) {
|
||||||
|
case EHTokWhile:
|
||||||
|
// so that something declared in the condition is scoped to the lifetime
|
||||||
|
// of the while sub-statement
|
||||||
|
parseContext.pushScope();
|
||||||
|
parseContext.nestLooping();
|
||||||
|
|
||||||
|
// LEFT_PAREN condition RIGHT_PAREN
|
||||||
|
if (! acceptParenExpression(condition))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// statement
|
||||||
|
if (! acceptScopedStatement(statement)) {
|
||||||
|
expected("while sub-statement");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
parseContext.unnestLooping();
|
||||||
|
parseContext.popScope();
|
||||||
|
|
||||||
|
statement = intermediate.addLoop(statement, condition, nullptr, true, loc);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case EHTokDo:
|
||||||
|
parseContext.nestLooping();
|
||||||
|
|
||||||
|
if (! acceptTokenClass(EHTokLeftBrace))
|
||||||
|
expected("{");
|
||||||
|
|
||||||
|
// statement
|
||||||
|
if (! peekTokenClass(EHTokRightBrace) && ! acceptScopedStatement(statement)) {
|
||||||
|
expected("do sub-statement");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! acceptTokenClass(EHTokRightBrace))
|
||||||
|
expected("}");
|
||||||
|
|
||||||
|
// WHILE
|
||||||
|
if (! acceptTokenClass(EHTokWhile)) {
|
||||||
|
expected("while");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LEFT_PAREN condition RIGHT_PAREN
|
||||||
|
TIntermTyped* condition;
|
||||||
|
if (! acceptParenExpression(condition))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (! acceptTokenClass(EHTokSemicolon))
|
||||||
|
expected(";");
|
||||||
|
|
||||||
|
parseContext.unnestLooping();
|
||||||
|
|
||||||
|
statement = intermediate.addLoop(statement, condition, 0, false, loc);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case EHTokFor:
|
||||||
|
{
|
||||||
|
// LEFT_PAREN
|
||||||
|
if (! acceptTokenClass(EHTokLeftParen))
|
||||||
|
expected("(");
|
||||||
|
|
||||||
|
// so that something declared in the condition is scoped to the lifetime
|
||||||
|
// of the for sub-statement
|
||||||
|
parseContext.pushScope();
|
||||||
|
|
||||||
|
// initializer SEMI_COLON
|
||||||
|
TIntermTyped* initializer = nullptr; // TODO, "for (initializer" needs to support decl. statement
|
||||||
|
acceptExpression(initializer);
|
||||||
|
if (! acceptTokenClass(EHTokSemicolon))
|
||||||
|
expected(";");
|
||||||
|
|
||||||
|
parseContext.nestLooping();
|
||||||
|
|
||||||
|
// condition SEMI_COLON
|
||||||
|
acceptExpression(condition);
|
||||||
|
if (! acceptTokenClass(EHTokSemicolon))
|
||||||
|
expected(";");
|
||||||
|
|
||||||
|
// iterator SEMI_COLON
|
||||||
|
TIntermTyped* iterator = nullptr;
|
||||||
|
acceptExpression(iterator);
|
||||||
|
if (! acceptTokenClass(EHTokRightParen))
|
||||||
|
expected(")");
|
||||||
|
|
||||||
|
// statement
|
||||||
|
if (! acceptScopedStatement(statement)) {
|
||||||
|
expected("for sub-statement");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
statement = intermediate.addForLoop(statement, initializer, condition, iterator, true, loc);
|
||||||
|
|
||||||
|
parseContext.popScope();
|
||||||
|
parseContext.unnestLooping();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// jump_statement
|
// jump_statement
|
||||||
|
@ -141,6 +141,8 @@ public:
|
|||||||
|
|
||||||
void nestStatement() { ++statementNestingLevel; }
|
void nestStatement() { ++statementNestingLevel; }
|
||||||
void unnestStatement() { --statementNestingLevel; }
|
void unnestStatement() { --statementNestingLevel; }
|
||||||
|
void nestLooping() { ++loopNestingLevel; }
|
||||||
|
void unnestLooping() { --loopNestingLevel; }
|
||||||
void pushScope() { symbolTable.push(); }
|
void pushScope() { symbolTable.push(); }
|
||||||
void popScope() { symbolTable.pop(0); }
|
void popScope() { symbolTable.pop(0); }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user