1use std::mem;
9use std::ptr::{ null };
10
11use Gpu;
12use types::*;
13use get_memory_type;
14use std::{ rc::Rc };
15
16#[derive(Clone)] pub struct Image(Rc<ImageContext>);
18
19struct ImageContext {
20 image: u64,
21 memory: u64,
22 view: u64,
23 vulkan: Gpu,
24}
25
26impl Image {
27 #[inline(always)] pub fn new(vulkan: &Gpu, width: u32, height: u32,
29 format: VkFormat, tiling: VkImageTiling, usage: VkImageUsage,
30 initial_layout: VkImageLayout, reqs_mask: VkFlags,
31 samples: VkSampleCount) -> Image
32 { unsafe {
33 let mut image = mem::uninitialized();
34 let mut memory = mem::uninitialized();
35 let mut memory_reqs = mem::uninitialized();
36
37 (vulkan.get().create_image)(
38 vulkan.get().device,
39 &VkImageCreateInfo {
40 s_type: VkStructureType::ImageCreateInfo,
41 p_next: null(),
42 flags: 0,
43 image_type: VkImageType::Dim2d,
44 format: format.clone(),
45 extent: VkExtent3D {
46 width,
47 height,
48 depth: 1,
49 },
50 mip_levels: 1,
51 array_layers: 1,
52 samples,
53 tiling,
54 usage,
55 sharing_mode: VkSharingMode::Exclusive,
56 queue_family_index_count: 0,
57 p_queue_family_indices: null(),
58 initial_layout,
59 },
60 null(),
61 &mut image
62 ).unwrap();
63
64 (vulkan.get().get_imgmemreq)(vulkan.get().device, image,
65 &mut memory_reqs);
66
67 let memory_type_index = get_memory_type(
68 vulkan,
69 memory_reqs.memory_type_bits,
70 reqs_mask
71 );
72
73 (vulkan.get().mem_allocate)(
74 vulkan.get().device,
75 &VkMemoryAllocateInfo {
76 s_type: VkStructureType::MemoryAllocateInfo,
77 next: null(),
78 allocation_size: memory_reqs.size,
79 memory_type_index,
80 },
81 null(),
82 &mut memory
83 ).unwrap();
84
85 (vulkan.get().bind_imgmem)(vulkan.get().device, image,
86 memory, 0).unwrap();
87
88 let view = ::create_img_view(vulkan, image,
89 format.clone(),
90 usage != VkImageUsage::DepthStencilAttachmentBit
91 );
92
93 Image(Rc::new(ImageContext {
94 vulkan: vulkan.clone(), image, memory, view
95 }))
96 } }
97
98 pub (crate) fn image(&self) -> (u64, u64, u64) {
99 (self.0.image, self.0.memory, self.0.view)
100 }
101
102 pub fn memory(&self) -> u64 {
104 self.image().1
105 }
106
107 pub fn view(&self) -> u64 {
109 self.image().2
110 }
111}
112
113impl Drop for ImageContext {
114 fn drop(&mut self) {
115 let vk = self.vulkan.get();
116
117 unsafe {
118 (vk.drop_image)(vk.device, self.image, null());
119 (vk.drop_memory)(vk.device, self.memory, null());
120 (vk.drop_imgview)(vk.device, self.view, null());
121 }
122 }
123}