aboutsummaryrefslogtreecommitdiff
path: root/src/buffer/usage.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer/usage.rs')
-rw-r--r--src/buffer/usage.rs360
1 files changed, 139 insertions, 221 deletions
diff --git a/src/buffer/usage.rs b/src/buffer/usage.rs
index 7566012..fc7fa1d 100644
--- a/src/buffer/usage.rs
+++ b/src/buffer/usage.rs
@@ -7,225 +7,143 @@
// notice may not be copied, modified, or distributed except
// according to those terms.
-use std::ops::BitOr;
-
-/// Describes how a buffer is going to be used. This is **not** just an optimization.
-///
-/// If you try to use a buffer in a way that you didn't declare, a panic will happen.
-///
-/// Some methods are provided to build `BufferUsage` structs for some common situations. However
-/// there is no restriction in the combination of BufferUsages that can be enabled.
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-pub struct BufferUsage {
- pub transfer_source: bool,
- pub transfer_destination: bool,
- pub uniform_texel_buffer: bool,
- pub storage_texel_buffer: bool,
- pub uniform_buffer: bool,
- pub storage_buffer: bool,
- pub index_buffer: bool,
- pub vertex_buffer: bool,
- pub indirect_buffer: bool,
- /// Requires the `buffer_device_address` feature. If that feature is not enabled, this will
- /// be silently ignored.
- pub device_address: bool,
-}
-
-impl BufferUsage {
- /// Builds a `BufferUsage` with all values set to false.
- #[inline]
- pub const fn none() -> BufferUsage {
- BufferUsage {
- transfer_source: false,
- transfer_destination: false,
- uniform_texel_buffer: false,
- storage_texel_buffer: false,
- uniform_buffer: false,
- storage_buffer: false,
- index_buffer: false,
- vertex_buffer: false,
- indirect_buffer: false,
- device_address: false,
- }
- }
-
- /// Builds a `BufferUsage` with all values set to true. Can be used for quick prototyping.
- #[inline]
- pub const fn all() -> BufferUsage {
- BufferUsage {
- transfer_source: true,
- transfer_destination: true,
- uniform_texel_buffer: true,
- storage_texel_buffer: true,
- uniform_buffer: true,
- storage_buffer: true,
- index_buffer: true,
- vertex_buffer: true,
- indirect_buffer: true,
- device_address: true,
- }
- }
-
- /// Builds a `BufferUsage` with `transfer_source` set to true and the rest to false.
- #[inline]
- pub const fn transfer_source() -> BufferUsage {
- BufferUsage {
- transfer_source: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `transfer_destination` set to true and the rest to false.
- #[inline]
- pub const fn transfer_destination() -> BufferUsage {
- BufferUsage {
- transfer_destination: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `vertex_buffer` set to true and the rest to false.
- #[inline]
- pub const fn vertex_buffer() -> BufferUsage {
- BufferUsage {
- vertex_buffer: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `vertex_buffer` and `transfer_destination` set to true and the rest
- /// to false.
- #[inline]
- pub const fn vertex_buffer_transfer_destination() -> BufferUsage {
- BufferUsage {
- vertex_buffer: true,
- transfer_destination: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `index_buffer` set to true and the rest to false.
- #[inline]
- pub const fn index_buffer() -> BufferUsage {
- BufferUsage {
- index_buffer: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `index_buffer` and `transfer_destination` set to true and the rest to false.
- #[inline]
- pub const fn index_buffer_transfer_destination() -> BufferUsage {
- BufferUsage {
- index_buffer: true,
- transfer_destination: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `uniform_buffer` set to true and the rest to false.
- #[inline]
- pub const fn uniform_buffer() -> BufferUsage {
- BufferUsage {
- uniform_buffer: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `uniform_buffer` and `transfer_destination` set to true and the rest
- /// to false.
- #[inline]
- pub const fn uniform_buffer_transfer_destination() -> BufferUsage {
- BufferUsage {
- uniform_buffer: true,
- transfer_destination: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `indirect_buffer` set to true and the rest to false.
- #[inline]
- pub const fn indirect_buffer() -> BufferUsage {
- BufferUsage {
- indirect_buffer: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `indirect_buffer` and `transfer_destination` set to true and the rest
- /// to false.
- #[inline]
- pub const fn indirect_buffer_transfer_destination() -> BufferUsage {
- BufferUsage {
- indirect_buffer: true,
- transfer_destination: true,
- ..BufferUsage::none()
- }
- }
-
- /// Builds a `BufferUsage` with `device_address` set to true and the rest to false.
- #[inline]
- pub const fn device_address() -> BufferUsage {
- BufferUsage {
- device_address: true,
- ..BufferUsage::none()
- }
- }
-}
-
-impl From<BufferUsage> for ash::vk::BufferUsageFlags {
- fn from(val: BufferUsage) -> Self {
- let mut result = ash::vk::BufferUsageFlags::empty();
- if val.transfer_source {
- result |= ash::vk::BufferUsageFlags::TRANSFER_SRC;
- }
- if val.transfer_destination {
- result |= ash::vk::BufferUsageFlags::TRANSFER_DST;
- }
- if val.uniform_texel_buffer {
- result |= ash::vk::BufferUsageFlags::UNIFORM_TEXEL_BUFFER;
- }
- if val.storage_texel_buffer {
- result |= ash::vk::BufferUsageFlags::STORAGE_TEXEL_BUFFER;
- }
- if val.uniform_buffer {
- result |= ash::vk::BufferUsageFlags::UNIFORM_BUFFER;
- }
- if val.storage_buffer {
- result |= ash::vk::BufferUsageFlags::STORAGE_BUFFER;
- }
- if val.index_buffer {
- result |= ash::vk::BufferUsageFlags::INDEX_BUFFER;
- }
- if val.vertex_buffer {
- result |= ash::vk::BufferUsageFlags::VERTEX_BUFFER;
- }
- if val.indirect_buffer {
- result |= ash::vk::BufferUsageFlags::INDIRECT_BUFFER;
- }
- if val.device_address {
- result |= ash::vk::BufferUsageFlags::SHADER_DEVICE_ADDRESS;
- }
- result
- }
-}
-
-impl BitOr for BufferUsage {
- type Output = Self;
-
- #[inline]
- fn bitor(self, rhs: Self) -> Self {
- BufferUsage {
- transfer_source: self.transfer_source || rhs.transfer_source,
- transfer_destination: self.transfer_destination || rhs.transfer_destination,
- uniform_texel_buffer: self.uniform_texel_buffer || rhs.uniform_texel_buffer,
- storage_texel_buffer: self.storage_texel_buffer || rhs.storage_texel_buffer,
- uniform_buffer: self.uniform_buffer || rhs.uniform_buffer,
- storage_buffer: self.storage_buffer || rhs.storage_buffer,
- index_buffer: self.index_buffer || rhs.index_buffer,
- vertex_buffer: self.vertex_buffer || rhs.vertex_buffer,
- indirect_buffer: self.indirect_buffer || rhs.indirect_buffer,
- device_address: self.device_address || rhs.device_address,
- }
- }
+use crate::macros::vulkan_bitflags;
+
+vulkan_bitflags! {
+ #[non_exhaustive]
+
+ /// Describes how a buffer is going to be used. This is **not** just an optimization.
+ ///
+ /// If you try to use a buffer in a way that you didn't declare, an error will be returned.
+ BufferUsage = BufferUsageFlags(u32);
+
+ /// The buffer can be used as a source for transfer, blit, resolve and clear commands.
+ TRANSFER_SRC = TRANSFER_SRC,
+
+ /// The buffer can be used as a destination for transfer, blit, resolve and clear commands.
+ TRANSFER_DST = TRANSFER_DST,
+
+ /// The buffer can be used as a uniform texel buffer in a descriptor set.
+ UNIFORM_TEXEL_BUFFER = UNIFORM_TEXEL_BUFFER,
+
+ /// The buffer can be used as a storage texel buffer in a descriptor set.
+ STORAGE_TEXEL_BUFFER = STORAGE_TEXEL_BUFFER,
+
+ /// The buffer can be used as a uniform buffer in a descriptor set.
+ UNIFORM_BUFFER = UNIFORM_BUFFER,
+
+ /// The buffer can be used as a storage buffer in a descriptor set.
+ STORAGE_BUFFER = STORAGE_BUFFER,
+
+ /// The buffer can be used as an index buffer.
+ INDEX_BUFFER = INDEX_BUFFER,
+
+ /// The buffer can be used as a vertex or instance buffer.
+ VERTEX_BUFFER = VERTEX_BUFFER,
+
+ /// The buffer can be used as an indirect buffer.
+ INDIRECT_BUFFER = INDIRECT_BUFFER,
+
+ /// The buffer's device address can be retrieved.
+ ///
+ /// A buffer created with this usage can only be bound to device memory allocated with the
+ /// [`MemoryAllocateFlags::DEVICE_ADDRESS`] flag, unless the [`ext_buffer_device_address`]
+ /// extension is enabled on the device.
+ ///
+ /// [`MemoryAllocateFlags::DEVICE_ADDRESS`]: crate::memory::MemoryAllocateFlags::DEVICE_ADDRESS
+ /// [`ext_buffer_device_address`]: crate::device::DeviceExtensions::ext_buffer_device_address
+ SHADER_DEVICE_ADDRESS = SHADER_DEVICE_ADDRESS {
+ api_version: V1_2,
+ device_extensions: [khr_buffer_device_address, ext_buffer_device_address],
+ },
+
+ /* TODO: enable
+ // TODO: document
+ VIDEO_DECODE_SRC = VIDEO_DECODE_SRC_KHR {
+ device_extensions: [khr_video_decode_queue],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ VIDEO_DECODE_DST = VIDEO_DECODE_DST_KHR {
+ device_extensions: [khr_video_decode_queue],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ TRANSFORM_FEEDBACK_BUFFER = TRANSFORM_FEEDBACK_BUFFER_EXT {
+ device_extensions: [ext_transform_feedback],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ TRANSFORM_FEEDBACK_COUNTER_BUFFER = TRANSFORM_FEEDBACK_COUNTER_BUFFER_EXT {
+ device_extensions: [ext_transform_feedback],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ CONDITIONAL_RENDERING = CONDITIONAL_RENDERING_EXT {
+ device_extensions: [ext_conditional_rendering],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_KHR = ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_KHR {
+ device_extensions: [khr_acceleration_structure],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ ACCELERATION_STRUCTURE_STORAGE = ACCELERATION_STRUCTURE_STORAGE_KHR {
+ device_extensions: [khr_acceleration_structure],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ SHADER_BINDING_TABLE = SHADER_BINDING_TABLE_KHR {
+ device_extensions: [khr_ray_tracing_pipeline, nv_ray_tracing],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ VIDEO_ENCODE_DST = VIDEO_ENCODE_DST_KHR {
+ device_extensions: [khr_video_encode_queue],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ VIDEO_ENCODE_SRC = VIDEO_ENCODE_SRC_KHR {
+ device_extensions: [khr_video_encode_queue],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ SAMPLER_DESCRIPTOR_BUFFER = SAMPLER_DESCRIPTOR_BUFFER_EXT {
+ device_extensions: [ext_descriptor_buffer],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ RESOURCE_DESCRIPTOR_BUFFER = RESOURCE_DESCRIPTOR_BUFFER_EXT {
+ device_extensions: [ext_descriptor_buffer],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER = PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_EXT {
+ device_extensions: [ext_descriptor_buffer],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ MICROMAP_BUILD_INPUT_READ_ONLY = MICROMAP_BUILD_INPUT_READ_ONLY_EXT {
+ device_extensions: [ext_opacity_micromap],
+ },*/
+
+ /* TODO: enable
+ // TODO: document
+ MICROMAP_STORAGE = MICROMAP_STORAGE_EXT {
+ device_extensions: [ext_opacity_micromap],
+ },*/
}