use std::collections::HashMap;
use std::marker::PhantomData;
use std::sync::MutexGuard;
use anyhow::Result;
use ash::vk;
use crate::{
Allocator, CmdBuffer, DefaultAllocator, DescriptorCache, Device, Error,
ExecutionManager, PipelineCache,
};
use crate::core::queue::Queue;
use crate::descriptor::builder::DescriptorSetBuilder;
use crate::pipeline::create_info::PipelineRenderingInfo;
use crate::sync::domain::ExecutionDomain;
pub mod compute;
pub mod graphics;
pub mod incomplete;
pub mod traits;
pub mod transfer;
pub(crate) mod command_pool;
pub(crate) mod state;
#[derive(Debug)]
pub struct CommandBuffer<D: ExecutionDomain> {
handle: vk::CommandBuffer,
_domain: PhantomData<D>,
}
#[derive(Derivative)]
#[derivative(Debug)]
pub struct IncompleteCommandBuffer<'q, D: ExecutionDomain, A: Allocator = DefaultAllocator> {
#[derivative(Debug = "ignore")]
device: Device,
handle: vk::CommandBuffer,
queue_lock: MutexGuard<'q, Queue>,
timestamp_valid_bits: u32,
current_pipeline_layout: vk::PipelineLayout,
current_set_layouts: Vec<vk::DescriptorSetLayout>,
current_bindpoint: vk::PipelineBindPoint,
current_rendering_state: Option<PipelineRenderingInfo>,
current_render_area: vk::Rect2D,
current_descriptor_sets: Option<HashMap<u32, DescriptorSetBuilder<'static>>>,
descriptor_state_needs_update: bool,
current_sbt_regions: Option<[vk::StridedDeviceAddressRegionKHR; 4]>,
descriptor_cache: DescriptorCache,
pipeline_cache: PipelineCache<A>,
_domain: PhantomData<D>,
}
impl<D: ExecutionDomain, A: Allocator> CmdBuffer<A> for CommandBuffer<D> {
unsafe fn delete(&mut self, exec: ExecutionManager<A>) -> Result<()> {
let queue = exec.get_queue::<D>().ok_or_else(|| Error::NoCapableQueue)?;
let handle = self.handle;
self.handle = vk::CommandBuffer::null();
queue.free_command_buffer::<Self, A>(handle)
}
}
impl<D: ExecutionDomain> CommandBuffer<D> {
pub unsafe fn handle(&self) -> vk::CommandBuffer {
self.handle
}
}