1pub mod buffers;
8pub use buffers::*;
9pub mod matrix;
11pub use matrix::*;
12pub mod color;
14pub use color::*;
15pub mod transformer;
17pub use transformer::*;
18
19use vera::{Input, Model, Tf, Vertex as ModelVertex, View, Projection};
20use vulkano::descriptor_set::layout::DescriptorSetLayout;
21use vulkano::pipeline::graphics::depth_stencil::{DepthStencilState, DepthState};
22
23use std::sync::Arc;
24use std::time::Instant;
25
26use vulkano::descriptor_set::allocator::StandardDescriptorSetAllocator;
27use vulkano::descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet};
28use vulkano::pipeline::graphics::color_blend::{
29 AttachmentBlend, ColorBlendAttachmentState, ColorBlendState,
30};
31use vulkano::pipeline::graphics::multisample::MultisampleState;
32use vulkano::pipeline::graphics::rasterization::RasterizationState;
33use vulkano::pipeline::graphics::GraphicsPipelineCreateInfo;
34use vulkano::pipeline::layout::PipelineDescriptorSetLayoutCreateInfo;
35
36use vulkano::buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer};
37use vulkano::command_buffer::allocator::StandardCommandBufferAllocator;
38use vulkano::command_buffer::{
39 AutoCommandBufferBuilder, CommandBufferExecFuture, CommandBufferUsage, CopyBufferInfo,
40 PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, RenderPassBeginInfo,
41};
42use vulkano::device::physical::{PhysicalDevice, PhysicalDeviceType};
43use vulkano::device::{
44 Device, DeviceCreateInfo, DeviceExtensions, Queue, QueueCreateInfo, QueueFlags,
45};
46use vulkano::image::view::ImageView;
47use vulkano::image::{Image, ImageUsage, ImageCreateInfo, ImageType};
48use vulkano::instance::{Instance, InstanceCreateFlags, InstanceCreateInfo};
49use vulkano::memory::allocator::{
50 AllocationCreateInfo, FreeListAllocator, GenericMemoryAllocator, MemoryTypeFilter,
51 StandardMemoryAllocator,
52};
53use vulkano::format::Format;
54use vulkano::pipeline::graphics::input_assembly::InputAssemblyState;
55use vulkano::pipeline::graphics::vertex_input::{Vertex, VertexDefinition};
56use vulkano::pipeline::graphics::viewport::{Viewport, ViewportState};
57use vulkano::pipeline::{
58 GraphicsPipeline, Pipeline, PipelineBindPoint, PipelineLayout,
59 PipelineShaderStageCreateInfo,
60};
61use vulkano::render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass, Subpass};
62use vulkano::shader::EntryPoint;
63use vulkano::swapchain::{
64 acquire_next_image, PresentFuture, Surface, Swapchain, SwapchainAcquireFuture,
65 SwapchainCreateInfo, SwapchainPresentInfo,
66};
67use vulkano::sync::future::{FenceSignalFuture, JoinFuture};
68use vulkano::sync::{self, GpuFuture};
69use vulkano::{Validated, Version, VulkanError};
70
71use winit::dpi::LogicalSize;
72use winit::event::{Event, WindowEvent};
73use winit::event_loop::{ControlFlow, EventLoop};
74use winit::platform::run_return::EventLoopExtRunReturn;
75use winit::window::{Window, WindowBuilder};
76
77pub struct Vera {
79 event_loop: EventLoop<()>,
80 vk: Vk,
81}
82
83struct Vk {
85 library: Arc<vulkano::VulkanLibrary>,
87 required_extensions: vulkano::instance::InstanceExtensions,
88 instance: Arc<Instance>,
89 surface: Arc<Surface>,
90 window: Arc<Window>,
91
92 device_extensions: DeviceExtensions,
93 physical_device: Arc<PhysicalDevice>,
94 queue_family_index: u32,
95 device: Arc<Device>,
96 queue: Arc<Queue>,
97
98 swapchain: Arc<Swapchain>,
99 images: Vec<Arc<Image>>,
100 render_pass: Arc<RenderPass>,
101 framebuffers: Vec<Arc<Framebuffer>>,
102
103
104 memory_allocator: Arc<GenericMemoryAllocator<FreeListAllocator>>,
105 command_buffer_allocator: StandardCommandBufferAllocator,
106 descriptor_set_allocator: StandardDescriptorSetAllocator,
107
108
109 max_uniform_buffer_size: u32,
110 max_storage_buffer_size: u32,
111
112
113 previous_frame_end: Option<Box<dyn GpuFuture>>,
114 recreate_swapchain: bool,
115 show_count: u32,
116 time: f32,
117
118
119 position_vertex_data: Vec<VertexData>,
121 vertex_len: u64,
122
123 vertex_buffer: Subbuffer<[VertexData]>,
124 staging_vertex_buffer: Subbuffer<[VertexData]>,
125 vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
126 vertex_copy_fence:
127 Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
128
129
130 color_vertex_data: Vec<ColorVertexData>,
131 color_vertex_colorizer: Vec<Colorizer>,
132
133 color_vertex_buffer: Subbuffer<[ColorVertexData]>,
134 staging_color_vertex_buffer: Subbuffer<[ColorVertexData]>,
135 color_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
136 color_vertex_copy_fence:
137 Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
138
139
140 transform_vertex_data: Vec<TransformVertexData>,
141 transform_vertex_transformer: Vec<Transformer>,
142
143 transform_vertex_buffer: Subbuffer<[TransformVertexData]>,
144 staging_transform_vertex_buffer: Subbuffer<[TransformVertexData]>,
145 transform_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
146 transform_vertex_copy_fence:
147 Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
148
149 general_uniform_data: GeneralData,
151 general_uniform_transformer: (Transformer, Transformer),
152
153 general_uniform_buffer: Subbuffer<GeneralData>,
154 general_staging_uniform_buffer: Subbuffer<GeneralData>,
155 general_uniform_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
156 general_uniform_copy_fence:
157 Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
158
159 entities_uniform_data: Vec<EntityData>,
161 entities_uniform_len: u64,
162 entities_uniform_transformer: Vec<Transformer>,
163
164 entities_uniform_buffer: Subbuffer<[EntityData]>,
165 entities_staging_uniform_buffer: Subbuffer<[EntityData]>,
166 entities_uniform_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
167 entities_uniform_copy_fence:
168 Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
169
170 drawing_vs: EntryPoint,
177 drawing_fs: EntryPoint,
178 drawing_pipeline: Arc<GraphicsPipeline>,
179 descriptor_set: Arc<PersistentDescriptorSet>,
180 descriptor_set_layout: Arc<DescriptorSetLayout>,
181 descriptor_set_layout_index: usize,
182
183 frames_in_flight: usize,
184 drawing_fences: Vec<
185 Option<
186 Arc<
187 FenceSignalFuture<
188 PresentFuture<
189 CommandBufferExecFuture<
190 JoinFuture<Box<dyn GpuFuture>, SwapchainAcquireFuture>,
191 >,
192 >,
193 >,
194 >,
195 >,
196 >,
197 previous_drawing_fence_i: u32,
198
199
200 background_color: [f32; 4],
201 start_time: f32,
202 end_time: f32,
203}
204
205mod vs {
206 vulkano_shaders::shader! {
207 ty: "vertex",
208 src: r"
209 #version 460
210
211 struct uGeneralData {
212 mat4 projection_matrix;
213 mat4 view_matrix;
214 vec2 resolution;
215 float time;
216 };
217
218 struct uEntityData {
219 mat4 model_matrix;
220 };
221
222 layout(set = 0, binding = 0) buffer GeneralData {
223 uGeneralData data;
224 } general_buf;
225
226 layout(set = 0, binding = 1) buffer EntityData {
227 uEntityData data[];
228 } entities_buf;
229
230 layout(location = 0) in uint entity_id;
231 layout(location = 1) in vec3 position;
232 layout(location = 2) in vec4 color;
233 layout(location = 3) in vec4 vertex_matrix0;
234 layout(location = 4) in vec4 vertex_matrix1;
235 layout(location = 5) in vec4 vertex_matrix2;
236 layout(location = 6) in vec4 vertex_matrix3;
237
238 layout(location = 0) out vec4 out_color;
239
240 void main() {
241 out_color = color;
242
243 mat4 transform = mat4(vertex_matrix0, vertex_matrix1, vertex_matrix2, vertex_matrix3);
244 vec4 uv = vec4(position, 1.0) * transform * entities_buf.data[entity_id].model_matrix * general_buf.data.view_matrix * general_buf.data.projection_matrix;
245
246 if (general_buf.data.resolution.x > general_buf.data.resolution.y) {
247 uv.x *= general_buf.data.resolution.y/general_buf.data.resolution.x;
248 } else {
249 uv.y *= general_buf.data.resolution.x/general_buf.data.resolution.y;
250 }
251
252 gl_Position = uv;
253 }
254 ",
255 }
256}
257
258mod fs {
259 vulkano_shaders::shader! {
260 ty: "fragment",
261 src: r"
262 #version 460
263
264 layout(location = 0) out vec4 f_color;
265
266 layout(location = 0) in vec4 in_color;
267
268 void main() {
269 f_color = in_color;
270 }
271 ",
272 }
273}
274
275impl Vera {
301 pub fn create(input: Input) -> Self {
304 let event_loop = EventLoop::new();
307 let library = vulkano::VulkanLibrary::new().expect("no local Vulkan library/DLL");
308 let required_extensions = Surface::required_extensions(&event_loop);
309 let instance = Instance::new(
310 library.clone(),
311 InstanceCreateInfo {
312 application_name: Some("Vera".to_owned()),
313 application_version: Version::major_minor(0, 2),
314 enabled_extensions: required_extensions,
315 flags: InstanceCreateFlags::ENUMERATE_PORTABILITY,
316 ..Default::default()
317 },
318 )
319 .expect("failed to create instance");
320
321 let window = Arc::new(
322 WindowBuilder::new()
323 .with_inner_size(LogicalSize {
324 width: 800,
325 height: 600,
326 })
327 .with_resizable(true)
328 .with_title("Vera")
329 .with_transparent(false)
330 .build(&event_loop)
331 .unwrap(),
332 );
333 let surface = Surface::from_window(instance.clone(), window.clone()).unwrap();
334 let device_extensions = DeviceExtensions {
335 khr_swapchain: true,
336 ..DeviceExtensions::empty()
337 };
338
339 let (physical_device, queue_family_index) = instance
340 .enumerate_physical_devices()
341 .expect("failed to enumerate physical devices")
342 .filter(|p| p.supported_extensions().contains(&device_extensions))
343 .filter_map(|p| {
344 p.queue_family_properties()
345 .iter()
346 .enumerate()
347 .position(|(i, q)| {
348 q.queue_flags.contains(QueueFlags::GRAPHICS)
349 && q.queue_flags.contains(QueueFlags::COMPUTE)
350 && q.queue_flags.contains(QueueFlags::TRANSFER)
351 && p.surface_support(i as u32, &surface).unwrap_or(false)
352 })
353 .map(|q| (p, q as u32))
354 })
355 .min_by_key(|(p, _)| match p.properties().device_type {
356 PhysicalDeviceType::DiscreteGpu => 0,
357 PhysicalDeviceType::IntegratedGpu => 1,
358 PhysicalDeviceType::VirtualGpu => 2,
359 PhysicalDeviceType::Cpu => 3,
360 _ => 4,
361 })
362 .expect("no device available");
363
364 println!(
365 "Using device: {} (type: {:?})",
366 physical_device.properties().device_name,
367 physical_device.properties().device_type,
368 );
369
370 let (device, mut queues) = Device::new(
371 physical_device.clone(),
372 DeviceCreateInfo {
373 queue_create_infos: vec![QueueCreateInfo {
374 queue_family_index,
375 ..Default::default()
376 }],
377 enabled_extensions: device_extensions,
378 ..Default::default()
379 },
380 )
381 .expect("failed to create device");
382 let queue = queues.next().unwrap();
383
384 let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone()));
387 let command_buffer_allocator =
388 StandardCommandBufferAllocator::new(device.clone(), Default::default());
389 let descriptor_set_allocator =
390 StandardDescriptorSetAllocator::new(device.clone(), Default::default());
391
392 let (swapchain, images) = {
395 let caps = physical_device
396 .surface_capabilities(&surface, Default::default())
397 .expect("failed to get surface capabilities");
398
399 let dimensions = window.inner_size();
400 let composite_alpha = caps.supported_composite_alpha.into_iter().next().unwrap();
401 let image_format = physical_device
402 .clone()
403 .surface_formats(&surface, Default::default())
404 .unwrap()[0]
405 .0;
406
407 Swapchain::new(
408 device.clone(),
409 surface.clone(),
410 SwapchainCreateInfo {
411 min_image_count: caps.min_image_count.max(2),
412 image_format,
413 image_extent: dimensions.into(),
414 image_usage: ImageUsage::COLOR_ATTACHMENT,
415 composite_alpha,
416 ..Default::default()
417 },
418 )
419 .unwrap()
420 };
421
422 let render_pass = vulkano::single_pass_renderpass!(
423 device.clone(),
424 attachments: {
425 color: {
426 format: swapchain.image_format(), samples: 1, load_op: Clear,
429 store_op: Store,
430 },
431 depth_stencil: {
432 format: Format::D16_UNORM,
433 samples: 1,
434 load_op: Clear,
435 store_op: DontCare,
436 },
437 },
438 pass: {
439 color: [color],
440 depth_stencil: {depth_stencil},
441 },
442 )
443 .unwrap();
444
445
446 let depth_attachment = ImageView::new_default(
447 Image::new(
448 memory_allocator.clone(),
449 ImageCreateInfo {
450 image_type: ImageType::Dim2d,
451 format: Format::D16_UNORM,
452 extent: images[0].extent(),
453 usage: ImageUsage::DEPTH_STENCIL_ATTACHMENT | ImageUsage::TRANSIENT_ATTACHMENT,
454 ..Default::default()
455 },
456 AllocationCreateInfo::default(),
457 )
458 .unwrap(),
459 )
460 .unwrap();
461
462 let framebuffers: Vec<Arc<Framebuffer>> = images
463 .iter()
464 .map(|image| {
465 let view = ImageView::new_default(image.clone()).unwrap();
466 Framebuffer::new(
467 render_pass.clone(),
468 FramebufferCreateInfo {
469 attachments: vec![view, depth_attachment.clone()],
470 ..Default::default()
471 },
472 )
473 .unwrap()
474 })
475 .collect::<Vec<Arc<Framebuffer>>>();
476
477 let max_uniform_buffer_size: u32 = physical_device.properties().max_uniform_buffer_range;
483 let max_storage_buffer_size: u32 = physical_device.properties().max_storage_buffer_range;
484 println!(
485 "max_uniform_buffer_size: {}\nmax_storage_buffer_size: {}\n",
486 max_uniform_buffer_size, max_storage_buffer_size
487 );
488
489 let (
495 (general_uniform_data, general_uniform_transformer),
496 (entities_uniform_len, entities_uniform_data, entities_uniform_transformer),
497 (transform_vertex_data, transform_vertex_transformer),
498 (color_vertex_data, color_vertex_colorizer),
499 (vertex_len, position_vertex_data),
500 (background_color, start_time, end_time)
501 ) = from_input(input);
502 let staging_vertex_buffer: Subbuffer<[VertexData]> = Buffer::from_iter(
507 memory_allocator.clone(),
508 BufferCreateInfo {
509 usage: BufferUsage::TRANSFER_SRC,
510 ..Default::default()
511 },
512 AllocationCreateInfo {
513 memory_type_filter: MemoryTypeFilter::PREFER_HOST
514 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
515 ..Default::default()
516 },
517 position_vertex_data,
518 )
519 .expect("failed to create staging_vertex_buffer");
520
521 let vertex_buffer: Subbuffer<[VertexData]> = Buffer::new_slice::<VertexData>(
522 memory_allocator.clone(),
523 BufferCreateInfo {
524 usage: BufferUsage::STORAGE_BUFFER
525 | BufferUsage::TRANSFER_DST
526 | BufferUsage::VERTEX_BUFFER,
527 ..Default::default()
528 },
529 AllocationCreateInfo {
530 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
531 ..Default::default()
532 },
533 vertex_len,
534 )
535 .expect("failed to create vertex_buffer");
536
537 let mut vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
538 AutoCommandBufferBuilder::primary(
539 &command_buffer_allocator,
540 queue.queue_family_index(),
541 CommandBufferUsage::MultipleSubmit,
542 )
543 .expect("failed to create vertex_cbb");
544
545 vertex_cbb
546 .copy_buffer(CopyBufferInfo::buffers(
547 staging_vertex_buffer.clone(),
548 vertex_buffer.clone(),
549 ))
550 .unwrap();
551
552 let vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer> = vertex_cbb.build().unwrap();
553
554 vertex_copy_command_buffer
555 .clone()
556 .execute(queue.clone())
557 .unwrap()
558 .then_signal_fence_and_flush()
559 .unwrap()
560 .wait(None )
561 .unwrap();
562
563 let vertex_copy_fence: Option<
564 Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
565 > = None;
566
567
568let staging_color_vertex_buffer: Subbuffer<[ColorVertexData]> = Buffer::from_iter(
571 memory_allocator.clone(),
572 BufferCreateInfo {
573 usage: BufferUsage::TRANSFER_SRC,
574 ..Default::default()
575 },
576 AllocationCreateInfo {
577 memory_type_filter: MemoryTypeFilter::PREFER_HOST
578 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
579 ..Default::default()
580 },
581 color_vertex_data,
582 )
583 .expect("failed to create staging_color_vertex_buffer");
584
585 let color_vertex_buffer: Subbuffer<[ColorVertexData]> = Buffer::new_slice::<ColorVertexData>(
586 memory_allocator.clone(),
587 BufferCreateInfo {
588 usage: BufferUsage::STORAGE_BUFFER
589 | BufferUsage::TRANSFER_DST
590 | BufferUsage::VERTEX_BUFFER,
591 ..Default::default()
592 },
593 AllocationCreateInfo {
594 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
595 ..Default::default()
596 },
597 vertex_len,
598 )
599 .expect("failed to create color_vertex_buffer");
600
601 let mut color_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
602 AutoCommandBufferBuilder::primary(
603 &command_buffer_allocator,
604 queue.queue_family_index(),
605 CommandBufferUsage::MultipleSubmit,
606 )
607 .expect("failed to create color_vertex_cbb");
608
609 color_vertex_cbb
610 .copy_buffer(CopyBufferInfo::buffers(
611 staging_color_vertex_buffer.clone(),
612 color_vertex_buffer.clone(),
613 ))
614 .unwrap();
615
616 let color_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer> = color_vertex_cbb.build().unwrap();
617
618 color_vertex_copy_command_buffer
619 .clone()
620 .execute(queue.clone())
621 .unwrap()
622 .then_signal_fence_and_flush()
623 .unwrap()
624 .wait(None )
625 .unwrap();
626
627 let color_vertex_copy_fence: Option<
628 Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
629 > = None;
630
631let staging_transform_vertex_buffer: Subbuffer<[TransformVertexData]> = Buffer::from_iter(
635 memory_allocator.clone(),
636 BufferCreateInfo {
637 usage: BufferUsage::TRANSFER_SRC,
638 ..Default::default()
639 },
640 AllocationCreateInfo {
641 memory_type_filter: MemoryTypeFilter::PREFER_HOST
642 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
643 ..Default::default()
644 },
645 transform_vertex_data,
646 )
647 .expect("failed to create staging_transform_vertex_buffer");
648
649 let transform_vertex_buffer: Subbuffer<[TransformVertexData]> = Buffer::new_slice::<TransformVertexData>(
650 memory_allocator.clone(),
651 BufferCreateInfo {
652 usage: BufferUsage::STORAGE_BUFFER
653 | BufferUsage::TRANSFER_DST
654 | BufferUsage::VERTEX_BUFFER,
655 ..Default::default()
656 },
657 AllocationCreateInfo {
658 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
659 ..Default::default()
660 },
661 vertex_len,
662 )
663 .expect("failed to create transform_vertex_buffer");
664
665 let mut transform_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
666 AutoCommandBufferBuilder::primary(
667 &command_buffer_allocator,
668 queue.queue_family_index(),
669 CommandBufferUsage::MultipleSubmit,
670 )
671 .expect("failed to create transform_vertex_cbb");
672
673 transform_vertex_cbb
674 .copy_buffer(CopyBufferInfo::buffers(
675 staging_transform_vertex_buffer.clone(),
676 transform_vertex_buffer.clone(),
677 ))
678 .unwrap();
679
680 let transform_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer> = transform_vertex_cbb.build().unwrap();
681
682 transform_vertex_copy_command_buffer
683 .clone()
684 .execute(queue.clone())
685 .unwrap()
686 .then_signal_fence_and_flush()
687 .unwrap()
688 .wait(None )
689 .unwrap();
690
691 let transform_vertex_copy_fence: Option<
692 Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
693 > = None;
694
695 let general_staging_uniform_buffer = Buffer::from_data(
700 memory_allocator.clone(),
701 BufferCreateInfo {
702 usage: BufferUsage::TRANSFER_SRC,
703 ..Default::default()
704 },
705 AllocationCreateInfo {
706 memory_type_filter: MemoryTypeFilter::PREFER_HOST
707 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
708 ..Default::default()
709 },
710 general_uniform_data.clone(),
711 )
712 .expect("failed to create staging_uniform_buffer");
713
714 let general_uniform_buffer = Buffer::new_sized::<GeneralData>(
715 memory_allocator.clone(),
716 BufferCreateInfo {
717 usage: BufferUsage::STORAGE_BUFFER
718 | BufferUsage::UNIFORM_BUFFER
719 | BufferUsage::TRANSFER_DST,
720 ..Default::default()
721 },
722 AllocationCreateInfo {
723 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
724 ..Default::default()
725 },
726 )
727 .expect("failed to create uniform_buffer");
728
729 let mut general_uniform_copy_cbb = AutoCommandBufferBuilder::primary(
730 &command_buffer_allocator,
731 queue.queue_family_index(),
732 CommandBufferUsage::MultipleSubmit,
733 )
734 .expect("failed to create uniform_copy_cbb");
735
736 general_uniform_copy_cbb
737 .copy_buffer(CopyBufferInfo::buffers(
738 general_staging_uniform_buffer.clone(),
739 general_uniform_buffer.clone(),
740 ))
741 .unwrap();
742
743 let general_uniform_copy_command_buffer = general_uniform_copy_cbb.build().unwrap();
744
745 general_uniform_copy_command_buffer
746 .clone()
747 .execute(queue.clone())
748 .unwrap()
749 .then_signal_fence_and_flush()
750 .unwrap()
751 .wait(None )
752 .unwrap();
753
754 let general_uniform_copy_fence: Option<
755 Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
756 > = None;
757
758 let entities_staging_uniform_buffer = Buffer::from_iter(
764 memory_allocator.clone(),
765 BufferCreateInfo {
766 usage: BufferUsage::TRANSFER_SRC,
767 ..Default::default()
768 },
769 AllocationCreateInfo {
770 memory_type_filter: MemoryTypeFilter::PREFER_HOST
771 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
772 ..Default::default()
773 },
774 entities_uniform_data,
775 )
776 .expect("failed to create staging_uniform_buffer");
777
778 let entities_uniform_buffer = Buffer::new_slice::<EntityData>(
779 memory_allocator.clone(),
780 BufferCreateInfo {
781 usage: BufferUsage::STORAGE_BUFFER
782 | BufferUsage::UNIFORM_BUFFER
783 | BufferUsage::TRANSFER_DST,
784 ..Default::default()
785 },
786 AllocationCreateInfo {
787 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
788 ..Default::default()
789 },
790 entities_uniform_len,
791 )
792 .expect("failed to create uniform_buffer");
793
794 let mut entities_uniform_copy_cbb = AutoCommandBufferBuilder::primary(
795 &command_buffer_allocator,
796 queue.queue_family_index(),
797 CommandBufferUsage::MultipleSubmit,
798 )
799 .expect("failed to create uniform_copy_cbb");
800
801 entities_uniform_copy_cbb
802 .copy_buffer(CopyBufferInfo::buffers(
803 entities_staging_uniform_buffer.clone(),
804 entities_uniform_buffer.clone(),
805 ))
806 .unwrap();
807
808 let entities_uniform_copy_command_buffer = entities_uniform_copy_cbb.build().unwrap();
809
810 entities_uniform_copy_command_buffer
811 .clone()
812 .execute(queue.clone())
813 .unwrap()
814 .then_signal_fence_and_flush()
815 .unwrap()
816 .wait(None )
817 .unwrap();
818
819 let entities_uniform_copy_fence: Option<
820 Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
821 > = None;
822
823 let drawing_vs = vs::load(device.clone())
884 .unwrap()
885 .entry_point("main")
886 .expect("failed to create vertex shader module");
887 let drawing_fs = fs::load(device.clone())
888 .unwrap()
889 .entry_point("main")
890 .expect("failed to create fragment shader module");
891
892 let drawing_pipeline: Arc<GraphicsPipeline> = {
893 let vertex_input_state = [VertexData::per_vertex(), ColorVertexData::per_vertex(), TransformVertexData::per_vertex()]
894 .definition(&drawing_vs.info().input_interface)
895 .unwrap();
896
897 let stages = [
898 PipelineShaderStageCreateInfo::new(drawing_vs.clone()),
899 PipelineShaderStageCreateInfo::new(drawing_fs.clone()),
900 ];
901
902 let pipeline_layout = PipelineLayout::new(
903 device.clone(),
904 PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages)
905 .into_pipeline_layout_create_info(device.clone())
906 .unwrap(),
907 )
908 .unwrap();
909
910 let subpass = Subpass::from(render_pass.clone(), 0).unwrap();
911
912 GraphicsPipeline::new(
913 device.clone(),
914 None,
915 GraphicsPipelineCreateInfo {
916 stages: stages.into_iter().collect(),
917 vertex_input_state: Some(vertex_input_state),
919 input_assembly_state: Some(InputAssemblyState::default()),
922 viewport_state: Some(ViewportState::default()),
925 rasterization_state: Some(RasterizationState::default()),
928 multisample_state: Some(MultisampleState::default()),
931 color_blend_state: Some(ColorBlendState::with_attachment_states(
934 subpass.num_color_attachments(),
935 ColorBlendAttachmentState {
936 blend: Some(AttachmentBlend::alpha()),
937 ..Default::default()
938 },
939 )),
940 subpass: Some(subpass.into()),
941 depth_stencil_state: Some(DepthStencilState {
942 depth: Some(DepthState::simple()),
943 ..Default::default()
944 }),
945 ..GraphicsPipelineCreateInfo::layout(pipeline_layout)
946 },
947 )
948 .unwrap()
949 };
950
951 let pipeline_layout: &Arc<vulkano::pipeline::PipelineLayout> = drawing_pipeline.layout();
952 let descriptor_set_layouts: &[Arc<vulkano::descriptor_set::layout::DescriptorSetLayout>] =
953 pipeline_layout.set_layouts();
954
955 let descriptor_set_layout_index: usize = 0;
956 let descriptor_set_layout: Arc<vulkano::descriptor_set::layout::DescriptorSetLayout> =
957 descriptor_set_layouts
958 .get(descriptor_set_layout_index)
959 .unwrap()
960 .clone();
961 let descriptor_set: Arc<PersistentDescriptorSet> = PersistentDescriptorSet::new(
962 &descriptor_set_allocator,
963 descriptor_set_layout.clone(),
964 [
965 WriteDescriptorSet::buffer(0, general_uniform_buffer.clone()),
966 WriteDescriptorSet::buffer(1, entities_uniform_buffer.clone()),
967 ],
968 [],
969 )
970 .unwrap();
971
972 let frames_in_flight: usize = images.len();
1020 let drawing_fences: Vec<Option<Arc<FenceSignalFuture<_>>>> = vec![None; frames_in_flight];
1021 let previous_drawing_fence_i: u32 = 0;
1022
1023 let previous_frame_end: Option<Box<dyn GpuFuture>> =
1028 Some(sync::now(device.clone()).boxed());
1029 let recreate_swapchain: bool = false;
1030 let show_count: u32 = 0;
1031 let time: f32 = 0.0;
1032
1033 Vera {
1036 event_loop,
1037 vk: Vk {
1038 library,
1040 required_extensions,
1041 instance,
1042 surface,
1043 window,
1044
1045 device_extensions,
1046 physical_device,
1047 queue_family_index,
1048 device,
1049 queue,
1050
1051 swapchain,
1052 images,
1053 render_pass,
1054 framebuffers,
1055
1056 memory_allocator,
1058 command_buffer_allocator,
1059 descriptor_set_allocator,
1060
1061 max_uniform_buffer_size,
1063 max_storage_buffer_size,
1064
1065 vertex_buffer,
1067 staging_vertex_buffer,
1068 vertex_copy_command_buffer,
1069 vertex_copy_fence,
1070
1071 general_uniform_buffer,
1073 general_staging_uniform_buffer,
1074 general_uniform_copy_command_buffer,
1075 general_uniform_copy_fence,
1076
1077 entities_uniform_buffer,
1079 entities_staging_uniform_buffer,
1080 entities_uniform_copy_command_buffer,
1081 entities_uniform_copy_fence,
1082
1083 drawing_vs,
1092 drawing_fs,
1093 descriptor_set,
1094 descriptor_set_layout,
1095 descriptor_set_layout_index,
1096 drawing_pipeline,
1097 frames_in_flight,
1098 drawing_fences,
1099 previous_drawing_fence_i,
1100
1101 previous_frame_end,
1103 recreate_swapchain,
1104 show_count,
1105 time,
1106
1107 position_vertex_data: vec![],
1109 vertex_len,
1110 general_uniform_data,
1111 general_uniform_transformer,
1112 entities_uniform_data: vec![],
1113 entities_uniform_transformer,
1114 entities_uniform_len,
1115 transform_vertex_data: vec![],
1116 transform_vertex_transformer,
1117 transform_vertex_buffer,
1118 staging_transform_vertex_buffer,
1119 transform_vertex_copy_command_buffer,
1120 transform_vertex_copy_fence,
1121 color_vertex_data: vec![],
1122 color_vertex_colorizer,
1123 color_vertex_buffer,
1124 staging_color_vertex_buffer,
1125 color_vertex_copy_command_buffer,
1126 color_vertex_copy_fence,
1127
1128 background_color,
1129 start_time,
1130 end_time,
1131 },
1132 }
1133 }
1134
1135 pub fn reset(&mut self, input: Input) {
1140 self.vk.source(input);
1141 }
1142
1143 pub fn show(&mut self) -> bool {
1148 match self.vk.show(&mut self.event_loop) {
1149 0 => {
1150 true
1152 }
1153 1 => {
1154 println!("\nℹ Window closed.");
1156 false
1157 }
1158 n => {
1159 println!("🛑 Unexpected return code \"{}\" when running the main loop", n);
1160 false
1161 }
1162 }
1163 }
1164
1165 pub fn save(&mut self, width: u32, height: u32) {
1166 match self.vk.show(&mut self.event_loop) { 0 => {
1168 println!("✨ Saved video!");
1170 }
1171 1 => {
1172 println!("⁉ Window closed. Stopping encoding now.");
1174 }
1175 _ => {
1176 panic!("🛑 Unexpected return code when running the main loop");
1177 }
1178 }
1179 }
1180}
1181
1182fn from_input(input: Input) -> ((GeneralData, (Transformer, Transformer)), (u64, Vec<EntityData>, Vec<Transformer>), (Vec<TransformVertexData>, Vec<Transformer>), (Vec<ColorVertexData>, Vec<Colorizer>), (u64, Vec<VertexData>), ([f32; 4], f32, f32)) {
1184 let Input {
1185 meta,
1186 m,
1187 v: View {
1188 t: view_t,
1189 },
1190 p: Projection {
1191 t: projection_t,
1192 },
1193 } = input;
1194
1195 let general_uniform_transformer: (Transformer, Transformer) = (Transformer::from_t(view_t), Transformer::from_t(projection_t)); let general_uniform_data: GeneralData = GeneralData::from_resolution([1.0, 1.0]);
1197
1198 let mut position_vertex_data: Vec<VertexData> = vec![];
1199 let mut color_vertex_data: Vec<ColorVertexData> = vec![];
1200 let mut color_vertex_colorizer: Vec<Colorizer> = vec![];
1201 let mut transform_vertex_transformer: Vec<Transformer> = vec![];
1202 let mut entities_uniform_transformer: Vec<Transformer> = vec![];
1203
1204 for (entity_id, model) in m.into_iter().enumerate() {
1205 for v in model.vertices.into_iter() {
1206 position_vertex_data.push(VertexData { entity_id: entity_id as u32, position: v.position });
1207 color_vertex_data.push(ColorVertexData { color: v.color });
1208 color_vertex_colorizer.push(Colorizer::from_c(v.color, v.c));
1209 transform_vertex_transformer.push(Transformer::from_t(v.t));
1210 }
1211 entities_uniform_transformer.push(Transformer::from_t(model.t));
1212 }
1213
1214 let entities_uniform_len = entities_uniform_transformer.len() as u64;
1215 let entities_uniform_data: Vec<EntityData> = vec![EntityData::new(); entities_uniform_len as usize];
1216 let vertex_len = position_vertex_data.len() as u64;
1217
1218 let transform_vertex_data: Vec<TransformVertexData> = vec![TransformVertexData::new(); vertex_len as usize];
1219
1220 (
1221 (general_uniform_data, general_uniform_transformer),
1222 (entities_uniform_len, entities_uniform_data, entities_uniform_transformer),
1223 (transform_vertex_data, transform_vertex_transformer),
1224 (color_vertex_data, color_vertex_colorizer),
1225 (vertex_len, position_vertex_data),
1226 (meta.bg, meta.start, meta.end)
1227 )
1228}
1229
1230impl Vk {
1231 fn source(&mut self, input: Input) {
1233 (
1234 (self.general_uniform_data, self.general_uniform_transformer),
1235 (self.entities_uniform_len, self.entities_uniform_data, self.entities_uniform_transformer),
1236 (self.transform_vertex_data, self.transform_vertex_transformer),
1237 (self.color_vertex_data, self.color_vertex_colorizer),
1238 (self.vertex_len, self.position_vertex_data),
1239 (self.background_color, self.start_time, self.end_time)
1240 ) = from_input(input);
1241
1242 self.recreate_vertex_buffer();
1243 self.recreate_color_vertex_buffer();
1244 self.recreate_transform_vertex_buffer();
1245 self.recreate_entities_uniform_buffer();
1246 self.recreate_general_uniform_buffer();
1247
1248 self.descriptor_set = PersistentDescriptorSet::new(
1249 &self.descriptor_set_allocator,
1250 self.descriptor_set_layout.clone(),
1251 [
1252 WriteDescriptorSet::buffer(0, self.general_uniform_buffer.clone()),
1253 WriteDescriptorSet::buffer(1, self.entities_uniform_buffer.clone()),
1254 ],
1255 [],
1256 )
1257 .unwrap();
1258
1259 self.copy_vertex_buffer();
1260 self.copy_color_vertex_buffer();
1261 self.copy_transform_vertex_buffer();
1262 self.copy_entities_uniform_buffer();
1263 self.copy_general_uniform_buffer();
1264 }
1265
1266 fn recreate_vertex_buffer(&mut self) {
1269 self.staging_vertex_buffer = Buffer::from_iter(
1270 self.memory_allocator.clone(),
1271 BufferCreateInfo {
1272 usage: BufferUsage::TRANSFER_SRC,
1273 ..Default::default()
1274 },
1275 AllocationCreateInfo {
1276 memory_type_filter: MemoryTypeFilter::PREFER_HOST
1277 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1278 ..Default::default()
1279 },
1280 std::mem::take(&mut self.position_vertex_data),
1281 )
1282 .expect("failed to create staging_vertex_buffer");
1283
1284 self.vertex_buffer = Buffer::new_slice::<VertexData>(
1285 self.memory_allocator.clone(),
1286 BufferCreateInfo {
1287 usage: BufferUsage::STORAGE_BUFFER
1288 | BufferUsage::TRANSFER_DST
1289 | BufferUsage::VERTEX_BUFFER,
1290 ..Default::default()
1291 },
1292 AllocationCreateInfo {
1293 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1294 ..Default::default()
1295 },
1296 self.vertex_len,
1297 )
1298 .expect("failed to create vertex_buffer");
1299
1300 let mut vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1301 AutoCommandBufferBuilder::primary(
1302 &self.command_buffer_allocator,
1303 self.queue.queue_family_index(),
1304 CommandBufferUsage::MultipleSubmit,
1305 )
1306 .expect("failed to create vertex_cbb");
1307
1308 vertex_cbb
1309 .copy_buffer(CopyBufferInfo::buffers(
1310 self.staging_vertex_buffer.clone(),
1311 self.vertex_buffer.clone(),
1312 ))
1313 .unwrap();
1314
1315 self.vertex_copy_command_buffer = vertex_cbb.build().unwrap();
1316 }
1317
1318 fn recreate_color_vertex_buffer(&mut self) {
1319 self.staging_color_vertex_buffer = Buffer::from_iter(
1320 self.memory_allocator.clone(),
1321 BufferCreateInfo {
1322 usage: BufferUsage::TRANSFER_SRC,
1323 ..Default::default()
1324 },
1325 AllocationCreateInfo {
1326 memory_type_filter: MemoryTypeFilter::PREFER_HOST
1327 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1328 ..Default::default()
1329 },
1330 std::mem::take(&mut self.color_vertex_data),
1331 )
1332 .expect("failed to create staging_color_vertex_buffer");
1333
1334 self.color_vertex_buffer = Buffer::new_slice::<ColorVertexData>(
1335 self.memory_allocator.clone(),
1336 BufferCreateInfo {
1337 usage: BufferUsage::STORAGE_BUFFER
1338 | BufferUsage::TRANSFER_DST
1339 | BufferUsage::VERTEX_BUFFER,
1340 ..Default::default()
1341 },
1342 AllocationCreateInfo {
1343 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1344 ..Default::default()
1345 },
1346 self.vertex_len,
1347 )
1348 .expect("failed to create color_vertex_buffer");
1349
1350 let mut color_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1351 AutoCommandBufferBuilder::primary(
1352 &self.command_buffer_allocator,
1353 self.queue.queue_family_index(),
1354 CommandBufferUsage::MultipleSubmit,
1355 )
1356 .expect("failed to create color_vertex_cbb");
1357
1358 color_vertex_cbb
1359 .copy_buffer(CopyBufferInfo::buffers(
1360 self.staging_color_vertex_buffer.clone(),
1361 self.color_vertex_buffer.clone(),
1362 ))
1363 .unwrap();
1364
1365 self.color_vertex_copy_command_buffer = color_vertex_cbb.build().unwrap();
1366 }
1367
1368 fn recreate_transform_vertex_buffer(&mut self) {
1369 self.staging_transform_vertex_buffer = Buffer::from_iter(
1370 self.memory_allocator.clone(),
1371 BufferCreateInfo {
1372 usage: BufferUsage::TRANSFER_SRC,
1373 ..Default::default()
1374 },
1375 AllocationCreateInfo {
1376 memory_type_filter: MemoryTypeFilter::PREFER_HOST
1377 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1378 ..Default::default()
1379 },
1380 std::mem::take(&mut self.transform_vertex_data),
1381 )
1382 .expect("failed to create staging_vertex_buffer");
1383
1384 self.transform_vertex_buffer = Buffer::new_slice::<TransformVertexData>(
1385 self.memory_allocator.clone(),
1386 BufferCreateInfo {
1387 usage: BufferUsage::STORAGE_BUFFER
1388 | BufferUsage::TRANSFER_DST
1389 | BufferUsage::VERTEX_BUFFER,
1390 ..Default::default()
1391 },
1392 AllocationCreateInfo {
1393 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1394 ..Default::default()
1395 },
1396 self.vertex_len,
1397 )
1398 .expect("failed to create vertex_buffer");
1399
1400 let mut transform_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1401 AutoCommandBufferBuilder::primary(
1402 &self.command_buffer_allocator,
1403 self.queue.queue_family_index(),
1404 CommandBufferUsage::MultipleSubmit,
1405 )
1406 .expect("failed to create transform_vertex_cbb");
1407
1408 transform_vertex_cbb
1409 .copy_buffer(CopyBufferInfo::buffers(
1410 self.staging_transform_vertex_buffer.clone(),
1411 self.transform_vertex_buffer.clone(),
1412 ))
1413 .unwrap();
1414
1415 self.transform_vertex_copy_command_buffer = transform_vertex_cbb.build().unwrap();
1416 }
1417
1418 fn recreate_general_uniform_buffer(&mut self) {
1419 self.general_staging_uniform_buffer = Buffer::from_data(
1420 self.memory_allocator.clone(),
1421 BufferCreateInfo {
1422 usage: BufferUsage::TRANSFER_SRC,
1423 ..Default::default()
1424 },
1425 AllocationCreateInfo {
1426 memory_type_filter: MemoryTypeFilter::PREFER_HOST
1427 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1428 ..Default::default()
1429 },
1430 self.general_uniform_data.clone(),
1431 )
1432 .expect("failed to create staging_uniform_buffer");
1433
1434 self.general_uniform_buffer = Buffer::new_sized::<GeneralData>(
1435 self.memory_allocator.clone(),
1436 BufferCreateInfo {
1437 usage: BufferUsage::STORAGE_BUFFER
1438 | BufferUsage::UNIFORM_BUFFER
1439 | BufferUsage::TRANSFER_DST,
1440 ..Default::default()
1441 },
1442 AllocationCreateInfo {
1443 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1444 ..Default::default()
1445 },
1446 )
1447 .expect("failed to create uniform_buffer");
1448
1449 let mut general_uniform_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1450 AutoCommandBufferBuilder::primary(
1451 &self.command_buffer_allocator,
1452 self.queue.queue_family_index(),
1453 CommandBufferUsage::MultipleSubmit,
1454 )
1455 .expect("failed to create general_uniform_cbb");
1456
1457 general_uniform_cbb
1458 .copy_buffer(CopyBufferInfo::buffers(
1459 self.general_staging_uniform_buffer.clone(),
1460 self.general_uniform_buffer.clone(),
1461 ))
1462 .unwrap();
1463
1464 self.general_uniform_copy_command_buffer = general_uniform_cbb.build().unwrap();
1465 }
1466
1467 fn recreate_entities_uniform_buffer(&mut self) {
1468 self.entities_staging_uniform_buffer = Buffer::from_iter(
1469 self.memory_allocator.clone(),
1470 BufferCreateInfo {
1471 usage: BufferUsage::TRANSFER_SRC,
1472 ..Default::default()
1473 },
1474 AllocationCreateInfo {
1475 memory_type_filter: MemoryTypeFilter::PREFER_HOST
1476 | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1477 ..Default::default()
1478 },
1479 std::mem::take(&mut self.entities_uniform_data),
1480 )
1481 .expect("failed to create staging_uniform_buffer");
1482
1483 self.entities_uniform_buffer = Buffer::new_slice::<EntityData>(
1484 self.memory_allocator.clone(),
1485 BufferCreateInfo {
1486 usage: BufferUsage::STORAGE_BUFFER
1487 | BufferUsage::UNIFORM_BUFFER
1488 | BufferUsage::TRANSFER_DST,
1489 ..Default::default()
1490 },
1491 AllocationCreateInfo {
1492 memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1493 ..Default::default()
1494 },
1495 self.entities_uniform_len,
1496 )
1497 .expect("failed to create uniform_buffer");
1498
1499 let mut entities_uniform_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1500 AutoCommandBufferBuilder::primary(
1501 &self.command_buffer_allocator,
1502 self.queue.queue_family_index(),
1503 CommandBufferUsage::MultipleSubmit,
1504 )
1505 .expect("failed to create entities_uniform_cbb");
1506
1507 entities_uniform_cbb
1508 .copy_buffer(CopyBufferInfo::buffers(
1509 self.entities_staging_uniform_buffer.clone(),
1510 self.entities_uniform_buffer.clone(),
1511 ))
1512 .unwrap();
1513
1514 self.entities_uniform_copy_command_buffer = entities_uniform_cbb.build().unwrap();
1515 }
1516
1517 fn update_color_vertex_buffer(&mut self) {
1522 for (o, i) in self.staging_color_vertex_buffer.write().unwrap().iter_mut()
1523 .zip(self.color_vertex_colorizer.iter_mut()) {
1524 (*o).color = i.update(self.time).0;
1525 }
1526
1527 self.copy_color_vertex_buffer();
1528 }
1529
1530 fn update_transform_vertex_buffer(&mut self) {
1531 for (o, i) in self.staging_transform_vertex_buffer.write().unwrap().iter_mut()
1532 .zip(self.transform_vertex_transformer.iter_mut()) {
1533 let mat = i.update_vm(self.time).0;
1534 ((*o).vertex_matrix0, (*o).vertex_matrix1, (*o).vertex_matrix2, (*o).vertex_matrix3) = (
1535 [mat[0], mat[1], mat[2], mat[3]],
1536 [mat[4], mat[5], mat[6], mat[7]],
1537 [mat[8], mat[9], mat[10], mat[11]],
1538 [mat[12], mat[13], mat[14], mat[15]],
1539 );
1540 }
1541
1542 self.copy_transform_vertex_buffer();
1543 }
1544
1545 fn update_general_uniform_buffer(&mut self) {
1546 let image_extent: [u32; 2] = self.window.inner_size().into();
1547 {
1548 let mut buf = self.general_staging_uniform_buffer.write().unwrap();
1549 buf.time = self.time;
1550 buf.resolution = [image_extent[0] as f32, image_extent[1] as f32];
1551 buf.view_matrix = self.general_uniform_transformer.0.update_vp(self.time).0;
1552 buf.projection_matrix = self.general_uniform_transformer.1.update_vp(self.time).0;
1553 }
1554
1555 self.copy_general_uniform_buffer();
1556 }
1557
1558 fn update_entities_uniform_buffer(&mut self) {
1559 for (o, i) in self.entities_staging_uniform_buffer.write().unwrap().iter_mut()
1560 .zip(self.entities_uniform_transformer.iter_mut()) {
1561 (*o).model_matrix = i.update_vm(self.time).0;
1562 }
1563
1564 self.copy_entities_uniform_buffer();
1565 }
1566
1567 fn copy_vertex_buffer(&mut self) {
1570 self.vertex_copy_command_buffer
1571 .clone()
1572 .execute(self.queue.clone())
1573 .unwrap()
1574 .then_signal_fence_and_flush()
1575 .unwrap()
1576 .wait(None )
1577 .unwrap();
1578 }
1579
1580 fn copy_color_vertex_buffer(&mut self) {
1581 self.color_vertex_copy_command_buffer
1582 .clone()
1583 .execute(self.queue.clone())
1584 .unwrap()
1585 .then_signal_fence_and_flush()
1586 .unwrap()
1587 .wait(None )
1588 .unwrap();
1589 }
1590
1591 fn copy_transform_vertex_buffer(&mut self) { self.transform_vertex_copy_command_buffer
1593 .clone()
1594 .execute(self.queue.clone())
1595 .unwrap()
1596 .then_signal_fence_and_flush()
1597 .unwrap()
1598 .wait(None )
1599 .unwrap();
1600 }
1601
1602 fn copy_general_uniform_buffer(&mut self) {
1603 self.general_uniform_copy_command_buffer
1604 .clone()
1605 .execute(self.queue.clone())
1606 .unwrap()
1607 .then_signal_fence_and_flush()
1608 .unwrap()
1609 .wait(None )
1610 .unwrap();
1611 }
1612
1613 fn copy_entities_uniform_buffer(&mut self) {
1614 self.entities_uniform_copy_command_buffer
1615 .clone()
1616 .execute(self.queue.clone())
1617 .unwrap()
1618 .then_signal_fence_and_flush()
1619 .unwrap()
1620 .wait(None )
1621 .unwrap();
1622 }
1623
1624 fn update(&mut self) {
1626 self.update_color_vertex_buffer();
1627 self.update_transform_vertex_buffer();
1628 self.update_general_uniform_buffer();
1629 self.update_entities_uniform_buffer();
1630 }
1631
1632 fn draw(&mut self) {
1634 let image_extent: [u32; 2] = self.window.inner_size().into();
1635
1636 if image_extent.contains(&0) {
1637 return;
1638 }
1639
1640 self.previous_frame_end.as_mut().unwrap().cleanup_finished();
1641
1642 if self.recreate_swapchain {
1643 self.recreate_swapchain = false;
1644
1645 (self.swapchain, self.images) = self
1646 .swapchain
1647 .recreate(SwapchainCreateInfo {
1648 image_extent,
1649 ..self.swapchain.create_info()
1650 })
1651 .expect("failed to recreate swapchain");
1652
1653 let extent = self.images[0].extent();
1654
1655
1656 let depth_attachment = ImageView::new_default(
1657 Image::new(
1658 self.memory_allocator.clone(),
1659 ImageCreateInfo {
1660 image_type: ImageType::Dim2d,
1661 format: Format::D16_UNORM,
1662 extent: self.images[0].extent(),
1663 usage: ImageUsage::DEPTH_STENCIL_ATTACHMENT | ImageUsage::TRANSIENT_ATTACHMENT,
1664 ..Default::default()
1665 },
1666 AllocationCreateInfo::default(),
1667 )
1668 .unwrap(),
1669 )
1670 .unwrap();
1671
1672 self.framebuffers = self
1673 .images
1674 .iter()
1675 .map(|image| {
1676 let view = ImageView::new_default(image.clone()).unwrap();
1677 Framebuffer::new(
1678 self.render_pass.clone(),
1679 FramebufferCreateInfo {
1680 attachments: vec![view, depth_attachment.clone()],
1681 ..Default::default()
1682 },
1683 )
1684 .unwrap()
1685 })
1686 .collect::<Vec<_>>();
1687
1688 self.drawing_pipeline = {
1693 let vertex_input_state = [VertexData::per_vertex(), ColorVertexData::per_vertex(), TransformVertexData::per_vertex()]
1694 .definition(&self.drawing_vs.info().input_interface)
1695 .unwrap();
1696 let stages = [
1697 PipelineShaderStageCreateInfo::new(self.drawing_vs.clone()),
1698 PipelineShaderStageCreateInfo::new(self.drawing_fs.clone()),
1699 ];
1700 let layout = PipelineLayout::new(
1701 self.device.clone(),
1702 PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages)
1703 .into_pipeline_layout_create_info(self.device.clone())
1704 .unwrap(),
1705 )
1706 .unwrap();
1707 let subpass = Subpass::from(self.render_pass.clone(), 0).unwrap();
1708
1709 GraphicsPipeline::new(
1710 self.device.clone(),
1711 None,
1712 GraphicsPipelineCreateInfo {
1713 stages: stages.into_iter().collect(),
1714 vertex_input_state: Some(vertex_input_state),
1715 input_assembly_state: Some(InputAssemblyState::default()),
1716 viewport_state: Some(ViewportState {
1717 viewports: [Viewport {
1718 offset: [0.0, 0.0],
1719 extent: [extent[0] as f32, extent[1] as f32],
1720 depth_range: 0.0..=1.0,
1721 }]
1722 .into_iter()
1723 .collect(),
1724 ..Default::default()
1725 }),
1726 rasterization_state: Some(RasterizationState::default()),
1727 multisample_state: Some(MultisampleState::default()),
1728 color_blend_state: Some(ColorBlendState::with_attachment_states(
1729 subpass.num_color_attachments(),
1730 ColorBlendAttachmentState {
1731 blend: Some(AttachmentBlend::alpha()),
1732 ..Default::default()
1733 },
1734 )),
1735 subpass: Some(subpass.into()),
1736 depth_stencil_state: Some(DepthStencilState {
1737 depth: Some(DepthState::simple()),
1738 ..Default::default()
1739 }),
1740 ..GraphicsPipelineCreateInfo::layout(layout)
1741 },
1742 )
1743 .unwrap()
1744 };
1745 }
1746
1747 let (image_i, suboptimal, acquire_future) =
1748 match acquire_next_image(self.swapchain.clone(), None).map_err(Validated::unwrap) {
1749 Ok(r) => r,
1750 Err(VulkanError::OutOfDate) => {
1751 self.recreate_swapchain = true;
1752 return;
1753 }
1754 Err(e) => panic!("failed to acquire next image: {e}"),
1755 };
1756
1757 if suboptimal {
1758 self.recreate_swapchain = true;
1759 }
1760
1761 let mut builder = AutoCommandBufferBuilder::primary(
1762 &self.command_buffer_allocator,
1763 self.queue.queue_family_index(),
1764 CommandBufferUsage::MultipleSubmit,
1765 )
1766 .unwrap();
1767
1768 builder
1769 .begin_render_pass(
1770 RenderPassBeginInfo {
1771 clear_values: vec![
1772 Some(self.background_color.into()),
1773 Some(1.0.into())
1774 ],
1775 ..RenderPassBeginInfo::framebuffer(self.framebuffers[image_i as usize].clone())
1776 },
1777 Default::default(), )
1779 .unwrap()
1780 .bind_pipeline_graphics(self.drawing_pipeline.clone())
1781 .unwrap()
1782 .bind_descriptor_sets(
1783 PipelineBindPoint::Graphics,
1784 self.drawing_pipeline.layout().clone(),
1785 self.descriptor_set_layout_index as u32,
1786 self.descriptor_set.clone(),
1787 )
1788 .unwrap()
1789 .bind_vertex_buffers(0, self.vertex_buffer.clone())
1790 .unwrap()
1791 .bind_vertex_buffers(1, self.color_vertex_buffer.clone())
1792 .unwrap()
1793 .bind_vertex_buffers(2, self.transform_vertex_buffer.clone())
1794 .unwrap()
1795 .draw(self.vertex_buffer.len() as u32, 1, 0, 0)
1796 .unwrap()
1797 .end_render_pass(Default::default())
1798 .unwrap();
1799
1800 let drawing_command_buffer = builder.build().unwrap();
1801
1802 let future = self
1809 .previous_frame_end
1810 .take()
1811 .unwrap()
1812 .join(acquire_future)
1813 .then_execute(self.queue.clone(), drawing_command_buffer)
1814 .unwrap()
1815 .then_swapchain_present(
1816 self.queue.clone(),
1817 SwapchainPresentInfo::swapchain_image_index(self.swapchain.clone(), image_i),
1818 )
1819 .then_signal_fence_and_flush();
1820
1821 match future.map_err(Validated::unwrap) {
1822 Ok(future) => {
1823 self.previous_frame_end = Some(future.boxed());
1824 }
1825 Err(VulkanError::OutOfDate) => {
1826 self.recreate_swapchain = true;
1827 self.previous_frame_end = Some(sync::now(self.device.clone()).boxed());
1828 }
1829 Err(e) => {
1830 panic!("failed to flush future: {e}");
1831 }
1833 }
1834 }
1835
1836 fn show(
1838 &mut self,
1839 event_loop: &mut EventLoop<()>,
1840 ) -> i32 {
1842 println!("♻ --- {}: Showing with updated data.", self.show_count);
1843 let start = Instant::now();
1844 let mut max_elapsed: bool = true;
1845 event_loop.run_return(move |event, _, control_flow| match event {
1846 Event::WindowEvent {
1847 event: WindowEvent::CloseRequested,
1848 ..
1849 } => {
1850 *control_flow = ControlFlow::ExitWithCode(1);
1851 }
1852 Event::WindowEvent {
1853 event: WindowEvent::Resized(_),
1854 ..
1855 } => {
1856 self.recreate_swapchain = true;
1857 }
1858 Event::MainEventsCleared => {
1859 self.time = start.elapsed().as_secs_f32() + self.start_time;
1860 if self.time > self.end_time {
1864 if max_elapsed {
1865 max_elapsed = false;
1866 self.show_count += 1;
1867 }
1868 *control_flow = ControlFlow::ExitWithCode(0);
1869 }
1870 self.update();
1871 self.draw();
1872 }
1874 _ => (),
1875 })
1876 }
1877
1878 }