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