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), brvk::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//! - 最適タイリング(`brvk::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//! - テクスチャが`brvk::VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT`が指定された[`DeviceMemory`]にバインドされることを想定している
116//! - パス間の中間バッファなどで、一時的に確保される必要があるバッファに指定するとメモリ使用量が少なくて済むかもしれない?
117//!
118use bedrock_vk as brvk;
119
120use crate::*;
121use cfg_if::cfg_if;
122use derives::implements;
123
124mod memory;
125pub use self::memory::*;
126
127mod buffer;
128pub use self::buffer::*;
129
130mod image;
131pub use self::image::*;
132
133mod sampler;
134pub use self::sampler::*;
135
136cfg_if! {
137 if #[cfg(feature = "VK_KHR_swapchain")] {
138 mod swapchain_image;
139 pub use self::swapchain_image::*;
140 }
141}
142
143/// Common operations for memory bound objects
144pub trait MemoryBound: VkHandle {
145 #[cfg(feature = "VK_KHR_get_memory_requirements2")]
146 type MemoryRequirementsInfo2<'b>
147 where
148 Self: 'b;
149
150 /// Returns the memory requirements for specified Vulkan object
151 #[implements]
152 fn requirements(&self) -> brvk::VkMemoryRequirements;
153
154 #[cfg(feature = "VK_KHR_get_memory_requirements2")]
155 fn requirements2<'b>(&'b self) -> Self::MemoryRequirementsInfo2<'b>;
156
157 /// Bind device memory to the object
158 /// # Failure
159 /// On failure, this command returns
160 ///
161 /// * `brvk::VK_ERROR_OUT_OF_HOST_MEMORY`
162 /// * `brvk::VK_ERROR_OUT_OF_DEVICE_MEMORY`
163 #[implements]
164 fn bind(
165 &mut self,
166 memory: &(impl VkHandle<Handle = brvk::VkDeviceMemory> + ?Sized),
167 offset: DeviceSize,
168 ) -> crate::Result<()>
169 where
170 Self: VkHandleMut;
171}
172
173#[implements]
174#[inline(always)]
175pub fn bind_memory(
176 resource: &mut (impl MemoryBound + VkHandleMut + ?Sized),
177 memory: &(impl VkHandle<Handle = brvk::VkDeviceMemory> + ?Sized),
178 offset: DeviceSize,
179) -> crate::Result<()> {
180 resource.bind(memory, offset)
181}