Skip to main content

easy_gpu/assets/compute/
bind_group.rs

1use crate::assets::compute::pipeline::ComputePipeline;
2use crate::assets::{Texture};
3use crate::assets::buffer::Buffer;
4use crate::assets_manager::Handle;
5use crate::Renderer;
6
7pub struct ComputeBindGroup{
8    pub bind_group: wgpu::BindGroup
9}
10
11pub struct ComputeBindGroupBuilder{
12    textures: Vec<(u32, Handle<Texture>)>,
13    storages: Vec<(u32,Handle<Buffer>)>,
14    pipeline: Handle<ComputePipeline>,
15}
16
17impl ComputeBindGroupBuilder{
18    pub fn new(pipeline: Handle<ComputePipeline>) -> Self{
19        Self{
20            textures: vec![],
21            storages: vec![],
22            pipeline,
23        }
24    }
25
26    pub fn storage_texture(
27        mut self,
28        texture_binding: u32,
29        texture: Handle<Texture>,
30    ) -> Self {
31        self.textures.push((texture_binding, texture));
32        self
33    }
34    pub fn storage(
35        mut self,
36        binding: u32,
37        buffer: Handle<Buffer>,
38    ) -> Self {
39        self.storages.push((binding, buffer));
40        self
41    }
42
43    pub fn build(self,renderer: &mut Renderer) -> ComputeBindGroup {
44        let pipeline = renderer.asset_manager.compute_pipelines.get(self.pipeline).unwrap();
45
46        let mut entries = Vec::new();
47
48        for (binding,handle) in self.storages {
49            let storage = renderer.asset_manager.buffers.get(handle).unwrap();
50
51            entries.push(wgpu::BindGroupEntry {
52                binding,
53                resource: storage.buffer.as_entire_binding(),
54            });
55        }
56
57        for (tex_binding,handle) in self.textures {
58            let texture = renderer.asset_manager.textures.get(handle).unwrap();
59
60            entries.push(wgpu::BindGroupEntry {
61                binding: tex_binding,
62                resource: wgpu::BindingResource::TextureView(&texture.view),
63            });
64        }
65
66        let bind_group = renderer.device.create_bind_group(
67            &wgpu::BindGroupDescriptor {
68                label: Some("material bind group"),
69                layout: &pipeline.layout,
70                entries: &entries,
71            }
72        );
73
74        ComputeBindGroup{
75            bind_group,
76        }
77    }
78}