1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{Device, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 7 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_pipeline_properties.html> 8 #[derive(Clone)] 9 pub struct PipelineProperties { 10 handle: vk::Device, 11 fp: vk::ExtPipelinePropertiesFn, 12 } 13 14 impl PipelineProperties { new(instance: &Instance, device: &Device) -> Self15 pub fn new(instance: &Instance, device: &Device) -> Self { 16 let handle = device.handle(); 17 let fp = vk::ExtPipelinePropertiesFn::load(|name| unsafe { 18 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 19 }); 20 Self { handle, fp } 21 } 22 23 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPipelinePropertiesEXT.html> 24 #[inline] get_pipeline_properties( &self, pipeline_info: &vk::PipelineInfoEXT, pipeline_properties: &mut impl vk::GetPipelinePropertiesEXTParamPipelineProperties, ) -> VkResult<()>25 pub unsafe fn get_pipeline_properties( 26 &self, 27 pipeline_info: &vk::PipelineInfoEXT, 28 pipeline_properties: &mut impl vk::GetPipelinePropertiesEXTParamPipelineProperties, 29 ) -> VkResult<()> { 30 (self.fp.get_pipeline_properties_ext)( 31 self.handle, 32 pipeline_info, 33 <*mut _>::cast(pipeline_properties), 34 ) 35 .result() 36 } 37 38 #[inline] name() -> &'static CStr39 pub const fn name() -> &'static CStr { 40 vk::ExtPipelinePropertiesFn::name() 41 } 42 43 #[inline] fp(&self) -> &vk::ExtPipelinePropertiesFn44 pub fn fp(&self) -> &vk::ExtPipelinePropertiesFn { 45 &self.fp 46 } 47 48 #[inline] device(&self) -> vk::Device49 pub fn device(&self) -> vk::Device { 50 self.handle 51 } 52 } 53