1
0
Fork 0
forked from wry/wry
wry/src/gfx_apis/vulkan/descriptor_buffer.rs

53 lines
1.3 KiB
Rust

use {
crate::gfx_apis::vulkan::descriptor::VulkanDescriptorSetLayout, ash::vk::DeviceSize,
std::ops::Deref,
};
#[derive(Default)]
pub struct VulkanDescriptorBufferWriter {
buffer: Vec<u8>,
}
pub struct VulkanDescriptorBufferSetWriter<'a> {
set: &'a mut [u8],
}
impl VulkanDescriptorBufferWriter {
pub fn clear(&mut self) {
self.buffer.clear();
}
pub fn next_offset(&self) -> DeviceSize {
self.buffer.len() as DeviceSize
}
pub fn add_set(
&mut self,
layout: &VulkanDescriptorSetLayout,
) -> VulkanDescriptorBufferSetWriter<'_> {
let buffer = &mut self.buffer;
let lo = buffer.len();
buffer.resize(lo + layout.size as usize, 0);
VulkanDescriptorBufferSetWriter {
set: &mut buffer[lo..],
}
}
}
impl VulkanDescriptorBufferSetWriter<'_> {
pub fn write(&mut self, offset: DeviceSize, data: &[u8]) {
let offset = offset as usize;
let set = &mut *self.set;
assert!(offset <= set.len());
assert!(data.len() <= set.len() - offset);
set[offset..offset + data.len()].copy_from_slice(data);
}
}
impl Deref for VulkanDescriptorBufferWriter {
type Target = [u8];
fn deref(&self) -> &Self::Target {
&self.buffer
}
}