diff --git a/src/device/draw.rs b/src/device/draw.rs index 8348e8bc8ee..b0f57a3cf11 100644 --- a/src/device/draw.rs +++ b/src/device/draw.rs @@ -105,7 +105,7 @@ pub trait CommandBuffer { fn bind_uniform(&mut self, shade::Location, shade::UniformValue); /// Bind a texture fn bind_texture(&mut self, ::TextureSlot, tex::TextureKind, back::Texture, - Option<::SamplerHandle>); + Option<::SamplerHandle>); /// Select, which color buffers are going to be targetted by the shader fn set_draw_color_buffers(&mut self, usize); /// Set primitive topology diff --git a/src/device/gl_device/draw.rs b/src/device/gl_device/draw.rs index c489d456d71..e433d16200c 100644 --- a/src/device/gl_device/draw.rs +++ b/src/device/gl_device/draw.rs @@ -18,11 +18,11 @@ use Command; use std::slice; pub struct GlCommandBuffer { - buf: Vec<::Command>, + buf: Vec<::Command>, } impl GlCommandBuffer { - pub fn iter<'a>(&'a self) -> slice::Iter<'a, ::Command> { + pub fn iter<'a>(&'a self) -> slice::Iter<'a, ::Command> { self.buf.iter() } } @@ -83,7 +83,7 @@ impl ::draw::CommandBuffer for GlCommandBuffer { self.buf.push(Command::BindUniform(loc, value)); } fn bind_texture(&mut self, slot: ::TextureSlot, kind: ::tex::TextureKind, - tex: super::Texture, sampler: Option<::SamplerHandle>) { + tex: super::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 33049245347..1315161e672 100644 --- a/src/device/gl_device/lib.rs +++ b/src/device/gl_device/lib.rs @@ -22,6 +22,7 @@ extern crate libc; extern crate "gfx_gl" as gl; use log::LogLevel; +use std::fmt; use attrib::{SignFlag, IntSubType, IntSize, FloatSubType, FloatSize, Type}; use state::{CullMode, RasterMethod, WindingOrder}; @@ -82,29 +83,6 @@ impl GlError { } } -static RESET_CB: &'static [Command] = &[ - Command::BindProgram(0), - Command::BindArrayBuffer(0), - //BindAttribute - Command::BindIndex(0), - Command::BindFrameBuffer(Access::Draw, 0), - Command::BindFrameBuffer(Access::Read, 0), - //UnbindTarget - //BindUniformBlock - //BindUniform - //BindTexture - Command::SetPrimitiveState(::state::Primitive { - front_face: WindingOrder::CounterClockwise, - method: RasterMethod::Fill(CullMode::Back), - offset: None, - }), - Command::SetViewport(::target::Rect{x: 0, y: 0, w: 0, h: 0}), - Command::SetScissor(None), - Command::SetDepthStencilState(None, None, CullMode::Nothing), - Command::SetBlendState(None), - Command::SetColorMask(::state::MASK_ALL), -]; - fn primitive_to_gl(prim_type: ::PrimitiveType) -> gl::types::GLenum { match prim_type { PrimitiveType::Point => gl::POINTS, @@ -139,6 +117,12 @@ pub struct GlDevice { gl: gl::Gl, } +impl fmt::Debug for GlDevice { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "GlDevice {{ info: {:?}, caps: {:?}, gl: Gl {{ ... }} }}", self.info, self.caps) + } +} + impl GlDevice { /// Load OpenGL symbols and detect driver information pub fn new(fn_proc: F) -> GlDevice where F: FnMut(&str) -> *const ::libc::c_void { @@ -170,7 +154,7 @@ impl GlDevice { } /// Fails during a debug build if the implementation's error flag was set. - fn check(&mut self, cmd: &::Command) { + fn check(&mut self, cmd: &::Command) { if cfg!(not(ndebug)) { let err = GlError::from_error_code(unsafe { self.gl.GetError() }); if err != GlError::NoError { @@ -221,7 +205,7 @@ impl GlDevice { } } - fn process(&mut self, cmd: &::Command, data_buf: &::draw::DataBuffer) { + fn process(&mut self, cmd: &::Command, data_buf: &::draw::DataBuffer) { match *cmd { Command::Clear(ref data, mask) => { let mut flags = 0; @@ -569,15 +553,41 @@ impl GlDevice { impl Device for GlDevice { type CommandBuffer = GlCommandBuffer; + type Buffer = Buffer; + type ArrayBuffer = ArrayBuffer; + type Shader = Shader; + type Program = Program; + type FrameBuffer = FrameBuffer; + type Surface = Surface; + type Texture = Texture; + type Sampler = Sampler; + fn get_capabilities<'a>(&'a self) -> &'a ::Capabilities { &self.caps } fn reset_state(&mut self) { let data = ::draw::DataBuffer::new(); - for com in RESET_CB.iter() { - self.process(com, &data); - } + self.process(&Command::BindProgram(0), &data); + self.process(&Command::BindArrayBuffer(0), &data); + // self.process(&command::BindAttribute, &data); + self.process(&Command::BindIndex(0), &data); + self.process(&Command::BindFrameBuffer(Access::Draw, 0), &data); + self.process(&Command::BindFrameBuffer(Access::Read, 0), &data); + // self.process(&command::UnbindTarget, &data); + // self.process(&command::BindUniformBlock, &data); + // self.process(&command::BindUniform, &data); + // self.process(&command::BindTexture, &data); + self.process(&Command::SetPrimitiveState(::state::Primitive { + front_face: WindingOrder::CounterClockwise, + method: RasterMethod::Fill(CullMode::Back), + offset: None, + }), &data); + self.process(&Command::SetViewport(::target::Rect{x: 0, y: 0, w: 0, h: 0}), &data); + self.process(&Command::SetScissor(None), &data); + self.process(&Command::SetDepthStencilState(None, None, CullMode::Nothing), &data); + self.process(&Command::SetBlendState(None), &data); + self.process(&Command::SetColorMask(::state::MASK_ALL), &data); } fn submit(&mut self, (cb, db): (&GlCommandBuffer, &::draw::DataBuffer)) { @@ -587,7 +597,7 @@ impl Device for GlDevice { } } - fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> ::BufferHandle<()> { + fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> ::BufferHandle { let name = self.create_buffer_internal(); let info = ::BufferInfo { usage: usage, @@ -597,7 +607,7 @@ impl Device for GlDevice { ::BufferHandle::from_raw(::Handle(name, info)) } - fn create_buffer_static_raw(&mut self, data: &[u8]) -> ::BufferHandle<()> { + fn create_buffer_static_raw(&mut self, data: &[u8]) -> ::BufferHandle { let name = self.create_buffer_internal(); let info = ::BufferInfo { @@ -609,7 +619,7 @@ impl Device for GlDevice { ::BufferHandle::from_raw(::Handle(name, info)) } - fn create_array_buffer(&mut self) -> Result<::ArrayBufferHandle, ()> { + fn create_array_buffer(&mut self) -> Result<::ArrayBufferHandle, ()> { if self.caps.array_buffer_supported { let mut name = 0 as ArrayBuffer; unsafe { @@ -624,7 +634,7 @@ impl Device for GlDevice { } fn create_shader(&mut self, stage: ::shade::Stage, code: &[u8]) - -> Result<::ShaderHandle, ::shade::CreateShaderError> { + -> Result<::ShaderHandle, ::shade::CreateShaderError> { let (name, info) = shade::create_shader(&self.gl, stage, code); info.map(|info| { let level = if name.is_err() { LogLevel::Error } else { LogLevel::Warn }; @@ -633,7 +643,7 @@ impl Device for GlDevice { name.map(|sh| ::Handle(sh, stage)) } - fn create_program(&mut self, shaders: &[::ShaderHandle], targets: Option<&[&str]>) -> Result<::ProgramHandle, ()> { + fn create_program(&mut self, shaders: &[::ShaderHandle], targets: Option<&[&str]>) -> Result<::ProgramHandle, ()> { let (prog, log) = shade::create_program(&self.gl, &self.caps, shaders, targets); log.map(|log| { let level = if prog.is_err() { LogLevel::Error } else { LogLevel::Warn }; @@ -642,7 +652,7 @@ impl Device for GlDevice { prog } - fn create_frame_buffer(&mut self) -> ::FrameBufferHandle { + fn create_frame_buffer(&mut self) -> ::FrameBufferHandle { if !self.caps.render_targets_supported { panic!("No framebuffer objects, can't make a new one!"); } @@ -656,12 +666,12 @@ impl Device for GlDevice { } fn create_surface(&mut self, info: ::tex::SurfaceInfo) -> - Result<::SurfaceHandle, ::tex::SurfaceError> { + Result<::SurfaceHandle, ::tex::SurfaceError> { tex::make_surface(&self.gl, &info).map(|suf| ::Handle(suf, info)) } fn create_texture(&mut self, info: ::tex::TextureInfo) -> - Result<::TextureHandle, ::tex::TextureError> { + Result<::TextureHandle, ::tex::TextureError> { if info.width == 0 || info.height == 0 || info.levels == 0 { return Err(::tex::TextureError::InvalidTextureInfo(info)) } @@ -674,7 +684,7 @@ impl Device for GlDevice { name.map(|tex| ::Handle(tex, info)) } - fn create_sampler(&mut self, info: ::tex::SamplerInfo) -> ::SamplerHandle { + fn create_sampler(&mut self, info: ::tex::SamplerInfo) -> ::SamplerHandle { let sam = if self.caps.sampler_objects_supported { tex::make_sampler(&self.gl, &info) } else { @@ -683,61 +693,61 @@ impl Device for GlDevice { ::Handle(sam, info) } - fn delete_buffer_raw(&mut self, handle: ::BufferHandle<()>) { + fn delete_buffer_raw(&mut self, handle: ::BufferHandle) { let name = handle.get_name(); unsafe { self.gl.DeleteBuffers(1, &name); } } - fn delete_shader(&mut self, handle: ::ShaderHandle) { + fn delete_shader(&mut self, handle: ::ShaderHandle) { unsafe { self.gl.DeleteShader(handle.get_name()) }; } - fn delete_program(&mut self, handle: ::ProgramHandle) { + fn delete_program(&mut self, handle: ::ProgramHandle) { unsafe { self.gl.DeleteProgram(handle.get_name()) }; } - fn delete_surface(&mut self, handle: ::SurfaceHandle) { + fn delete_surface(&mut self, handle: ::SurfaceHandle) { let name = handle.get_name(); unsafe { self.gl.DeleteRenderbuffers(1, &name); } } - fn delete_texture(&mut self, handle: ::TextureHandle) { + fn delete_texture(&mut self, handle: ::TextureHandle) { let name = handle.get_name(); unsafe { self.gl.DeleteTextures(1, &name); } } - fn delete_sampler(&mut self, handle: ::SamplerHandle) { + fn delete_sampler(&mut self, handle: ::SamplerHandle) { let name = handle.get_name(); unsafe { self.gl.DeleteSamplers(1, &name); } } - fn update_buffer_raw(&mut self, buffer: ::BufferHandle<()>, data: &[u8], + fn update_buffer_raw(&mut self, buffer: ::BufferHandle, data: &[u8], offset_bytes: usize) { debug_assert!(offset_bytes + data.len() <= buffer.get_info().size); self.update_sub_buffer(buffer.get_name(), data.as_ptr(), data.len(), offset_bytes) } - fn update_texture_raw(&mut self, texture: &::TextureHandle, + fn update_texture_raw(&mut self, texture: &::TextureHandle, img: &::tex::ImageInfo, data: &[u8]) -> Result<(), ::tex::TextureError> { tex::update_texture(&self.gl, texture.get_info().kind, texture.get_name(), img, data.as_ptr(), data.len()) } - fn generate_mipmap(&mut self, texture: &::TextureHandle) { + fn generate_mipmap(&mut self, texture: &::TextureHandle) { tex::generate_mipmap(&self.gl, texture.get_info().kind, texture.get_name()); } - fn map_buffer_raw(&mut self, buf: BufferHandle<()>, access: MapAccess) -> RawMapping { + fn map_buffer_raw(&mut self, buf: BufferHandle, access: MapAccess) -> RawMapping { let ptr; unsafe { self.gl.BindBuffer(gl::ARRAY_BUFFER, buf.get_name()) }; ptr = unsafe { self.gl.MapBuffer(gl::ARRAY_BUFFER, match access { @@ -755,7 +765,7 @@ impl Device for GlDevice { unsafe { self.gl.UnmapBuffer(map.target) }; } - fn map_buffer_readable(&mut self, buf: BufferHandle) -> ReadableMapping { + fn map_buffer_readable(&mut self, buf: BufferHandle) -> ReadableMapping { let map = self.map_buffer_raw(buf.cast(), MapAccess::Readable); ReadableMapping { raw: map, @@ -764,7 +774,7 @@ impl Device for GlDevice { } } - fn map_buffer_writable(&mut self, buf: BufferHandle) -> WritableMapping { + fn map_buffer_writable(&mut self, buf: BufferHandle) -> WritableMapping { let map = self.map_buffer_raw(buf.cast(), MapAccess::Writable); WritableMapping { raw: map, @@ -773,7 +783,7 @@ impl Device for GlDevice { } } - fn map_buffer_rw(&mut self, buf: BufferHandle) -> RWMapping { + fn map_buffer_rw(&mut self, buf: BufferHandle) -> RWMapping { let map = self.map_buffer_raw(buf.cast(), MapAccess::RW); RWMapping { raw: map, diff --git a/src/device/gl_device/shade.rs b/src/device/gl_device/shade.rs index 7400326658f..7bc6165e5f3 100644 --- a/src/device/gl_device/shade.rs +++ b/src/device/gl_device/shade.rs @@ -279,8 +279,8 @@ fn query_parameters(gl: &gl::Gl, caps: &::Capabilities, prog: super::Program) -> (uniforms, textures) } -pub fn create_program(gl: &gl::Gl, caps: &::Capabilities, shaders: &[::ShaderHandle], targets: Option<&[&str]>) - -> (Result<::ProgramHandle, ()>, Option) { +pub fn create_program(gl: &gl::Gl, caps: &::Capabilities, shaders: &[::ShaderHandle], targets: Option<&[&str]>) + -> (Result<::ProgramHandle, ()>, Option) { let name = unsafe { gl.CreateProgram() }; for sh in shaders.iter() { unsafe { gl.AttachShader(name, sh.get_name()) }; diff --git a/src/device/lib.rs b/src/device/lib.rs index 99eb719245e..2c79eeefd97 100644 --- a/src/device/lib.rs +++ b/src/device/lib.rs @@ -26,6 +26,7 @@ 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::slice; use std::ops::{Deref, DerefMut}; @@ -149,7 +150,9 @@ impl Handle { let Handle(name, _) = *self; name } +} +impl Handle { /// Get the info reference pub fn get_info(&self) -> &I { let Handle(_, ref info) = *self; @@ -158,26 +161,40 @@ impl Handle { } /// Type-safe buffer handle -#[derive(Copy, Debug, PartialEq, Clone)] -pub struct BufferHandle { - raw: RawBufferHandle, +#[derive(Debug)] +pub struct BufferHandle { + raw: RawBufferHandle, +} + +impl Copy for BufferHandle {} + +impl Clone for BufferHandle { + fn clone(&self) -> BufferHandle { + BufferHandle { raw: self.raw } + } } -impl BufferHandle { +impl PartialEq for BufferHandle { + fn eq(&self, other: &BufferHandle) -> bool { + self.raw == other.raw + } +} + +impl BufferHandle { /// Create a type-safe BufferHandle from a RawBufferHandle - pub fn from_raw(handle: RawBufferHandle) -> BufferHandle { + pub fn from_raw(handle: RawBufferHandle) -> BufferHandle { BufferHandle { raw: handle, } } /// Cast the type this BufferHandle references - pub fn cast(self) -> BufferHandle { + pub fn cast(self) -> BufferHandle { BufferHandle::from_raw(self.raw) } /// Get the underlying GL name for this BufferHandle - pub fn get_name(&self) -> back::Buffer { + pub fn get_name(&self) -> ::Buffer { self.raw.get_name() } @@ -187,7 +204,7 @@ impl BufferHandle { } /// Get the underlying raw Handle - pub fn raw(&self) -> RawBufferHandle { + pub fn raw(&self) -> RawBufferHandle { self.raw } @@ -201,25 +218,25 @@ impl BufferHandle { } /// Raw (untyped) Buffer Handle -pub type RawBufferHandle = Handle; +pub type RawBufferHandle = Handle<::Buffer, BufferInfo>; /// Array Buffer Handle -pub type ArrayBufferHandle = Handle; +pub type ArrayBufferHandle = Handle<::ArrayBuffer, ()>; /// Shader Handle -pub type ShaderHandle = Handle; +pub type ShaderHandle = Handle<::Shader, shade::Stage>; /// Program Handle -pub type ProgramHandle = Handle; +pub type ProgramHandle = Handle<::Program, shade::ProgramInfo>; /// Frame Buffer Handle -pub type FrameBufferHandle = Handle; +pub type FrameBufferHandle = Handle<::FrameBuffer, ()>; /// Surface Handle -pub type SurfaceHandle = Handle; +pub type SurfaceHandle = Handle<::Surface, tex::SurfaceInfo>; /// Texture Handle -pub type TextureHandle = Handle; +pub type TextureHandle = Handle<::Texture, tex::TextureInfo>; /// Sampler Handle -pub type SamplerHandle = 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 { +pub fn make_fake_buffer() -> BufferHandle { let info = BufferInfo { usage: BufferUsage::Static, size: 0, @@ -228,7 +245,7 @@ pub fn make_fake_buffer() -> BufferHandle { } /// Return the framebuffer handle for the screen. -pub fn get_main_frame_buffer() -> FrameBufferHandle { +pub fn get_main_frame_buffer() -> FrameBufferHandle { Handle(0, ()) } @@ -320,23 +337,23 @@ pub struct BufferInfo { /// this particular representation may be used by different backends, /// such as OpenGL (prior to GLNG) and DirectX (prior to DX12) #[allow(missing_docs)] -#[derive(Copy, Debug)] -pub enum Command { - BindProgram(back::Program), - BindArrayBuffer(back::ArrayBuffer), - BindAttribute(AttributeSlot, back::Buffer, attrib::Format), - BindIndex(back::Buffer), - BindFrameBuffer(target::Access, back::FrameBuffer), +#[derive(Debug)] +pub enum Command { + BindProgram(::Program), + BindArrayBuffer(::ArrayBuffer), + BindAttribute(AttributeSlot, ::Buffer, attrib::Format), + BindIndex(::Buffer), + BindFrameBuffer(target::Access, ::FrameBuffer), /// Unbind any surface from the specified target slot UnbindTarget(target::Access, target::Target), /// Bind a surface to the specified target slot - BindTargetSurface(target::Access, target::Target, back::Surface), + BindTargetSurface(target::Access, target::Target, ::Surface), /// Bind a level of the texture to the specified target slot - BindTargetTexture(target::Access, target::Target, back::Texture, + BindTargetTexture(target::Access, target::Target, ::Texture, target::Level, Option), - BindUniformBlock(back::Program, UniformBufferSlot, UniformBlockIndex, back::Buffer), + BindUniformBlock(::Program, UniformBufferSlot, UniformBlockIndex, ::Buffer), BindUniform(shade::Location, shade::UniformValue), - BindTexture(TextureSlot, tex::TextureKind, back::Texture, Option), + BindTexture(TextureSlot, tex::TextureKind, ::Texture, Option>), SetDrawColorBuffers(usize), SetPrimitiveState(state::Primitive), SetViewport(target::Rect), @@ -345,8 +362,8 @@ pub enum Command { SetDepthStencilState(Option, Option, state::CullMode), SetBlendState(Option), SetColorMask(state::ColorMask), - UpdateBuffer(back::Buffer, draw::DataPointer, usize), - UpdateTexture(tex::TextureKind, back::Texture, tex::ImageInfo, draw::DataPointer), + UpdateBuffer(::Buffer, draw::DataPointer, usize), + UpdateTexture(tex::TextureKind, ::Texture, tex::ImageInfo, draw::DataPointer), // drawing Clear(target::ClearData, target::Mask), Draw(PrimitiveType, VertexCount, VertexCount, Option<(InstanceCount, VertexCount)>), @@ -360,6 +377,15 @@ pub trait Device { type CommandBuffer: draw::CommandBuffer; + type Buffer: fmt::Debug + Copy + PartialEq; + type ArrayBuffer: fmt::Debug + Copy + PartialEq; + type Shader: fmt::Debug + Copy + PartialEq; + type Program: fmt::Debug + Copy + PartialEq; + type FrameBuffer: fmt::Debug + Copy + PartialEq; + type Surface: fmt::Debug + Copy + PartialEq; + type Texture: fmt::Debug + Copy + PartialEq; + type Sampler: fmt::Debug + Copy + PartialEq; + /// Returns the capabilities available to the specific API implementation fn get_capabilities<'a>(&'a self) -> &'a Capabilities; /// Reset all the states to disabled/default @@ -368,56 +394,56 @@ pub trait Device { fn submit(&mut self, buffer: (&Self::CommandBuffer, &draw::DataBuffer)); // resource creation - fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> BufferHandle<()>; - fn create_buffer(&mut self, num: usize, usage: BufferUsage) -> BufferHandle { + fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> BufferHandle; + fn create_buffer(&mut self, num: usize, usage: BufferUsage) -> BufferHandle { self.create_buffer_raw(num * mem::size_of::(), usage).cast() } - fn create_buffer_static_raw(&mut self, data: &[u8]) -> BufferHandle<()>; - fn create_buffer_static(&mut self, data: &[T]) -> BufferHandle { + fn create_buffer_static_raw(&mut self, data: &[u8]) -> BufferHandle; + fn create_buffer_static(&mut self, data: &[T]) -> BufferHandle { self.create_buffer_static_raw(as_byte_slice(data)).cast() } - fn create_array_buffer(&mut self) -> Result; + fn create_array_buffer(&mut self) -> Result, ()>; fn create_shader(&mut self, stage: shade::Stage, code: &[u8]) -> - Result; - fn create_program(&mut self, shaders: &[ShaderHandle], targets: Option<&[&str]>) -> Result; - fn create_frame_buffer(&mut self) -> FrameBufferHandle; - fn create_surface(&mut self, info: tex::SurfaceInfo) -> Result; - fn create_texture(&mut self, info: tex::TextureInfo) -> Result; - fn create_sampler(&mut self, info: tex::SamplerInfo) -> SamplerHandle; + Result, shade::CreateShaderError>; + fn create_program(&mut self, shaders: &[ShaderHandle], targets: Option<&[&str]>) -> Result, ()>; + fn create_frame_buffer(&mut self) -> FrameBufferHandle; + fn create_surface(&mut self, info: tex::SurfaceInfo) -> Result, tex::SurfaceError>; + fn create_texture(&mut self, info: tex::TextureInfo) -> Result, tex::TextureError>; + fn create_sampler(&mut self, info: tex::SamplerInfo) -> SamplerHandle; // resource deletion - fn delete_buffer_raw(&mut self, buf: BufferHandle<()>); - fn delete_buffer(&mut self, buf: BufferHandle) { + fn delete_buffer_raw(&mut self, buf: BufferHandle); + fn delete_buffer(&mut self, buf: BufferHandle) { self.delete_buffer_raw(buf.cast()); } - fn delete_shader(&mut self, ShaderHandle); - fn delete_program(&mut self, ProgramHandle); - fn delete_surface(&mut self, SurfaceHandle); - fn delete_texture(&mut self, TextureHandle); - fn delete_sampler(&mut self, SamplerHandle); + fn delete_shader(&mut self, ShaderHandle); + fn delete_program(&mut self, ProgramHandle); + fn delete_surface(&mut self, SurfaceHandle); + fn delete_texture(&mut self, TextureHandle); + fn delete_sampler(&mut self, SamplerHandle); /// Update the information stored in a specific buffer - fn update_buffer_raw(&mut self, buf: BufferHandle<()>, data: &[u8], + fn update_buffer_raw(&mut self, buf: BufferHandle, data: &[u8], offset_bytes: usize); - fn update_buffer(&mut self, buf: BufferHandle, data: &[T], + fn update_buffer(&mut self, buf: BufferHandle, data: &[T], offset_elements: usize) { self.update_buffer_raw(buf.cast(), as_byte_slice(data), mem::size_of::() * offset_elements) } - fn map_buffer_raw(&mut self, buf: BufferHandle<()>, access: MapAccess) -> back::RawMapping; + fn map_buffer_raw(&mut self, buf: BufferHandle, access: MapAccess) -> back::RawMapping; fn unmap_buffer_raw(&mut self, map: back::RawMapping); - fn map_buffer_readable(&mut self, buf: BufferHandle) -> ReadableMapping; - fn map_buffer_writable(&mut self, buf: BufferHandle) -> WritableMapping; - fn map_buffer_rw(&mut self, buf: BufferHandle) -> RWMapping; + fn map_buffer_readable(&mut self, buf: BufferHandle) -> ReadableMapping; + fn map_buffer_writable(&mut self, buf: BufferHandle) -> WritableMapping; + fn map_buffer_rw(&mut self, buf: BufferHandle) -> RWMapping; /// Update the information stored in a texture - fn update_texture_raw(&mut self, tex: &TextureHandle, img: &tex::ImageInfo, + fn update_texture_raw(&mut self, tex: &TextureHandle, img: &tex::ImageInfo, data: &[u8]) -> Result<(), tex::TextureError>; - fn update_texture(&mut self, tex: &TextureHandle, + fn update_texture(&mut self, tex: &TextureHandle, img: &tex::ImageInfo, data: &[T]) -> Result<(), tex::TextureError> { self.update_texture_raw(tex, img, as_byte_slice(data)) } - fn generate_mipmap(&mut self, tex: &TextureHandle); + fn generate_mipmap(&mut self, tex: &TextureHandle); } #[cfg(test)]