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