librashader/librashader-runtime-vk/src/draw_quad.rs

77 lines
1.7 KiB
Rust
Raw Normal View History

2022-12-25 17:18:11 +11:00
use crate::error;
use crate::vulkan_primitives::VulkanBuffer;
2023-01-10 14:54:54 +11:00
use ash::vk;
2022-12-25 17:18:11 +11:00
2022-12-22 14:03:38 +11:00
#[rustfmt::skip]
pub(crate) static VBO_OFFSCREEN: &[f32; 16] = &[
2022-12-11 17:06:28 +11:00
// Offscreen
2022-12-22 14:03:38 +11:00
-1.0, -1.0, 0.0, 0.0,
-1.0, 1.0, 0.0, 1.0,
1.0, -1.0, 1.0, 0.0,
1.0, 1.0, 1.0, 1.0,
2022-12-11 17:06:28 +11:00
];
2022-12-22 14:03:38 +11:00
#[rustfmt::skip]
pub(crate) static VBO_DEFAULT_FINAL: &[f32; 16] = &[
2022-12-11 17:06:28 +11:00
// Final
2022-12-22 14:03:38 +11:00
0.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 1.0,
1.0, 0.0, 1.0, 0.0,
1.0, 1.0, 1.0, 1.0,
2022-12-11 17:06:28 +11:00
];
2022-12-25 17:18:11 +11:00
pub enum VboType {
Offscreen,
2023-01-10 14:54:54 +11:00
Final,
2022-12-25 17:18:11 +11:00
}
pub struct DrawQuad {
buffer: VulkanBuffer,
2023-01-10 14:54:54 +11:00
device: ash::Device,
2022-12-25 17:18:11 +11:00
}
impl DrawQuad {
2023-01-10 14:54:54 +11:00
pub fn new(
device: &ash::Device,
mem_props: &vk::PhysicalDeviceMemoryProperties,
) -> error::Result<DrawQuad> {
let mut buffer = VulkanBuffer::new(
device,
mem_props,
vk::BufferUsageFlags::VERTEX_BUFFER,
2 * std::mem::size_of::<[f32; 16]>(),
)?;
2022-12-25 17:18:11 +11:00
{
let mut map = buffer.map()?;
unsafe {
map.copy_from(0, bytemuck::cast_slice(VBO_OFFSCREEN));
2023-01-10 14:54:54 +11:00
map.copy_from(
std::mem::size_of::<[f32; 16]>(),
bytemuck::cast_slice(VBO_DEFAULT_FINAL),
);
2022-12-25 17:18:11 +11:00
}
}
Ok(DrawQuad {
buffer,
2023-01-10 14:54:54 +11:00
device: device.clone(),
2022-12-25 17:18:11 +11:00
})
}
2023-01-10 16:45:48 +11:00
pub fn bind_vbo(&self, cmd: vk::CommandBuffer, vbo: VboType) {
2022-12-25 17:18:11 +11:00
let offset = match vbo {
VboType::Offscreen => 0,
2023-01-10 14:54:54 +11:00
VboType::Final => std::mem::size_of::<[f32; 16]>(),
2022-12-25 17:18:11 +11:00
};
unsafe {
2023-01-10 14:54:54 +11:00
self.device.cmd_bind_vertex_buffers(
2023-01-10 16:45:48 +11:00
cmd,
2023-01-10 14:54:54 +11:00
0,
&[self.buffer.handle],
&[offset as vk::DeviceSize],
)
2022-12-25 17:18:11 +11:00
}
}
}