#[allow(unused_imports)] pub use self::commands::{clear::*, copy::*, dynamic_state::*, pipeline::*, sync::*};
use crate::{graph::ResourceMap, resource::DeathRow, Id};
use ash::vk;
use std::{any::Any, sync::Arc};
use vulkano::{
buffer::Buffer,
command_buffer as raw,
device::{Device, DeviceOwned},
image::Image,
VulkanObject,
};
mod commands;
pub struct RecordingCommandBuffer<'a> {
inner: &'a mut raw::RecordingCommandBuffer,
accesses: ResourceAccesses<'a>,
death_row: &'a mut DeathRow,
}
struct ResourceAccesses<'a> {
resource_map: &'a ResourceMap<'a>,
}
impl<'a> RecordingCommandBuffer<'a> {
pub(crate) unsafe fn new(
inner: &'a mut raw::RecordingCommandBuffer,
resource_map: &'a ResourceMap<'a>,
death_row: &'a mut DeathRow,
) -> Self {
RecordingCommandBuffer {
inner,
accesses: ResourceAccesses { resource_map },
death_row,
}
}
#[inline]
pub fn as_raw(&mut self) -> &mut raw::RecordingCommandBuffer {
self.inner
}
#[inline]
pub fn destroy_object(&mut self, object: Arc<impl Any + Send + Sync>) {
self.death_row.push(object);
}
#[inline]
pub fn destroy_objects(
&mut self,
objects: impl IntoIterator<Item = Arc<impl Any + Send + Sync>>,
) {
self.death_row
.extend(objects.into_iter().map(|object| object as _));
}
}
unsafe impl DeviceOwned for RecordingCommandBuffer<'_> {
#[inline]
fn device(&self) -> &Arc<Device> {
self.inner.device()
}
}
unsafe impl VulkanObject for RecordingCommandBuffer<'_> {
type Handle = vk::CommandBuffer;
#[inline]
fn handle(&self) -> Self::Handle {
self.inner.handle()
}
}
impl<'a> ResourceAccesses<'a> {
unsafe fn buffer_unchecked(&self, id: Id<Buffer>) -> &'a Arc<Buffer> {
if id.is_virtual() {
unsafe { self.resource_map.buffer_unchecked(id) }.buffer()
} else {
let resources = self.resource_map.resources();
unsafe { resources.buffer_unchecked_unprotected(id) }.buffer()
}
}
unsafe fn image_unchecked(&self, id: Id<Image>) -> &'a Arc<Image> {
if id.is_virtual() {
unsafe { self.resource_map.image_unchecked(id) }.image()
} else {
let resources = self.resource_map.resources();
unsafe { resources.image_unchecked_unprotected(id) }.image()
}
}
}
type Result<T = (), E = Box<vulkano::ValidationError>> = ::std::result::Result<T, E>;