1     type Image
2         def transition self (from : ImageLayout) (to : ImageLayout) =
3             let command_buffer : CommandBuffer @auto
4             assert self.layout == from
5     
6             let mut barrier = self.barrier_to to
7             if to == ImageLayout/DepthStencilAttachmentOptimal then
8                 barrier.subresource_range.aspect_mask = ImageAspectFlags/Depth
9                 if has_stencil self.format then
10                    barrier.subresource_range.aspect_mask =
11                        barrier.subresource_range.aspect_mask | ImageAspectFlags/Stencil
12    
13            let mut source_stage = PipelineStageFlags@zero
14            let mut destination_stage = PipelineStageFlags@zero
15            if from == ImageLayout/Undefined && to == ImageLayout/TransferDstOptimal then
16                barrier.src_access_mask = AccessFlags@zero
17                barrier.dst_access_mask = AccessFlags/TransferWrite
18    
19                source_stage = PipelineStageFlags/TopOfPipe
20                destination_stage = PipelineStageFlags/Transfer
21    
22            else if from == ImageLayout/TransferDstOptimal
23                    && to == ImageLayout/ShaderReadOnlyOptimal
24            then
25                barrier.src_access_mask = AccessFlags/TransferWrite
26                barrier.dst_access_mask = AccessFlags/ShaderRead
27    
28                source_stage = PipelineStageFlags/Transfer
29                destination_stage = PipelineStageFlags/FragmentShader
30    
31            else if from == ImageLayout/ColorAttachmentOptimal
32                    && to == ImageLayout/ShaderReadOnlyOptimal
33            then
34                barrier.src_access_mask =
35                    AccessFlags/ColorAttachmentRead | AccessFlags/ColorAttachmentWrite
36                barrier.dst_access_mask = AccessFlags/ShaderRead
37    
38                source_stage = PipelineStageFlags/ColorAttachmentOutput
39                destination_stage = PipelineStageFlags/FragmentShader
40    
41            else if from == ImageLayout/DepthStencilAttachmentOptimal
42                    && to == ImageLayout/ShaderReadOnlyOptimal
43            then
44                barrier.src_access_mask = AccessFlags/DepthStencilAttachmentRead
45                                          | AccessFlags/DepthStencilAttachmentWrite
46                barrier.dst_access_mask = AccessFlags/ShaderRead
47    
48                source_stage = PipelineStageFlags/EarlyFragmentTests
49                destination_stage = PipelineStageFlags/FragmentShader
50    
51            else if from == ImageLayout/ShaderReadOnlyOptimal
52                    && to == ImageLayout/ColorAttachmentOptimal
53            then
54                barrier.src_access_mask = AccessFlags/ShaderRead
55                barrier.dst_access_mask = AccessFlags/ColorAttachmentRead
56                                          | AccessFlags/ColorAttachmentWrite
57    
58                source_stage = PipelineStageFlags/FragmentShader
59                destination_stage = PipelineStageFlags/ColorAttachmentOutput
60    
61            else if from == ImageLayout/ShaderReadOnlyOptimal
62                    && to == ImageLayout/DepthStencilAttachmentOptimal
63            then
64                barrier.src_access_mask = AccessFlags/ShaderRead
65                barrier.dst_access_mask = AccessFlags/DepthStencilAttachmentRead
66                                          | AccessFlags/DepthStencilAttachmentWrite
67    
68                source_stage = PipelineStageFlags/FragmentShader
69                destination_stage = PipelineStageFlags/EarlyFragmentTests
70    
71            else if from == ImageLayout/Undefined
72                    && to == ImageLayout/DepthStencilAttachmentOptimal
73            then
74                barrier.src_access_mask = AccessFlags@zero
75                barrier.dst_access_mask = AccessFlags/DepthStencilAttachmentRead
76                                          | AccessFlags/DepthStencilAttachmentWrite
77    
78                source_stage = PipelineStageFlags/TopOfPipe
79                destination_stage = PipelineStageFlags/EarlyFragmentTests
80    
81            else if from == ImageLayout/Undefined
82                    && to == ImageLayout/ColorAttachmentOptimal
83            then
84                barrier.src_access_mask = AccessFlags@zero
85                barrier.dst_access_mask = AccessFlags/ColorAttachmentRead
86                                          | AccessFlags/ColorAttachmentWrite
87    
88                source_stage = PipelineStageFlags/TopOfPipe
89                destination_stage = PipelineStageFlags/ColorAttachmentOutput
90    
91            else if from == ImageLayout/Undefined
92                    && to == ImageLayout/ShaderReadOnlyOptimal
93            then
94                barrier.src_access_mask = AccessFlags@zero
95                barrier.dst_access_mask = AccessFlags/ShaderRead
96                source_stage = PipelineStageFlags/TopOfPipe
97                destination_stage = PipelineStageFlags/VertexShader
98                                    | PipelineStageFlags/FragmentShader
99                                    | PipelineStageFlags/ComputeShader
100   
101           else if from == ImageLayout/Undefined && to == ImageLayout/General then
102               barrier.src_access_mask = AccessFlags@zero
103               barrier.dst_access_mask = AccessFlags/ShaderRead
104                                         | AccessFlags/ShaderWrite
105   
106               source_stage = PipelineStageFlags/TopOfPipe
107               destination_stage = PipelineStageFlags/VertexShader
108                                   | PipelineStageFlags/FragmentShader
109                                   | PipelineStageFlags/ComputeShader
110   
111           else if from == ImageLayout/General
112                   && to == ImageLayout/ShaderReadOnlyOptimal
113           then
114               barrier.src_access_mask = AccessFlags/ShaderRead
115                                         | AccessFlags/ShaderWrite
116   
117               barrier.dst_access_mask = AccessFlags/ShaderRead
118               source_stage = PipelineStageFlags/VertexShader
119                              | PipelineStageFlags/FragmentShader
120                              | PipelineStageFlags/ComputeShader
121   
122               destination_stage = PipelineStageFlags/VertexShader
123                                   | PipelineStageFlags/FragmentShader
124                                   | PipelineStageFlags/ComputeShader
125   
126           else if from == ImageLayout/ShaderReadOnlyOptimal
127                   && to == ImageLayout/General
128           then
129               barrier.src_access_mask = AccessFlags/ShaderRead
130               barrier.dst_access_mask = AccessFlags/ShaderRead
131                                         | AccessFlags/ShaderWrite
132   
133               source_stage = PipelineStageFlags/VertexShader
134                              | PipelineStageFlags/FragmentShader
135                              | PipelineStageFlags/ComputeShader
136   
137               destination_stage = PipelineStageFlags/VertexShader
138                                   | PipelineStageFlags/FragmentShader
139                                   | PipelineStageFlags/ComputeShader
140   
141           else if from == ImageLayout/TransferDstOptimal && to == ImageLayout/General
142           then
143               barrier.src_access_mask = AccessFlags/TransferWrite
144               barrier.dst_access_mask = AccessFlags/ShaderRead
145                                         | AccessFlags/ShaderWrite
146   
147               source_stage = PipelineStageFlags/Transfer
148               destination_stage = PipelineStageFlags/VertexShader
149                                   | PipelineStageFlags/FragmentShader
150                                   | PipelineStageFlags/ComputeShader
151   
152           else if from == ImageLayout/DepthStencilAttachmentOptimal
153                   && to == ImageLayout/TransferSrcOptimal
154           then
155               barrier.src_access_mask = AccessFlags/ShaderWrite
156               barrier.dst_access_mask = AccessFlags/TransferRead
157   
158               source_stage = PipelineStageFlags/FragmentShader
159               destination_stage = PipelineStageFlags/Transfer
160   
161           else if from == ImageLayout/TransferSrcOptimal
162                   && to == ImageLayout/DepthStencilAttachmentOptimal
163           then
164               barrier.src_access_mask = AccessFlags/TransferRead
165               barrier.dst_access_mask = AccessFlags/ShaderWrite
166   
167               source_stage = PipelineStageFlags/Transfer
168               destination_stage = PipelineStageFlags/FragmentShader
169   
170           else if from == ImageLayout/ShaderReadOnlyOptimal
171                   && to == ImageLayout/TransferDstOptimal
172           then
173               barrier.src_access_mask = AccessFlags/ShaderRead
174               barrier.dst_access_mask = AccessFlags/TransferWrite
175               source_stage = PipelineStageFlags/VertexShader
176                              | PipelineStageFlags/FragmentShader
177                              | PipelineStageFlags/ComputeShader
178   
179               destination_stage = PipelineStageFlags/Transfer
180           else
181               fail "unexpected case"
182   
183           vk/cmd_pipeline_barrier command_buffer.object source_stage destination_stage
184                                   DependencyFlags@zero 0 null 0 null 1 barrier@ptr
185   
186           self.layout = to
187