From 15f3952c1b1f1cd05b9b1dc3fa24581bec4e979b Mon Sep 17 00:00:00 2001 From: Till Date: Sat, 27 Jun 2020 00:05:25 +0200 Subject: [PATCH] fix ubo --- shaders/line_frag.spv | Bin 348 -> 0 bytes shaders/line_vert.spv | Bin 1400 -> 0 bytes shaders/triangle.vert | 6 ++---- shaders/triangle_frag.spv | Bin 592 -> 0 bytes shaders/triangle_vert.spv | Bin 1576 -> 0 bytes src/main.rs | 8 +++----- src/vulkan.rs | 37 +++++++++++++++++-------------------- 7 files changed, 22 insertions(+), 29 deletions(-) delete mode 100644 shaders/line_frag.spv delete mode 100644 shaders/line_vert.spv delete mode 100644 shaders/triangle_frag.spv delete mode 100644 shaders/triangle_vert.spv diff --git a/shaders/line_frag.spv b/shaders/line_frag.spv deleted file mode 100644 index 0970cb50154b4f38877dff0ef48258f337c96f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 zcmZQ(Qf6mhU}Rut;9%fofB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N|uOvFrR@zhk+fekB5PQ0i*_mL2@A4jDZzw jKgb@Ca*%mH7?>DX85kJs7?{EC2I>3Dz{p_1z{mgqRm>4~ diff --git a/shaders/line_vert.spv b/shaders/line_vert.spv deleted file mode 100644 index 147d70accad7063ce5df3944bc52b59f460a9580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1400 zcmZQ(Qf6mhU}Rut;9$^ZfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!Nfq|8Qg#lR&D+3z?HvmV>f!H81P&m6YFoVql zsqigXsgg8RRaIm^%XtIE>_=?h|HU0;eTKaH?Vev&9&g8Q2&Y7!(*77{nP^z$p>L z2l-!=frWtsDhDz`8_MTo0Ht;Y1{nqx1}<eRJFo48i`edN`Kw%2gC(8he zLk0$zK2SOV=>>^{)PVe{1TBXG89=2C1A__!0|Q75eTGB7e& IFfcLz0JDQtC;$Ke diff --git a/shaders/triangle.vert b/shaders/triangle.vert index 1eca8d6..aafc3f2 100644 --- a/shaders/triangle.vert +++ b/shaders/triangle.vert @@ -1,7 +1,7 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable -layout(binding = 0) uniform UniformBufferObject { +layout(binding = 0) uniform ObjectUniformData { mat4 view; mat4 projection; float time; @@ -14,8 +14,6 @@ layout(location = 0) out vec2 tex_coords; layout(push_constant) uniform PushConstants { mat4 model; - mat4 view; - mat4 projection; } push; out gl_PerVertex { @@ -23,6 +21,6 @@ out gl_PerVertex { }; void main() { - gl_Position = push.projection * push.view * push.model * vec4(position, 1.0); + gl_Position = ubo.projection * ubo.view * push.model * vec4(position, 1.0); tex_coords = uv; } \ No newline at end of file diff --git a/shaders/triangle_frag.spv b/shaders/triangle_frag.spv deleted file mode 100644 index c93e87acdb2c070ddee969c022305d3cc91aa94b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmZQ(Qf6mhU}Rut;9wA8fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!NxG%g%D~D1GB>}pBtAJmC%=dRq=uP+ zmw|zyB(;J8BoDH)B()+wIX}NBrI>-ioq+|cM-JpD1_&RdUI~q_$N&lfh&;#)n0jFb zCa{|o!LDZjv&9&g8Q2&Y7!(*77{nP^7(jjl@j+prz`(-50ro2cSlk-Q2e}&*Vv-D; z3|tHhVEv%*g*pRF!T8b)%naNN3}AI2^LW6rptxXQ0GS8kgZuyz2HDRKH4hZFAoT)J zzktL+>Op*vpFrlDF|dOD0CFoxKgdl#7?>DX85kIB8Cbyf@-Z-g!xY2^nIQy?%Wwu( eu%Cn(7#KimK;m``%;4|^iT!0@WUydhWB>q9xF+oY diff --git a/shaders/triangle_vert.spv b/shaders/triangle_vert.spv deleted file mode 100644 index 0243574b3785898e4b3e214ef43b27603a9c0ce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1576 zcmZQ(Qf6mhU}Rut;9xLhfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N(z@X2-z`)GF%)rFJz;K9>fq{jAlfm65-Z982 zzBsiYu_&=5HNH3_F(tJqK0hfdHMyjifq|8Qg#p<-Rt7c(4h9B>^qlyB)S|G|qLS1K zkUeZraS$6MmtUM&l9`{!z{E+;6N55cME`fs`tP z2sANv1_lO@Utsz`{zuja;)C=#An5~%A@o7Q5@a_>T?5oTAUi=~?hGto^Oc}>!}y?d z0uln*3kxThy)Zt=Jct@r2ACMkUXY(bVlX>E=E;E+gY9PlhaoZ_lpaBRklTeBn84{$ z5u8F9z-%!FW(GC}1_lKN1_p5k76y<#AU-HP%0a^yB&GmP$)L2&01k6&C?AyWK)FMd zfrSASFCcS3c40jBpDdMxfLV^G7H29r9)5-2FXi9HOdiAs#UIE%GX_?0e1XCa6r> UniformBufferObject { + fn update(self: &mut Self, renderer: &mut VulkanRenderer) -> ObjectUniformData { self.input.frame_start(); let time = (renderer.game_data.start_time.elapsed().unwrap().as_micros() as f64 / 1000000.0) as f32; @@ -68,12 +68,10 @@ impl Game for TestGame { renderer.game_data.line_push_constants.view = view.into(); renderer.game_data.line_push_constants.projection = proj.into(); - renderer.game_data.push_constants.view = view.into(); - renderer.game_data.push_constants.projection = proj.into(); self.input.frame_end(); - UniformBufferObject { + ObjectUniformData { view: view.into(), projection: proj.into(), time, diff --git a/src/vulkan.rs b/src/vulkan.rs index 1c162ba..e73a35e 100644 --- a/src/vulkan.rs +++ b/src/vulkan.rs @@ -1,4 +1,4 @@ -use std::sync::{Arc}; +use std::sync::Arc; use std::time::SystemTime; use cgmath::{Matrix4, SquareMatrix}; @@ -6,7 +6,7 @@ use image::{ImageBuffer, ImageFormat, Rgb, Rgba}; use image::buffer::ConvertBuffer; use vulkano::buffer::{BufferUsage, CpuAccessibleBuffer}; use vulkano::command_buffer::{AutoCommandBuffer, AutoCommandBufferBuilder, DynamicState}; -use vulkano::descriptor::descriptor_set::{PersistentDescriptorSet}; +use vulkano::descriptor::descriptor_set::PersistentDescriptorSet; use vulkano::descriptor::DescriptorSet; use vulkano::device::{Device, DeviceExtensions, Queue}; use vulkano::format::{ClearValue, Format}; @@ -24,7 +24,7 @@ use vulkano::sync::{FlushError, GpuFuture}; use vulkano::sync; use vulkano_win::VkSurfaceBuild; use winit::event::{Event, WindowEvent}; -use winit::event_loop::{EventLoop, ControlFlow}; +use winit::event_loop::{ControlFlow, EventLoop}; use winit::window::{Window, WindowBuilder}; use line_vs::ty::LinePushConstants; @@ -54,7 +54,7 @@ pub trait Game { /// Returns true if event should be ignored by the vulkan handler fn on_window_event(self: &mut Self, event: &Event<()>); - fn update(self: &mut Self, renderer: &mut VulkanRenderer) -> vs::ty::UniformBufferObject; + fn update(self: &mut Self, renderer: &mut VulkanRenderer) -> vs::ty::ObjectUniformData; } pub struct Mesh { @@ -84,7 +84,7 @@ pub struct GameData { pub textures: Vec>>, } -type Yeet = dyn DescriptorSet + Send + Sync; +type RendererDescriptorSets = dyn DescriptorSet + Send + Sync; pub struct VulkanRenderer { pub game_data: GameData, @@ -102,8 +102,8 @@ pub struct VulkanRenderer { pub recreate_swapchain: bool, pub debug_callback: Option, pub previous_frame_end: Option>, - pub uniform_buffers: Vec>>, - pub descriptor_sets: Vec>, + pub uniform_buffers: Vec>>, + pub descriptor_sets: Vec>, } impl VulkanRenderer { @@ -111,8 +111,6 @@ impl VulkanRenderer { let mut data = GameData { push_constants: PushConstants { model: Matrix4::identity().into(), - view: Matrix4::identity().into(), - projection: Matrix4::identity().into(), }, line_push_constants: LinePushConstants { model: Matrix4::identity().into(), @@ -284,7 +282,7 @@ impl VulkanRenderer { let framebuffers = window_size_dependent_setup(device.clone(), &images, render_pass.clone(), &mut dynamic_state); let mut uniform_buffers = Vec::new(); - let uniform_buffer = vs::ty::UniformBufferObject { view: Matrix4::identity().into(), projection: Matrix4::identity().into(), time: 0.0 }; + let uniform_buffer = vs::ty::ObjectUniformData { view: Matrix4::identity().into(), projection: Matrix4::identity().into(), time: 0.0 }; for _ in 0..swapchain.num_images() { uniform_buffers.push(CpuAccessibleBuffer::from_data( @@ -299,7 +297,7 @@ impl VulkanRenderer { let descriptor_sets = uniform_buffers.iter().map(|uniform_buffer| { let builder = PersistentDescriptorSet::start(descriptor_set_layout.clone()); - let result: Arc = Arc::new(builder + let result: Arc = Arc::new(builder .add_buffer(uniform_buffer.clone()).unwrap() .add_sampled_image(default_tex.clone(), sampler.clone()).unwrap() .build().unwrap()); @@ -322,9 +320,9 @@ impl VulkanRenderer { recreate_swapchain: false, debug_callback, previous_frame_end }, events_loop) } - fn create_command_buffer(self: &mut Self, fb_index: usize, ubo: vs::ty::UniformBufferObject) -> Arc { + fn create_command_buffer(self: &mut Self, fb_index: usize, uniform_buffer_data: vs::ty::ObjectUniformData) -> Arc { let mut builder = AutoCommandBufferBuilder::primary_simultaneous_use(self.device.clone(), self.queue.family()).unwrap(); - builder.update_buffer(self.uniform_buffers[fb_index].clone(), ubo).unwrap(); + builder.update_buffer(self.uniform_buffers[fb_index].clone(), uniform_buffer_data).unwrap(); builder.begin_render_pass(self.framebuffers[fb_index].clone(), false, vec![ClearValue::Float([0.0, 0.0, 0.0, 1.0]), ClearValue::Depth(1.0)]).unwrap(); for i in 0..self.game_data.game_objects.len() { @@ -347,13 +345,11 @@ impl VulkanRenderer { Arc::new(builder.build().unwrap()) } - pub fn render_loop(self: &mut Self, new_ubo: vs::ty::UniformBufferObject) { - // It is important to call this function from time to time, otherwise resources will keep - // accumulating and you will eventually reach an out of memory error. - // Calling this function polls various fences in order to determine what the GPU has - // already processed, and frees the resources that are no longer needed. + pub fn render_loop(self: &mut Self, new_ubo: vs::ty::ObjectUniformData) { + // cleanup previous frame self.previous_frame_end.as_mut().unwrap().cleanup_finished(); + // recreate swapchain if window size changed if self.recreate_swapchain { let window = self.surface.window(); let inner_size = window.inner_size(); @@ -378,6 +374,7 @@ impl VulkanRenderer { self.recreate_swapchain = false; } + // recreate pipeline if requested if self.game_data.recreate_pipeline { if let Some(pipeline_ok) = create_pipeline::(self.device.clone(), self.render_pass.clone(), false) { self.pipeline = pipeline_ok; @@ -468,7 +465,7 @@ impl VulkanRenderer { pub fn start_event_loop(mut renderer: VulkanRenderer, mut game: Box, event_loop: EventLoop<()>) { let mut recreate_swapchain = false; - let ubo = game.update(&mut renderer); + let mut ubo = game.update(&mut renderer); event_loop.run(move |event, _, control_flow| { game.on_window_event(&event); @@ -480,7 +477,7 @@ pub fn start_event_loop(mut renderer: VulkanRenderer, mut game: Box, e recreate_swapchain = true; }, Event::RedrawEventsCleared => { - game.update(&mut renderer); + ubo = game.update(&mut renderer); renderer.render_loop(ubo); }, _ => {}