1     object VkImage =
2         def create (physical_device : VkPhysicalDevice
3                     device : VkDevice
4                     properties : ref ImageProperties) : (VkImage, VkMemory, u64) =
5             let mut flags = properties.flags
6             if properties.view_type == ViewType/Cube
7                || properties.view_type == ViewType/CubeArray
8             then
9                 flags |= ImageCreateFlags/CubeCompatible
10    
11            let image_type = case properties.view_type of
12                ViewType/1d -> ImageType/1d
13                ViewType/2d -> ImageType/2d
14                ViewType/3d -> ImageType/3d
15                ViewType/Cube -> ImageType/2d
16                ViewType/1dArray -> ImageType/1d
17                ViewType/2dArray -> ImageType/2d
18                ViewType/CubeArray -> ImageType/2d
19    
20            let create_info = ImageCreateInfo
21                type = StructureType/ImageCreateInfo
22                next = null
23                =flags
24                =image_type
25                format = properties.format
26                extent = Extent3D
27                    width = properties.width
28                    height = properties.height
29                    depth = properties.depth
30    
31                mip_levels = properties.mip_levels
32                array_layers = properties.array_layers
33                samples = properties.samples
34                tiling = properties.tiling
35                usage = properties.usage
36                sharing_mode = SharingMode/Exclusive
37                queue_family_index_count = 0
38                queue_family_indices = null
39                initial_layout = ImageLayout/Undefined
40    
41            let mut image = null
42            vk/create_image device create_info@ptr null image@mut_ptr
43    
44            let mut memory_requirements = struct@zero
45            vk/get_image_memory_requirements device image memory_requirements@mut_ptr
46            let size = memory_requirements.size
47    
48            let allocate_info = MemoryAllocateInfo
49                type = StructureType/MemoryAllocateInfo
50                next = null
51                allocation_size = size
52                memory_type_index = physical_device.get_memory_type_index
53                    memory_requirements.memory_type_bits
54                    properties.memory_flags
55    
56            let mut memory = null
57            vk/allocate_memory device allocate_info@ptr null memory@mut_ptr
58            vk/bind_image_memory device image memory 0
59    
60            (image, memory, size)
61    
62    object Image =
63        def create (name : String) (properties : ref ImageProperties) =
64            let instance : Instance @auto
65    
66            assert not properties.aspect_flags.contains ImageAspectFlags/Color
67                   || not is_depth_format properties.format
68    
69            let device = instance.device
70            let (image, memory, size) =
71                VkImage.create instance.physical_device device properties
72    
73            let view = VkImageView.create device properties.format properties.aspect_flags
74                                          0 properties.mip_levels 0 properties.array_layers
75                                          image properties.view_type ComponentMapping.default
76    
77            let sampler_properties = SamplerProperties
78                max_lod = properties.mip_levels as f32
79                f@ SamplerProperties.default
80    
81            let sampler = VkSampler.create device sampler_properties@ref
82    
83            set_name ObjectType/Image image.unwrap.as<u64> name
84    
85            Image name
86                  view_type = properties.view_type
87                  format = properties.format
88                  width = properties.width
89                  height = properties.height
90                  depth = properties.depth
91                  base_mip_level = 0
92                  mip_levels = properties.mip_levels
93                  base_layer = 0
94                  array_layers = properties.array_layers
95                  samples = properties.samples
96                  usage = properties.usage
97                  layout = ImageLayout/Undefined
98                  =device
99                  =sampler
100                 object = image
101                 =memory
102                 =view
103                 =size
104   
105       def from_memory (name : String) (memory : ImageMemory) =
106           let buffer_pool : BufferPool @auto
107           let command_buffer : CommandBuffer @auto
108   
109           let array_layers = 1
110           let width = memory.width
111           let height = memory.height
112           let format = memory.format.to_vk_format
113           let mip_levels = width.max height as f64 |> log2 |> floor as u32 + 1
114           let usage = ImageUsageFlags/TransferSrc
115                       | ImageUsageFlags/TransferDst
116                       | ImageUsageFlags/Sampled
117   
118           let image_properties = ImageProperties
119               =width =height =mip_levels =array_layers =format =usage
120               f@ ImageProperties.default
121   
122           let image = Image.create name image_properties@ref
123           image.update memory.bytes.as_slice
124   
125           image
126