1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
use crate::{ resource::TextureViewDimension, track::TrackerSet, BindGroupLayoutId, BufferAddress, BufferId, DeviceId, LifeGuard, RefCount, SamplerId, Stored, TextureViewId, }; use arrayvec::ArrayVec; use bitflags::bitflags; use rendy_descriptor::{DescriptorRanges, DescriptorSet}; use std::borrow::Borrow; pub const MAX_BIND_GROUPS: usize = 4; bitflags! { #[repr(transparent)] pub struct ShaderStage: u32 { const NONE = 0; const VERTEX = 1; const FRAGMENT = 2; const COMPUTE = 4; } } #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] pub enum BindingType { UniformBuffer = 0, StorageBuffer = 1, ReadonlyStorageBuffer = 2, Sampler = 3, SampledTexture = 4, StorageTexture = 5, } #[repr(C)] #[derive(Clone, Debug, Hash)] pub struct BindGroupLayoutBinding { pub binding: u32, pub visibility: ShaderStage, pub ty: BindingType, pub texture_dimension: TextureViewDimension, pub multisampled: bool, pub dynamic: bool, } #[repr(C)] #[derive(Debug)] pub struct BindGroupLayoutDescriptor { pub bindings: *const BindGroupLayoutBinding, pub bindings_length: usize, } #[derive(Debug)] pub struct BindGroupLayout<B: hal::Backend> { pub(crate) raw: B::DescriptorSetLayout, pub(crate) bindings: Vec<BindGroupLayoutBinding>, pub(crate) desc_ranges: DescriptorRanges, pub(crate) dynamic_count: usize, } #[repr(C)] #[derive(Debug)] pub struct PipelineLayoutDescriptor { pub bind_group_layouts: *const BindGroupLayoutId, pub bind_group_layouts_length: usize, } #[derive(Debug)] pub struct PipelineLayout<B: hal::Backend> { pub(crate) raw: B::PipelineLayout, pub(crate) bind_group_layout_ids: ArrayVec<[BindGroupLayoutId; MAX_BIND_GROUPS]>, } #[repr(C)] #[derive(Debug)] pub struct BufferBinding { pub buffer: BufferId, pub offset: BufferAddress, pub size: BufferAddress, } #[repr(C)] #[derive(Debug)] pub enum BindingResource { Buffer(BufferBinding), Sampler(SamplerId), TextureView(TextureViewId), } #[repr(C)] #[derive(Debug)] pub struct BindGroupBinding { pub binding: u32, pub resource: BindingResource, } #[repr(C)] #[derive(Debug)] pub struct BindGroupDescriptor { pub layout: BindGroupLayoutId, pub bindings: *const BindGroupBinding, pub bindings_length: usize, } #[derive(Debug)] pub struct BindGroup<B: hal::Backend> { pub(crate) raw: DescriptorSet<B>, pub(crate) device_id: Stored<DeviceId>, pub(crate) layout_id: BindGroupLayoutId, pub(crate) life_guard: LifeGuard, pub(crate) used: TrackerSet, pub(crate) dynamic_count: usize, } impl<B: hal::Backend> Borrow<RefCount> for BindGroup<B> { fn borrow(&self) -> &RefCount { &self.life_guard.ref_count } }