rafx_api/
texture.rs

1#[cfg(feature = "rafx-dx12")]
2use crate::dx12::RafxTextureDx12;
3#[cfg(any(
4    feature = "rafx-empty",
5    not(any(
6        feature = "rafx-dx12",
7        feature = "rafx-metal",
8        feature = "rafx-vulkan",
9        feature = "rafx-gles2",
10        feature = "rafx-gles3"
11    ))
12))]
13use crate::empty::RafxTextureEmpty;
14#[cfg(feature = "rafx-gles2")]
15use crate::gles2::RafxTextureGles2;
16#[cfg(feature = "rafx-gles3")]
17use crate::gles3::RafxTextureGles3;
18#[cfg(feature = "rafx-metal")]
19use crate::metal::RafxTextureMetal;
20#[cfg(feature = "rafx-vulkan")]
21use crate::vulkan::RafxTextureVulkan;
22use crate::RafxTextureDef;
23
24/// An image that can be used by the GPU.
25///
26/// Textures must not be dropped if they are in use by the GPU.
27#[derive(Clone, Debug)]
28pub enum RafxTexture {
29    #[cfg(feature = "rafx-dx12")]
30    Dx12(RafxTextureDx12),
31    #[cfg(feature = "rafx-vulkan")]
32    Vk(RafxTextureVulkan),
33    #[cfg(feature = "rafx-metal")]
34    Metal(RafxTextureMetal),
35    #[cfg(feature = "rafx-gles2")]
36    Gles2(RafxTextureGles2),
37    #[cfg(feature = "rafx-gles3")]
38    Gles3(RafxTextureGles3),
39    #[cfg(any(
40        feature = "rafx-empty",
41        not(any(
42            feature = "rafx-dx12",
43            feature = "rafx-metal",
44            feature = "rafx-vulkan",
45            feature = "rafx-gles2",
46            feature = "rafx-gles3"
47        ))
48    ))]
49    Empty(RafxTextureEmpty),
50}
51
52impl RafxTexture {
53    /// Return the metadata used to create the texture
54    pub fn texture_def(&self) -> &RafxTextureDef {
55        match self {
56            #[cfg(feature = "rafx-dx12")]
57            RafxTexture::Dx12(inner) => inner.texture_def(),
58            #[cfg(feature = "rafx-vulkan")]
59            RafxTexture::Vk(inner) => inner.texture_def(),
60            #[cfg(feature = "rafx-metal")]
61            RafxTexture::Metal(inner) => inner.texture_def(),
62            #[cfg(feature = "rafx-gles2")]
63            RafxTexture::Gles2(inner) => inner.texture_def(),
64            #[cfg(feature = "rafx-gles3")]
65            RafxTexture::Gles3(inner) => inner.texture_def(),
66            #[cfg(any(
67                feature = "rafx-empty",
68                not(any(
69                    feature = "rafx-dx12",
70                    feature = "rafx-metal",
71                    feature = "rafx-vulkan",
72                    feature = "rafx-gles2",
73                    feature = "rafx-gles3"
74                ))
75            ))]
76            RafxTexture::Empty(inner) => inner.texture_def(),
77        }
78    }
79
80    /// Sets a name for this texture. This is useful for debugging, graphics debuggers/profilers such
81    /// as nsight graphics or renderdoc will display this texture with the given name in the list of resources.
82    pub fn set_debug_name(
83        &self,
84        _name: impl AsRef<str>,
85    ) {
86        match self {
87            #[cfg(feature = "rafx-dx12")]
88            RafxTexture::Dx12(inner) => inner.set_debug_name(_name),
89            #[cfg(feature = "rafx-vulkan")]
90            RafxTexture::Vk(inner) => inner.set_debug_name(_name),
91            #[cfg(feature = "rafx-metal")]
92            RafxTexture::Metal(inner) => inner.set_debug_name(_name),
93            #[cfg(feature = "rafx-gles2")]
94            RafxTexture::Gles2(_) => {}
95            #[cfg(feature = "rafx-gles3")]
96            RafxTexture::Gles3(_) => {}
97            #[cfg(any(
98                feature = "rafx-empty",
99                not(any(
100                    feature = "rafx-dx12",
101                    feature = "rafx-metal",
102                    feature = "rafx-vulkan",
103                    feature = "rafx-gles2",
104                    feature = "rafx-gles3"
105                ))
106            ))]
107            RafxTexture::Empty(inner) => inner.set_debug_name(_name),
108        }
109    }
110
111    /// Get the underlying vulkan API object. This provides access to any internally created
112    /// vulkan objects.
113    #[cfg(feature = "rafx-dx12")]
114    pub fn dx12_texture(&self) -> Option<&RafxTextureDx12> {
115        match self {
116            #[cfg(feature = "rafx-dx12")]
117            RafxTexture::Dx12(inner) => Some(inner),
118            #[cfg(feature = "rafx-vulkan")]
119            RafxTexture::Vk(_) => None,
120            #[cfg(feature = "rafx-metal")]
121            RafxTexture::Metal(_) => None,
122            #[cfg(feature = "rafx-gles2")]
123            RafxTexture::Gles2(_) => None,
124            #[cfg(feature = "rafx-gles3")]
125            RafxTexture::Gles3(_) => None,
126            #[cfg(any(
127                feature = "rafx-empty",
128                not(any(
129                    feature = "rafx-dx12",
130                    feature = "rafx-metal",
131                    feature = "rafx-vulkan",
132                    feature = "rafx-gles2",
133                    feature = "rafx-gles3"
134                ))
135            ))]
136            RafxTexture::Empty(_) => None,
137        }
138    }
139
140    /// Get the underlying vulkan API object. This provides access to any internally created
141    /// vulkan objects.
142    #[cfg(feature = "rafx-vulkan")]
143    pub fn vk_texture(&self) -> Option<&RafxTextureVulkan> {
144        match self {
145            #[cfg(feature = "rafx-dx12")]
146            RafxTexture::Dx12(_) => None,
147            #[cfg(feature = "rafx-vulkan")]
148            RafxTexture::Vk(inner) => Some(inner),
149            #[cfg(feature = "rafx-metal")]
150            RafxTexture::Metal(_) => None,
151            #[cfg(feature = "rafx-gles2")]
152            RafxTexture::Gles2(_) => None,
153            #[cfg(feature = "rafx-gles3")]
154            RafxTexture::Gles3(_) => None,
155            #[cfg(any(
156                feature = "rafx-empty",
157                not(any(
158                    feature = "rafx-dx12",
159                    feature = "rafx-metal",
160                    feature = "rafx-vulkan",
161                    feature = "rafx-gles2",
162                    feature = "rafx-gles3"
163                ))
164            ))]
165            RafxTexture::Empty(_) => None,
166        }
167    }
168
169    /// Get the underlying metal API object. This provides access to any internally created
170    /// metal objects.
171    #[cfg(feature = "rafx-metal")]
172    pub fn metal_texture(&self) -> Option<&RafxTextureMetal> {
173        match self {
174            #[cfg(feature = "rafx-dx12")]
175            RafxTexture::Dx12(_) => None,
176            #[cfg(feature = "rafx-vulkan")]
177            RafxTexture::Vk(_) => None,
178            #[cfg(feature = "rafx-metal")]
179            RafxTexture::Metal(inner) => Some(inner),
180            #[cfg(feature = "rafx-gles2")]
181            RafxTexture::Gles2(_) => None,
182            #[cfg(feature = "rafx-gles3")]
183            RafxTexture::Gles3(_) => None,
184            #[cfg(any(
185                feature = "rafx-empty",
186                not(any(
187                    feature = "rafx-dx12",
188                    feature = "rafx-metal",
189                    feature = "rafx-vulkan",
190                    feature = "rafx-gles2",
191                    feature = "rafx-gles3"
192                ))
193            ))]
194            RafxTexture::Empty(_) => None,
195        }
196    }
197
198    /// Get the underlying metal API object. This provides access to any internally created
199    /// metal objects.
200    #[cfg(feature = "rafx-gles2")]
201    pub fn gles2_texture(&self) -> Option<&RafxTextureGles2> {
202        match self {
203            #[cfg(feature = "rafx-dx12")]
204            RafxTexture::Dx12(_) => None,
205            #[cfg(feature = "rafx-vulkan")]
206            RafxTexture::Vk(_) => None,
207            #[cfg(feature = "rafx-metal")]
208            RafxTexture::Metal(_) => None,
209            #[cfg(feature = "rafx-gles2")]
210            RafxTexture::Gles2(inner) => Some(inner),
211            #[cfg(feature = "rafx-gles3")]
212            RafxTexture::Gles3(_) => None,
213            #[cfg(any(
214                feature = "rafx-empty",
215                not(any(
216                    feature = "rafx-dx12",
217                    feature = "rafx-metal",
218                    feature = "rafx-vulkan",
219                    feature = "rafx-gles2",
220                    feature = "rafx-gles3"
221                ))
222            ))]
223            RafxTexture::Empty(_) => None,
224        }
225    }
226
227    /// Get the underlying metal API object. This provides access to any internally created
228    /// metal objects.
229    #[cfg(feature = "rafx-gles3")]
230    pub fn gles3_texture(&self) -> Option<&RafxTextureGles3> {
231        match self {
232            #[cfg(feature = "rafx-dx12")]
233            RafxTexture::Dx12(_) => None,
234            #[cfg(feature = "rafx-vulkan")]
235            RafxTexture::Vk(_) => None,
236            #[cfg(feature = "rafx-metal")]
237            RafxTexture::Metal(_) => None,
238            #[cfg(feature = "rafx-gles2")]
239            RafxTexture::Gles2(_) => None,
240            #[cfg(feature = "rafx-gles3")]
241            RafxTexture::Gles3(inner) => Some(inner),
242            #[cfg(any(
243                feature = "rafx-empty",
244                not(any(
245                    feature = "rafx-dx12",
246                    feature = "rafx-metal",
247                    feature = "rafx-vulkan",
248                    feature = "rafx-gles2",
249                    feature = "rafx-gles3"
250                ))
251            ))]
252            RafxTexture::Empty(_) => None,
253        }
254    }
255
256    /// Get the underlying metal API object. This provides access to any internally created
257    /// metal objects.
258    #[cfg(any(
259        feature = "rafx-empty",
260        not(any(
261            feature = "rafx-dx12",
262            feature = "rafx-metal",
263            feature = "rafx-vulkan",
264            feature = "rafx-gles2",
265            feature = "rafx-gles3"
266        ))
267    ))]
268    pub fn empty_texture(&self) -> Option<&RafxTextureEmpty> {
269        match self {
270            #[cfg(feature = "rafx-dx12")]
271            RafxTexture::Dx12(_) => None,
272            #[cfg(feature = "rafx-vulkan")]
273            RafxTexture::Vk(_) => None,
274            #[cfg(feature = "rafx-metal")]
275            RafxTexture::Metal(_) => None,
276            #[cfg(feature = "rafx-gles2")]
277            RafxTexture::Gles2(_) => None,
278            #[cfg(feature = "rafx-gles3")]
279            RafxTexture::Gles3(_) => None,
280            #[cfg(any(
281                feature = "rafx-empty",
282                not(any(
283                    feature = "rafx-dx12",
284                    feature = "rafx-metal",
285                    feature = "rafx-vulkan",
286                    feature = "rafx-gles2",
287                    feature = "rafx-gles3"
288                ))
289            ))]
290            RafxTexture::Empty(inner) => Some(inner),
291        }
292    }
293}