2022-12-25 17:18:11 +11:00
|
|
|
use crate::error;
|
2023-02-10 10:11:34 +11:00
|
|
|
use crate::memory::VulkanBuffer;
|
2024-02-13 17:26:40 +11:00
|
|
|
use array_concat::concat_arrays;
|
2023-02-06 08:17:23 +11:00
|
|
|
use ash::vk;
|
2024-02-13 17:26:40 +11:00
|
|
|
use bytemuck::{Pod, Zeroable};
|
2023-02-10 10:11:34 +11:00
|
|
|
use gpu_allocator::vulkan::Allocator;
|
2023-02-06 08:17:23 +11:00
|
|
|
use librashader_runtime::quad::QuadType;
|
2023-02-10 10:11:34 +11:00
|
|
|
use parking_lot::RwLock;
|
2023-02-06 08:17:23 +11:00
|
|
|
use std::sync::Arc;
|
2022-12-25 17:18:11 +11:00
|
|
|
|
2024-02-12 08:46:43 +11:00
|
|
|
// Vulkan does vertex expansion
|
|
|
|
#[repr(C)]
|
|
|
|
#[derive(Debug, Copy, Clone, Default, Zeroable, Pod)]
|
|
|
|
struct VulkanVertex {
|
|
|
|
position: [f32; 2],
|
|
|
|
texcoord: [f32; 2],
|
|
|
|
}
|
|
|
|
|
|
|
|
const OFFSCREEN_VBO_DATA: [VulkanVertex; 4] = [
|
|
|
|
VulkanVertex {
|
|
|
|
position: [-1.0, -1.0],
|
|
|
|
texcoord: [0.0, 0.0],
|
|
|
|
},
|
|
|
|
VulkanVertex {
|
|
|
|
position: [-1.0, 1.0],
|
|
|
|
texcoord: [0.0, 1.0],
|
|
|
|
},
|
|
|
|
VulkanVertex {
|
|
|
|
position: [1.0, -1.0],
|
|
|
|
texcoord: [1.0, 0.0],
|
|
|
|
},
|
|
|
|
VulkanVertex {
|
|
|
|
position: [1.0, 1.0],
|
|
|
|
texcoord: [1.0, 1.0],
|
|
|
|
},
|
2023-01-31 16:53:55 +11:00
|
|
|
];
|
|
|
|
|
2024-02-12 08:46:43 +11:00
|
|
|
const FINAL_VBO_DATA: [VulkanVertex; 4] = [
|
|
|
|
VulkanVertex {
|
|
|
|
position: [0.0, 0.0],
|
|
|
|
texcoord: [0.0, 0.0],
|
|
|
|
},
|
|
|
|
VulkanVertex {
|
|
|
|
position: [0.0, 1.0],
|
|
|
|
texcoord: [0.0, 1.0],
|
|
|
|
},
|
|
|
|
VulkanVertex {
|
|
|
|
position: [1.0, 0.0],
|
|
|
|
texcoord: [1.0, 0.0],
|
|
|
|
},
|
|
|
|
VulkanVertex {
|
|
|
|
position: [1.0, 1.0],
|
|
|
|
texcoord: [1.0, 1.0],
|
|
|
|
},
|
2022-12-11 17:06:28 +11:00
|
|
|
];
|
2022-12-25 17:18:11 +11:00
|
|
|
|
2024-02-12 08:46:43 +11:00
|
|
|
static VBO_DATA: &[VulkanVertex; 8] = &concat_arrays!(OFFSCREEN_VBO_DATA, FINAL_VBO_DATA);
|
|
|
|
|
2022-12-25 17:18:11 +11:00
|
|
|
pub struct DrawQuad {
|
|
|
|
buffer: VulkanBuffer,
|
2023-02-06 08:17:23 +11:00
|
|
|
device: Arc<ash::Device>,
|
2022-12-25 17:18:11 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
impl DrawQuad {
|
2023-02-06 08:17:23 +11:00
|
|
|
pub fn new(
|
|
|
|
device: &Arc<ash::Device>,
|
2023-02-10 10:11:34 +11:00
|
|
|
allocator: &Arc<RwLock<Allocator>>,
|
2023-02-06 08:17:23 +11:00
|
|
|
) -> error::Result<DrawQuad> {
|
|
|
|
let mut buffer = VulkanBuffer::new(
|
|
|
|
device,
|
2023-02-10 10:11:34 +11:00
|
|
|
allocator,
|
2023-02-06 08:17:23 +11:00
|
|
|
vk::BufferUsageFlags::VERTEX_BUFFER,
|
2024-02-12 08:46:43 +11:00
|
|
|
std::mem::size_of::<[VulkanVertex; 8]>(),
|
2023-02-06 08:17:23 +11:00
|
|
|
)?;
|
2022-12-25 17:18:11 +11:00
|
|
|
|
|
|
|
{
|
2023-02-10 10:11:34 +11:00
|
|
|
let slice = buffer.as_mut_slice()?;
|
2024-02-13 17:26:40 +11:00
|
|
|
slice.copy_from_slice(bytemuck::cast_slice(VBO_DATA));
|
2022-12-25 17:18:11 +11:00
|
|
|
}
|
2023-02-10 10:11:34 +11:00
|
|
|
|
2022-12-25 17:18:11 +11:00
|
|
|
Ok(DrawQuad {
|
|
|
|
buffer,
|
2023-02-06 08:17:23 +11:00
|
|
|
device: device.clone(),
|
2022-12-25 17:18:11 +11:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2023-02-06 16:23:37 +11:00
|
|
|
pub fn bind_vbo_for_frame(&self, cmd: vk::CommandBuffer) {
|
2022-12-25 17:18:11 +11:00
|
|
|
unsafe {
|
2023-02-06 08:17:23 +11:00
|
|
|
self.device.cmd_bind_vertex_buffers(
|
|
|
|
cmd,
|
|
|
|
0,
|
|
|
|
&[self.buffer.handle],
|
2023-02-06 16:23:37 +11:00
|
|
|
&[0 as vk::DeviceSize],
|
2023-02-06 08:17:23 +11:00
|
|
|
)
|
2022-12-25 17:18:11 +11:00
|
|
|
}
|
|
|
|
}
|
2023-02-06 16:23:37 +11:00
|
|
|
|
|
|
|
pub fn draw_quad(&self, cmd: vk::CommandBuffer, vbo: QuadType) {
|
|
|
|
let offset = match vbo {
|
|
|
|
QuadType::Offscreen => 0,
|
|
|
|
QuadType::Final => 4,
|
|
|
|
};
|
|
|
|
|
|
|
|
unsafe {
|
|
|
|
self.device.cmd_draw(cmd, 4, 1, offset, 0);
|
|
|
|
}
|
|
|
|
}
|
2023-02-06 08:17:23 +11:00
|
|
|
}
|