Fix errors
Some checks failed
Build legacy Nix package on Ubuntu / build (push) Failing after 0s

This commit is contained in:
Florian RICHER 2024-11-20 20:08:31 +01:00
parent 1dc9da0d61
commit 2590db0a06
Signed by: florian.richer
GPG key ID: C73D37CBED7BFC77
8 changed files with 123 additions and 88 deletions

View file

@ -1,7 +1,8 @@
use crate::vulkan::vk_command_pool::VkCommandPool;
use crate::vulkan::{VkDevice, VkGraphicsPipeline, VkInstance, VkPhysicalDevice, VkRenderPass, VkSemaphore, VkSurface, VkSwapchain};
use crate::vulkan::{
VkCommandPool, VkDevice, VkFramebuffer, VkGraphicsPipeline, VkInstance, VkPhysicalDevice,
VkRenderPass, VkSemaphore, VkSurface, VkSwapchain,
};
use ash::vk;
use std::mem::swap;
use std::sync::Arc;
pub struct VkRenderContext {
@ -11,6 +12,7 @@ pub struct VkRenderContext {
swapchain: Arc<VkSwapchain>,
render_pass: Arc<VkRenderPass>,
framebuffers: Vec<Arc<VkFramebuffer>>,
pipeline: Arc<VkGraphicsPipeline>,
command_pool: VkCommandPool,
command_buffers: Vec<vk::CommandBuffer>,
@ -34,66 +36,81 @@ impl VkRenderContext {
Some(vk::QueueFlags::GRAPHICS),
Some(&surface),
)
.ok_or_else(|| anyhow::anyhow!("Unable to find physical device"))?;
.ok_or_else(|| anyhow::anyhow!("Unable to find physical device"))?;
log::debug!(
"Selected queue {properties:#?} for physical device {:?}",
physical_device.properties.device_name_as_c_str()
);
let device = Arc::new(VkDevice::new_graphics_device(
instance.clone(),
&instance,
&physical_device,
queue_family_index,
)?);
let swapchain = Arc::new(VkSwapchain::new(
&window,
surface.clone(),
device.clone(),
&surface,
&device,
&physical_device,
)?);
let render_pass = Arc::new(VkRenderPass::new(
device.clone(),
swapchain.clone(),
)?);
let render_pass = Arc::new(VkRenderPass::new(&device, &swapchain)?);
let framebuffers = swapchain.create_framebuffers(render_pass.clone())
let framebuffers = swapchain
.create_framebuffers(&render_pass)
.ok_or_else(|| anyhow::anyhow!("Failed to get framebuffers"))?;
let pipeline = Arc::new(VkGraphicsPipeline::new(
device.clone(),
swapchain.clone(),
render_pass.clone(),
)?);
let pipeline = Arc::new(VkGraphicsPipeline::new(&device, &swapchain, &render_pass)?);
let command_pool = VkCommandPool::new(device.clone())?;
let command_pool = VkCommandPool::new(&device)?;
let command_buffer_info = vk::CommandBufferAllocateInfo::default()
.command_pool(command_pool.handle)
.level(vk::CommandBufferLevel::PRIMARY)
.command_buffer_count(framebuffers.as_ref().unwrap().len() as u32);
.command_buffer_count(framebuffers.len() as u32);
// Destroyed with command pool
let command_buffers = unsafe { device.handle.allocate_command_buffers(&command_buffer_info)? };
let command_buffers = unsafe {
device
.handle
.allocate_command_buffers(&command_buffer_info)?
};
// Same in VkGraphicsPipeline (TODO: Refactor this)
let render_area = vk::Rect2D::default().extent(swapchain.surface_resolution);
let clear_value = vk::ClearValue::default();
for (index, command_buffer) in command_buffers.iter().enumerate() {
let command_buffer_begin_info = vk::CommandBufferBeginInfo::default();
unsafe { device.handle.begin_command_buffer(*command_buffer, &command_buffer_begin_info)? };
unsafe {
device
.handle
.begin_command_buffer(*command_buffer, &command_buffer_begin_info)?
};
let clear_values = [clear_value];
let framebuffer = framebuffers[index].as_ref();
let render_pass_begin_info = vk::RenderPassBeginInfo::default()
.render_pass(render_pass.handle)
.framebuffer(framebuffers[index])
.framebuffer(framebuffer.handle)
.render_area(render_area)
.clear_values(&clear_values);
unsafe { device.handle.cmd_begin_render_pass(*command_buffer, &render_pass_begin_info, vk::SubpassContents::INLINE); };
unsafe {
device.handle.cmd_begin_render_pass(
*command_buffer,
&render_pass_begin_info,
vk::SubpassContents::INLINE,
);
};
unsafe { device.handle.cmd_bind_pipeline(*command_buffer, vk::PipelineBindPoint::GRAPHICS, pipeline.pipeline) };
unsafe {
device.handle.cmd_bind_pipeline(
*command_buffer,
vk::PipelineBindPoint::GRAPHICS,
pipeline.pipeline,
)
};
unsafe { device.handle.cmd_draw(*command_buffer, 3, 1, 0, 0) };
@ -112,6 +129,7 @@ impl VkRenderContext {
swapchain,
render_pass,
framebuffers,
pipeline,
command_pool,
@ -123,10 +141,14 @@ impl VkRenderContext {
}
pub fn render(&mut self) -> anyhow::Result<()> {
let queue = self.device.get_device_queue(0)
let queue = self
.device
.get_device_queue(0)
.ok_or_else(|| anyhow::anyhow!("Failed to get a queue"))?;
let (index, _) = self.swapchain.acquire_next_image(&self.image_available_semaphore)?;
let (index, _) = self
.swapchain
.acquire_next_image(&self.image_available_semaphore)?;
let wait_semaphores = [self.image_available_semaphore.handle];
let signal_semaphores = [self.render_finished_semaphore.handle];
@ -138,7 +160,11 @@ impl VkRenderContext {
.command_buffers(&command_buffers_to_submit)
.signal_semaphores(&signal_semaphores);
unsafe { self.device.handle.queue_submit(*queue, &[submit_info], vk::Fence::null())? };
unsafe {
self.device
.handle
.queue_submit(*queue, &[submit_info], vk::Fence::null())?
};
Ok(())
}