ash/extensions/ext/
descriptor_buffer.rs

1use crate::prelude::*;
2use crate::vk;
3use crate::{Device, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7/// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_descriptor_buffer.html>
8#[derive(Clone)]
9pub struct DescriptorBuffer {
10    handle: vk::Device,
11    fp: vk::ExtDescriptorBufferFn,
12}
13
14impl DescriptorBuffer {
15    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]
25    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]
36    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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
198    pub const fn name() -> &'static CStr {
199        vk::ExtDescriptorBufferFn::name()
200    }
201
202    #[inline]
203    pub fn fp(&self) -> &vk::ExtDescriptorBufferFn {
204        &self.fp
205    }
206
207    #[inline]
208    pub fn device(&self) -> vk::Device {
209        self.handle
210    }
211}