• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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