tiny_wgpu 0.1.10

wgpu helper library
Documentation
use pollster::FutureExt;
use winit::{event::{Event, WindowEvent}, event_loop::EventLoop, window::Window};
use tiny_wgpu::{Compute, ComputeProgram, RenderKernel, Storage};

struct WindowExample<'a> {
    storage: tiny_wgpu::Storage,
    compute: tiny_wgpu::Compute,
    surface: wgpu::Surface<'a>
}

impl ComputeProgram for WindowExample<'_> {
    fn storage(&self) -> &Storage {
        &self.storage
    }

    fn storage_mut(&mut self) -> &mut Storage {
        &mut self.storage
    }

    fn compute(&self) -> &Compute {
        &self.compute
    }
}

fn main() {

    let event_loop = EventLoop::new().unwrap();
    let window = Window::new(&event_loop).unwrap();

    let compute = Compute::new(
        wgpu::Features::empty(),
        wgpu::Limits::default()
    ).block_on();

    let surface = compute.instance.create_surface(&window).unwrap();

    let storage = Default::default();
    
    let mut program = WindowExample { compute, surface, storage };

    program.add_module("window", wgpu::include_wgsl!("window.wgsl"));

    let swapchain_capabilities = program.surface.get_capabilities(&program.compute().adapter);
    let swapchain_format = swapchain_capabilities.formats[0];
    program.add_render_pipelines(
        "window",
         &[],
         &[RenderKernel { label: "window", vertex: "vs_main", fragment: "fs_main" }], 
         &[], 
         &[Some(swapchain_format.into())], 
         &[], 
         None, 
         None
    );

    let mut config = program.surface
        .get_default_config(&program.compute().adapter, 400, 400)
        .unwrap();
    
    program.surface.configure(&program.compute().device, &config);

    let window = &window;

    event_loop.run(move |event, target| {

        if let Event::WindowEvent { window_id: _window_id, event } = event {
            match event {
                WindowEvent::Resized(new_size) => {
                    config.width = new_size.width.max(1);
                    config.height = new_size.height.max(1);
                    program.surface.configure(&program.compute().device, &config);
                    window.request_redraw();
                },
                WindowEvent::RedrawRequested => {
                    let frame = program.surface.get_current_texture().unwrap();
                    let view = frame.texture.create_view(&wgpu::TextureViewDescriptor::default());

                    let mut encoder = program.compute().device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
                        label: None
                    });

                    {
                        let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
                            label: None,
                            color_attachments: &[Some(wgpu::RenderPassColorAttachment {
                                view: &view,
                                resolve_target: None,
                                ops: wgpu::Operations {
                                    load: wgpu::LoadOp::Clear(wgpu::Color::GREEN),
                                    store: wgpu::StoreOp::Store,
                                },
                            })],
                            depth_stencil_attachment: None,
                            timestamp_writes: None,
                            occlusion_query_set: None,
                        });
                        rpass.set_pipeline(&program.storage().render_pipelines["window"]);
                        rpass.draw(0..3, 0..1);
                    }

                    program.compute().queue.submit(Some(encoder.finish()));

                    frame.present();
                    window.request_redraw();
                },
                WindowEvent::CloseRequested => {
                    target.exit();
                },
                _ => {}
            }
        }

    }).unwrap();
}