1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 pub type FactoryParam = *mut std::ffi::c_void;
10 pub struct IdentityRecycler<I> {
11 fun: extern "C" fn(I, FactoryParam),
16 impl<I: id::TypedId + Clone + std::fmt::Debug> wgc::hub::IdentityHandler<I>
17 for IdentityRecycler<I>
20 fn process(&self, id: I, _backend: wgt::Backend) -> I {
21 log::debug!("process {} {:?}", self.kind, id);
22 //debug_assert_eq!(id.unzip().2, backend);
25 fn free(&self, id: I) {
26 log::debug!("free {} {:?}", self.kind, id);
27 (self.fun)(id, self.param);
31 //TODO: remove this in favor of `DropAction` that could be sent over IPC.
33 pub struct IdentityRecyclerFactory {
35 free_adapter: extern "C" fn(id::AdapterId, FactoryParam),
36 free_device: extern "C" fn(id::DeviceId, FactoryParam),
37 free_pipeline_layout: extern "C" fn(id::PipelineLayoutId, FactoryParam),
38 free_shader_module: extern "C" fn(id::ShaderModuleId, FactoryParam),
39 free_bind_group_layout: extern "C" fn(id::BindGroupLayoutId, FactoryParam),
40 free_bind_group: extern "C" fn(id::BindGroupId, FactoryParam),
41 free_command_buffer: extern "C" fn(id::CommandBufferId, FactoryParam),
42 free_render_bundle: extern "C" fn(id::RenderBundleId, FactoryParam),
43 free_render_pipeline: extern "C" fn(id::RenderPipelineId, FactoryParam),
44 free_compute_pipeline: extern "C" fn(id::ComputePipelineId, FactoryParam),
45 free_query_set: extern "C" fn(id::QuerySetId, FactoryParam),
46 free_buffer: extern "C" fn(id::BufferId, FactoryParam),
47 free_texture: extern "C" fn(id::TextureId, FactoryParam),
48 free_texture_view: extern "C" fn(id::TextureViewId, FactoryParam),
49 free_sampler: extern "C" fn(id::SamplerId, FactoryParam),
50 free_surface: extern "C" fn(id::SurfaceId, FactoryParam),
53 impl wgc::hub::IdentityHandlerFactory<id::AdapterId> for IdentityRecyclerFactory {
54 type Filter = IdentityRecycler<id::AdapterId>;
55 fn spawn(&self) -> Self::Filter {
57 fun: self.free_adapter,
63 impl wgc::hub::IdentityHandlerFactory<id::DeviceId> for IdentityRecyclerFactory {
64 type Filter = IdentityRecycler<id::DeviceId>;
65 fn spawn(&self) -> Self::Filter {
67 fun: self.free_device,
73 impl wgc::hub::IdentityHandlerFactory<id::PipelineLayoutId> for IdentityRecyclerFactory {
74 type Filter = IdentityRecycler<id::PipelineLayoutId>;
75 fn spawn(&self) -> Self::Filter {
77 fun: self.free_pipeline_layout,
79 kind: "pipeline_layout",
83 impl wgc::hub::IdentityHandlerFactory<id::ShaderModuleId> for IdentityRecyclerFactory {
84 type Filter = IdentityRecycler<id::ShaderModuleId>;
85 fn spawn(&self) -> Self::Filter {
87 fun: self.free_shader_module,
89 kind: "shader_module",
93 impl wgc::hub::IdentityHandlerFactory<id::BindGroupLayoutId> for IdentityRecyclerFactory {
94 type Filter = IdentityRecycler<id::BindGroupLayoutId>;
95 fn spawn(&self) -> Self::Filter {
97 fun: self.free_bind_group_layout,
99 kind: "bind_group_layout",
103 impl wgc::hub::IdentityHandlerFactory<id::BindGroupId> for IdentityRecyclerFactory {
104 type Filter = IdentityRecycler<id::BindGroupId>;
105 fn spawn(&self) -> Self::Filter {
107 fun: self.free_bind_group,
113 impl wgc::hub::IdentityHandlerFactory<id::CommandBufferId> for IdentityRecyclerFactory {
114 type Filter = IdentityRecycler<id::CommandBufferId>;
115 fn spawn(&self) -> Self::Filter {
117 fun: self.free_command_buffer,
119 kind: "command_buffer",
123 impl wgc::hub::IdentityHandlerFactory<id::RenderBundleId> for IdentityRecyclerFactory {
124 type Filter = IdentityRecycler<id::RenderBundleId>;
125 fn spawn(&self) -> Self::Filter {
127 fun: self.free_render_bundle,
129 kind: "render_bundle",
133 impl wgc::hub::IdentityHandlerFactory<id::RenderPipelineId> for IdentityRecyclerFactory {
134 type Filter = IdentityRecycler<id::RenderPipelineId>;
135 fn spawn(&self) -> Self::Filter {
137 fun: self.free_render_pipeline,
139 kind: "render_pipeline",
143 impl wgc::hub::IdentityHandlerFactory<id::ComputePipelineId> for IdentityRecyclerFactory {
144 type Filter = IdentityRecycler<id::ComputePipelineId>;
145 fn spawn(&self) -> Self::Filter {
147 fun: self.free_compute_pipeline,
149 kind: "compute_pipeline",
153 impl wgc::hub::IdentityHandlerFactory<id::QuerySetId> for IdentityRecyclerFactory {
154 type Filter = IdentityRecycler<id::QuerySetId>;
155 fn spawn(&self) -> Self::Filter {
157 fun: self.free_query_set,
163 impl wgc::hub::IdentityHandlerFactory<id::BufferId> for IdentityRecyclerFactory {
164 type Filter = IdentityRecycler<id::BufferId>;
165 fn spawn(&self) -> Self::Filter {
167 fun: self.free_buffer,
173 impl wgc::hub::IdentityHandlerFactory<id::TextureId> for IdentityRecyclerFactory {
174 type Filter = IdentityRecycler<id::TextureId>;
175 fn spawn(&self) -> Self::Filter {
177 fun: self.free_texture,
183 impl wgc::hub::IdentityHandlerFactory<id::TextureViewId> for IdentityRecyclerFactory {
184 type Filter = IdentityRecycler<id::TextureViewId>;
185 fn spawn(&self) -> Self::Filter {
187 fun: self.free_texture_view,
189 kind: "texture_view",
193 impl wgc::hub::IdentityHandlerFactory<id::SamplerId> for IdentityRecyclerFactory {
194 type Filter = IdentityRecycler<id::SamplerId>;
195 fn spawn(&self) -> Self::Filter {
197 fun: self.free_sampler,
203 impl wgc::hub::IdentityHandlerFactory<id::SurfaceId> for IdentityRecyclerFactory {
204 type Filter = IdentityRecycler<id::SurfaceId>;
205 fn spawn(&self) -> Self::Filter {
207 fun: self.free_surface,
214 impl wgc::hub::GlobalIdentityHandlerFactory for IdentityRecyclerFactory {}