1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 use std::ptr;
6 
7 #[derive(Clone)]
8 pub struct ExtendedDynamicState {
9     fp: vk::ExtExtendedDynamicStateFn,
10 }
11 
12 impl ExtendedDynamicState {
new(instance: &Instance, device: &Device) -> Self13     pub fn new(instance: &Instance, device: &Device) -> Self {
14         let fp = vk::ExtExtendedDynamicStateFn::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/vkCmdSetCullModeEXT.html>
21     #[inline]
cmd_set_cull_mode( &self, command_buffer: vk::CommandBuffer, cull_mode: vk::CullModeFlags, )22     pub unsafe fn cmd_set_cull_mode(
23         &self,
24         command_buffer: vk::CommandBuffer,
25         cull_mode: vk::CullModeFlags,
26     ) {
27         (self.fp.cmd_set_cull_mode_ext)(command_buffer, cull_mode)
28     }
29 
30     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetFrontFaceEXT.html>
31     #[inline]
cmd_set_front_face( &self, command_buffer: vk::CommandBuffer, front_face: vk::FrontFace, )32     pub unsafe fn cmd_set_front_face(
33         &self,
34         command_buffer: vk::CommandBuffer,
35         front_face: vk::FrontFace,
36     ) {
37         (self.fp.cmd_set_front_face_ext)(command_buffer, front_face)
38     }
39 
40     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetPrimitiveTopologyEXT.html>
41     #[inline]
cmd_set_primitive_topology( &self, command_buffer: vk::CommandBuffer, primitive_topology: vk::PrimitiveTopology, )42     pub unsafe fn cmd_set_primitive_topology(
43         &self,
44         command_buffer: vk::CommandBuffer,
45         primitive_topology: vk::PrimitiveTopology,
46     ) {
47         (self.fp.cmd_set_primitive_topology_ext)(command_buffer, primitive_topology)
48     }
49 
50     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetViewportWithCountEXT.html>
51     #[inline]
cmd_set_viewport_with_count( &self, command_buffer: vk::CommandBuffer, viewports: &[vk::Viewport], )52     pub unsafe fn cmd_set_viewport_with_count(
53         &self,
54         command_buffer: vk::CommandBuffer,
55         viewports: &[vk::Viewport],
56     ) {
57         (self.fp.cmd_set_viewport_with_count_ext)(
58             command_buffer,
59             viewports.len() as u32,
60             viewports.as_ptr(),
61         )
62     }
63 
64     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetScissorWithCountEXT.html>
65     #[inline]
cmd_set_scissor_with_count( &self, command_buffer: vk::CommandBuffer, scissors: &[vk::Rect2D], )66     pub unsafe fn cmd_set_scissor_with_count(
67         &self,
68         command_buffer: vk::CommandBuffer,
69         scissors: &[vk::Rect2D],
70     ) {
71         (self.fp.cmd_set_scissor_with_count_ext)(
72             command_buffer,
73             scissors.len() as u32,
74             scissors.as_ptr(),
75         )
76     }
77 
78     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBindVertexBuffers2EXT.html>
79     #[inline]
cmd_bind_vertex_buffers2( &self, command_buffer: vk::CommandBuffer, first_binding: u32, buffers: &[vk::Buffer], offsets: &[vk::DeviceSize], sizes: Option<&[vk::DeviceSize]>, strides: Option<&[vk::DeviceSize]>, )80     pub unsafe fn cmd_bind_vertex_buffers2(
81         &self,
82         command_buffer: vk::CommandBuffer,
83         first_binding: u32,
84         buffers: &[vk::Buffer],
85         offsets: &[vk::DeviceSize],
86         sizes: Option<&[vk::DeviceSize]>,
87         strides: Option<&[vk::DeviceSize]>,
88     ) {
89         assert_eq!(offsets.len(), buffers.len());
90         let p_sizes = if let Some(sizes) = sizes {
91             assert_eq!(sizes.len(), buffers.len());
92             sizes.as_ptr()
93         } else {
94             ptr::null()
95         };
96         let p_strides = if let Some(strides) = strides {
97             assert_eq!(strides.len(), buffers.len());
98             strides.as_ptr()
99         } else {
100             ptr::null()
101         };
102         (self.fp.cmd_bind_vertex_buffers2_ext)(
103             command_buffer,
104             first_binding,
105             buffers.len() as u32,
106             buffers.as_ptr(),
107             offsets.as_ptr(),
108             p_sizes,
109             p_strides,
110         )
111     }
112 
113     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthTestEnableEXT.html>
114     #[inline]
cmd_set_depth_test_enable( &self, command_buffer: vk::CommandBuffer, depth_test_enable: bool, )115     pub unsafe fn cmd_set_depth_test_enable(
116         &self,
117         command_buffer: vk::CommandBuffer,
118         depth_test_enable: bool,
119     ) {
120         (self.fp.cmd_set_depth_test_enable_ext)(command_buffer, depth_test_enable.into())
121     }
122 
123     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthWriteEnableEXT.html>
124     #[inline]
cmd_set_depth_write_enable( &self, command_buffer: vk::CommandBuffer, depth_write_enable: bool, )125     pub unsafe fn cmd_set_depth_write_enable(
126         &self,
127         command_buffer: vk::CommandBuffer,
128         depth_write_enable: bool,
129     ) {
130         (self.fp.cmd_set_depth_write_enable_ext)(command_buffer, depth_write_enable.into())
131     }
132 
133     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthCompareOpEXT.html>
134     #[inline]
cmd_set_depth_compare_op( &self, command_buffer: vk::CommandBuffer, depth_compare_op: vk::CompareOp, )135     pub unsafe fn cmd_set_depth_compare_op(
136         &self,
137         command_buffer: vk::CommandBuffer,
138         depth_compare_op: vk::CompareOp,
139     ) {
140         (self.fp.cmd_set_depth_compare_op_ext)(command_buffer, depth_compare_op)
141     }
142 
143     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthBoundsTestEnableEXT.html>
144     #[inline]
cmd_set_depth_bounds_test_enable( &self, command_buffer: vk::CommandBuffer, depth_bounds_test_enable: bool, )145     pub unsafe fn cmd_set_depth_bounds_test_enable(
146         &self,
147         command_buffer: vk::CommandBuffer,
148         depth_bounds_test_enable: bool,
149     ) {
150         (self.fp.cmd_set_depth_bounds_test_enable_ext)(
151             command_buffer,
152             depth_bounds_test_enable.into(),
153         )
154     }
155 
156     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetStencilTestEnableEXT.html>
157     #[inline]
cmd_set_stencil_test_enable( &self, command_buffer: vk::CommandBuffer, stencil_test_enable: bool, )158     pub unsafe fn cmd_set_stencil_test_enable(
159         &self,
160         command_buffer: vk::CommandBuffer,
161         stencil_test_enable: bool,
162     ) {
163         (self.fp.cmd_set_stencil_test_enable_ext)(command_buffer, stencil_test_enable.into())
164     }
165 
166     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetStencilOpEXT.html>
167     #[inline]
cmd_set_stencil_op( &self, command_buffer: vk::CommandBuffer, face_mask: vk::StencilFaceFlags, fail_op: vk::StencilOp, pass_op: vk::StencilOp, depth_fail_op: vk::StencilOp, compare_op: vk::CompareOp, )168     pub unsafe fn cmd_set_stencil_op(
169         &self,
170         command_buffer: vk::CommandBuffer,
171         face_mask: vk::StencilFaceFlags,
172         fail_op: vk::StencilOp,
173         pass_op: vk::StencilOp,
174         depth_fail_op: vk::StencilOp,
175         compare_op: vk::CompareOp,
176     ) {
177         (self.fp.cmd_set_stencil_op_ext)(
178             command_buffer,
179             face_mask,
180             fail_op,
181             pass_op,
182             depth_fail_op,
183             compare_op,
184         )
185     }
186 
187     #[inline]
name() -> &'static CStr188     pub const fn name() -> &'static CStr {
189         vk::ExtExtendedDynamicStateFn::name()
190     }
191 
192     #[inline]
fp(&self) -> &vk::ExtExtendedDynamicStateFn193     pub fn fp(&self) -> &vk::ExtExtendedDynamicStateFn {
194         &self.fp
195     }
196 }
197