1 // Copyright 2015 The Gfx-rs Developers.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #![deny(missing_docs, missing_copy_implementations)]
16 
17 //! Resource handles
18 
19 use std::marker::PhantomData;
20 use std::ops::Deref;
21 use std::sync::Arc;
22 use {buffer, shade, texture, Resources};
23 use memory::Typed;
24 
25 /// Untyped buffer handle
26 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
27 pub struct RawBuffer<R: Resources>(Arc<buffer::Raw<R>>);
28 
29 impl<R: Resources> Deref for RawBuffer<R> {
30     type Target = buffer::Raw<R>;
deref(&self) -> &Self::Target31     fn deref(&self) -> &Self::Target { &self.0 }
32 }
33 
34 /// Type-safe buffer handle
35 #[derive(Derivative)]
36 #[derivative(Clone, Debug, Eq, Hash, PartialEq)]
37 pub struct Buffer<R: Resources, T>(
38     RawBuffer<R>,
39     #[derivative(Hash = "ignore", PartialEq = "ignore")]
40     PhantomData<T>
41 );
42 
43 impl<R: Resources, T> Typed for Buffer<R, T> {
44     type Raw = RawBuffer<R>;
new(handle: RawBuffer<R>) -> Buffer<R, T>45     fn new(handle: RawBuffer<R>) -> Buffer<R, T> {
46         Buffer(handle, PhantomData)
47     }
48 
raw(&self) -> &RawBuffer<R>49     fn raw(&self) -> &RawBuffer<R> { &self.0 }
50 }
51 
52 impl<R: Resources, T> Buffer<R, T> {
53     /// Get the associated information about the buffer
get_info(&self) -> &buffer::Info54     pub fn get_info(&self) -> &buffer::Info { self.raw().get_info() }
55 
56     /// Get the number of elements in the buffer.
57     ///
58     /// Fails if `T` is zero-sized.
len(&self) -> usize59     pub fn len(&self) -> usize {
60         unsafe { self.raw().len::<T>() }
61     }
62 }
63 
64 /// Shader Handle
65 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
66 pub struct Shader<R: Resources>(Arc<R::Shader>);
67 
68 /// Program Handle
69 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
70 pub struct Program<R: Resources>(Arc<shade::Program<R>>);
71 
72 impl<R: Resources> Deref for Program<R> {
73     type Target = shade::Program<R>;
deref(&self) -> &Self::Target74     fn deref(&self) -> &Self::Target { &self.0 }
75 }
76 
77 /// Raw Pipeline State Handle
78 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
79 pub struct RawPipelineState<R: Resources>(Arc<R::PipelineStateObject>, Program<R>);
80 
81 /// Raw texture handle
82 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
83 pub struct RawTexture<R: Resources>(Arc<texture::Raw<R>>);
84 
85 impl<R: Resources> Deref for RawTexture<R> {
86     type Target = texture::Raw<R>;
deref(&self) -> &Self::Target87     fn deref(&self) -> &Self::Target { &self.0 }
88 }
89 
90 /// Typed texture object
91 #[derive(Derivative)]
92 #[derivative(Clone, Debug, Eq, Hash, PartialEq)]
93 pub struct Texture<R: Resources, S>(
94     RawTexture<R>,
95     #[derivative(Hash = "ignore", PartialEq = "ignore")]
96     PhantomData<S>
97 );
98 
99 impl<R: Resources, S> Typed for Texture<R, S> {
100     type Raw = RawTexture<R>;
new(handle: RawTexture<R>) -> Texture<R, S>101     fn new(handle: RawTexture<R>) -> Texture<R, S> {
102         Texture(handle, PhantomData)
103     }
104 
raw(&self) -> &RawTexture<R>105     fn raw(&self) -> &RawTexture<R> { &self.0 }
106 }
107 
108 impl<R: Resources, S> Texture<R, S> {
109     /// Get texture descriptor
get_info(&self) -> &texture::Info110     pub fn get_info(&self) -> &texture::Info { self.raw().get_info() }
111 }
112 
113 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
114 enum ViewSource<R: Resources> {
115     Buffer(RawBuffer<R>),
116     Texture(RawTexture<R>),
117 }
118 
119 /// Raw Shader Resource View Handle
120 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
121 pub struct RawShaderResourceView<R: Resources>(Arc<R::ShaderResourceView>, ViewSource<R>);
122 
123 /// Type-safe Shader Resource View Handle
124 #[derive(Derivative)]
125 #[derivative(Clone, Debug, Eq, Hash, PartialEq)]
126 pub struct ShaderResourceView<R: Resources, T>(
127     RawShaderResourceView<R>,
128     #[derivative(Hash = "ignore", PartialEq = "ignore")]
129     PhantomData<T>
130 );
131 
132 impl<R: Resources, T> Typed for ShaderResourceView<R, T> {
133     type Raw = RawShaderResourceView<R>;
new(handle: RawShaderResourceView<R>) -> ShaderResourceView<R, T>134     fn new(handle: RawShaderResourceView<R>) -> ShaderResourceView<R, T> {
135         ShaderResourceView(handle, PhantomData)
136     }
137 
raw(&self) -> &RawShaderResourceView<R>138     fn raw(&self) -> &RawShaderResourceView<R> { &self.0 }
139 }
140 
141 /// Raw Unordered Access View Handle
142 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
143 pub struct RawUnorderedAccessView<R: Resources>(Arc<R::UnorderedAccessView>, ViewSource<R>);
144 
145 /// Type-safe Unordered Access View Handle
146 #[derive(Derivative)]
147 #[derivative(Clone, Debug, Eq, Hash, PartialEq)]
148 pub struct UnorderedAccessView<R: Resources, T>(
149     RawUnorderedAccessView<R>,
150     #[derivative(Hash = "ignore", PartialEq = "ignore")]
151     PhantomData<T>
152 );
153 
154 impl<R: Resources, T> Typed for UnorderedAccessView<R, T> {
155     type Raw = RawUnorderedAccessView<R>;
new(handle: RawUnorderedAccessView<R>) -> UnorderedAccessView<R, T>156     fn new(handle: RawUnorderedAccessView<R>) -> UnorderedAccessView<R, T> {
157         UnorderedAccessView(handle, PhantomData)
158     }
159 
raw(&self) -> &RawUnorderedAccessView<R>160     fn raw(&self) -> &RawUnorderedAccessView<R> { &self.0 }
161 }
162 
163 /// Raw RTV
164 // TODO: Arc it all
165 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
166 pub struct RawRenderTargetView<R: Resources>(Arc<R::RenderTargetView>, RawTexture<R>, texture::Dimensions);
167 
168 impl<R: Resources> RawRenderTargetView<R> {
169     /// Get target dimensions
get_dimensions(&self) -> texture::Dimensions170     pub fn get_dimensions(&self) -> texture::Dimensions { self.2 }
171 
172     /// Get the associated texture
get_texture(&self) -> &RawTexture<R>173     pub fn get_texture(&self) -> &RawTexture<R> { &self.1 }
174 }
175 
176 /// Raw DSV
177 // TODO: Arc it all
178 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
179 pub struct RawDepthStencilView<R: Resources>(Arc<R::DepthStencilView>, RawTexture<R>, texture::Dimensions);
180 
181 impl<R: Resources> RawDepthStencilView<R> {
182     /// Get target dimensions
get_dimensions(&self) -> texture::Dimensions183     pub fn get_dimensions(&self) -> texture::Dimensions { self.2 }
184 
185     /// Get the associated texture
get_texture(&self) -> &RawTexture<R>186     pub fn get_texture(&self) -> &RawTexture<R> { &self.1 }
187 }
188 
189 /// Typed RTV
190 #[derive(Derivative)]
191 #[derivative(Clone, Debug, Eq, Hash, PartialEq)]
192 pub struct RenderTargetView<R: Resources, T>(
193     RawRenderTargetView<R>,
194     #[derivative(Hash = "ignore", PartialEq = "ignore")]
195     PhantomData<T>
196 );
197 
198 impl<R: Resources, T> RenderTargetView<R, T> {
199     /// Get target dimensions
get_dimensions(&self) -> texture::Dimensions200     pub fn get_dimensions(&self) -> texture::Dimensions { self.raw().get_dimensions() }
201 }
202 
203 impl<R: Resources, T> Typed for RenderTargetView<R, T> {
204     type Raw = RawRenderTargetView<R>;
new(h: RawRenderTargetView<R>) -> RenderTargetView<R, T>205     fn new(h: RawRenderTargetView<R>) -> RenderTargetView<R, T> {
206         RenderTargetView(h, PhantomData)
207     }
208 
raw(&self) -> &RawRenderTargetView<R>209     fn raw(&self) -> &RawRenderTargetView<R> { &self.0 }
210 }
211 
212 /// Typed DSV
213 #[derive(Derivative)]
214 #[derivative(Clone, Debug, Eq, Hash, PartialEq)]
215 pub struct DepthStencilView<R: Resources, T>(
216     RawDepthStencilView<R>,
217     #[derivative(Hash = "ignore", PartialEq = "ignore")]
218     PhantomData<T>
219 );
220 
221 impl<R: Resources, T> DepthStencilView<R, T> {
222     /// Get target dimensions
get_dimensions(&self) -> texture::Dimensions223     pub fn get_dimensions(&self) -> texture::Dimensions {
224         self.raw().get_dimensions()
225     }
226 }
227 
228 impl<R: Resources, T> Typed for DepthStencilView<R, T> {
229     type Raw = RawDepthStencilView<R>;
new(h: RawDepthStencilView<R>) -> DepthStencilView<R, T>230     fn new(h: RawDepthStencilView<R>) -> DepthStencilView<R, T> {
231         DepthStencilView(h, PhantomData)
232     }
233 
raw(&self) -> &RawDepthStencilView<R>234     fn raw(&self) -> &RawDepthStencilView<R> { &self.0 }
235 }
236 
237 /// Sampler Handle
238 // TODO: Arc it all
239 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
240 pub struct Sampler<R: Resources>(Arc<R::Sampler>, texture::SamplerInfo);
241 
242 impl<R: Resources> Sampler<R> {
243     /// Get sampler info
get_info(&self) -> &texture::SamplerInfo244     pub fn get_info(&self) -> &texture::SamplerInfo { &self.1 }
245 }
246 
247 /// Fence Handle
248 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
249 pub struct Fence<R: Resources>(Arc<R::Fence>);
250 
251 impl<R: Resources> Fence<R> {
252     #[doc(hidden)]
resource(&self) -> &R::Fence253     pub fn resource(&self) -> &R::Fence { &self.0 }
254 }
255 
256 
257 /// Stores reference-counted resources used in a command buffer.
258 /// Seals actual resource names behind the interface, automatically
259 /// referencing them both by the Factory on resource creation
260 /// and the Renderer during CommandBuffer population.
261 #[allow(missing_docs)]
262 #[derive(Debug)]
263 pub struct Manager<R: Resources> {
264     buffers:       Vec<Arc<buffer::Raw<R>>>,
265     shaders:       Vec<Arc<R::Shader>>,
266     programs:      Vec<Arc<shade::Program<R>>>,
267     psos:          Vec<Arc<R::PipelineStateObject>>,
268     textures:      Vec<Arc<texture::Raw<R>>>,
269     srvs:          Vec<Arc<R::ShaderResourceView>>,
270     uavs:          Vec<Arc<R::UnorderedAccessView>>,
271     rtvs:          Vec<Arc<R::RenderTargetView>>,
272     dsvs:          Vec<Arc<R::DepthStencilView>>,
273     samplers:      Vec<Arc<R::Sampler>>,
274     fences:        Vec<Arc<R::Fence>>,
275 }
276 
277 /// A service trait to be used by the device implementation
278 #[doc(hidden)]
279 pub trait Producer<R: Resources> {
make_buffer(&mut self, R::Buffer, buffer::Info, Option<R::Mapping>) -> RawBuffer<R>280     fn make_buffer(&mut self,
281                    R::Buffer,
282                    buffer::Info,
283                    Option<R::Mapping>) -> RawBuffer<R>;
make_shader(&mut self, R::Shader) -> Shader<R>284     fn make_shader(&mut self, R::Shader) -> Shader<R>;
make_program(&mut self, R::Program, shade::ProgramInfo) -> Program<R>285     fn make_program(&mut self, R::Program, shade::ProgramInfo) -> Program<R>;
make_pso(&mut self, R::PipelineStateObject, &Program<R>) -> RawPipelineState<R>286     fn make_pso(&mut self, R::PipelineStateObject, &Program<R>) -> RawPipelineState<R>;
make_texture(&mut self, R::Texture, texture::Info) -> RawTexture<R>287     fn make_texture(&mut self, R::Texture, texture::Info) -> RawTexture<R>;
make_buffer_srv(&mut self, R::ShaderResourceView, &RawBuffer<R>) -> RawShaderResourceView<R>288     fn make_buffer_srv(&mut self, R::ShaderResourceView, &RawBuffer<R>) -> RawShaderResourceView<R>;
make_texture_srv(&mut self, R::ShaderResourceView, &RawTexture<R>) -> RawShaderResourceView<R>289     fn make_texture_srv(&mut self, R::ShaderResourceView, &RawTexture<R>) -> RawShaderResourceView<R>;
make_buffer_uav(&mut self, R::UnorderedAccessView, &RawBuffer<R>) -> RawUnorderedAccessView<R>290     fn make_buffer_uav(&mut self, R::UnorderedAccessView, &RawBuffer<R>) -> RawUnorderedAccessView<R>;
make_texture_uav(&mut self, R::UnorderedAccessView, &RawTexture<R>) -> RawUnorderedAccessView<R>291     fn make_texture_uav(&mut self, R::UnorderedAccessView, &RawTexture<R>) -> RawUnorderedAccessView<R>;
make_rtv(&mut self, R::RenderTargetView, &RawTexture<R>, texture::Dimensions) -> RawRenderTargetView<R>292     fn make_rtv(&mut self, R::RenderTargetView, &RawTexture<R>, texture::Dimensions) -> RawRenderTargetView<R>;
make_dsv(&mut self, R::DepthStencilView, &RawTexture<R>, texture::Dimensions) -> RawDepthStencilView<R>293     fn make_dsv(&mut self, R::DepthStencilView, &RawTexture<R>, texture::Dimensions) -> RawDepthStencilView<R>;
make_sampler(&mut self, R::Sampler, texture::SamplerInfo) -> Sampler<R>294     fn make_sampler(&mut self, R::Sampler, texture::SamplerInfo) -> Sampler<R>;
make_fence(&mut self, name: R::Fence) -> Fence<R>295     fn make_fence(&mut self, name: R::Fence) -> Fence<R>;
296 
297     /// Walk through all the handles, keep ones that are reference elsewhere
298     /// and call the provided delete function (resource-specific) for others
clean_with<T, A: Fn(&mut T, &buffer::Raw<R>), B: Fn(&mut T, &R::Shader), C: Fn(&mut T, &shade::Program<R>), D: Fn(&mut T, &R::PipelineStateObject), E: Fn(&mut T, &texture::Raw<R>), F: Fn(&mut T, &R::ShaderResourceView), G: Fn(&mut T, &R::UnorderedAccessView), H: Fn(&mut T, &R::RenderTargetView), I: Fn(&mut T, &R::DepthStencilView), J: Fn(&mut T, &R::Sampler), K: Fn(&mut T, &R::Fence), >(&mut self, &mut T, A, B, C, D, E, F, G, H, I, J, K)299     fn clean_with<T,
300         A: Fn(&mut T, &buffer::Raw<R>),
301         B: Fn(&mut T, &R::Shader),
302         C: Fn(&mut T, &shade::Program<R>),
303         D: Fn(&mut T, &R::PipelineStateObject),
304         E: Fn(&mut T, &texture::Raw<R>),
305         F: Fn(&mut T, &R::ShaderResourceView),
306         G: Fn(&mut T, &R::UnorderedAccessView),
307         H: Fn(&mut T, &R::RenderTargetView),
308         I: Fn(&mut T, &R::DepthStencilView),
309         J: Fn(&mut T, &R::Sampler),
310         K: Fn(&mut T, &R::Fence),
311     >(&mut self, &mut T, A, B, C, D, E, F, G, H, I, J, K);
312 }
313 
314 impl<R: Resources> Producer<R> for Manager<R> {
make_buffer(&mut self, res: R::Buffer, info: buffer::Info, mapping: Option<R::Mapping>) -> RawBuffer<R>315     fn make_buffer(&mut self,
316                    res: R::Buffer,
317                    info: buffer::Info,
318                    mapping: Option<R::Mapping>) -> RawBuffer<R> {
319         let r = Arc::new(buffer::Raw::new(res, info, mapping));
320         self.buffers.push(r.clone());
321         RawBuffer(r)
322     }
323 
make_shader(&mut self, res: R::Shader) -> Shader<R>324     fn make_shader(&mut self, res: R::Shader) -> Shader<R> {
325         let r = Arc::new(res);
326         self.shaders.push(r.clone());
327         Shader(r)
328     }
329 
make_program(&mut self, res: R::Program, info: shade::ProgramInfo) -> Program<R>330     fn make_program(&mut self, res: R::Program, info: shade::ProgramInfo) -> Program<R> {
331         let r = Arc::new(shade::Program::new(res, info));
332         self.programs.push(r.clone());
333         Program(r)
334     }
335 
make_pso(&mut self, res: R::PipelineStateObject, program: &Program<R>) -> RawPipelineState<R>336     fn make_pso(&mut self, res: R::PipelineStateObject, program: &Program<R>) -> RawPipelineState<R> {
337         let r = Arc::new(res);
338         self.psos.push(r.clone());
339         RawPipelineState(r, program.clone())
340     }
341 
make_texture(&mut self, res: R::Texture, info: texture::Info) -> RawTexture<R>342     fn make_texture(&mut self, res: R::Texture, info: texture::Info) -> RawTexture<R> {
343         let r = Arc::new(texture::Raw::new(res, info));
344         self.textures.push(r.clone());
345         RawTexture(r)
346     }
347 
make_buffer_srv(&mut self, res: R::ShaderResourceView, buf: &RawBuffer<R>) -> RawShaderResourceView<R>348     fn make_buffer_srv(&mut self, res: R::ShaderResourceView, buf: &RawBuffer<R>) -> RawShaderResourceView<R> {
349         let r = Arc::new(res);
350         self.srvs.push(r.clone());
351         RawShaderResourceView(r, ViewSource::Buffer(buf.clone()))
352     }
353 
make_texture_srv(&mut self, res: R::ShaderResourceView, tex: &RawTexture<R>) -> RawShaderResourceView<R>354     fn make_texture_srv(&mut self, res: R::ShaderResourceView, tex: &RawTexture<R>) -> RawShaderResourceView<R> {
355         let r = Arc::new(res);
356         self.srvs.push(r.clone());
357         RawShaderResourceView(r, ViewSource::Texture(tex.clone()))
358     }
359 
make_buffer_uav(&mut self, res: R::UnorderedAccessView, buf: &RawBuffer<R>) -> RawUnorderedAccessView<R>360     fn make_buffer_uav(&mut self, res: R::UnorderedAccessView, buf: &RawBuffer<R>) -> RawUnorderedAccessView<R> {
361         let r = Arc::new(res);
362         self.uavs.push(r.clone());
363         RawUnorderedAccessView(r, ViewSource::Buffer(buf.clone()))
364     }
365 
make_texture_uav(&mut self, res: R::UnorderedAccessView, tex: &RawTexture<R>) -> RawUnorderedAccessView<R>366     fn make_texture_uav(&mut self, res: R::UnorderedAccessView, tex: &RawTexture<R>) -> RawUnorderedAccessView<R> {
367         let r = Arc::new(res);
368         self.uavs.push(r.clone());
369         RawUnorderedAccessView(r, ViewSource::Texture(tex.clone()))
370     }
371 
make_rtv(&mut self, res: R::RenderTargetView, tex: &RawTexture<R>, dim: texture::Dimensions) -> RawRenderTargetView<R>372     fn make_rtv(&mut self, res: R::RenderTargetView, tex: &RawTexture<R>, dim: texture::Dimensions) -> RawRenderTargetView<R> {
373         let r = Arc::new(res);
374         self.rtvs.push(r.clone());
375         RawRenderTargetView(r, tex.clone(), dim)
376     }
377 
make_dsv(&mut self, res: R::DepthStencilView, tex: &RawTexture<R>, dim: texture::Dimensions) -> RawDepthStencilView<R>378     fn make_dsv(&mut self, res: R::DepthStencilView, tex: &RawTexture<R>, dim: texture::Dimensions) -> RawDepthStencilView<R> {
379         let r = Arc::new(res);
380         self.dsvs.push(r.clone());
381         RawDepthStencilView(r, tex.clone(), dim)
382     }
383 
make_sampler(&mut self, res: R::Sampler, info: texture::SamplerInfo) -> Sampler<R>384     fn make_sampler(&mut self, res: R::Sampler, info: texture::SamplerInfo) -> Sampler<R> {
385         let r = Arc::new(res);
386         self.samplers.push(r.clone());
387         Sampler(r, info)
388     }
389 
make_fence(&mut self, res: R::Fence) -> Fence<R>390     fn make_fence(&mut self, res: R::Fence) -> Fence<R> {
391         let r = Arc::new(res);
392         self.fences.push(r.clone());
393         Fence(r)
394     }
395 
clean_with<T, A: Fn(&mut T, &buffer::Raw<R>), B: Fn(&mut T, &R::Shader), C: Fn(&mut T, &shade::Program<R>), D: Fn(&mut T, &R::PipelineStateObject), E: Fn(&mut T, &texture::Raw<R>), F: Fn(&mut T, &R::ShaderResourceView), G: Fn(&mut T, &R::UnorderedAccessView), H: Fn(&mut T, &R::RenderTargetView), I: Fn(&mut T, &R::DepthStencilView), J: Fn(&mut T, &R::Sampler), K: Fn(&mut T, &R::Fence), >(&mut self, param: &mut T, fa: A, fb: B, fc: C, fd: D, fe: E, ff: F, fg: G, fh: H, fi: I, fj: J, fk: K)396     fn clean_with<T,
397         A: Fn(&mut T, &buffer::Raw<R>),
398         B: Fn(&mut T, &R::Shader),
399         C: Fn(&mut T, &shade::Program<R>),
400         D: Fn(&mut T, &R::PipelineStateObject),
401         E: Fn(&mut T, &texture::Raw<R>),
402         F: Fn(&mut T, &R::ShaderResourceView),
403         G: Fn(&mut T, &R::UnorderedAccessView),
404         H: Fn(&mut T, &R::RenderTargetView),
405         I: Fn(&mut T, &R::DepthStencilView),
406         J: Fn(&mut T, &R::Sampler),
407         K: Fn(&mut T, &R::Fence),
408     >(&mut self, param: &mut T, fa: A, fb: B, fc: C, fd: D, fe: E, ff: F, fg: G, fh: H, fi: I, fj: J, fk: K) {
409         fn clean_vec<X, Param, Fun>(param: &mut Param, vector: &mut Vec<Arc<X>>, fun: Fun)
410             where Fun: Fn(&mut Param, &X)
411         {
412             let mut temp = Vec::new();
413             // delete unique resources and make a list of their indices
414             for (i, v) in vector.iter_mut().enumerate() {
415                 if let Some(x) = Arc::get_mut(v) {
416                     fun(param, x);
417                     temp.push(i);
418                 }
419             }
420             // update the resource vector by removing the elements
421             // starting from the last one
422             for t in temp.iter().rev() {
423                 vector.swap_remove(*t);
424             }
425         }
426         clean_vec(param, &mut self.buffers,       fa);
427         clean_vec(param, &mut self.shaders,       fb);
428         clean_vec(param, &mut self.programs,      fc);
429         clean_vec(param, &mut self.psos,          fd);
430         clean_vec(param, &mut self.textures,      fe);
431         clean_vec(param, &mut self.srvs,          ff);
432         clean_vec(param, &mut self.uavs,          fg);
433         clean_vec(param, &mut self.rtvs,          fh);
434         clean_vec(param, &mut self.dsvs,          fi);
435         clean_vec(param, &mut self.samplers,      fj);
436         clean_vec(param, &mut self.fences,        fk);
437     }
438 }
439 
440 impl<R: Resources> Manager<R> {
441     /// Create a new handle manager
new() -> Manager<R>442     pub fn new() -> Manager<R> {
443         Manager {
444             buffers: Vec::new(),
445             shaders: Vec::new(),
446             programs: Vec::new(),
447             psos: Vec::new(),
448             textures: Vec::new(),
449             srvs: Vec::new(),
450             uavs: Vec::new(),
451             rtvs: Vec::new(),
452             dsvs: Vec::new(),
453             samplers: Vec::new(),
454             fences: Vec::new(),
455         }
456     }
457     /// Clear all references
clear(&mut self)458     pub fn clear(&mut self) {
459         self.buffers.clear();
460         self.shaders.clear();
461         self.programs.clear();
462         self.psos.clear();
463         self.textures.clear();
464         self.srvs.clear();
465         self.uavs.clear();
466         self.rtvs.clear();
467         self.dsvs.clear();
468         self.samplers.clear();
469         self.fences.clear();
470     }
471     /// Extend with all references of another handle manager
extend(&mut self, other: &Manager<R>)472     pub fn extend(&mut self, other: &Manager<R>) {
473         self.buffers  .extend(other.buffers  .iter().map(|h| h.clone()));
474         self.shaders  .extend(other.shaders  .iter().map(|h| h.clone()));
475         self.programs .extend(other.programs .iter().map(|h| h.clone()));
476         self.psos     .extend(other.psos     .iter().map(|h| h.clone()));
477         self.textures .extend(other.textures .iter().map(|h| h.clone()));
478         self.srvs     .extend(other.srvs     .iter().map(|h| h.clone()));
479         self.uavs     .extend(other.uavs     .iter().map(|h| h.clone()));
480         self.rtvs     .extend(other.rtvs     .iter().map(|h| h.clone()));
481         self.dsvs     .extend(other.dsvs     .iter().map(|h| h.clone()));
482         self.samplers .extend(other.samplers .iter().map(|h| h.clone()));
483         self.fences   .extend(other.fences   .iter().map(|h| h.clone()));
484     }
485     /// Count the total number of referenced resources
count(&self) -> usize486     pub fn count(&self) -> usize {
487         self.buffers.len() +
488         self.shaders.len() +
489         self.programs.len() +
490         self.psos.len() +
491         self.textures.len() +
492         self.srvs.len() +
493         self.uavs.len() +
494         self.rtvs.len() +
495         self.dsvs.len() +
496         self.samplers.len() +
497         self.fences.len()
498     }
499     /// Reference a buffer
ref_buffer<'a>(&mut self, handle: &'a RawBuffer<R>) -> &'a R::Buffer500     pub fn ref_buffer<'a>(&mut self, handle: &'a RawBuffer<R>) -> &'a R::Buffer {
501         self.buffers.push(handle.0.clone());
502         handle.resource()
503     }
504     /// Reference a shader
ref_shader<'a>(&mut self, handle: &'a Shader<R>) -> &'a R::Shader505     pub fn ref_shader<'a>(&mut self, handle: &'a Shader<R>) -> &'a R::Shader {
506         self.shaders.push(handle.0.clone());
507         &handle.0
508     }
509     /// Reference a program
ref_program<'a>(&mut self, handle: &'a Program<R>) -> &'a R::Program510     pub fn ref_program<'a>(&mut self, handle: &'a Program<R>) -> &'a R::Program {
511         self.programs.push(handle.0.clone());
512         handle.resource()
513     }
514     /// Reference a pipeline state object
ref_pso<'a>(&mut self, handle: &'a RawPipelineState<R>) -> (&'a R::PipelineStateObject, &'a R::Program)515     pub fn ref_pso<'a>(&mut self, handle: &'a RawPipelineState<R>) -> (&'a R::PipelineStateObject, &'a R::Program) {
516         self.psos.push(handle.0.clone());
517         self.programs.push((handle.1).0.clone());
518         (&handle.0, handle.1.resource())
519     }
520     /// Reference a texture
ref_texture<'a>(&mut self, handle: &'a RawTexture<R>) -> &'a R::Texture521     pub fn ref_texture<'a>(&mut self, handle: &'a RawTexture<R>) -> &'a R::Texture {
522         self.textures.push(handle.0.clone());
523         handle.resource()
524     }
525     /// Reference a shader resource view
ref_srv<'a>(&mut self, handle: &'a RawShaderResourceView<R>) -> &'a R::ShaderResourceView526     pub fn ref_srv<'a>(&mut self, handle: &'a RawShaderResourceView<R>) -> &'a R::ShaderResourceView {
527         self.srvs.push(handle.0.clone());
528         &handle.0
529     }
530     /// Reference an unordered access view
ref_uav<'a>(&mut self, handle: &'a RawUnorderedAccessView<R>) -> &'a R::UnorderedAccessView531     pub fn ref_uav<'a>(&mut self, handle: &'a RawUnorderedAccessView<R>) -> &'a R::UnorderedAccessView {
532         self.uavs.push(handle.0.clone());
533         &handle.0
534     }
535     /// Reference an RTV
ref_rtv<'a>(&mut self, handle: &'a RawRenderTargetView<R>) -> &'a R::RenderTargetView536     pub fn ref_rtv<'a>(&mut self, handle: &'a RawRenderTargetView<R>) -> &'a R::RenderTargetView {
537         self.rtvs.push(handle.0.clone());
538         self.textures.push((handle.1).0.clone());
539         &handle.0
540     }
541     /// Reference a DSV
ref_dsv<'a>(&mut self, handle: &'a RawDepthStencilView<R>) -> &'a R::DepthStencilView542     pub fn ref_dsv<'a>(&mut self, handle: &'a RawDepthStencilView<R>) -> &'a R::DepthStencilView {
543         self.dsvs.push(handle.0.clone());
544         self.textures.push((handle.1).0.clone());
545         &handle.0
546     }
547     /// Reference a sampler
ref_sampler<'a>(&mut self, handle: &'a Sampler<R>) -> &'a R::Sampler548     pub fn ref_sampler<'a>(&mut self, handle: &'a Sampler<R>) -> &'a R::Sampler {
549         self.samplers.push(handle.0.clone());
550         &handle.0
551     }
552     /// Reference a fence
ref_fence<'a>(&mut self, fence: &'a Fence<R>) -> &'a R::Fence553     pub fn ref_fence<'a>(&mut self, fence: &'a Fence<R>) -> &'a R::Fence {
554         self.fences.push(fence.0.clone());
555         fence.resource()
556     }
557 }
558