asi_vulkan/
image.rs

1// "asi_vulkan" - Aldaron's System Interface - Vulkan
2//
3// Copyright Jeron A. Lau 2018.
4// Distributed under the Boost Software License, Version 1.0.
5// (See accompanying file LICENSE_1_0.txt or copy at
6// https://www.boost.org/LICENSE_1_0.txt)
7
8use std::mem;
9use std::ptr::{ null };
10
11use Gpu;
12use types::*;
13use get_memory_type;
14use std::{ rc::Rc };
15
16/// An Image
17#[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	/// Create a new image.
28	#[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	/// Get the memory handle for this image.
103	pub fn memory(&self) -> u64 {
104		self.image().1
105	}
106
107	/// Get the image view for this image
108	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}