use ash::vk;
use crate::command_buffer::traits::IncompleteCmdBuffer;
use crate::command_buffer::IncompleteCommandBuffer;
use crate::core::queue::Queue;
use crate::{Allocator, QueueType};
pub trait ExecutionDomain {
fn queue_is_compatible(queue: &Queue) -> bool;
type CmdBuf<'q, A: Allocator>: IncompleteCmdBuffer<'q, A>;
}
pub struct All;
pub struct Graphics;
pub struct Transfer;
pub struct Compute;
impl ExecutionDomain for Graphics {
fn queue_is_compatible(queue: &Queue) -> bool {
queue.info().queue_type == QueueType::Graphics
}
type CmdBuf<'q, A: Allocator> = IncompleteCommandBuffer<'q, Graphics, A>;
}
impl ExecutionDomain for Transfer {
fn queue_is_compatible(queue: &Queue) -> bool {
queue.info().queue_type == QueueType::Transfer
}
type CmdBuf<'q, A: Allocator> = IncompleteCommandBuffer<'q, Transfer, A>;
}
impl ExecutionDomain for Compute {
fn queue_is_compatible(queue: &Queue) -> bool {
queue.info().queue_type == QueueType::Compute
}
type CmdBuf<'q, A: Allocator> = IncompleteCommandBuffer<'q, Compute, A>;
}
impl ExecutionDomain for All {
fn queue_is_compatible(queue: &Queue) -> bool {
queue
.info()
.flags
.contains(vk::QueueFlags::COMPUTE | vk::QueueFlags::GRAPHICS | vk::QueueFlags::TRANSFER)
}
type CmdBuf<'q, A: Allocator> = IncompleteCommandBuffer<'q, All, A>;
}