use std::marker::PhantomData;
use std::sync::Arc;
use command_buffer::CommandAddError;
use command_buffer::cb::AddCommand;
use command_buffer::cb::UnsafeCommandBufferBuilder;
use command_buffer::pool::CommandPool;
use device::Device;
use device::DeviceOwned;
use pipeline::ComputePipelineAbstract;
use pipeline::GraphicsPipelineAbstract;
use VulkanObject;
use VulkanPointers;
use vk;
pub struct CmdBindPipeline<P> {
raw_pipeline: vk::Pipeline,
pipeline_ty: vk::PipelineBindPoint,
device: Arc<Device>,
pipeline: P,
}
impl<P> CmdBindPipeline<P> {
#[inline]
pub fn bind_compute_pipeline(pipeline: P) -> CmdBindPipeline<P>
where P: ComputePipelineAbstract
{
let raw_pipeline = pipeline.inner().internal_object();
let device = pipeline.device().clone();
CmdBindPipeline {
raw_pipeline: raw_pipeline,
pipeline_ty: vk::PIPELINE_BIND_POINT_COMPUTE,
device: device,
pipeline: pipeline,
}
}
#[inline]
pub fn bind_graphics_pipeline(pipeline: P) -> CmdBindPipeline<P>
where P: GraphicsPipelineAbstract
{
let raw_pipeline = GraphicsPipelineAbstract::inner(&pipeline).internal_object();
let device = pipeline.device().clone();
CmdBindPipeline {
raw_pipeline: raw_pipeline,
pipeline_ty: vk::PIPELINE_BIND_POINT_GRAPHICS,
device: device,
pipeline: pipeline,
}
}
#[inline]
pub fn disabled(mut self) -> CmdBindPipeline<P> {
self.raw_pipeline = 0;
self
}
#[inline]
pub fn device(&self) -> &Arc<Device> {
&self.device
}
#[inline]
pub fn is_graphics(&self) -> bool {
self.pipeline_ty == vk::PIPELINE_BIND_POINT_GRAPHICS
}
#[inline]
pub fn sys(&self) -> CmdBindPipelineSys {
CmdBindPipelineSys(self.raw_pipeline, PhantomData)
}
}
unsafe impl<'a, P, Pl> AddCommand<&'a CmdBindPipeline<Pl>> for UnsafeCommandBufferBuilder<P>
where P: CommandPool
{
type Out = UnsafeCommandBufferBuilder<P>;
#[inline]
fn add(self, command: &'a CmdBindPipeline<Pl>) -> Result<Self::Out, CommandAddError> {
if command.raw_pipeline != 0 {
unsafe {
let vk = self.device().pointers();
let cmd = self.internal_object();
vk.CmdBindPipeline(cmd, command.pipeline_ty, command.raw_pipeline);
}
}
Ok(self)
}
}
unsafe impl<Pl> DeviceOwned for CmdBindPipeline<Pl> {
#[inline]
fn device(&self) -> &Arc<Device> {
&self.device
}
}
#[derive(Debug, Copy, Clone)]
pub struct CmdBindPipelineSys<'a>(vk::Pipeline, PhantomData<&'a ()>);
unsafe impl<'a> VulkanObject for CmdBindPipelineSys<'a> {
type Object = vk::Pipeline;
#[inline]
fn internal_object(&self) -> vk::Pipeline {
self.0
}
}