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 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 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 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 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 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 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 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 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 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 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 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 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}