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