1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{Device, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 7 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_descriptor_buffer.html> 8 #[derive(Clone)] 9 pub struct DescriptorBuffer { 10 handle: vk::Device, 11 fp: vk::ExtDescriptorBufferFn, 12 } 13 14 impl DescriptorBuffer { new(instance: &Instance, device: &Device) -> Self15 pub fn new(instance: &Instance, device: &Device) -> Self { 16 let handle = device.handle(); 17 let fp = vk::ExtDescriptorBufferFn::load(|name| unsafe { 18 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 19 }); 20 Self { handle, fp } 21 } 22 23 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDescriptorSetLayoutSizeEXT.html> 24 #[inline] get_descriptor_set_layout_size( &self, layout: vk::DescriptorSetLayout, ) -> vk::DeviceSize25 pub unsafe fn get_descriptor_set_layout_size( 26 &self, 27 layout: vk::DescriptorSetLayout, 28 ) -> vk::DeviceSize { 29 let mut count = 0; 30 (self.fp.get_descriptor_set_layout_size_ext)(self.handle, layout, &mut count); 31 count 32 } 33 34 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDescriptorSetLayoutBindingOffsetEXT.html> 35 #[inline] get_descriptor_set_layout_binding_offset( &self, layout: vk::DescriptorSetLayout, binding: u32, ) -> vk::DeviceSize36 pub unsafe fn get_descriptor_set_layout_binding_offset( 37 &self, 38 layout: vk::DescriptorSetLayout, 39 binding: u32, 40 ) -> vk::DeviceSize { 41 let mut offset = 0; 42 (self.fp.get_descriptor_set_layout_binding_offset_ext)( 43 self.handle, 44 layout, 45 binding, 46 &mut offset, 47 ); 48 offset 49 } 50 51 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDescriptorEXT.html> 52 #[inline] get_descriptor( &self, descriptor_info: &vk::DescriptorGetInfoEXT, descriptor: &mut [u8], )53 pub unsafe fn get_descriptor( 54 &self, 55 descriptor_info: &vk::DescriptorGetInfoEXT, 56 descriptor: &mut [u8], 57 ) { 58 (self.fp.get_descriptor_ext)( 59 self.handle, 60 descriptor_info, 61 descriptor.len(), 62 descriptor.as_mut_ptr().cast(), 63 ) 64 } 65 66 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBindDescriptorBuffersEXT.html> 67 #[inline] cmd_bind_descriptor_buffers( &self, command_buffer: vk::CommandBuffer, binding_info: &[vk::DescriptorBufferBindingInfoEXT], )68 pub unsafe fn cmd_bind_descriptor_buffers( 69 &self, 70 command_buffer: vk::CommandBuffer, 71 binding_info: &[vk::DescriptorBufferBindingInfoEXT], 72 ) { 73 (self.fp.cmd_bind_descriptor_buffers_ext)( 74 command_buffer, 75 binding_info.len() as u32, 76 binding_info.as_ptr(), 77 ) 78 } 79 80 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetDescriptorBufferOffsetsEXT.html> 81 #[inline] cmd_set_descriptor_buffer_offsets( &self, command_buffer: vk::CommandBuffer, pipeline_bind_point: vk::PipelineBindPoint, layout: vk::PipelineLayout, first_set: u32, buffer_indices: &[u32], offsets: &[vk::DeviceSize], )82 pub unsafe fn cmd_set_descriptor_buffer_offsets( 83 &self, 84 command_buffer: vk::CommandBuffer, 85 pipeline_bind_point: vk::PipelineBindPoint, 86 layout: vk::PipelineLayout, 87 first_set: u32, 88 buffer_indices: &[u32], 89 offsets: &[vk::DeviceSize], 90 ) { 91 assert_eq!(buffer_indices.len(), offsets.len()); 92 (self.fp.cmd_set_descriptor_buffer_offsets_ext)( 93 command_buffer, 94 pipeline_bind_point, 95 layout, 96 first_set, 97 buffer_indices.len() as u32, 98 buffer_indices.as_ptr(), 99 offsets.as_ptr(), 100 ) 101 } 102 103 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBindDescriptorBufferEmbeddedSamplersEXT.html> 104 #[inline] cmd_bind_descriptor_buffer_embedded_samplers( &self, command_buffer: vk::CommandBuffer, pipeline_bind_point: vk::PipelineBindPoint, layout: vk::PipelineLayout, set: u32, )105 pub unsafe fn cmd_bind_descriptor_buffer_embedded_samplers( 106 &self, 107 command_buffer: vk::CommandBuffer, 108 pipeline_bind_point: vk::PipelineBindPoint, 109 layout: vk::PipelineLayout, 110 set: u32, 111 ) { 112 (self.fp.cmd_bind_descriptor_buffer_embedded_samplers_ext)( 113 command_buffer, 114 pipeline_bind_point, 115 layout, 116 set, 117 ) 118 } 119 120 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetBufferOpaqueCaptureDescriptorDataEXT.html> 121 #[inline] get_buffer_opaque_capture_descriptor_data( &self, info: &vk::BufferCaptureDescriptorDataInfoEXT, data: &mut [u8], ) -> VkResult<()>122 pub unsafe fn get_buffer_opaque_capture_descriptor_data( 123 &self, 124 info: &vk::BufferCaptureDescriptorDataInfoEXT, 125 data: &mut [u8], 126 ) -> VkResult<()> { 127 (self.fp.get_buffer_opaque_capture_descriptor_data_ext)( 128 self.handle, 129 info, 130 data.as_mut_ptr().cast(), 131 ) 132 .result() 133 } 134 135 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetImageOpaqueCaptureDescriptorDataEXT.html> 136 #[inline] get_image_opaque_capture_descriptor_data( &self, info: &vk::ImageCaptureDescriptorDataInfoEXT, data: &mut [u8], ) -> VkResult<()>137 pub unsafe fn get_image_opaque_capture_descriptor_data( 138 &self, 139 info: &vk::ImageCaptureDescriptorDataInfoEXT, 140 data: &mut [u8], 141 ) -> VkResult<()> { 142 (self.fp.get_image_opaque_capture_descriptor_data_ext)( 143 self.handle, 144 info, 145 data.as_mut_ptr().cast(), 146 ) 147 .result() 148 } 149 150 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetImageViewOpaqueCaptureDescriptorDataEXT.html> 151 #[inline] get_image_view_opaque_capture_descriptor_data( &self, info: &vk::ImageViewCaptureDescriptorDataInfoEXT, data: &mut [u8], ) -> VkResult<()>152 pub unsafe fn get_image_view_opaque_capture_descriptor_data( 153 &self, 154 info: &vk::ImageViewCaptureDescriptorDataInfoEXT, 155 data: &mut [u8], 156 ) -> VkResult<()> { 157 (self.fp.get_image_view_opaque_capture_descriptor_data_ext)( 158 self.handle, 159 info, 160 data.as_mut_ptr().cast(), 161 ) 162 .result() 163 } 164 165 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetSamplerOpaqueCaptureDescriptorDataEXT.html> 166 #[inline] get_sampler_opaque_capture_descriptor_data( &self, info: &vk::SamplerCaptureDescriptorDataInfoEXT, data: &mut [u8], ) -> VkResult<()>167 pub unsafe fn get_sampler_opaque_capture_descriptor_data( 168 &self, 169 info: &vk::SamplerCaptureDescriptorDataInfoEXT, 170 data: &mut [u8], 171 ) -> VkResult<()> { 172 (self.fp.get_sampler_opaque_capture_descriptor_data_ext)( 173 self.handle, 174 info, 175 data.as_mut_ptr().cast(), 176 ) 177 .result() 178 } 179 180 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT.html> 181 #[inline] get_acceleration_structure_opaque_capture_descriptor_data( &self, info: &vk::AccelerationStructureCaptureDescriptorDataInfoEXT, data: &mut [u8], ) -> VkResult<()>182 pub unsafe fn get_acceleration_structure_opaque_capture_descriptor_data( 183 &self, 184 info: &vk::AccelerationStructureCaptureDescriptorDataInfoEXT, 185 data: &mut [u8], 186 ) -> VkResult<()> { 187 (self 188 .fp 189 .get_acceleration_structure_opaque_capture_descriptor_data_ext)( 190 self.handle, 191 info, 192 data.as_mut_ptr().cast(), 193 ) 194 .result() 195 } 196 197 #[inline] name() -> &'static CStr198 pub const fn name() -> &'static CStr { 199 vk::ExtDescriptorBufferFn::name() 200 } 201 202 #[inline] fp(&self) -> &vk::ExtDescriptorBufferFn203 pub fn fp(&self) -> &vk::ExtDescriptorBufferFn { 204 &self.fp 205 } 206 207 #[inline] device(&self) -> vk::Device208 pub fn device(&self) -> vk::Device { 209 self.handle 210 } 211 } 212