1 use crate::prelude::*;
2 use crate::vk;
3 use crate::RawPtr;
4 use crate::{Device, Instance};
5 use std::ffi::CStr;
6 use std::mem;
7 use std::ptr;
8 
9 /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_shader_object.html>
10 #[derive(Clone)]
11 pub struct ShaderObject {
12     handle: vk::Device,
13     fp: vk::ExtShaderObjectFn,
14 }
15 
16 impl ShaderObject {
new(instance: &Instance, device: &Device) -> Self17     pub fn new(instance: &Instance, device: &Device) -> Self {
18         let handle = device.handle();
19         let fp = vk::ExtShaderObjectFn::load(|name| unsafe {
20             mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
21         });
22         Self { handle, fp }
23     }
24 
25     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateShadersEXT.html>
26     #[inline]
create_shaders( &self, create_infos: &[vk::ShaderCreateInfoEXT], allocator: Option<&vk::AllocationCallbacks>, ) -> VkResult<Vec<vk::ShaderEXT>>27     pub unsafe fn create_shaders(
28         &self,
29         create_infos: &[vk::ShaderCreateInfoEXT],
30         allocator: Option<&vk::AllocationCallbacks>,
31     ) -> VkResult<Vec<vk::ShaderEXT>> {
32         let mut shaders = Vec::with_capacity(create_infos.len());
33         (self.fp.create_shaders_ext)(
34             self.handle,
35             create_infos.len() as u32,
36             create_infos.as_ptr(),
37             allocator.as_raw_ptr(),
38             shaders.as_mut_ptr(),
39         )
40         .result()?;
41         shaders.set_len(create_infos.len());
42         Ok(shaders)
43     }
44 
45     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDestroyShaderEXT.html>
46     #[inline]
destroy_shader( &self, shader: vk::ShaderEXT, allocator: Option<&vk::AllocationCallbacks>, )47     pub unsafe fn destroy_shader(
48         &self,
49         shader: vk::ShaderEXT,
50         allocator: Option<&vk::AllocationCallbacks>,
51     ) {
52         (self.fp.destroy_shader_ext)(self.handle, shader, allocator.as_raw_ptr())
53     }
54 
55     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetShaderBinaryDataEXT.html>
56     #[inline]
get_shader_binary_data(&self, shader: vk::ShaderEXT) -> VkResult<Vec<u8>>57     pub unsafe fn get_shader_binary_data(&self, shader: vk::ShaderEXT) -> VkResult<Vec<u8>> {
58         read_into_uninitialized_vector(|count, data: *mut u8| {
59             (self.fp.get_shader_binary_data_ext)(self.handle, shader, count, data.cast())
60         })
61     }
62 
63     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBindShadersEXT.html>
64     #[inline]
cmd_bind_shaders( &self, command_buffer: vk::CommandBuffer, stages: &[vk::ShaderStageFlags], shaders: &[vk::ShaderEXT], )65     pub unsafe fn cmd_bind_shaders(
66         &self,
67         command_buffer: vk::CommandBuffer,
68         stages: &[vk::ShaderStageFlags],
69         shaders: &[vk::ShaderEXT],
70     ) {
71         assert_eq!(stages.len(), shaders.len());
72         (self.fp.cmd_bind_shaders_ext)(
73             command_buffer,
74             stages.len() as u32,
75             stages.as_ptr(),
76             shaders.as_ptr(),
77         )
78     }
79 
80     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetVertexInputEXT.html>
81     #[inline]
cmd_set_vertex_input( &self, command_buffer: vk::CommandBuffer, vertex_binding_descriptions: &[vk::VertexInputBindingDescription2EXT], vertex_attribute_descriptions: &[vk::VertexInputAttributeDescription2EXT], )82     pub unsafe fn cmd_set_vertex_input(
83         &self,
84         command_buffer: vk::CommandBuffer,
85         vertex_binding_descriptions: &[vk::VertexInputBindingDescription2EXT],
86         vertex_attribute_descriptions: &[vk::VertexInputAttributeDescription2EXT],
87     ) {
88         (self.fp.cmd_set_vertex_input_ext)(
89             command_buffer,
90             vertex_binding_descriptions.len() as u32,
91             vertex_binding_descriptions.as_ptr(),
92             vertex_attribute_descriptions.len() as u32,
93             vertex_attribute_descriptions.as_ptr(),
94         )
95     }
96 
97     // --- extended_dynamic_state functions ---
98 
99     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCullModeEXT.html>
100     #[inline]
cmd_set_cull_mode( &self, command_buffer: vk::CommandBuffer, cull_mode: vk::CullModeFlags, )101     pub unsafe fn cmd_set_cull_mode(
102         &self,
103         command_buffer: vk::CommandBuffer,
104         cull_mode: vk::CullModeFlags,
105     ) {
106         (self.fp.cmd_set_cull_mode_ext)(command_buffer, cull_mode)
107     }
108 
109     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetFrontFaceEXT.html>
110     #[inline]
cmd_set_front_face( &self, command_buffer: vk::CommandBuffer, front_face: vk::FrontFace, )111     pub unsafe fn cmd_set_front_face(
112         &self,
113         command_buffer: vk::CommandBuffer,
114         front_face: vk::FrontFace,
115     ) {
116         (self.fp.cmd_set_front_face_ext)(command_buffer, front_face)
117     }
118 
119     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetPrimitiveTopologyEXT.html>
120     #[inline]
cmd_set_primitive_topology( &self, command_buffer: vk::CommandBuffer, primitive_topology: vk::PrimitiveTopology, )121     pub unsafe fn cmd_set_primitive_topology(
122         &self,
123         command_buffer: vk::CommandBuffer,
124         primitive_topology: vk::PrimitiveTopology,
125     ) {
126         (self.fp.cmd_set_primitive_topology_ext)(command_buffer, primitive_topology)
127     }
128 
129     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetViewportWithCountEXT.html>
130     #[inline]
cmd_set_viewport_with_count( &self, command_buffer: vk::CommandBuffer, viewports: &[vk::Viewport], )131     pub unsafe fn cmd_set_viewport_with_count(
132         &self,
133         command_buffer: vk::CommandBuffer,
134         viewports: &[vk::Viewport],
135     ) {
136         (self.fp.cmd_set_viewport_with_count_ext)(
137             command_buffer,
138             viewports.len() as u32,
139             viewports.as_ptr(),
140         )
141     }
142 
143     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetScissorWithCountEXT.html>
144     #[inline]
cmd_set_scissor_with_count( &self, command_buffer: vk::CommandBuffer, scissors: &[vk::Rect2D], )145     pub unsafe fn cmd_set_scissor_with_count(
146         &self,
147         command_buffer: vk::CommandBuffer,
148         scissors: &[vk::Rect2D],
149     ) {
150         (self.fp.cmd_set_scissor_with_count_ext)(
151             command_buffer,
152             scissors.len() as u32,
153             scissors.as_ptr(),
154         )
155     }
156 
157     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBindVertexBuffers2EXT.html>
158     #[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]>, )159     pub unsafe fn cmd_bind_vertex_buffers2(
160         &self,
161         command_buffer: vk::CommandBuffer,
162         first_binding: u32,
163         buffers: &[vk::Buffer],
164         offsets: &[vk::DeviceSize],
165         sizes: Option<&[vk::DeviceSize]>,
166         strides: Option<&[vk::DeviceSize]>,
167     ) {
168         assert_eq!(offsets.len(), buffers.len());
169         let p_sizes = if let Some(sizes) = sizes {
170             assert_eq!(sizes.len(), buffers.len());
171             sizes.as_ptr()
172         } else {
173             ptr::null()
174         };
175         let p_strides = if let Some(strides) = strides {
176             assert_eq!(strides.len(), buffers.len());
177             strides.as_ptr()
178         } else {
179             ptr::null()
180         };
181         (self.fp.cmd_bind_vertex_buffers2_ext)(
182             command_buffer,
183             first_binding,
184             buffers.len() as u32,
185             buffers.as_ptr(),
186             offsets.as_ptr(),
187             p_sizes,
188             p_strides,
189         )
190     }
191 
192     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthTestEnableEXT.html>
193     #[inline]
cmd_set_depth_test_enable( &self, command_buffer: vk::CommandBuffer, depth_test_enable: bool, )194     pub unsafe fn cmd_set_depth_test_enable(
195         &self,
196         command_buffer: vk::CommandBuffer,
197         depth_test_enable: bool,
198     ) {
199         (self.fp.cmd_set_depth_test_enable_ext)(command_buffer, depth_test_enable.into())
200     }
201 
202     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthWriteEnableEXT.html>
203     #[inline]
cmd_set_depth_write_enable( &self, command_buffer: vk::CommandBuffer, depth_write_enable: bool, )204     pub unsafe fn cmd_set_depth_write_enable(
205         &self,
206         command_buffer: vk::CommandBuffer,
207         depth_write_enable: bool,
208     ) {
209         (self.fp.cmd_set_depth_write_enable_ext)(command_buffer, depth_write_enable.into())
210     }
211 
212     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthCompareOpEXT.html>
213     #[inline]
cmd_set_depth_compare_op( &self, command_buffer: vk::CommandBuffer, depth_compare_op: vk::CompareOp, )214     pub unsafe fn cmd_set_depth_compare_op(
215         &self,
216         command_buffer: vk::CommandBuffer,
217         depth_compare_op: vk::CompareOp,
218     ) {
219         (self.fp.cmd_set_depth_compare_op_ext)(command_buffer, depth_compare_op)
220     }
221 
222     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthBoundsTestEnableEXT.html>
223     #[inline]
cmd_set_depth_bounds_test_enable( &self, command_buffer: vk::CommandBuffer, depth_bounds_test_enable: bool, )224     pub unsafe fn cmd_set_depth_bounds_test_enable(
225         &self,
226         command_buffer: vk::CommandBuffer,
227         depth_bounds_test_enable: bool,
228     ) {
229         (self.fp.cmd_set_depth_bounds_test_enable_ext)(
230             command_buffer,
231             depth_bounds_test_enable.into(),
232         )
233     }
234 
235     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetStencilTestEnableEXT.html>
236     #[inline]
cmd_set_stencil_test_enable( &self, command_buffer: vk::CommandBuffer, stencil_test_enable: bool, )237     pub unsafe fn cmd_set_stencil_test_enable(
238         &self,
239         command_buffer: vk::CommandBuffer,
240         stencil_test_enable: bool,
241     ) {
242         (self.fp.cmd_set_stencil_test_enable_ext)(command_buffer, stencil_test_enable.into())
243     }
244 
245     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetStencilOpEXT.html>
246     #[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, )247     pub unsafe fn cmd_set_stencil_op(
248         &self,
249         command_buffer: vk::CommandBuffer,
250         face_mask: vk::StencilFaceFlags,
251         fail_op: vk::StencilOp,
252         pass_op: vk::StencilOp,
253         depth_fail_op: vk::StencilOp,
254         compare_op: vk::CompareOp,
255     ) {
256         (self.fp.cmd_set_stencil_op_ext)(
257             command_buffer,
258             face_mask,
259             fail_op,
260             pass_op,
261             depth_fail_op,
262             compare_op,
263         )
264     }
265 
266     // --- extended_dynamic_state2 functions ---
267 
268     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetPatchControlPointsEXT.html>
269     #[inline]
cmd_set_patch_control_points( &self, command_buffer: vk::CommandBuffer, patch_control_points: u32, )270     pub unsafe fn cmd_set_patch_control_points(
271         &self,
272         command_buffer: vk::CommandBuffer,
273         patch_control_points: u32,
274     ) {
275         (self.fp.cmd_set_patch_control_points_ext)(command_buffer, patch_control_points)
276     }
277 
278     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetRasterizerDiscardEnableEXT.html>
279     #[inline]
cmd_set_rasterizer_discard_enable( &self, command_buffer: vk::CommandBuffer, rasterizer_discard_enable: bool, )280     pub unsafe fn cmd_set_rasterizer_discard_enable(
281         &self,
282         command_buffer: vk::CommandBuffer,
283         rasterizer_discard_enable: bool,
284     ) {
285         (self.fp.cmd_set_rasterizer_discard_enable_ext)(
286             command_buffer,
287             rasterizer_discard_enable.into(),
288         )
289     }
290 
291     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthBiasEnableEXT.html>
292     #[inline]
cmd_set_depth_bias_enable( &self, command_buffer: vk::CommandBuffer, depth_bias_enable: bool, )293     pub unsafe fn cmd_set_depth_bias_enable(
294         &self,
295         command_buffer: vk::CommandBuffer,
296         depth_bias_enable: bool,
297     ) {
298         (self.fp.cmd_set_depth_bias_enable_ext)(command_buffer, depth_bias_enable.into())
299     }
300 
301     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetLogicOpEXT.html>
302     #[inline]
cmd_set_logic_op( &self, command_buffer: vk::CommandBuffer, logic_op: vk::LogicOp, )303     pub unsafe fn cmd_set_logic_op(
304         &self,
305         command_buffer: vk::CommandBuffer,
306         logic_op: vk::LogicOp,
307     ) {
308         (self.fp.cmd_set_logic_op_ext)(command_buffer, logic_op)
309     }
310 
311     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetPrimitiveRestartEnableEXT.html>
312     #[inline]
cmd_set_primitive_restart_enable( &self, command_buffer: vk::CommandBuffer, primitive_restart_enable: bool, )313     pub unsafe fn cmd_set_primitive_restart_enable(
314         &self,
315         command_buffer: vk::CommandBuffer,
316         primitive_restart_enable: bool,
317     ) {
318         (self.fp.cmd_set_primitive_restart_enable_ext)(
319             command_buffer,
320             primitive_restart_enable.into(),
321         )
322     }
323 
324     // --- extended_dynamic_state3 functions ---
325 
326     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetTessellationDomainOriginEXT.html>
327     #[inline]
cmd_set_tessellation_domain_origin( &self, command_buffer: vk::CommandBuffer, domain_origin: vk::TessellationDomainOrigin, )328     pub unsafe fn cmd_set_tessellation_domain_origin(
329         &self,
330         command_buffer: vk::CommandBuffer,
331         domain_origin: vk::TessellationDomainOrigin,
332     ) {
333         (self.fp.cmd_set_tessellation_domain_origin_ext)(command_buffer, domain_origin)
334     }
335 
336     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthClampEnableEXT.html>
337     #[inline]
cmd_set_depth_clamp_enable( &self, command_buffer: vk::CommandBuffer, depth_clamp_enable: bool, )338     pub unsafe fn cmd_set_depth_clamp_enable(
339         &self,
340         command_buffer: vk::CommandBuffer,
341         depth_clamp_enable: bool,
342     ) {
343         (self.fp.cmd_set_depth_clamp_enable_ext)(command_buffer, depth_clamp_enable.into())
344     }
345 
346     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetPolygonModeEXT.html>
347     #[inline]
cmd_set_polygon_mode( &self, command_buffer: vk::CommandBuffer, polygon_mode: vk::PolygonMode, )348     pub unsafe fn cmd_set_polygon_mode(
349         &self,
350         command_buffer: vk::CommandBuffer,
351         polygon_mode: vk::PolygonMode,
352     ) {
353         (self.fp.cmd_set_polygon_mode_ext)(command_buffer, polygon_mode)
354     }
355 
356     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetRasterizationSamplesEXT.html>
357     #[inline]
cmd_set_rasterization_samples( &self, command_buffer: vk::CommandBuffer, rasterization_samples: vk::SampleCountFlags, )358     pub unsafe fn cmd_set_rasterization_samples(
359         &self,
360         command_buffer: vk::CommandBuffer,
361         rasterization_samples: vk::SampleCountFlags,
362     ) {
363         (self.fp.cmd_set_rasterization_samples_ext)(command_buffer, rasterization_samples)
364     }
365 
366     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetSampleMaskEXT.html>
367     #[inline]
cmd_set_sample_mask( &self, command_buffer: vk::CommandBuffer, samples: vk::SampleCountFlags, sample_mask: &[vk::SampleMask], )368     pub unsafe fn cmd_set_sample_mask(
369         &self,
370         command_buffer: vk::CommandBuffer,
371         samples: vk::SampleCountFlags,
372         sample_mask: &[vk::SampleMask],
373     ) {
374         assert!(
375             samples.as_raw().is_power_of_two(),
376             "Only one SampleCount bit must be set"
377         );
378         assert_eq!(samples.as_raw() as usize / 32, sample_mask.len());
379         (self.fp.cmd_set_sample_mask_ext)(command_buffer, samples, sample_mask.as_ptr())
380     }
381 
382     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetAlphaToCoverageEnableEXT.html>
383     #[inline]
cmd_set_alpha_to_coverage_enable( &self, command_buffer: vk::CommandBuffer, alpha_to_coverage_enable: bool, )384     pub unsafe fn cmd_set_alpha_to_coverage_enable(
385         &self,
386         command_buffer: vk::CommandBuffer,
387         alpha_to_coverage_enable: bool,
388     ) {
389         (self.fp.cmd_set_alpha_to_coverage_enable_ext)(
390             command_buffer,
391             alpha_to_coverage_enable.into(),
392         )
393     }
394 
395     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetAlphaToOneEnableEXT.html>
396     #[inline]
cmd_set_alpha_to_one_enable( &self, command_buffer: vk::CommandBuffer, alpha_to_one_enable: bool, )397     pub unsafe fn cmd_set_alpha_to_one_enable(
398         &self,
399         command_buffer: vk::CommandBuffer,
400         alpha_to_one_enable: bool,
401     ) {
402         (self.fp.cmd_set_alpha_to_one_enable_ext)(command_buffer, alpha_to_one_enable.into())
403     }
404 
405     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetLogicOpEnableEXT.html>
406     #[inline]
cmd_set_logic_op_enable( &self, command_buffer: vk::CommandBuffer, logic_op_enable: bool, )407     pub unsafe fn cmd_set_logic_op_enable(
408         &self,
409         command_buffer: vk::CommandBuffer,
410         logic_op_enable: bool,
411     ) {
412         (self.fp.cmd_set_logic_op_enable_ext)(command_buffer, logic_op_enable.into())
413     }
414 
415     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorBlendEnableEXT.html>
416     #[inline]
cmd_set_color_blend_enable( &self, command_buffer: vk::CommandBuffer, first_attachment: u32, color_blend_enables: &[vk::Bool32], )417     pub unsafe fn cmd_set_color_blend_enable(
418         &self,
419         command_buffer: vk::CommandBuffer,
420         first_attachment: u32,
421         color_blend_enables: &[vk::Bool32],
422     ) {
423         (self.fp.cmd_set_color_blend_enable_ext)(
424             command_buffer,
425             first_attachment,
426             color_blend_enables.len() as u32,
427             color_blend_enables.as_ptr(),
428         )
429     }
430 
431     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorBlendEquationEXT.html>
432     #[inline]
cmd_set_color_blend_equation( &self, command_buffer: vk::CommandBuffer, first_attachment: u32, color_blend_equations: &[vk::ColorBlendEquationEXT], )433     pub unsafe fn cmd_set_color_blend_equation(
434         &self,
435         command_buffer: vk::CommandBuffer,
436         first_attachment: u32,
437         color_blend_equations: &[vk::ColorBlendEquationEXT],
438     ) {
439         (self.fp.cmd_set_color_blend_equation_ext)(
440             command_buffer,
441             first_attachment,
442             color_blend_equations.len() as u32,
443             color_blend_equations.as_ptr(),
444         )
445     }
446 
447     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorWriteMaskEXT.html>
448     #[inline]
cmd_set_color_write_mask( &self, command_buffer: vk::CommandBuffer, first_attachment: u32, color_write_masks: &[vk::ColorComponentFlags], )449     pub unsafe fn cmd_set_color_write_mask(
450         &self,
451         command_buffer: vk::CommandBuffer,
452         first_attachment: u32,
453         color_write_masks: &[vk::ColorComponentFlags],
454     ) {
455         (self.fp.cmd_set_color_write_mask_ext)(
456             command_buffer,
457             first_attachment,
458             color_write_masks.len() as u32,
459             color_write_masks.as_ptr(),
460         )
461     }
462 
463     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetRasterizationStreamEXT.html>
464     #[inline]
cmd_set_rasterization_stream( &self, command_buffer: vk::CommandBuffer, rasterization_stream: u32, )465     pub unsafe fn cmd_set_rasterization_stream(
466         &self,
467         command_buffer: vk::CommandBuffer,
468         rasterization_stream: u32,
469     ) {
470         (self.fp.cmd_set_rasterization_stream_ext)(command_buffer, rasterization_stream)
471     }
472 
473     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetConservativeRasterizationModeEXT.html>
474     #[inline]
cmd_set_conservative_rasterization_mode( &self, command_buffer: vk::CommandBuffer, conservative_rasterization_mode: vk::ConservativeRasterizationModeEXT, )475     pub unsafe fn cmd_set_conservative_rasterization_mode(
476         &self,
477         command_buffer: vk::CommandBuffer,
478         conservative_rasterization_mode: vk::ConservativeRasterizationModeEXT,
479     ) {
480         (self.fp.cmd_set_conservative_rasterization_mode_ext)(
481             command_buffer,
482             conservative_rasterization_mode,
483         )
484     }
485 
486     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetExtraPrimitiveOverestimationSizeEXT.html>
487     #[inline]
cmd_set_extra_primitive_overestimation_size( &self, command_buffer: vk::CommandBuffer, extra_primitive_overestimation_size: f32, )488     pub unsafe fn cmd_set_extra_primitive_overestimation_size(
489         &self,
490         command_buffer: vk::CommandBuffer,
491         extra_primitive_overestimation_size: f32,
492     ) {
493         (self.fp.cmd_set_extra_primitive_overestimation_size_ext)(
494             command_buffer,
495             extra_primitive_overestimation_size,
496         )
497     }
498 
499     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthClipEnableEXT.html>
500     #[inline]
cmd_set_depth_clip_enable( &self, command_buffer: vk::CommandBuffer, depth_clip_enable: bool, )501     pub unsafe fn cmd_set_depth_clip_enable(
502         &self,
503         command_buffer: vk::CommandBuffer,
504         depth_clip_enable: bool,
505     ) {
506         (self.fp.cmd_set_depth_clip_enable_ext)(command_buffer, depth_clip_enable.into())
507     }
508 
509     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetSampleLocationsEnableEXT.html>
510     #[inline]
cmd_set_sample_locations_enable( &self, command_buffer: vk::CommandBuffer, sample_locations_enable: bool, )511     pub unsafe fn cmd_set_sample_locations_enable(
512         &self,
513         command_buffer: vk::CommandBuffer,
514         sample_locations_enable: bool,
515     ) {
516         (self.fp.cmd_set_sample_locations_enable_ext)(
517             command_buffer,
518             sample_locations_enable.into(),
519         )
520     }
521 
522     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetColorBlendAdvancedEXT.html>
523     #[inline]
cmd_set_color_blend_advanced( &self, command_buffer: vk::CommandBuffer, first_attachment: u32, color_blend_advanced: &[vk::ColorBlendAdvancedEXT], )524     pub unsafe fn cmd_set_color_blend_advanced(
525         &self,
526         command_buffer: vk::CommandBuffer,
527         first_attachment: u32,
528         color_blend_advanced: &[vk::ColorBlendAdvancedEXT],
529     ) {
530         (self.fp.cmd_set_color_blend_advanced_ext)(
531             command_buffer,
532             first_attachment,
533             color_blend_advanced.len() as u32,
534             color_blend_advanced.as_ptr(),
535         )
536     }
537 
538     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetProvokingVertexModeEXT.html>
539     #[inline]
cmd_set_provoking_vertex_mode( &self, command_buffer: vk::CommandBuffer, provoking_vertex_mode: vk::ProvokingVertexModeEXT, )540     pub unsafe fn cmd_set_provoking_vertex_mode(
541         &self,
542         command_buffer: vk::CommandBuffer,
543         provoking_vertex_mode: vk::ProvokingVertexModeEXT,
544     ) {
545         (self.fp.cmd_set_provoking_vertex_mode_ext)(command_buffer, provoking_vertex_mode)
546     }
547 
548     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetLineRasterizationModeEXT.html>
549     #[inline]
cmd_set_line_rasterization_mode( &self, command_buffer: vk::CommandBuffer, line_rasterization_mode: vk::LineRasterizationModeEXT, )550     pub unsafe fn cmd_set_line_rasterization_mode(
551         &self,
552         command_buffer: vk::CommandBuffer,
553         line_rasterization_mode: vk::LineRasterizationModeEXT,
554     ) {
555         (self.fp.cmd_set_line_rasterization_mode_ext)(command_buffer, line_rasterization_mode)
556     }
557 
558     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetLineStippleEnableEXT.html>
559     #[inline]
cmd_set_line_stipple_enable( &self, command_buffer: vk::CommandBuffer, stippled_line_enable: bool, )560     pub unsafe fn cmd_set_line_stipple_enable(
561         &self,
562         command_buffer: vk::CommandBuffer,
563         stippled_line_enable: bool,
564     ) {
565         (self.fp.cmd_set_line_stipple_enable_ext)(command_buffer, stippled_line_enable.into())
566     }
567 
568     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDepthClipNegativeOneToOneEXT.html>
569     #[inline]
cmd_set_depth_clip_negative_one_to_one( &self, command_buffer: vk::CommandBuffer, negative_one_to_one: bool, )570     pub unsafe fn cmd_set_depth_clip_negative_one_to_one(
571         &self,
572         command_buffer: vk::CommandBuffer,
573         negative_one_to_one: bool,
574     ) {
575         (self.fp.cmd_set_depth_clip_negative_one_to_one_ext)(
576             command_buffer,
577             negative_one_to_one.into(),
578         )
579     }
580 
581     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetViewportWScalingEnableNV.html>
582     #[inline]
cmd_set_viewport_w_scaling_enable_nv( &self, command_buffer: vk::CommandBuffer, viewport_w_scaling_enable: bool, )583     pub unsafe fn cmd_set_viewport_w_scaling_enable_nv(
584         &self,
585         command_buffer: vk::CommandBuffer,
586         viewport_w_scaling_enable: bool,
587     ) {
588         (self.fp.cmd_set_viewport_w_scaling_enable_nv)(
589             command_buffer,
590             viewport_w_scaling_enable.into(),
591         )
592     }
593 
594     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetViewportSwizzleNV.html>
595     #[inline]
cmd_set_viewport_swizzle_nv( &self, command_buffer: vk::CommandBuffer, first_attachment: u32, viewport_swizzles: &[vk::ViewportSwizzleNV], )596     pub unsafe fn cmd_set_viewport_swizzle_nv(
597         &self,
598         command_buffer: vk::CommandBuffer,
599         first_attachment: u32,
600         viewport_swizzles: &[vk::ViewportSwizzleNV],
601     ) {
602         (self.fp.cmd_set_viewport_swizzle_nv)(
603             command_buffer,
604             first_attachment,
605             viewport_swizzles.len() as u32,
606             viewport_swizzles.as_ptr(),
607         )
608     }
609 
610     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCoverageToColorEnableNV.html>
611     #[inline]
cmd_set_coverage_to_color_enable_nv( &self, command_buffer: vk::CommandBuffer, coverage_to_color_enable: bool, )612     pub unsafe fn cmd_set_coverage_to_color_enable_nv(
613         &self,
614         command_buffer: vk::CommandBuffer,
615         coverage_to_color_enable: bool,
616     ) {
617         (self.fp.cmd_set_coverage_to_color_enable_nv)(
618             command_buffer,
619             coverage_to_color_enable.into(),
620         )
621     }
622 
623     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCoverageToColorLocationNV.html>
624     #[inline]
cmd_set_coverage_to_color_location_nv( &self, command_buffer: vk::CommandBuffer, coverage_to_color_location: u32, )625     pub unsafe fn cmd_set_coverage_to_color_location_nv(
626         &self,
627         command_buffer: vk::CommandBuffer,
628         coverage_to_color_location: u32,
629     ) {
630         (self.fp.cmd_set_coverage_to_color_location_nv)(command_buffer, coverage_to_color_location)
631     }
632 
633     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCoverageModulationModeNV.html>
634     #[inline]
cmd_set_coverage_modulation_mode_nv( &self, command_buffer: vk::CommandBuffer, coverage_modulation_mode: vk::CoverageModulationModeNV, )635     pub unsafe fn cmd_set_coverage_modulation_mode_nv(
636         &self,
637         command_buffer: vk::CommandBuffer,
638         coverage_modulation_mode: vk::CoverageModulationModeNV,
639     ) {
640         (self.fp.cmd_set_coverage_modulation_mode_nv)(command_buffer, coverage_modulation_mode)
641     }
642 
643     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCoverageModulationTableEnableNV.html>
644     #[inline]
cmd_set_coverage_modulation_table_enable_nv( &self, command_buffer: vk::CommandBuffer, coverage_modulation_table_enable: bool, )645     pub unsafe fn cmd_set_coverage_modulation_table_enable_nv(
646         &self,
647         command_buffer: vk::CommandBuffer,
648         coverage_modulation_table_enable: bool,
649     ) {
650         (self.fp.cmd_set_coverage_modulation_table_enable_nv)(
651             command_buffer,
652             coverage_modulation_table_enable.into(),
653         )
654     }
655 
656     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCoverageModulationTableNV.html>
657     #[inline]
cmd_set_coverage_modulation_table_nv( &self, command_buffer: vk::CommandBuffer, coverage_modulation_table: &[f32], )658     pub unsafe fn cmd_set_coverage_modulation_table_nv(
659         &self,
660         command_buffer: vk::CommandBuffer,
661         coverage_modulation_table: &[f32],
662     ) {
663         (self.fp.cmd_set_coverage_modulation_table_nv)(
664             command_buffer,
665             coverage_modulation_table.len() as u32,
666             coverage_modulation_table.as_ptr(),
667         )
668     }
669 
670     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetShadingRateImageEnableNV.html>
671     #[inline]
cmd_set_shading_rate_image_enable_nv( &self, command_buffer: vk::CommandBuffer, shading_rate_image_enable: bool, )672     pub unsafe fn cmd_set_shading_rate_image_enable_nv(
673         &self,
674         command_buffer: vk::CommandBuffer,
675         shading_rate_image_enable: bool,
676     ) {
677         (self.fp.cmd_set_shading_rate_image_enable_nv)(
678             command_buffer,
679             shading_rate_image_enable.into(),
680         )
681     }
682 
683     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetRepresentativeFragmentTestEnableNV.html>
684     #[inline]
cmd_set_representative_fragment_test_enable_nv( &self, command_buffer: vk::CommandBuffer, representative_fragment_test_enable: bool, )685     pub unsafe fn cmd_set_representative_fragment_test_enable_nv(
686         &self,
687         command_buffer: vk::CommandBuffer,
688         representative_fragment_test_enable: bool,
689     ) {
690         (self.fp.cmd_set_representative_fragment_test_enable_nv)(
691             command_buffer,
692             representative_fragment_test_enable.into(),
693         )
694     }
695 
696     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCoverageReductionModeNV.html>
697     #[inline]
cmd_set_coverage_reduction_mode_nv( &self, command_buffer: vk::CommandBuffer, coverage_reduction_mode: vk::CoverageReductionModeNV, )698     pub unsafe fn cmd_set_coverage_reduction_mode_nv(
699         &self,
700         command_buffer: vk::CommandBuffer,
701         coverage_reduction_mode: vk::CoverageReductionModeNV,
702     ) {
703         (self.fp.cmd_set_coverage_reduction_mode_nv)(command_buffer, coverage_reduction_mode)
704     }
705 
name() -> &'static CStr706     pub const fn name() -> &'static CStr {
707         vk::ExtShaderObjectFn::name()
708     }
709 
710     #[inline]
fp(&self) -> &vk::ExtShaderObjectFn711     pub fn fp(&self) -> &vk::ExtShaderObjectFn {
712         &self.fp
713     }
714 
715     #[inline]
device(&self) -> vk::Device716     pub fn device(&self) -> vk::Device {
717         self.handle
718     }
719 }
720