use std::sync::Arc;
use buffer::BufferAccess;
use buffer::TypedBufferAccess;
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::input_assembly::Index;
use VulkanObject;
use VulkanPointers;
use vk;
pub struct CmdBindIndexBuffer<B> {
raw_buffer: vk::Buffer,
offset: vk::DeviceSize,
index_type: vk::IndexType,
device: Arc<Device>,
buffer: B,
}
impl<B, I> CmdBindIndexBuffer<B>
where B: BufferAccess + TypedBufferAccess<Content = [I]>,
I: Index + 'static
{
#[inline]
pub fn new(buffer: B) -> CmdBindIndexBuffer<B> {
let device;
let raw_buffer;
let offset;
{
let inner = buffer.inner();
debug_assert!(inner.offset < inner.buffer.size());
assert!(inner.buffer.usage_index_buffer()); device = inner.buffer.device().clone();
raw_buffer = inner.buffer.internal_object();
offset = inner.offset as vk::DeviceSize;
}
CmdBindIndexBuffer {
raw_buffer: raw_buffer,
offset: offset,
index_type: I::ty() as vk::IndexType,
device: device,
buffer: buffer,
}
}
}
impl<B> CmdBindIndexBuffer<B> {
#[inline]
pub fn buffer(&self) -> &B {
&self.buffer
}
}
unsafe impl<B> DeviceOwned for CmdBindIndexBuffer<B>
where B: DeviceOwned
{
#[inline]
fn device(&self) -> &Arc<Device> {
self.buffer.device()
}
}
unsafe impl<'a, P, B> AddCommand<&'a CmdBindIndexBuffer<B>> for UnsafeCommandBufferBuilder<P>
where P: CommandPool
{
type Out = UnsafeCommandBufferBuilder<P>;
#[inline]
fn add(self, command: &'a CmdBindIndexBuffer<B>) -> Result<Self::Out, CommandAddError> {
unsafe {
let vk = self.device().pointers();
let cmd = self.internal_object();
vk.CmdBindIndexBuffer(cmd, command.raw_buffer, command.offset, command.index_type);
}
Ok(self)
}
}