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