From a661783e7a3daad05ad13278740d6ac632c4803f Mon Sep 17 00:00:00 2001 From: Piotrek Date: Mon, 12 Apr 2021 22:00:24 +0200 Subject: [PATCH] cleaned up new() function --- Cargo.lock | 20 ++++++ Cargo.toml | 1 + src/app.rs | 180 ++++++++++++++++++++++++++--------------------------- 3 files changed, 110 insertions(+), 91 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37dd523..00cdac7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,6 +43,15 @@ version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -160,6 +169,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx", + "num-traits", +] + [[package]] name = "cmake" version = "0.1.45" @@ -1963,6 +1982,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bytemuck", + "cgmath", "fs_extra", "futures", "glob", diff --git a/Cargo.toml b/Cargo.toml index 90e5019..81fe1ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ wgpu = "0.7" futures = "0.3" bytemuck = { version = "1.5", features = [ "derive" ] } image = "0.23.14" +cgmath = "0.18" [build-dependencies] anyhow = "1.0" diff --git a/src/app.rs b/src/app.rs index 3600cb5..d32b8b5 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,5 +1,6 @@ use winit::{window::Window, dpi::PhysicalSize, event::WindowEvent}; use wgpu::util::DeviceExt; +use futures::executor::block_on; use crate::vertex::Vertex; use crate::texture::Texture; @@ -31,35 +32,8 @@ pub struct App { } impl App { - pub async fn new(window: &Window) -> Self { - // Select backend - let backend = wgpu::BackendBit::PRIMARY; - println!("Backend: {:?}", backend); - - // Create surface and pick adapter (physical gpu) - let instance = wgpu::Instance::new(backend); - let surface = unsafe { instance.create_surface(window) }; - let adapter = instance.request_adapter( - &wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::default(), - compatible_surface: Some(&surface), - }, - ).await.unwrap(); - println!("Adapter: {}", adapter.get_info().name); - - // Pick device (logical gpu) from adapter - let (device, queue) = adapter.request_device( - &wgpu::DeviceDescriptor { - features: wgpu::Features::empty(), - limits: wgpu::Limits::default(), - label: None, - }, - None, // Trace path - ).await.unwrap(); - - // Build descriptor and create swap chain - let size = window.inner_size(); + fn create_swapchain(adapter: &wgpu::Adapter, device: &wgpu::Device, surface: &wgpu::Surface, size: PhysicalSize) -> (wgpu::SwapChainDescriptor, wgpu::SwapChain) { let swapchain_desc = wgpu::SwapChainDescriptor { usage: wgpu::TextureUsage::RENDER_ATTACHMENT, // render to screen format: adapter.get_swap_chain_preferred_format(&surface), @@ -68,10 +42,57 @@ impl App { present_mode: wgpu::PresentMode::Fifo, }; let swapchain = device.create_swap_chain(&surface, &swapchain_desc); + (swapchain_desc, swapchain) + } - // Load image - let tex = Texture::from_file(&device, &queue, "./assets/rick.png"); + fn create_pipeline(device: &wgpu::Device, swapchain_desc: &wgpu::SwapChainDescriptor, bind_group_layouts: &[&wgpu::BindGroupLayout]) -> wgpu::RenderPipeline{ + // Pipeline stuff + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("Render Pipeline Layout"), + bind_group_layouts: bind_group_layouts, + push_constant_ranges: &[], + }); + let vert_state = wgpu::VertexState { //vert + module: &device.create_shader_module(&wgpu::include_spirv!(".bin\\shader.vert.spv")), + entry_point: "main", + buffers: &[Vertex::desc()], + }; + let frag_state = wgpu::FragmentState { // frag + module: &device.create_shader_module(&wgpu::include_spirv!(".bin\\shader.frag.spv")), + entry_point: "main", + targets: &[wgpu::ColorTargetState { + format: swapchain_desc.format, + alpha_blend: wgpu::BlendState::REPLACE, + color_blend: wgpu::BlendState::REPLACE, + write_mask: wgpu::ColorWrite::ALL, + }], + }; + let prim_state = wgpu::PrimitiveState { // primitive + topology: wgpu::PrimitiveTopology::TriangleList, + strip_index_format: None, + front_face: wgpu::FrontFace::Cw, + cull_mode: wgpu::CullMode::Back, + polygon_mode: wgpu::PolygonMode::Fill, + }; + let multisample_state = wgpu::MultisampleState { // multisample + count: 1, + mask: !0, + alpha_to_coverage_enabled: false, + }; + // Create pipeline + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Render Pipeline"), + layout: Some(&pipeline_layout), + vertex: vert_state, + fragment: Some(frag_state), + primitive: prim_state, + depth_stencil: None, + multisample: multisample_state, + }) + } + + fn create_bind_group(device: &wgpu::Device, tex: &Texture) -> (wgpu::BindGroupLayout, wgpu::BindGroup) { let bind_group_layout = device.create_bind_group_layout( &wgpu::BindGroupLayoutDescriptor { entries: &[ @@ -112,74 +133,51 @@ impl App { resource: wgpu::BindingResource::Sampler(&tex.sampler), } ], - label: Some("diffuse_bind_group"), + label: None, } ); - - - // Pipeline stuff - let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: Some("Render Pipeline Layout"), - bind_group_layouts: &[&bind_group_layout], - push_constant_ranges: &[], - }); - let vert_state = wgpu::VertexState { //vert - module: &device.create_shader_module(&wgpu::include_spirv!(".bin\\shader.vert.spv")), - entry_point: "main", - buffers: &[Vertex::desc()], - }; - let frag_state = wgpu::FragmentState { // frag - module: &device.create_shader_module(&wgpu::include_spirv!(".bin\\shader.frag.spv")), - entry_point: "main", - targets: &[wgpu::ColorTargetState { - format: swapchain_desc.format, - alpha_blend: wgpu::BlendState::REPLACE, - color_blend: wgpu::BlendState::REPLACE, - write_mask: wgpu::ColorWrite::ALL, - }], - }; - let prim_state = wgpu::PrimitiveState { // primitive - topology: wgpu::PrimitiveTopology::TriangleList, - strip_index_format: None, - front_face: wgpu::FrontFace::Cw, - cull_mode: wgpu::CullMode::Back, - polygon_mode: wgpu::PolygonMode::Fill, - }; - let multisample_state = wgpu::MultisampleState { // multisample - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }; + (bind_group_layout, bind_group) + } - // Create pipeline - let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Render Pipeline"), - layout: Some(&pipeline_layout), - vertex: vert_state, - fragment: Some(frag_state), - primitive: prim_state, - depth_stencil: None, - multisample: multisample_state, - }); - - // Vertex buffer - let vertex_buffer = device.create_buffer_init( + fn create_buffer(device: &wgpu::Device, usage: wgpu::BufferUsage, content: &[u8]) -> wgpu::Buffer { + device.create_buffer_init( &wgpu::util::BufferInitDescriptor { - label: Some("Vertex Buffer"), - contents: bytemuck::cast_slice(VERTICES), - usage: wgpu::BufferUsage::VERTEX, + label: None, + contents: content, + usage: usage, } - ); + ) + } - // Index buffer - let index_buffer = device.create_buffer_init( - &wgpu::util::BufferInitDescriptor { - label: Some("Index Buffer"), - contents: bytemuck::cast_slice(INDICES), - usage: wgpu::BufferUsage::INDEX, - } - ); + pub async fn new(window: &Window) -> Self { + + // Create surface and pick device + let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); + let surface = unsafe { instance.create_surface(window) }; + + // Pick adapter (physical gpu) + let adapter_options = wgpu::RequestAdapterOptions { power_preference: wgpu::PowerPreference::HighPerformance, compatible_surface: Some(&surface) }; + let adapter = instance.request_adapter(&adapter_options).await.unwrap(); + println!("Adapter: {}", adapter.get_info().name); + + // Pick device (logical gpu) from adapter + let device_desc = wgpu::DeviceDescriptor { features: wgpu::Features::empty(), limits: wgpu::Limits::default(), label: None }; + let (device, queue) = adapter.request_device(&device_desc, None).await.unwrap(); + + // Create swapchain + let (swapchain_desc, swapchain) = Self::create_swapchain(&adapter, &device, &surface, window.inner_size()); + + // Load image + let tex = Texture::from_file(&device, &queue, "./assets/rick.png"); + let (bind_group_layout, bind_group) = Self::create_bind_group(&device, &tex); + + // Pipeline + let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&bind_group_layout]); + + // Buffers + let vertex_buffer = Self::create_buffer(&device, wgpu::BufferUsage::VERTEX, bytemuck::cast_slice(VERTICES)); + let index_buffer = Self::create_buffer(&device, wgpu::BufferUsage::INDEX, bytemuck::cast_slice(INDICES)); // Save values in app println!("Initialized");