@@ -2,43 +2,21 @@ use crate::{
22 png:: grammar:: Png ,
33 renderer:: {
44 draw_uniform:: DrawUniform ,
5- feature_uniform:: {
6- FeatureUniform ,
7- TransformAction ,
8- } ,
9- gpu_state:: {
10- GpuResourceAllocator ,
11- Shader ,
12- } ,
5+ feature_uniform:: { FeatureUniform , TransformAction } ,
6+ gpu_state:: GpuResourceAllocator ,
137 mouse_state:: MouseState ,
14- shape:: {
15- compute_radius,
16- Shape ,
17- ShapeStack ,
18- } ,
8+ shader:: Shader ,
9+ shape:: { compute_radius, Shape , ShapeStack } ,
1910 } ,
2011} ;
2112use anyhow:: Result ;
22- use wgpu :: SurfaceError ;
13+
2314use winit:: {
2415 dpi:: PhysicalSize ,
25- event:: {
26- ElementState ,
27- Event ,
28- KeyEvent ,
29- MouseButton ,
30- WindowEvent ,
31- } ,
16+ event:: { ElementState , Event , KeyEvent , MouseButton , WindowEvent } ,
3217 event_loop:: EventLoop ,
33- keyboard:: {
34- KeyCode ,
35- PhysicalKey ,
36- } ,
37- window:: {
38- CursorIcon ,
39- Window ,
40- WindowBuilder ,
41- } ,
18+ keyboard:: { KeyCode , PhysicalKey } ,
19+ window:: { CursorIcon , Window , WindowBuilder } ,
4220} ;
4321
4422/// AppState is the state that is created by user input.
@@ -245,8 +223,56 @@ impl<'a> AppState<'a> {
245223 . write_uniform_buffer ( & uniform_resources[ 1 ] . resource , self . draw_uniform ) ;
246224 }
247225
248- pub ( crate ) fn render ( & self ) -> Result < ( ) , SurfaceError > {
249- self . gpu_allocator . render ( & self . image_shader ) ?;
226+ pub ( crate ) fn render ( & self ) -> Result < ( ) , wgpu:: SurfaceError > {
227+ let ( output, view, mut encoder) = self . gpu_allocator . begin_frame ( ) ?;
228+
229+ // Image shader render pass
230+ {
231+ let mut render_pass = encoder. begin_render_pass ( & wgpu:: RenderPassDescriptor {
232+ label : Some ( "content render pass" ) ,
233+ color_attachments : & [ Some ( wgpu:: RenderPassColorAttachment {
234+ view : & view,
235+ resolve_target : None ,
236+ ops : wgpu:: Operations {
237+ load : wgpu:: LoadOp :: Clear ( wgpu:: Color {
238+ r : 0.1 ,
239+ g : 0.2 ,
240+ b : 0.3 ,
241+ a : 1.0 ,
242+ } ) ,
243+ store : wgpu:: StoreOp :: Store ,
244+ } ,
245+ } ) ] ,
246+ depth_stencil_attachment : None ,
247+ occlusion_query_set : None ,
248+ timestamp_writes : None ,
249+ } ) ;
250+
251+ render_pass. set_pipeline ( & self . image_shader . render_pipeline ) ;
252+
253+ let mut i = 0 ;
254+
255+ self . image_shader . texture_resources . iter ( ) . for_each ( |r| {
256+ render_pass. set_bind_group ( i, & r. bind_group , & [ ] ) ;
257+ i += 1 ;
258+ } ) ;
259+
260+ self . image_shader . uniform_resources . iter ( ) . for_each ( |r| {
261+ render_pass. set_bind_group ( i, & r. bind_group , & [ ] ) ;
262+ i += 1 ;
263+ } ) ;
264+
265+ render_pass. set_vertex_buffer ( 0 , self . gpu_allocator . vertex_buffer . slice ( ..) ) ;
266+ render_pass. set_index_buffer (
267+ self . gpu_allocator . index_buffer . slice ( ..) ,
268+ wgpu:: IndexFormat :: Uint16 ,
269+ ) ;
270+
271+ render_pass. draw_indexed ( 0 ..self . gpu_allocator . num_indices ( ) , 0 , 0 ..1 ) ;
272+ }
273+
274+ self . gpu_allocator . end_frame ( encoder) ;
275+ output. present ( ) ;
250276
251277 Ok ( ( ) )
252278 }
@@ -330,17 +356,17 @@ pub async fn run(png: Png) -> anyhow::Result<()> {
330356 match state. render ( ) {
331357 Ok ( _) => { }
332358 // Reconfigure the surface if it's lost or outdated
333- Err ( SurfaceError :: Lost | SurfaceError :: Outdated ) => {
359+ Err ( wgpu :: SurfaceError :: Lost | wgpu :: SurfaceError :: Outdated ) => {
334360 state. resize ( state. size )
335361 }
336362 // The system is out of memory, we should probably quit
337- Err ( SurfaceError :: OutOfMemory ) => {
363+ Err ( wgpu :: SurfaceError :: OutOfMemory ) => {
338364 log:: error!( "OutOfMemory" ) ;
339365 control_flow. exit ( ) ;
340366 }
341367
342368 // This happens when a frame takes too long to present
343- Err ( SurfaceError :: Timeout ) => {
369+ Err ( wgpu :: SurfaceError :: Timeout ) => {
344370 log:: warn!( "Surface timeout" )
345371 }
346372 }
0 commit comments