From 6303adfd53df64263ae43ee3feeb0f94d0008edc Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 24 Feb 2015 07:47:13 +1100 Subject: [PATCH 1/2] Parameterise Renderer over CommandBuffer rather than Device --- src/gfx/lib.rs | 2 +- src/render/device_ext.rs | 4 +-- src/render/lib.rs | 60 ++++++++++++++++++++-------------------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/gfx/lib.rs b/src/gfx/lib.rs index 00cbc78b15d..8aa5a66222b 100644 --- a/src/gfx/lib.rs +++ b/src/gfx/lib.rs @@ -55,7 +55,7 @@ pub struct Graphics { /// Graphics device. pub device: D, /// Renderer front-end. - pub renderer: Renderer, + pub renderer: Renderer, /// Hidden batch context. context: batch::Context, } diff --git a/src/render/device_ext.rs b/src/render/device_ext.rs index 6a4db3da0a4..1ef876b61f3 100644 --- a/src/render/device_ext.rs +++ b/src/render/device_ext.rs @@ -60,7 +60,7 @@ impl<'a> ShaderSource<'a> { /// Backend extension trait for convenience methods pub trait DeviceExt: device::Device { /// Create a new renderer - fn create_renderer(&mut self) -> ::Renderer; + fn create_renderer(&mut self) -> ::Renderer; /// Create a new mesh from the given vertex data. /// Convenience function around `create_buffer` and `Mesh::from_format`. fn create_mesh(&mut self, data: &[T]) -> Mesh where @@ -75,7 +75,7 @@ pub trait DeviceExt: device::Device { } impl DeviceExt for D { - fn create_renderer(&mut self) -> ::Renderer { + fn create_renderer(&mut self) -> ::Renderer { ::Renderer { command_buffer: device::draw::CommandBuffer::new(), data_buffer: device::draw::DataBuffer::new(), diff --git a/src/render/lib.rs b/src/render/lib.rs index fc5e312c2a5..99e3f59a1a6 100644 --- a/src/render/lib.rs +++ b/src/render/lib.rs @@ -142,18 +142,18 @@ pub enum DrawError { } /// Renderer front-end -pub struct Renderer { - command_buffer: D::CommandBuffer, +pub struct Renderer { + command_buffer: C, data_buffer: device::draw::DataBuffer, - common_array_buffer: Result, ()>, - draw_frame_buffer: device::FrameBufferHandle, - read_frame_buffer: device::FrameBufferHandle, - default_frame_buffer: device::FrameBufferHandle, - render_state: RenderState, - parameters: ParamStorage, + common_array_buffer: Result, ()>, + draw_frame_buffer: device::FrameBufferHandle, + read_frame_buffer: device::FrameBufferHandle, + default_frame_buffer: device::FrameBufferHandle, + render_state: RenderState, + parameters: ParamStorage, } -impl Renderer { +impl Renderer { /// Reset all commands for the command buffer re-usal. pub fn reset(&mut self) { self.command_buffer.clear(); @@ -162,12 +162,12 @@ impl Renderer { } /// Get command and data buffers to be submitted to the device. - pub fn as_buffer(&self) -> (&D::CommandBuffer, &device::draw::DataBuffer) { + pub fn as_buffer(&self) -> (&C, &device::draw::DataBuffer) { (&self.command_buffer, &self.data_buffer) } /// Clone the renderer shared data but ignore the commands. - pub fn clone_empty(&self) -> Renderer { + pub fn clone_empty(&self) -> Renderer { Renderer { command_buffer: CommandBuffer::new(), data_buffer: device::draw::DataBuffer::new(), @@ -181,29 +181,29 @@ impl Renderer { } /// Clear the `Frame` as the `ClearData` specifies. - pub fn clear(&mut self, data: ClearData, mask: Mask, frame: &target::Frame) { + pub fn clear(&mut self, data: ClearData, mask: Mask, frame: &target::Frame) { self.bind_frame(frame); self.command_buffer.call_clear(data, mask); } /// Draw a `batch` into the specified `frame` - pub fn draw>(&mut self, batch: &B, frame: &target::Frame) + pub fn draw>(&mut self, batch: &B, frame: &target::Frame) -> Result<(), DrawError> { self.draw_all(batch, None, frame) } /// Draw a `batch` multiple times using instancing - pub fn draw_instanced>(&mut self, batch: &B, + pub fn draw_instanced>(&mut self, batch: &B, count: device::InstanceCount, base: device::VertexCount, - frame: &target::Frame) + frame: &target::Frame) -> Result<(), DrawError> { self.draw_all(batch, Some((count, base)), frame) } /// Draw a 'batch' with all known parameters specified, internal use only. - fn draw_all>(&mut self, batch: &B, instances: Option, - frame: &target::Frame) -> Result<(), DrawError> { + fn draw_all>(&mut self, batch: &B, instances: Option, + frame: &target::Frame) -> Result<(), DrawError> { let (mesh, attrib_iter, slice, state) = match batch.get_data() { Ok(data) => data, Err(e) => return Err(DrawError::InvalidBatch(e)), @@ -224,8 +224,8 @@ impl Renderer { } /// Blit one frame onto another - pub fn blit(&mut self, source: &target::Frame, source_rect: Rect, - destination: &target::Frame, dest_rect: Rect, + pub fn blit(&mut self, source: &target::Frame, source_rect: Rect, + destination: &target::Frame, dest_rect: Rect, mirror: Mirror, mask: Mask) { // verify as much as possible here if mask.intersects(device::target::COLOR) { @@ -247,7 +247,7 @@ impl Renderer { } /// Update a buffer with data from a vector. - pub fn update_buffer_vec(&mut self, buf: device::BufferHandle, + pub fn update_buffer_vec(&mut self, buf: device::BufferHandle, data: &[T], offset_elements: usize) { let esize = mem::size_of::(); let offset_bytes = esize * offset_elements; @@ -258,21 +258,21 @@ impl Renderer { /// Update a buffer with data from a single type. pub fn update_buffer_struct(&mut self, - buf: device::BufferHandle, data: &T) { + buf: device::BufferHandle, data: &T) { debug_assert!(mem::size_of::() <= buf.get_info().size); let pointer = self.data_buffer.add_struct(data); self.command_buffer.update_buffer(buf.get_name(), pointer, 0); } /// Update the contents of a texture. - pub fn update_texture(&mut self, tex: device::TextureHandle, + pub fn update_texture(&mut self, tex: device::TextureHandle, img: device::tex::ImageInfo, data: &[T]) { debug_assert!(tex.get_info().contains(&img)); let pointer = self.data_buffer.add_vec(data); self.command_buffer.update_texture(tex.get_info().kind, tex.get_name(), img, pointer); } - fn bind_frame(&mut self, frame: &target::Frame) { + fn bind_frame(&mut self, frame: &target::Frame) { if self.render_state.frame.width != frame.width || self.render_state.frame.height != frame.height { self.command_buffer.set_viewport(Rect { @@ -330,7 +330,7 @@ impl Renderer { } } - fn bind_read_frame(&mut self, frame: &target::Frame) { + fn bind_read_frame(&mut self, frame: &target::Frame) { self.command_buffer.bind_frame_buffer(Access::Read, self.read_frame_buffer.get_name()); // color if frame.colors.is_empty() { @@ -367,8 +367,8 @@ impl Renderer { self.render_state.draw = *state; } - fn bind_program<'a, B: Batch>(&mut self, batch: &'a B) - -> Result<&'a device::ProgramHandle, B::Error> { + fn bind_program<'a, B: Batch>(&mut self, batch: &'a B) + -> Result<&'a device::ProgramHandle, B::Error> { let program = match batch.fill_params(self.parameters.get_mut()) { Ok(p) => p, Err(e) => return Err(e), @@ -382,7 +382,7 @@ impl Renderer { Ok(program) } - fn upload_parameters(&mut self, program: &device::ProgramHandle) { + fn upload_parameters(&mut self, program: &device::ProgramHandle) { let info = program.get_info(); if self.parameters.uniforms.len() != info.uniforms.len() || self.parameters.blocks.len() != info.blocks.len() || @@ -422,7 +422,7 @@ impl Renderer { } fn bind_mesh>(&mut self, - mesh: &mesh::Mesh, attrib_iter: I, info: &ProgramInfo) { + mesh: &mesh::Mesh, attrib_iter: I, info: &ProgramInfo) { if !self.render_state.is_array_buffer_set { // It's Ok if the array buffer is not supported. We can just ignore it. self.common_array_buffer.map(|ab| @@ -448,14 +448,14 @@ impl Renderer { } } - fn bind_index(&mut self, buf: device::BufferHandle) { + fn bind_index(&mut self, buf: device::BufferHandle) { if self.render_state.index != Some(buf.raw()) { self.command_buffer.bind_index(buf.get_name()); self.render_state.index = Some(buf.raw()); } } - fn draw_slice(&mut self, slice: &mesh::Slice, + fn draw_slice(&mut self, slice: &mesh::Slice, instances: Option<(device::InstanceCount, device::VertexCount)>) { let mesh::Slice { start, end, prim_type, kind } = slice.clone(); match kind { From 23d931a7e24f5d6be8febf4b4d77621f9ac364ba Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 24 Feb 2015 07:54:59 +1100 Subject: [PATCH 2/2] Make device::gl_device crate fully self-contained --- src/device/gl_device/draw.rs | 8 ++++---- src/device/gl_device/lib.rs | 10 ++++++++++ src/device/lib.rs | 13 ------------- tests/vertex_format.rs | 4 ++-- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/device/gl_device/draw.rs b/src/device/gl_device/draw.rs index 420e28ae98d..ea15bbbfd10 100644 --- a/src/device/gl_device/draw.rs +++ b/src/device/gl_device/draw.rs @@ -16,9 +16,9 @@ use std::slice; -use {attrib, back, draw, target, tex, shade, state}; +use {attrib, draw, target, tex, shade, state}; use {AttributeSlot, IndexType, InstanceCount, PrimitiveType, TextureSlot, UniformBlockIndex, UniformBufferSlot, VertexCount}; -use super::{ArrayBuffer, Buffer, FrameBuffer, Program, Surface, Texture}; +use super::{ArrayBuffer, Buffer, FrameBuffer, Program, Surface, Texture, GlResources}; /// Serialized device command. #[derive(Copy, Debug)] @@ -33,7 +33,7 @@ pub enum Command { BindTargetTexture(target::Access, target::Target, Texture, target::Level, Option), BindUniformBlock(Program, UniformBufferSlot, UniformBlockIndex, Buffer), BindUniform(shade::Location, shade::UniformValue), - BindTexture(TextureSlot, tex::TextureKind, Texture, Option<::SamplerHandle>), + BindTexture(TextureSlot, tex::TextureKind, Texture, Option<::SamplerHandle>), SetDrawColorBuffers(usize), SetPrimitiveState(state::Primitive), SetViewport(target::Rect), @@ -119,7 +119,7 @@ impl draw::CommandBuffer for CommandBuffer { self.buf.push(Command::BindUniform(loc, value)); } fn bind_texture(&mut self, slot: ::TextureSlot, kind: ::tex::TextureKind, - tex: Texture, sampler: Option<::SamplerHandle>) { + tex: Texture, sampler: Option<::SamplerHandle>) { self.buf.push(Command::BindTexture(slot, kind, tex, sampler)); } diff --git a/src/device/gl_device/lib.rs b/src/device/gl_device/lib.rs index 04f726a4b47..cab607ebe1d 100644 --- a/src/device/gl_device/lib.rs +++ b/src/device/gl_device/lib.rs @@ -71,6 +71,16 @@ pub type Surface = gl::types::GLuint; pub type Sampler = gl::types::GLuint; pub type Texture = gl::types::GLuint; +/// A helper method to test `#[vertex_format]` without GL context +//#[cfg(test)] +pub fn make_dummy_buffer() -> BufferHandle { + let info = ::BufferInfo { + usage: BufferUsage::Static, + size: 0, + }; + BufferHandle::from_raw(::Handle(0, info)) +} + #[derive(Copy, Clone, PartialEq, Debug)] pub enum GlResources {} diff --git a/src/device/lib.rs b/src/device/lib.rs index e84c6e359cb..99be8087acb 100644 --- a/src/device/lib.rs +++ b/src/device/lib.rs @@ -23,9 +23,6 @@ extern crate log; extern crate bitflags; extern crate libc; -// TODO: Remove these exports once `gl_device` becomes a separate crate. -pub use self::gl_device as back; - use std::fmt; use std::mem; use std::ops::{Deref, DerefMut}; @@ -248,16 +245,6 @@ pub type TextureHandle = Handle<::Texture, tex::Te /// Sampler Handle pub type SamplerHandle = Handle<::Sampler, tex::SamplerInfo>; -/// A helper method to test `#[vertex_format]` without GL context -//#[cfg(test)] -pub fn make_fake_buffer() -> BufferHandle { - let info = BufferInfo { - usage: BufferUsage::Static, - size: 0, - }; - BufferHandle::from_raw(Handle(0, info)) -} - /// Treat a given slice as `&[u8]` for the given function call pub fn as_byte_slice(slice: &[T]) -> &[u8] { let len = mem::size_of::() * slice.len(); diff --git a/tests/vertex_format.rs b/tests/vertex_format.rs index 709b999038b..0b372ac3ca5 100644 --- a/tests/vertex_format.rs +++ b/tests/vertex_format.rs @@ -49,8 +49,8 @@ fn test_vertex_format() { use secret_lib::gfx; use secret_lib::device; - let buf_vert = device::make_fake_buffer(); - let buf_inst = device::make_fake_buffer(); + let buf_vert = device::gl_device::make_dummy_buffer(); + let buf_inst = device::gl_device::make_dummy_buffer(); let mesh = gfx::Mesh::from_format_instanced::(buf_vert, 0, buf_inst); let stride_vert = 34 as Stride; let stride_inst = 8 as Stride;