Use bind group and bind group layout builders
This commit is contained in:
		
							parent
							
								
									20aeaa304d
								
							
						
					
					
						commit
						c6932e6646
					
				|  | @ -1,6 +1,6 @@ | ||||||
| // TODO: Support mip-mapping and multi-sampling
 | // TODO: Support mip-mapping and multi-sampling
 | ||||||
| 
 | 
 | ||||||
| use super::Context; | use super::{BindGroupBuilder, BindGroupLayoutBuilder, Context}; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct TextureAttributes { | pub struct TextureAttributes { | ||||||
|  | @ -141,46 +141,27 @@ impl Texture { | ||||||
|             wgpu::TextureDimension::D3 => wgpu::TextureViewDimension::D3, |             wgpu::TextureDimension::D3 => wgpu::TextureViewDimension::D3, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         let bind_group_layout = |         let bind_group_layout = BindGroupLayoutBuilder::new() | ||||||
|             context |             .with_entry( | ||||||
|                 .device |                 attributes.shader_visibility, | ||||||
|                 .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { |                 wgpu::BindingType::Texture { | ||||||
|                     label: None, |                     sample_type: wgpu::TextureSampleType::Float { filterable: true }, | ||||||
|                     entries: &[ |                     view_dimension, | ||||||
|                         wgpu::BindGroupLayoutEntry { |                     multisampled: false, | ||||||
|                             binding: 0, |                 }, | ||||||
|                             visibility: attributes.shader_visibility, |                 None, | ||||||
|                             ty: wgpu::BindingType::Texture { |             ) | ||||||
|                                 sample_type: wgpu::TextureSampleType::Float { filterable: true }, |             .with_entry( | ||||||
|                                 view_dimension: view_dimension, |                 attributes.shader_visibility, | ||||||
|                                 multisampled: false, |                 wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), | ||||||
|                             }, |                 None, | ||||||
|                             count: None, |             ) | ||||||
|                         }, |             .build(context); | ||||||
|                         wgpu::BindGroupLayoutEntry { |         let bind_group = BindGroupBuilder::new() | ||||||
|                             binding: 1, |             .with_layout(&bind_group_layout) | ||||||
|                             visibility: attributes.shader_visibility, |             .with_entry(wgpu::BindingResource::TextureView(&view)) | ||||||
|                             ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), |             .with_entry(wgpu::BindingResource::Sampler(&sampler)) | ||||||
|                             count: None, |             .build(context); | ||||||
|                         }, |  | ||||||
|                     ], |  | ||||||
|                 }); |  | ||||||
|         let bind_group = context |  | ||||||
|             .device |  | ||||||
|             .create_bind_group(&wgpu::BindGroupDescriptor { |  | ||||||
|                 label: None, |  | ||||||
|                 layout: &bind_group_layout, |  | ||||||
|                 entries: &[ |  | ||||||
|                     wgpu::BindGroupEntry { |  | ||||||
|                         binding: 0, |  | ||||||
|                         resource: wgpu::BindingResource::TextureView(&view), |  | ||||||
|                     }, |  | ||||||
|                     wgpu::BindGroupEntry { |  | ||||||
|                         binding: 1, |  | ||||||
|                         resource: wgpu::BindingResource::Sampler(&sampler), |  | ||||||
|                     }, |  | ||||||
|                 ], |  | ||||||
|             }); |  | ||||||
| 
 | 
 | ||||||
|         Self { |         Self { | ||||||
|             attributes, |             attributes, | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ use winit::event::WindowEvent; | ||||||
| 
 | 
 | ||||||
| use crate::{ | use crate::{ | ||||||
|     camera, |     camera, | ||||||
|     render::{Context, Texture, TextureBuilder}, |     render::{BindGroupBuilder, BindGroupLayoutBuilder, Context, Texture, TextureBuilder}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| pub(crate) struct Renderer { | pub(crate) struct Renderer { | ||||||
|  | @ -93,32 +93,23 @@ impl Renderer { | ||||||
|             0.25, |             0.25, | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|         let camera_bind_group_layout = |         let camera_bind_group_layout = BindGroupLayoutBuilder::new() | ||||||
|             context |             .with_label("camera_bind_group_layout") | ||||||
|                 .device |             .with_entry( | ||||||
|                 .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { |                 wgpu::ShaderStages::COMPUTE, | ||||||
|                     entries: &[wgpu::BindGroupLayoutEntry { |                 wgpu::BindingType::Buffer { | ||||||
|                         binding: 0, |                     ty: wgpu::BufferBindingType::Uniform, | ||||||
|                         visibility: wgpu::ShaderStages::COMPUTE, |                     has_dynamic_offset: false, | ||||||
|                         ty: wgpu::BindingType::Buffer { |                     min_binding_size: None, | ||||||
|                             ty: wgpu::BufferBindingType::Uniform, |                 }, | ||||||
|                             has_dynamic_offset: false, |                 None, | ||||||
|                             min_binding_size: None, |             ) | ||||||
|                         }, |             .build(context); | ||||||
|                         count: None, |         let camera_bind_group = BindGroupBuilder::new() | ||||||
|                     }], |             .with_label("camera_bind_group") | ||||||
|                     label: Some("camera_bind_group_layout"), |             .with_layout(&camera_bind_group_layout) | ||||||
|                 }); |             .with_entry(camera_controller.get_buffer().as_entire_binding()) | ||||||
|         let camera_bind_group = context |             .build(context); | ||||||
|             .device |  | ||||||
|             .create_bind_group(&wgpu::BindGroupDescriptor { |  | ||||||
|                 layout: &camera_bind_group_layout, |  | ||||||
|                 entries: &[wgpu::BindGroupEntry { |  | ||||||
|                     binding: 0, |  | ||||||
|                     resource: camera_controller.get_buffer().as_entire_binding(), |  | ||||||
|                 }], |  | ||||||
|                 label: Some("camera_bind_group"), |  | ||||||
|             }); |  | ||||||
| 
 | 
 | ||||||
|         log::info!("Creating render pipeline..."); |         log::info!("Creating render pipeline..."); | ||||||
|         let render_pipeline = |         let render_pipeline = | ||||||
|  | @ -152,32 +143,21 @@ impl Renderer { | ||||||
|         log::info!("Creating compute pipeline..."); |         log::info!("Creating compute pipeline..."); | ||||||
|         let cs_descriptor = wgpu::include_wgsl!("../assets/shaders/voxel_volume.wgsl"); |         let cs_descriptor = wgpu::include_wgsl!("../assets/shaders/voxel_volume.wgsl"); | ||||||
|         let cs = context.device.create_shader_module(cs_descriptor); |         let cs = context.device.create_shader_module(cs_descriptor); | ||||||
|         let compute_layout = |         let compute_layout = BindGroupLayoutBuilder::new() | ||||||
|             context |             .with_entry( | ||||||
|                 .device |                 wgpu::ShaderStages::COMPUTE, | ||||||
|                 .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { |                 wgpu::BindingType::StorageTexture { | ||||||
|                     label: None, |                     access: wgpu::StorageTextureAccess::WriteOnly, | ||||||
|                     entries: &[wgpu::BindGroupLayoutEntry { |                     format: render_texture.attributes.format, | ||||||
|                         binding: 0, |                     view_dimension: wgpu::TextureViewDimension::D2, | ||||||
|                         visibility: wgpu::ShaderStages::COMPUTE, |                 }, | ||||||
|                         ty: wgpu::BindingType::StorageTexture { |                 None, | ||||||
|                             access: wgpu::StorageTextureAccess::WriteOnly, |             ) | ||||||
|                             format: render_texture.attributes.format, |             .build(context); | ||||||
|                             view_dimension: wgpu::TextureViewDimension::D2, |         let compute_bind_group = BindGroupBuilder::new() | ||||||
|                         }, |             .with_layout(&compute_layout) | ||||||
|                         count: None, |             .with_entry(wgpu::BindingResource::TextureView(&render_texture.view)) | ||||||
|                     }], |             .build(context); | ||||||
|                 }); |  | ||||||
|         let compute_bind_group = context |  | ||||||
|             .device |  | ||||||
|             .create_bind_group(&wgpu::BindGroupDescriptor { |  | ||||||
|                 label: None, |  | ||||||
|                 layout: &compute_layout, |  | ||||||
|                 entries: &[wgpu::BindGroupEntry { |  | ||||||
|                     binding: 0, |  | ||||||
|                     resource: wgpu::BindingResource::TextureView(&render_texture.view), |  | ||||||
|                 }], |  | ||||||
|             }); |  | ||||||
|         let compute_pipeline = |         let compute_pipeline = | ||||||
|             context |             context | ||||||
|                 .device |                 .device | ||||||
|  | @ -217,6 +197,7 @@ impl Renderer { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // pub fn render(&mut self, context: &Context, encoders: &[wgpu::CommandEncoder]) {
 | ||||||
|     pub fn render(&mut self, context: &Context) { |     pub fn render(&mut self, context: &Context) { | ||||||
|         let frame = context.surface.get_current_texture().unwrap(); |         let frame = context.surface.get_current_texture().unwrap(); | ||||||
|         let view = frame |         let view = frame | ||||||
|  | @ -256,6 +237,14 @@ impl Renderer { | ||||||
| 
 | 
 | ||||||
|         context.queue.submit(Some(encoder.finish())); |         context.queue.submit(Some(encoder.finish())); | ||||||
|         frame.present(); |         frame.present(); | ||||||
|  | 
 | ||||||
|  |         // let mut command_buffers = Vec::with_capacity(encoders.len());
 | ||||||
|  |         // for encoder in encoders {
 | ||||||
|  |         //     command_buffers.push(encoder.finish());
 | ||||||
|  |         // }
 | ||||||
|  | 
 | ||||||
|  |         // context.queue.submit(command_buffers);
 | ||||||
|  |         // frame.present();
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn input(&mut self, event: &WindowEvent) -> bool { |     pub fn input(&mut self, event: &WindowEvent) -> bool { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue