ash/extensions/ext/
descriptor_buffer.rs1use crate::prelude::*;
2use crate::vk;
3use crate::{Device, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7#[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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}