1 use crate::vk; 2 use crate::{Device, Instance}; 3 use std::ffi::CStr; 4 use std::mem; 5 6 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_image_compression_control.html> 7 #[derive(Clone)] 8 pub struct ImageCompressionControl { 9 handle: vk::Device, 10 fp: vk::ExtImageCompressionControlFn, 11 } 12 13 impl ImageCompressionControl { new(instance: &Instance, device: &Device) -> Self14 pub fn new(instance: &Instance, device: &Device) -> Self { 15 let handle = device.handle(); 16 let fp = vk::ExtImageCompressionControlFn::load(|name| unsafe { 17 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 18 }); 19 Self { handle, fp } 20 } 21 22 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetImageSubresourceLayout2EXT.html> 23 #[inline] get_image_subresource_layout2( &self, image: vk::Image, subresource: &vk::ImageSubresource2EXT, layout: &mut vk::SubresourceLayout2EXT, )24 pub unsafe fn get_image_subresource_layout2( 25 &self, 26 image: vk::Image, 27 subresource: &vk::ImageSubresource2EXT, 28 layout: &mut vk::SubresourceLayout2EXT, 29 ) { 30 (self.fp.get_image_subresource_layout2_ext)(self.handle, image, subresource, layout) 31 } 32 33 #[inline] name() -> &'static CStr34 pub const fn name() -> &'static CStr { 35 vk::ExtImageCompressionControlFn::name() 36 } 37 38 #[inline] fp(&self) -> &vk::ExtImageCompressionControlFn39 pub fn fp(&self) -> &vk::ExtImageCompressionControlFn { 40 &self.fp 41 } 42 43 #[inline] device(&self) -> vk::Device44 pub fn device(&self) -> vk::Device { 45 self.handle 46 } 47 } 48