use attrib;
use back;
use shade;
use target;
use tex;
type Offset = u32;
type Size = u32;
#[derive(Copy, PartialEq, Debug)]
pub struct DataPointer(Offset, Size);
pub struct DataBuffer {
buf: Vec<u8>,
}
impl DataBuffer {
pub fn new() -> DataBuffer {
DataBuffer {
buf: Vec::new(),
}
}
pub fn clear(&mut self) {
unsafe { self.buf.set_len(0); }
}
#[inline(always)]
pub fn add_struct<T: Copy>(&mut self, v: &T) -> DataPointer {
use std::slice::ref_slice;
self.add_vec(ref_slice(v))
}
pub fn add_vec<T: Copy>(&mut self, v: &[T]) -> DataPointer {
use std::{mem, slice};
let offset = self.buf.len();
let size = mem::size_of::<T>() * v.len();
self.buf.reserve(size);
unsafe {
self.buf.set_len(offset + size);
slice::bytes::copy_memory(&mut self.buf[offset ..],
slice::from_raw_buf(&(v.as_ptr() as *const u8), size));
}
DataPointer(offset as Offset, size as Size)
}
pub fn get_ref(&self, data: DataPointer) -> &[u8] {
let DataPointer(offset, size) = data;
&self.buf[offset as usize ..offset as usize + size as usize]
}
}
#[allow(missing_docs)] pub trait CommandBuffer {
fn new() -> Self;
fn clear(&mut self);
fn bind_program(&mut self, back::Program);
fn bind_array_buffer(&mut self, back::ArrayBuffer);
fn bind_attribute(&mut self, ::AttributeSlot, back::Buffer, attrib::Format);
fn bind_index(&mut self, back::Buffer);
fn bind_frame_buffer(&mut self, target::Access, back::FrameBuffer);
fn unbind_target(&mut self, target::Access, target::Target);
fn bind_target_surface(&mut self, target::Access, target::Target, back::Surface);
fn bind_target_texture(&mut self, target::Access, target::Target, back::Texture,
target::Level, Option<target::Layer>);
fn bind_uniform_block(&mut self, back::Program, ::UniformBufferSlot,
::UniformBlockIndex, back::Buffer);
fn bind_uniform(&mut self, shade::Location, shade::UniformValue);
fn bind_texture(&mut self, ::TextureSlot, tex::TextureKind, back::Texture,
Option<::SamplerHandle>);
fn set_draw_color_buffers(&mut self, usize);
fn set_primitive(&mut self, ::state::Primitive);
fn set_viewport(&mut self, target::Rect);
fn set_multi_sample(&mut self, Option<::state::MultiSample>);
fn set_scissor(&mut self, Option<target::Rect>);
fn set_depth_stencil(&mut self, Option<::state::Depth>,
Option<::state::Stencil>, ::state::CullMode);
fn set_blend(&mut self, Option<::state::Blend>);
fn set_color_mask(&mut self, ::state::ColorMask);
fn update_buffer(&mut self, back::Buffer, DataPointer, usize);
fn update_texture(&mut self, tex::TextureKind, back::Texture,
tex::ImageInfo, DataPointer);
fn call_clear(&mut self, target::ClearData, target::Mask);
fn call_draw(&mut self, ::PrimitiveType, ::VertexCount, ::VertexCount,
Option<(::InstanceCount, ::VertexCount)>);
fn call_draw_indexed(&mut self, ::PrimitiveType, ::IndexType, ::VertexCount,
::VertexCount, ::VertexCount, Option<(::InstanceCount, ::VertexCount)>);
fn call_blit(&mut self, target::Rect, target::Rect, target::Mask);
}
#[cfg(test)]
mod tests {
#[test]
fn test_data_buffer() {
let mut buf = super::DataBuffer::new();
assert_eq!(buf.add_struct(&(0u, false)), super::DataPointer(0, 16));
assert_eq!(buf.add_vec(&[5i, 6i]), super::DataPointer(16, 16));
}
}