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