The loop test is always emitted before the loop body. For do-while loops, use a phi node to track whether we're on the first loop iteration, and only check the loop test on the second and subsequent iterations. For do-while loops, the loop test branch no longer occurs at the top of the loop, so it must get its own selection merge instruction. A block can't be the target of more than one merge instruction. So when the loop test executes after the body (as in do-while in GLSL) we need to introduce a dummy block to be the target of the selection merge just before the loop test conditional branch. The other arm of the branch exits the loop and hence is the "break block" exception in the structured control flow rules.
67 lines
2.9 KiB
Plaintext
67 lines
2.9 KiB
Plaintext
spv.do-simple.vert
|
|
|
|
Linked vertex stage:
|
|
|
|
|
|
// Module Version 99
|
|
// Generated by (magic number): 51a00bb
|
|
// Id's are bound by 30
|
|
|
|
Source ESSL 300
|
|
1: ExtInstImport "GLSL.std.450"
|
|
MemoryModel Logical GLSL450
|
|
EntryPoint Vertex 4
|
|
Name 4 "main"
|
|
Name 9 "i"
|
|
Name 28 "gl_VertexID"
|
|
Name 29 "gl_InstanceID"
|
|
Decorate 9(i) PrecisionHigh
|
|
Decorate 28(gl_VertexID) PrecisionHigh
|
|
Decorate 28(gl_VertexID) BuiltIn VertexId
|
|
Decorate 28(gl_VertexID) NoStaticUse
|
|
Decorate 29(gl_InstanceID) PrecisionHigh
|
|
Decorate 29(gl_InstanceID) BuiltIn InstanceId
|
|
Decorate 29(gl_InstanceID) NoStaticUse
|
|
2: TypeVoid
|
|
3: TypeFunction 2
|
|
7: TypeInt 32 1
|
|
8: TypePointer Function 7(int)
|
|
10: 7(int) Constant 0
|
|
14: TypeBool
|
|
15: 14(bool) ConstantTrue
|
|
20: 7(int) Constant 10
|
|
24: 7(int) Constant 1
|
|
26: 14(bool) ConstantFalse
|
|
27: TypePointer Input 7(int)
|
|
28(gl_VertexID): 27(ptr) Variable Input
|
|
29(gl_InstanceID): 27(ptr) Variable Input
|
|
4(main): 2 Function None 3
|
|
5: Label
|
|
9(i): 8(ptr) Variable Function
|
|
Store 9(i) 10
|
|
Branch 11
|
|
11: Label
|
|
13: 14(bool) Phi 15 5 26 17
|
|
LoopMerge 12 None
|
|
Branch 16
|
|
16: Label
|
|
SelectionMerge 17 None
|
|
BranchConditional 13 17 18
|
|
18: Label
|
|
19: 7(int) Load 9(i)
|
|
21: 14(bool) SLessThan 19 20
|
|
SelectionMerge 22 None
|
|
BranchConditional 21 22 12
|
|
22: Label
|
|
Branch 17
|
|
17: Label
|
|
23: 7(int) Load 9(i)
|
|
25: 7(int) IAdd 23 24
|
|
Store 9(i) 25
|
|
Branch 11
|
|
12: Label
|
|
Branch 6
|
|
6: Label
|
|
Return
|
|
FunctionEnd
|