1 use crate::vk; 2 use crate::{Device, Instance}; 3 use std::ffi::c_void; 4 use std::ffi::CStr; 5 use std::mem; 6 7 #[derive(Clone)] 8 pub struct PushDescriptor { 9 fp: vk::KhrPushDescriptorFn, 10 } 11 12 impl PushDescriptor { new(instance: &Instance, device: &Device) -> Self13 pub fn new(instance: &Instance, device: &Device) -> Self { 14 let fp = vk::KhrPushDescriptorFn::load(|name| unsafe { 15 mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr())) 16 }); 17 Self { fp } 18 } 19 20 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdPushDescriptorSetKHR.html> 21 #[inline] cmd_push_descriptor_set( &self, command_buffer: vk::CommandBuffer, pipeline_bind_point: vk::PipelineBindPoint, layout: vk::PipelineLayout, set: u32, descriptor_writes: &[vk::WriteDescriptorSet], )22 pub unsafe fn cmd_push_descriptor_set( 23 &self, 24 command_buffer: vk::CommandBuffer, 25 pipeline_bind_point: vk::PipelineBindPoint, 26 layout: vk::PipelineLayout, 27 set: u32, 28 descriptor_writes: &[vk::WriteDescriptorSet], 29 ) { 30 (self.fp.cmd_push_descriptor_set_khr)( 31 command_buffer, 32 pipeline_bind_point, 33 layout, 34 set, 35 descriptor_writes.len() as u32, 36 descriptor_writes.as_ptr(), 37 ); 38 } 39 40 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdPushDescriptorSetWithTemplateKHR.html> 41 #[inline] cmd_push_descriptor_set_with_template( &self, command_buffer: vk::CommandBuffer, descriptor_update_template: vk::DescriptorUpdateTemplate, layout: vk::PipelineLayout, set: u32, p_data: *const c_void, )42 pub unsafe fn cmd_push_descriptor_set_with_template( 43 &self, 44 command_buffer: vk::CommandBuffer, 45 descriptor_update_template: vk::DescriptorUpdateTemplate, 46 layout: vk::PipelineLayout, 47 set: u32, 48 p_data: *const c_void, 49 ) { 50 (self.fp.cmd_push_descriptor_set_with_template_khr)( 51 command_buffer, 52 descriptor_update_template, 53 layout, 54 set, 55 p_data, 56 ); 57 } 58 59 #[inline] name() -> &'static CStr60 pub const fn name() -> &'static CStr { 61 vk::KhrPushDescriptorFn::name() 62 } 63 64 #[inline] fp(&self) -> &vk::KhrPushDescriptorFn65 pub fn fp(&self) -> &vk::KhrPushDescriptorFn { 66 &self.fp 67 } 68 } 69