1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 
6 #[derive(Clone)]
7 pub struct DrawIndirectCount {
8     fp: vk::KhrDrawIndirectCountFn,
9 }
10 
11 impl DrawIndirectCount {
new(instance: &Instance, device: &Device) -> Self12     pub fn new(instance: &Instance, device: &Device) -> Self {
13         let fp = vk::KhrDrawIndirectCountFn::load(|name| unsafe {
14             mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr()))
15         });
16         Self { fp }
17     }
18 
19     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawIndexedIndirectCountKHR.html>
20     #[inline]
cmd_draw_indexed_indirect_count( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, count_buffer: vk::Buffer, count_buffer_offset: vk::DeviceSize, max_draw_count: u32, stride: u32, )21     pub unsafe fn cmd_draw_indexed_indirect_count(
22         &self,
23         command_buffer: vk::CommandBuffer,
24         buffer: vk::Buffer,
25         offset: vk::DeviceSize,
26         count_buffer: vk::Buffer,
27         count_buffer_offset: vk::DeviceSize,
28         max_draw_count: u32,
29         stride: u32,
30     ) {
31         (self.fp.cmd_draw_indexed_indirect_count_khr)(
32             command_buffer,
33             buffer,
34             offset,
35             count_buffer,
36             count_buffer_offset,
37             max_draw_count,
38             stride,
39         );
40     }
41 
42     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawIndirectCountKHR.html>
43     #[inline]
cmd_draw_indirect_count( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, count_buffer: vk::Buffer, count_buffer_offset: vk::DeviceSize, max_draw_count: u32, stride: u32, )44     pub unsafe fn cmd_draw_indirect_count(
45         &self,
46         command_buffer: vk::CommandBuffer,
47         buffer: vk::Buffer,
48         offset: vk::DeviceSize,
49         count_buffer: vk::Buffer,
50         count_buffer_offset: vk::DeviceSize,
51         max_draw_count: u32,
52         stride: u32,
53     ) {
54         (self.fp.cmd_draw_indirect_count_khr)(
55             command_buffer,
56             buffer,
57             offset,
58             count_buffer,
59             count_buffer_offset,
60             max_draw_count,
61             stride,
62         );
63     }
64 
65     #[inline]
name() -> &'static CStr66     pub const fn name() -> &'static CStr {
67         vk::KhrDrawIndirectCountFn::name()
68     }
69 
70     #[inline]
fp(&self) -> &vk::KhrDrawIndirectCountFn71     pub fn fp(&self) -> &vk::KhrDrawIndirectCountFn {
72         &self.fp
73     }
74 }
75