bedrock/resources.rs
1//! Vulkan Resources
2//!
3//! (以下メモ)
4//!
5//! ## バッファの作成
6//!
7//! [`BufferDesc`](struct.BufferDesc.html)で作成する
8//!
9//! ```rust,ignore
10//! let buffer = BufferDesc::new(4 * 4 * 3, BufferUsage::VERTEX_BUFFER.transfer_dest()).crete(&device)?;
11//! ```
12//!
13//! `new`から`create`までにメソッドチェーンを用いて以下のようなバッファの詳細を指定できる。
14//!
15//! - [`sparse_binding_opt`](struct.BufferDesc.html#method.sparse_binding_opt): SparseBinding時の許可される挙動を指定する。デフォルトでは"なし"
16//! - [`BufferSparseBinding::Bound`]でSparseBindingによってメモリにバインドできることを示す
17//! - [`BufferSparseBinding::Residency`]で部分的にメモリにバインドできることを示す
18//! - [`BufferSparseBinding::Aliased`]で、バインド先のメモリ範囲が他のバッファに同時に使われる可能性を示す
19//! - [`BufferSparseBinding::Both`]は`Residency`と`Aliased`の両方を示す
20//! - [`sharing_queue_families`](struct.BufferDesc.html#method.sharing_queue_families): 複数のキューでアイテムを共有する際に、共有したいキューファミリの番号を指定する。デフォルトは空(占有)
21//!
22//! ## イメージの作成
23//!
24//! [`ImageDesc`](struct.ImageDesc.html)で作成する
25//!
26//! ```rust,ignore
27//! let image = ImageDesc::new(&Extent2D(128, 128), VK_FORMAT_R8G8B8A8_UNORM, ImageUsage::SAMPLED.color_attachment(), ImageLayout::General)
28//! .create(&device)?;
29//! ```
30//!
31//! [`ImageDesc::new`](struct.ImageDesc.html#method.new)の第一引数に
32//!
33//! - `Extent1D`を指定すると1Dテクスチャ
34//! - `Extent2D`を指定すると2Dテクスチャ
35//! - `Extent3D`を指定すると3Dテクスチャ
36//!
37//! を生成するようになる。
38//! `new`から`create`までにメソッドチェーンを用いて以下のようなイメージの詳細を指定できる。
39//!
40//! - [`sample_counts`](struct.ImageDesc.html#method.sample_counts): イメージの要素ごとのサンプル数を2^nの値(1, 2, 4, 8, 16, 32, 64)で指定する。デフォルトは1。
41//! 以下の条件を一つでも満たす場合は1を設定する必要がある。
42//! - 最適タイリング(`VK_IMAGE_TILING_OPTIMAL`)が使われていない(`use_linear_tiling`を併用する場合)
43//! - 2Dテクスチャではない(`new`の第一引数が`Extent2D`でない場合)
44//! - キューブテクスチャである(`flags`に`ImageFlags::CUBE_COMPATIBLE`を指定している場合)
45//! - 指定したフォーマットがカラーアタッチメントもしくは深度/ステンシルアタッチメントとしての利用に対応していない場合
46//! - RGBAフォーマットやDSフォーマットを指定している分には気にする必要はない
47//! - [`use_linear_tiling`](struct.ImageDesc.html#method.use_linear_tiling): イメージデータのメモリ上での配列を線形に強制する(デフォルトではデバイス最適な並びを使うようになっている)
48//! - ディスクから読み込んだピクセルデータなどを`map`して流し込む場合はこれが必要
49//! - [`array_layers`](struct.ImageDesc.html#method.array_layers): 配列イメージの要素数を指定する。デフォルトは1(配列ではない)
50//! - [`mip_levels`](struct.ImageDesc.html#method.mip_levels): ミップマップの最大縮小レベルを指定する。デフォルトは1(ミップマップを使用しない)
51//! - [`sharing_queue_families`](struct.ImageDesc.html#method.sharing_queue_families): 複数のキューでアイテムを共有する際に、共有したいキューファミリの番号を指定する。デフォルトは空(占有)
52//! - [`flags`](struct.ImageDesc.html#method.flags): [`ImageFlags`](struct.ImageFlags.html)を指定する。デフォルトでは"なし"
53//!
54//! ## `BufferUsage`の種類
55//!
56//! [`BufferUsage`](struct.BufferUsage.html)はメソッドチェーンを利用してビットフラグを指定する。メソッド名は定数名をすべて小文字にしたもの。
57//!
58//! ```rust,ignore
59//! BufferUsage::VERTEX_BUFFER.transfer_dest()
60//! ```
61//!
62//! ### 入力/利用形態系
63//!
64//! - `VERTEX_BUFFER`: **頂点バッファ** として頂点入力時に使用できる
65//! - `INDEX_BUFFER`: **インデックスバッファ** として頂点入力時に使用できる
66//! - `UNIFORM_BUFFER`: **定数バッファ** としてデスクリプタ入力時に使用できる
67//! - `STORAGE_BUFFER`: **ストレージバッファ** としてデスクリプタ入力時に使用できる
68//! - 定数バッファより大容量
69//! - `UNIFORM_TEXEL_BUFFER`: 1Dのイメージアイテムとして適用可能な定数バッファとしてデスクリプタ入力時に使用できる
70//! - `STORAGE_TEXEL_BUFFER`: 1Dのイメージアイテムとして適用可能なストレージバッファとしてデスクリプタ入力時に使用できる
71//! - `INDIRECT_BUFFER`: 間接実行コマンドの **引数バッファ** として使用できる
72//!
73//! ### 転送系
74//!
75//! - `TRANSFER_SRC`: 転送コマンドでソースアイテムとして指定可能であることを示す
76//! - `TRANSFER_DEST`: 転送コマンドで対象アイテムとして指定可能であることを示す
77//! - *このバッファに対してクリア、値埋めコマンドを適用したい場合もこれを指定する必要がある*
78//!
79//! ## `ImageUsage`の種類
80//!
81//! [`ImageUsage`](struct.ImageUsage.html)もメソッドチェーンを利用してビットフラグを指定する。
82//!
83//! ```rust,ignore
84//! ImageUsage::SAMPLED.color_attachment()
85//! ```
86//!
87//! ### シェーダ入力系
88//!
89//! - `SAMPLED`: シェーダによってサンプル可能であることを示す
90//! - シェーダで **テクスチャ** として使用できるようにする場合はこれ
91//! - `INPUT_ATTACHMENT`: シェーダによって入力アタッチメントとしての扱いを受けることができる
92//! - シェーダで入力アタッチメントとして指定したい場合(中間バッファなど)はこれ
93//! - `STORAGE`: シェーダのイメージ入力として使用可能であることを示す
94//! - `SAMPLED`との違いは、こちらはサンプラーによるサンプリングを使用できない
95//!
96//! ### 出力系
97//!
98//! - `COLOR_ATTACHMENT`: [`crate::framebuffer::Framebuffer`]の出力(カラーもしくはマルチサンプル解決)アイテムとして利用可能であることを示す
99//! - 要するに、 **コマンドで描画した結果を受け取る** ことができる
100//! - プロシージャルテクスチャの作成やオフスクリーンレンダリングの出力として使いたい場合はこれ
101//! - `DEPTH_STENCIL_ATTACHMENT`: [`crate::framebuffer::Framebuffer`]での深度/ステンシルバッファとして利用可能であることを示す
102//! - オフスクリーンレンダリングなどで深度バッファが必要な場合はこれ
103//!
104//! ### 転送系
105//!
106//! - `TRANSFER_SRC`: 転送コマンドでソースアイテムとして指定可能であることを示す
107//! - このテクスチャが何らかのコピー元になる場合はこれ
108//! - `TRANSFER_DEST`: 転送コマンドで対象アイテムとして指定可能であることを示す
109//! - このテクスチャが何らかのコピー先になる場合はこれ
110//! - このテクスチャに対してクリア、値埋めコマンドを適用したい場合はこれ
111//!
112//! ### その他
113//!
114//! - `TRANSIENT_ATTACHMENT`: 色、深度/ステンシル、マルチサンプル解決、および入力アイテムとして指定可能であることを示す
115//! - テクスチャが`VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT`が指定された[`DeviceMemory`]にバインドされることを想定している
116//! - パス間の中間バッファなどで、一時的に確保される必要があるバッファに指定するとメモリ使用量が少なくて済むかもしれない?
117//!
118
119use crate::*;
120use cfg_if::cfg_if;
121use derives::implements;
122
123mod memory;
124pub use self::memory::*;
125
126mod buffer;
127pub use self::buffer::*;
128
129mod image;
130pub use self::image::*;
131
132mod sampler;
133pub use self::sampler::*;
134
135cfg_if! {
136 if #[cfg(feature = "VK_KHR_swapchain")] {
137 mod swapchain_image;
138 pub use self::swapchain_image::*;
139 }
140}
141
142/// Common operations for memory bound objects
143pub trait MemoryBound: VkHandle {
144 #[cfg(feature = "VK_KHR_get_memory_requirements2")]
145 type MemoryRequirementsInfo2<'b>
146 where
147 Self: 'b;
148
149 /// Returns the memory requirements for specified Vulkan object
150 #[implements]
151 fn requirements(&self) -> VkMemoryRequirements;
152
153 #[cfg(feature = "VK_KHR_get_memory_requirements2")]
154 fn requirements2<'b>(&'b self) -> Self::MemoryRequirementsInfo2<'b>;
155
156 /// Bind device memory to the object
157 /// # Failure
158 /// On failure, this command returns
159 ///
160 /// * `VK_ERROR_OUT_OF_HOST_MEMORY`
161 /// * `VK_ERROR_OUT_OF_DEVICE_MEMORY`
162 #[implements]
163 fn bind(&mut self, memory: &(impl VkHandle<Handle = VkDeviceMemory> + ?Sized), offset: usize) -> crate::Result<()>
164 where
165 Self: VkHandleMut;
166}
167
168#[inline(always)]
169#[implements]
170pub fn bind_memory(
171 resource: &mut (impl MemoryBound + VkHandleMut + ?Sized),
172 memory: &(impl VkHandle<Handle = VkDeviceMemory> + ?Sized),
173 offset: usize,
174) -> crate::Result<()> {
175 resource.bind(memory, offset)
176}
177
178impl VkComponentMapping {
179 pub const IDENTITY: Self = Self::all(VK_COMPONENT_SWIZZLE_IDENTITY);
180 pub const ZERO: Self = Self::all(VK_COMPONENT_SWIZZLE_ZERO);
181 pub const ONE: Self = Self::all(VK_COMPONENT_SWIZZLE_ONE);
182
183 /// Set same value to all component
184 pub const fn all(s: VkComponentSwizzle) -> Self {
185 Self { r: s, g: s, b: s, a: s }
186 }
187
188 /// Set 2 values with repeating
189 pub const fn set2(a: VkComponentSwizzle, b: VkComponentSwizzle) -> Self {
190 Self { r: a, g: b, b: a, a: b }
191 }
192}