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