use std::sync::Arc;
use smallvec::SmallVec;
use command_buffer::CommandAddError;
use command_buffer::DynamicState;
use command_buffer::cb::AddCommand;
use command_buffer::cb::UnsafeCommandBufferBuilder;
use command_buffer::pool::CommandPool;
use device::Device;
use device::DeviceOwned;
use VulkanObject;
use VulkanPointers;
pub struct CmdSetState {
device: Arc<Device>,
dynamic_state: DynamicState,
}
impl CmdSetState {
pub fn new(device: Arc<Device>, state: DynamicState) -> CmdSetState {
CmdSetState {
device: device,
dynamic_state: DynamicState {
line_width: state.line_width,
viewports: state.viewports,
scissors: state.scissors,
},
}
}
#[inline]
pub fn device(&self) -> &Arc<Device> {
&self.device
}
#[inline]
pub fn state(&self) -> &DynamicState {
&self.dynamic_state
}
}
unsafe impl DeviceOwned for CmdSetState {
#[inline]
fn device(&self) -> &Arc<Device> {
&self.device
}
}
unsafe impl<'a, P> AddCommand<&'a CmdSetState> for UnsafeCommandBufferBuilder<P>
where P: CommandPool
{
type Out = UnsafeCommandBufferBuilder<P>;
#[inline]
fn add(self, command: &'a CmdSetState) -> Result<Self::Out, CommandAddError> {
unsafe {
let vk = self.device().pointers();
let cmd = self.internal_object();
if let Some(line_width) = command.dynamic_state.line_width {
vk.CmdSetLineWidth(cmd, line_width);
}
if let Some(ref viewports) = command.dynamic_state.viewports {
let viewports = viewports.iter().map(|v| v.clone().into()).collect::<SmallVec<[_; 16]>>();
vk.CmdSetViewport(cmd, 0, viewports.len() as u32, viewports.as_ptr());
}
if let Some(ref scissors) = command.dynamic_state.scissors {
let scissors = scissors.iter().map(|v| v.clone().into()).collect::<SmallVec<[_; 16]>>();
vk.CmdSetScissor(cmd, 0, scissors.len() as u32, scissors.as_ptr());
}
}
Ok(self)
}
}