1 def resolve_multisample (from : Image 2 to : Image 3 post_barrier : BarrierFlags) = 4 let command_buffer : CommandBuffer @auto 5 6 assert from.usage.contains ImageUsageFlags/TransferSrc 7 assert from.view_type == ViewType/2d 8 assert from.samples <> SampleCountFlags/1 9 10 assert to.usage.contains ImageUsageFlags/TransferDst 11 assert to.view_type == ViewType/2d 12 assert to.samples == SampleCountFlags/1 13 14 assert from.format == to.format 15 assert from.width == to.width && from.height == to.height 16 && from.depth == to.depth 17 assert from.aspect_mask == to.aspect_mask 18 19 let from_barrier = ImageMemoryBarrier 20 src_access_mask = AccessFlags@zero 21 dst_access_mask = AccessFlags/TransferRead 22 subresource_range = ImageSubresourceRange 23 aspect_mask = from.aspect_mask 24 level_count = 1 25 layer_count = 1 26 f@ from.subresource_range 27 28 f@ from.barrier_to ImageLayout/TransferSrcOptimal 29 30 vk/cmd_pipeline_barrier command_buffer.object 31 PipelineStageFlags/BottomOfPipe 32 PipelineStageFlags/Transfer DependencyFlags@zero 33 0 null 0 null 1 from_barrier@ptr 34 35 let to_barrier = ImageMemoryBarrier 36 dst_access_mask = AccessFlags/TransferWrite 37 subresource_range = ImageSubresourceRange 38 level_count = 1 39 layer_count = 1 40 f@ to.subresource_range 41 42 f@ to.barrier_to ImageLayout/TransferDstOptimal 43 44 vk/cmd_pipeline_barrier command_buffer.object 45 PipelineStageFlags/TopOfPipe 46 PipelineStageFlags/Transfer DependencyFlags@zero 47 0 null 0 null 1 to_barrier@ptr 48 49 let image_resolve = ImageResolve 50 src_subresource = ImageSubresourceLayers 51 aspect_mask = from.aspect_mask 52 mip_level = from.base_mip_level 53 base_array_layer = from.base_layer 54 layer_count = 1 55 56 src_offset = Offset3D 0 0 0 57 dst_subresource = ImageSubresourceLayers 58 aspect_mask = to.aspect_mask 59 mip_level = to.base_mip_level 60 base_array_layer = to.base_layer 61 layer_count = 1 62 63 dst_offset = Offset3D 0 0 0 64 extent = Extent3D 65 width = from.width 66 height = from.height 67 depth = from.depth 68 69 vk/cmd_resolve_image command_buffer.object from.object 70 ImageLayout/TransferSrcOptimal 71 to.object ImageLayout/TransferDstOptimal 1 72 image_resolve@ptr 73 74 let mut barrier_flags = PipelineStageFlags@zero 75 let mut access_flags = AccessFlags@zero 76 if post_barrier.contains BarrierFlags/Compute then 77 barrier_flags |= PipelineStageFlags/ComputeShader 78 access_flags |= AccessFlags/ShaderRead | AccessFlags/ShaderWrite 79 80 if post_barrier.contains BarrierFlags/Raster then 81 barrier_flags |= PipelineStageFlags/VertexShader 82 | PipelineStageFlags/FragmentShader 83 84 access_flags |= AccessFlags/ShaderRead | AccessFlags/ShaderWrite 85 86 if post_barrier.contains BarrierFlags/Transfer then 87 barrier_flags |= PipelineStageFlags/Transfer 88 access_flags |= AccessFlags/TransferWrite 89 90 if barrier_flags == PipelineStageFlags@zero then 91 barrier_flags = PipelineStageFlags/BottomOfPipe 92 93 let from_back_barrier = ImageMemoryBarrier 94 src_access_mask = AccessFlags/TransferRead 95 dst_access_mask = access_flags 96 old_layout = ImageLayout/TransferSrcOptimal 97 subresource_range = ImageSubresourceRange 98 aspect_mask = from.aspect_mask 99 level_count = 1 100 layer_count = 1 101 f@ from.subresource_range 102 103 f@ from.barrier_to from.layout 104 105 vk/cmd_pipeline_barrier command_buffer.object PipelineStageFlags/Transfer 106 barrier_flags DependencyFlags@zero 0 null 0 null 1 107 from_back_barrier@ptr 108 109 let to_back_barrier = ImageMemoryBarrier 110 src_access_mask = AccessFlags/TransferWrite 111 dst_access_mask = access_flags 112 old_layout = ImageLayout/TransferDstOptimal 113 image = to.object 114 subresource_range = ImageSubresourceRange 115 level_count = 1 116 layer_count = 1 117 f@ to.subresource_range 118 119 f@ to.barrier_to to.layout 120 121 vk/cmd_pipeline_barrier command_buffer.object PipelineStageFlags/Transfer 122 barrier_flags DependencyFlags@zero 0 null 123 0 null 1 to_back_barrier@ptr 124