aboutsummaryrefslogtreecommitdiff
path: root/src/descriptor_set/layout/sys.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/descriptor_set/layout/sys.rs')
-rw-r--r--src/descriptor_set/layout/sys.rs202
1 files changed, 0 insertions, 202 deletions
diff --git a/src/descriptor_set/layout/sys.rs b/src/descriptor_set/layout/sys.rs
deleted file mode 100644
index 656f767..0000000
--- a/src/descriptor_set/layout/sys.rs
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2016 The vulkano developers
-// Licensed under the Apache License, Version 2.0
-// <LICENSE-APACHE or
-// https://www.apache.org/licenses/LICENSE-2.0> or the MIT
-// license <LICENSE-MIT or https://opensource.org/licenses/MIT>,
-// at your option. All files in the project carrying such
-// notice may not be copied, modified, or distributed except
-// according to those terms.
-
-use crate::check_errors;
-use crate::descriptor_set::layout::DescriptorDesc;
-use crate::descriptor_set::layout::DescriptorSetDesc;
-use crate::descriptor_set::pool::DescriptorsCount;
-use crate::device::Device;
-use crate::device::DeviceOwned;
-use crate::OomError;
-use crate::VulkanObject;
-use smallvec::SmallVec;
-use std::mem::MaybeUninit;
-use std::ptr;
-use std::sync::Arc;
-
-/// Describes to the Vulkan implementation the layout of all descriptors within a descriptor set.
-#[derive(Debug)]
-pub struct DescriptorSetLayout {
- // The layout.
- handle: ash::vk::DescriptorSetLayout,
- // The device this layout belongs to.
- device: Arc<Device>,
- // Descriptors.
- desc: DescriptorSetDesc,
- // Number of descriptors.
- descriptors_count: DescriptorsCount,
-}
-
-impl DescriptorSetLayout {
- /// Builds a new `DescriptorSetLayout` with the given descriptors.
- ///
- /// The descriptors must be passed in the order of the bindings. In order words, descriptor
- /// at bind point 0 first, then descriptor at bind point 1, and so on. If a binding must remain
- /// empty, you can make the iterator yield `None` for an element.
- pub fn new<D>(device: Arc<Device>, desc: D) -> Result<DescriptorSetLayout, OomError>
- where
- D: Into<DescriptorSetDesc>,
- {
- let desc = desc.into();
- let mut descriptors_count = DescriptorsCount::zero();
-
- let bindings = desc
- .bindings()
- .iter()
- .enumerate()
- .filter_map(|(binding, desc)| {
- let desc = match desc {
- Some(d) => d,
- None => return None,
- };
-
- // FIXME: it is not legal to pass eg. the TESSELLATION_SHADER bit when the device
- // doesn't have tess shaders enabled
-
- let ty = desc.ty.ty();
- descriptors_count.add_num(ty, desc.array_count);
-
- Some(ash::vk::DescriptorSetLayoutBinding {
- binding: binding as u32,
- descriptor_type: ty.into(),
- descriptor_count: desc.array_count,
- stage_flags: desc.stages.into(),
- p_immutable_samplers: ptr::null(), // FIXME: not yet implemented
- })
- })
- .collect::<SmallVec<[_; 32]>>();
-
- // Note that it seems legal to have no descriptor at all in the set.
-
- let handle = unsafe {
- let infos = ash::vk::DescriptorSetLayoutCreateInfo {
- flags: ash::vk::DescriptorSetLayoutCreateFlags::empty(),
- binding_count: bindings.len() as u32,
- p_bindings: bindings.as_ptr(),
- ..Default::default()
- };
-
- let mut output = MaybeUninit::uninit();
- let fns = device.fns();
- check_errors(fns.v1_0.create_descriptor_set_layout(
- device.internal_object(),
- &infos,
- ptr::null(),
- output.as_mut_ptr(),
- ))?;
- output.assume_init()
- };
-
- Ok(DescriptorSetLayout {
- handle,
- device,
- desc,
- descriptors_count,
- })
- }
-
- pub(crate) fn desc(&self) -> &DescriptorSetDesc {
- &self.desc
- }
-
- /// Returns the number of descriptors of each type.
- #[inline]
- pub fn descriptors_count(&self) -> &DescriptorsCount {
- &self.descriptors_count
- }
-
- /// Returns the number of binding slots in the set.
- #[inline]
- pub fn num_bindings(&self) -> usize {
- self.desc.bindings().len()
- }
-
- /// Returns a description of a descriptor, or `None` if out of range.
- #[inline]
- pub fn descriptor(&self, binding: usize) -> Option<DescriptorDesc> {
- self.desc.bindings().get(binding).cloned().unwrap_or(None)
- }
-}
-
-unsafe impl DeviceOwned for DescriptorSetLayout {
- #[inline]
- fn device(&self) -> &Arc<Device> {
- &self.device
- }
-}
-
-unsafe impl VulkanObject for DescriptorSetLayout {
- type Object = ash::vk::DescriptorSetLayout;
-
- #[inline]
- fn internal_object(&self) -> ash::vk::DescriptorSetLayout {
- self.handle
- }
-}
-
-impl Drop for DescriptorSetLayout {
- #[inline]
- fn drop(&mut self) {
- unsafe {
- let fns = self.device.fns();
- fns.v1_0.destroy_descriptor_set_layout(
- self.device.internal_object(),
- self.handle,
- ptr::null(),
- );
- }
- }
-}
-
-#[cfg(test)]
-mod tests {
- use crate::descriptor_set::layout::DescriptorBufferDesc;
- use crate::descriptor_set::layout::DescriptorDesc;
- use crate::descriptor_set::layout::DescriptorDescTy;
- use crate::descriptor_set::layout::DescriptorSetDesc;
- use crate::descriptor_set::layout::DescriptorSetLayout;
- use crate::descriptor_set::pool::DescriptorsCount;
- use crate::pipeline::shader::ShaderStages;
- use std::iter;
-
- #[test]
- fn empty() {
- let (device, _) = gfx_dev_and_queue!();
- let _layout = DescriptorSetLayout::new(device, DescriptorSetDesc::empty());
- }
-
- #[test]
- fn basic_create() {
- let (device, _) = gfx_dev_and_queue!();
-
- let layout = DescriptorDesc {
- ty: DescriptorDescTy::Buffer(DescriptorBufferDesc {
- dynamic: Some(false),
- storage: false,
- }),
- array_count: 1,
- stages: ShaderStages::all_graphics(),
- readonly: true,
- };
-
- let sl = DescriptorSetLayout::new(
- device.clone(),
- DescriptorSetDesc::new(iter::once(Some(layout))),
- )
- .unwrap();
-
- assert_eq!(
- sl.descriptors_count(),
- &DescriptorsCount {
- uniform_buffer: 1,
- ..DescriptorsCount::zero()
- }
- );
- }
-}