easy_gpu/assets/compute/
bind_group.rs1use 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 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) -> Handle<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:*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 renderer.asset_manager.compute_bind_groups.insert(ComputeBindGroup{
75 bind_group,
76 })
77 }
78}