ash/extensions/ext/
extended_dynamic_state.rs

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