2024-01-28 20:55:49 +01:00
|
|
|
use randr::{Renderer, App, Wgpu, AppDI};
|
|
|
|
use wgpu::{include_wgsl, TextureFormat};
|
2024-02-10 13:15:50 +01:00
|
|
|
use winit::{event_loop::{EventLoop, EventLoopBuilder}, platform::wayland::EventLoopBuilderExtWayland, window};
|
2024-01-28 20:55:49 +01:00
|
|
|
|
|
|
|
struct Randr {
|
|
|
|
color: wgpu::Color,
|
|
|
|
clear_color: wgpu::Color,
|
2024-02-10 13:15:50 +01:00
|
|
|
render_pipeline: wgpu::RenderPipeline,
|
2024-01-28 20:55:49 +01:00
|
|
|
}
|
|
|
|
|
2024-02-10 13:15:50 +01:00
|
|
|
impl Randr {
|
|
|
|
pub fn new(render_pipeline: wgpu::RenderPipeline) -> Self {
|
2024-01-28 20:55:49 +01:00
|
|
|
Self {
|
|
|
|
color: wgpu::Color::BLUE,
|
|
|
|
clear_color: wgpu::Color::BLACK,
|
2024-02-10 13:15:50 +01:00
|
|
|
render_pipeline,
|
2024-01-28 20:55:49 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Renderer for Randr {
|
|
|
|
fn render(&mut self, wgpu: &Wgpu) -> Result<(), wgpu::SurfaceError> {
|
|
|
|
let frame = wgpu.surface.get_current_texture()?;
|
|
|
|
let view = frame.texture.create_view(&wgpu::TextureViewDescriptor::default());
|
|
|
|
let mut encoder = wgpu.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(self.clear_color),
|
|
|
|
store: wgpu::StoreOp::Store,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
depth_stencil_attachment: None,
|
|
|
|
timestamp_writes: None,
|
|
|
|
occlusion_query_set: None,
|
|
|
|
});
|
|
|
|
|
2024-02-10 13:15:50 +01:00
|
|
|
rpass.set_pipeline(&self.render_pipeline);
|
2024-01-28 20:55:49 +01:00
|
|
|
rpass.draw(0..3, 0..1);
|
|
|
|
|
|
|
|
drop(rpass);
|
|
|
|
|
|
|
|
wgpu.queue.submit(Some(encoder.finish()));
|
|
|
|
frame.present();
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2024-02-10 13:15:50 +01:00
|
|
|
|
|
|
|
fn resize(&mut self, _size: winit::dpi::PhysicalSize<u32>) {}
|
|
|
|
|
|
|
|
fn input(&mut self, _input: &winit_input_helper::WinitInputHelper) {}
|
|
|
|
|
|
|
|
fn update(&mut self, _wgpu: &Wgpu) {}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn hello_triangle() {
|
|
|
|
let renderer = |window: &window::Window, wgpu: &Wgpu, swapchain_formats: TextureFormat| {
|
2024-01-28 20:55:49 +01:00
|
|
|
let shader = wgpu.device.create_shader_module(include_wgsl!("shader.wgsl"));
|
|
|
|
|
|
|
|
let pipeline_layout = wgpu.device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
|
|
|
|
label: None,
|
|
|
|
bind_group_layouts: &[],
|
|
|
|
push_constant_ranges: &[],
|
|
|
|
});
|
|
|
|
|
|
|
|
let render_pipeline = wgpu.device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
|
|
|
|
label: None,
|
|
|
|
layout: Some(&pipeline_layout),
|
|
|
|
vertex: wgpu::VertexState {
|
|
|
|
module: &shader,
|
|
|
|
entry_point: "vs_main",
|
|
|
|
buffers: &[],
|
|
|
|
},
|
|
|
|
fragment: Some(wgpu::FragmentState {
|
|
|
|
module: &shader,
|
|
|
|
entry_point: "fs_main",
|
|
|
|
targets: &[Some(swapchain_formats.into())],
|
|
|
|
}),
|
|
|
|
primitive: wgpu::PrimitiveState::default(),
|
|
|
|
depth_stencil: None,
|
|
|
|
multisample: wgpu::MultisampleState::default(),
|
|
|
|
multiview: None,
|
|
|
|
});
|
2024-02-10 13:15:50 +01:00
|
|
|
Randr::new(render_pipeline)
|
|
|
|
};
|
2024-01-28 20:55:49 +01:00
|
|
|
|
2024-02-10 13:15:50 +01:00
|
|
|
let event_loop = EventLoopBuilder::new().with_wayland().with_any_thread(true).build().unwrap();
|
|
|
|
App::new(renderer, &event_loop, AppDI::default()).await.run(event_loop).unwrap();
|
2024-01-28 20:55:49 +01:00
|
|
|
}
|