Skip to content

Commit 1ee52a8

Browse files
committed
Add Resources trait for common resource types
1 parent 63d566b commit 1ee52a8

File tree

15 files changed

+161
-173
lines changed

15 files changed

+161
-173
lines changed

examples/deferred/main.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ struct LightParams {
101101
#[name = "u_Transform"]
102102
transform: [[f32; 4]; 4],
103103
#[name = "u_LightPosBlock"]
104-
light_pos_buf: gfx::RawBufferHandle<gfx::GlDevice>,
104+
light_pos_buf: gfx::RawBufferHandle<gfx::GlResources>,
105105
#[name = "u_Radius"]
106106
radius: f32,
107107
#[name = "u_CameraPos"]
@@ -121,7 +121,7 @@ struct EmitterParams {
121121
#[name = "u_Transform"]
122122
transform: [[f32; 4]; 4],
123123
#[name = "u_LightPosBlock"]
124-
light_pos_buf: gfx::RawBufferHandle<gfx::GlDevice>,
124+
light_pos_buf: gfx::RawBufferHandle<gfx::GlResources>,
125125
#[name = "u_Radius"]
126126
radius: f32,
127127
}
@@ -308,8 +308,8 @@ fn calculate_color(height: f32) -> [f32; 3] {
308308
}
309309

310310
fn create_g_buffer(width: u16, height: u16, device: &mut gfx::GlDevice)
311-
-> (gfx::Frame, TextureHandle<gfx::GlDevice>, TextureHandle<gfx::GlDevice>,
312-
TextureHandle<gfx::GlDevice>, TextureHandle<gfx::GlDevice>) {
311+
-> (gfx::Frame, TextureHandle<gfx::GlResources>, TextureHandle<gfx::GlResources>,
312+
TextureHandle<gfx::GlResources>, TextureHandle<gfx::GlResources>) {
313313
let mut frame = gfx::Frame::new(width, height);
314314

315315
let texture_info_float = gfx::tex::TextureInfo {
@@ -345,8 +345,8 @@ fn create_g_buffer(width: u16, height: u16, device: &mut gfx::GlDevice)
345345
(frame, texture_pos, texture_normal, texture_diffuse, texture_depth)
346346
}
347347

348-
fn create_res_buffer(width: u16, height: u16, device: &mut gfx::GlDevice, texture_depth: TextureHandle<gfx::GlDevice>)
349-
-> (gfx::Frame, TextureHandle<gfx::GlDevice>, TextureHandle<gfx::GlDevice>) {
348+
fn create_res_buffer(width: u16, height: u16, device: &mut gfx::GlDevice, texture_depth: TextureHandle<gfx::GlResources>)
349+
-> (gfx::Frame, TextureHandle<gfx::GlResources>, TextureHandle<gfx::GlResources>) {
350350
let mut frame = gfx::Frame::new(width, height);
351351

352352
let texture_info_float = gfx::tex::TextureInfo {
@@ -570,7 +570,7 @@ fn main() {
570570
tex: (texture_pos, Some(sampler)),
571571
};
572572

573-
let mut debug_buf: Option<TextureHandle<gfx::GlDevice>> = None;
573+
let mut debug_buf: Option<TextureHandle<gfx::GlResources>> = None;
574574

575575
let mut light_pos_vec: Vec<[f32; 4]> = (0 ..NUM_LIGHTS).map(|_| {
576576
[0.0, 0.0, 0.0, 0.0]

src/device/draw.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,12 @@
1414

1515
//! Command Buffer device interface
1616
17-
use std::fmt;
18-
1917
use attrib;
2018
use back;
2119
use shade;
2220
use target;
2321
use tex;
22+
use Resources;
2423

2524
type Offset = u32;
2625
type Size = u32;
@@ -79,13 +78,7 @@ impl DataBuffer {
7978
/// An interface of the abstract command buffer. It collects commands in an
8079
/// efficient API-specific manner, to be ready for execution on the device.
8180
pub trait CommandBuffer {
82-
type Buffer: Copy + fmt::Debug + PartialEq + Clone;
83-
type ArrayBuffer: Copy + fmt::Debug + PartialEq + Clone;
84-
type Program: Copy + fmt::Debug + PartialEq + Clone;
85-
type FrameBuffer: Copy + fmt::Debug + PartialEq + Clone;
86-
type Surface: Copy + fmt::Debug + PartialEq + Clone;
87-
type Texture: Copy + fmt::Debug + PartialEq + Clone;
88-
type Sampler: Copy + fmt::Debug + PartialEq + Clone;
81+
type Resources: Resources;
8982

9083
/// An empty constructor
9184
fn new() -> Self;
@@ -115,7 +108,7 @@ pub trait CommandBuffer {
115108
fn bind_uniform(&mut self, shade::Location, shade::UniformValue);
116109
/// Bind a texture
117110
fn bind_texture(&mut self, ::TextureSlot, tex::TextureKind, back::Texture,
118-
Option<::SamplerHandle<back::GlDevice>>);
111+
Option<::SamplerHandle<back::GlResources>>);
119112
/// Select, which color buffers are going to be targetted by the shader
120113
fn set_draw_color_buffers(&mut self, usize);
121114
/// Set primitive topology

src/device/gl_device/draw.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use std::slice;
1818

1919
use {attrib, back, draw, target, tex, shade, state};
2020
use {AttributeSlot, IndexType, InstanceCount, PrimitiveType, TextureSlot, UniformBlockIndex, UniformBufferSlot, VertexCount};
21-
use super::{ArrayBuffer, Buffer, FrameBuffer, Program, Sampler, Surface, Texture};
21+
use super::{ArrayBuffer, Buffer, FrameBuffer, Program, Surface, Texture};
2222

2323
/// Serialized device command.
2424
#[derive(Copy, Debug)]
@@ -33,7 +33,7 @@ pub enum Command {
3333
BindTargetTexture(target::Access, target::Target, Texture, target::Level, Option<target::Layer>),
3434
BindUniformBlock(Program, UniformBufferSlot, UniformBlockIndex, Buffer),
3535
BindUniform(shade::Location, shade::UniformValue),
36-
BindTexture(TextureSlot, tex::TextureKind, Texture, Option<::SamplerHandle<back::GlDevice>>),
36+
BindTexture(TextureSlot, tex::TextureKind, Texture, Option<::SamplerHandle<back::GlResources>>),
3737
SetDrawColorBuffers(usize),
3838
SetPrimitiveState(state::Primitive),
3939
SetViewport(target::Rect),
@@ -62,13 +62,7 @@ impl CommandBuffer {
6262
}
6363

6464
impl draw::CommandBuffer for CommandBuffer {
65-
type Buffer = Buffer;
66-
type ArrayBuffer = ArrayBuffer;
67-
type Program = Program;
68-
type FrameBuffer = FrameBuffer;
69-
type Surface = Surface;
70-
type Texture = Texture;
71-
type Sampler = Sampler;
65+
type Resources = super::GlResources;
7266

7367
fn new() -> CommandBuffer {
7468
CommandBuffer {
@@ -125,7 +119,7 @@ impl draw::CommandBuffer for CommandBuffer {
125119
self.buf.push(Command::BindUniform(loc, value));
126120
}
127121
fn bind_texture(&mut self, slot: ::TextureSlot, kind: ::tex::TextureKind,
128-
tex: Texture, sampler: Option<::SamplerHandle<back::GlDevice>>) {
122+
tex: Texture, sampler: Option<::SamplerHandle<back::GlResources>>) {
129123
self.buf.push(Command::BindTexture(slot, kind, tex, sampler));
130124
}
131125

src/device/gl_device/lib.rs

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use state::{CullMode, RasterMethod, WindingOrder};
2828
use target::{Access, Target};
2929

3030
use BufferUsage;
31-
use Device;
31+
use {Device, Resources};
3232
use {MapAccess, ReadableMapping, WritableMapping, RWMapping, BufferHandle, PrimitiveType};
3333
use self::draw::{Command, CommandBuffer};
3434
pub use self::info::{Info, PlatformName, Version};
@@ -55,6 +55,20 @@ pub type Surface = gl::types::GLuint;
5555
pub type Sampler = gl::types::GLuint;
5656
pub type Texture = gl::types::GLuint;
5757

58+
#[derive(Copy)]
59+
pub enum GlResources {}
60+
61+
impl Resources for GlResources {
62+
type Buffer = Buffer;
63+
type ArrayBuffer = ArrayBuffer;
64+
type Shader = Shader;
65+
type Program = Program;
66+
type FrameBuffer = FrameBuffer;
67+
type Surface = Surface;
68+
type Texture = Texture;
69+
type Sampler = Sampler;
70+
}
71+
5872
#[derive(Copy, Eq, PartialEq, Debug)]
5973
pub enum GlError {
6074
NoError,
@@ -542,17 +556,9 @@ impl GlDevice {
542556
}
543557

544558
impl Device for GlDevice {
559+
type Resources = GlResources;
545560
type CommandBuffer = CommandBuffer;
546561

547-
type Buffer = Buffer;
548-
type ArrayBuffer = ArrayBuffer;
549-
type Shader = Shader;
550-
type Program = Program;
551-
type FrameBuffer = FrameBuffer;
552-
type Surface = Surface;
553-
type Texture = Texture;
554-
type Sampler = Sampler;
555-
556562
fn get_capabilities<'a>(&'a self) -> &'a ::Capabilities {
557563
&self.caps
558564
}
@@ -588,7 +594,7 @@ impl Device for GlDevice {
588594
}
589595
}
590596

591-
fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> ::BufferHandle<GlDevice, ()> {
597+
fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> ::BufferHandle<GlResources, ()> {
592598
let name = self.create_buffer_internal();
593599
let info = ::BufferInfo {
594600
usage: usage,
@@ -598,7 +604,7 @@ impl Device for GlDevice {
598604
::BufferHandle::from_raw(::Handle(name, info))
599605
}
600606

601-
fn create_buffer_static_raw(&mut self, data: &[u8]) -> ::BufferHandle<GlDevice, ()> {
607+
fn create_buffer_static_raw(&mut self, data: &[u8]) -> ::BufferHandle<GlResources, ()> {
602608
let name = self.create_buffer_internal();
603609

604610
let info = ::BufferInfo {
@@ -610,7 +616,7 @@ impl Device for GlDevice {
610616
::BufferHandle::from_raw(::Handle(name, info))
611617
}
612618

613-
fn create_array_buffer(&mut self) -> Result<::ArrayBufferHandle<GlDevice>, ()> {
619+
fn create_array_buffer(&mut self) -> Result<::ArrayBufferHandle<GlResources>, ()> {
614620
if self.caps.array_buffer_supported {
615621
let mut name = 0 as ArrayBuffer;
616622
unsafe {
@@ -625,7 +631,7 @@ impl Device for GlDevice {
625631
}
626632

627633
fn create_shader(&mut self, stage: ::shade::Stage, code: &[u8])
628-
-> Result<::ShaderHandle<GlDevice>, ::shade::CreateShaderError> {
634+
-> Result<::ShaderHandle<GlResources>, ::shade::CreateShaderError> {
629635
let (name, info) = shade::create_shader(&self.gl, stage, code);
630636
info.map(|info| {
631637
let level = if name.is_err() { LogLevel::Error } else { LogLevel::Warn };
@@ -634,7 +640,7 @@ impl Device for GlDevice {
634640
name.map(|sh| ::Handle(sh, stage))
635641
}
636642

637-
fn create_program(&mut self, shaders: &[::ShaderHandle<GlDevice>], targets: Option<&[&str]>) -> Result<::ProgramHandle<GlDevice>, ()> {
643+
fn create_program(&mut self, shaders: &[::ShaderHandle<GlResources>], targets: Option<&[&str]>) -> Result<::ProgramHandle<GlResources>, ()> {
638644
let (prog, log) = shade::create_program(&self.gl, &self.caps, shaders, targets);
639645
log.map(|log| {
640646
let level = if prog.is_err() { LogLevel::Error } else { LogLevel::Warn };
@@ -643,7 +649,7 @@ impl Device for GlDevice {
643649
prog
644650
}
645651

646-
fn create_frame_buffer(&mut self) -> ::FrameBufferHandle<GlDevice> {
652+
fn create_frame_buffer(&mut self) -> ::FrameBufferHandle<GlResources> {
647653
if !self.caps.render_targets_supported {
648654
panic!("No framebuffer objects, can't make a new one!");
649655
}
@@ -657,12 +663,12 @@ impl Device for GlDevice {
657663
}
658664

659665
fn create_surface(&mut self, info: ::tex::SurfaceInfo) ->
660-
Result<::SurfaceHandle<GlDevice>, ::tex::SurfaceError> {
666+
Result<::SurfaceHandle<GlResources>, ::tex::SurfaceError> {
661667
tex::make_surface(&self.gl, &info).map(|suf| ::Handle(suf, info))
662668
}
663669

664670
fn create_texture(&mut self, info: ::tex::TextureInfo) ->
665-
Result<::TextureHandle<GlDevice>, ::tex::TextureError> {
671+
Result<::TextureHandle<GlResources>, ::tex::TextureError> {
666672
if info.width == 0 || info.height == 0 || info.levels == 0 {
667673
return Err(::tex::TextureError::InvalidTextureInfo(info))
668674
}
@@ -675,7 +681,7 @@ impl Device for GlDevice {
675681
name.map(|tex| ::Handle(tex, info))
676682
}
677683

678-
fn create_sampler(&mut self, info: ::tex::SamplerInfo) -> ::SamplerHandle<GlDevice> {
684+
fn create_sampler(&mut self, info: ::tex::SamplerInfo) -> ::SamplerHandle<GlResources> {
679685
let sam = if self.caps.sampler_objects_supported {
680686
tex::make_sampler(&self.gl, &info)
681687
} else {
@@ -684,61 +690,61 @@ impl Device for GlDevice {
684690
::Handle(sam, info)
685691
}
686692

687-
fn delete_buffer_raw(&mut self, handle: ::BufferHandle<GlDevice, ()>) {
693+
fn delete_buffer_raw(&mut self, handle: ::BufferHandle<GlResources, ()>) {
688694
let name = handle.get_name();
689695
unsafe {
690696
self.gl.DeleteBuffers(1, &name);
691697
}
692698
}
693699

694-
fn delete_shader(&mut self, handle: ::ShaderHandle<GlDevice>) {
700+
fn delete_shader(&mut self, handle: ::ShaderHandle<GlResources>) {
695701
unsafe { self.gl.DeleteShader(handle.get_name()) };
696702
}
697703

698-
fn delete_program(&mut self, handle: ::ProgramHandle<GlDevice>) {
704+
fn delete_program(&mut self, handle: ::ProgramHandle<GlResources>) {
699705
unsafe { self.gl.DeleteProgram(handle.get_name()) };
700706
}
701707

702-
fn delete_surface(&mut self, handle: ::SurfaceHandle<GlDevice>) {
708+
fn delete_surface(&mut self, handle: ::SurfaceHandle<GlResources>) {
703709
let name = handle.get_name();
704710
unsafe {
705711
self.gl.DeleteRenderbuffers(1, &name);
706712
}
707713
}
708714

709-
fn delete_texture(&mut self, handle: ::TextureHandle<GlDevice>) {
715+
fn delete_texture(&mut self, handle: ::TextureHandle<GlResources>) {
710716
let name = handle.get_name();
711717
unsafe {
712718
self.gl.DeleteTextures(1, &name);
713719
}
714720
}
715721

716-
fn delete_sampler(&mut self, handle: ::SamplerHandle<GlDevice>) {
722+
fn delete_sampler(&mut self, handle: ::SamplerHandle<GlResources>) {
717723
let name = handle.get_name();
718724
unsafe {
719725
self.gl.DeleteSamplers(1, &name);
720726
}
721727
}
722728

723-
fn update_buffer_raw(&mut self, buffer: ::BufferHandle<GlDevice, ()>, data: &[u8],
729+
fn update_buffer_raw(&mut self, buffer: ::BufferHandle<GlResources, ()>, data: &[u8],
724730
offset_bytes: usize) {
725731
debug_assert!(offset_bytes + data.len() <= buffer.get_info().size);
726732
self.update_sub_buffer(buffer.get_name(), data.as_ptr(), data.len(),
727733
offset_bytes)
728734
}
729735

730-
fn update_texture_raw(&mut self, texture: &::TextureHandle<GlDevice>,
736+
fn update_texture_raw(&mut self, texture: &::TextureHandle<GlResources>,
731737
img: &::tex::ImageInfo, data: &[u8])
732738
-> Result<(), ::tex::TextureError> {
733739
tex::update_texture(&self.gl, texture.get_info().kind,
734740
texture.get_name(), img, data.as_ptr(), data.len())
735741
}
736742

737-
fn generate_mipmap(&mut self, texture: &::TextureHandle<GlDevice>) {
743+
fn generate_mipmap(&mut self, texture: &::TextureHandle<GlResources>) {
738744
tex::generate_mipmap(&self.gl, texture.get_info().kind, texture.get_name());
739745
}
740746

741-
fn map_buffer_raw(&mut self, buf: BufferHandle<GlDevice, ()>, access: MapAccess) -> RawMapping {
747+
fn map_buffer_raw(&mut self, buf: BufferHandle<GlResources, ()>, access: MapAccess) -> RawMapping {
742748
let ptr;
743749
unsafe { self.gl.BindBuffer(gl::ARRAY_BUFFER, buf.get_name()) };
744750
ptr = unsafe { self.gl.MapBuffer(gl::ARRAY_BUFFER, match access {
@@ -756,7 +762,7 @@ impl Device for GlDevice {
756762
unsafe { self.gl.UnmapBuffer(map.target) };
757763
}
758764

759-
fn map_buffer_readable<T: Copy>(&mut self, buf: BufferHandle<GlDevice, T>) -> ReadableMapping<T, GlDevice> {
765+
fn map_buffer_readable<T: Copy>(&mut self, buf: BufferHandle<GlResources, T>) -> ReadableMapping<T, GlDevice> {
760766
let map = self.map_buffer_raw(buf.cast(), MapAccess::Readable);
761767
ReadableMapping {
762768
raw: map,
@@ -765,7 +771,7 @@ impl Device for GlDevice {
765771
}
766772
}
767773

768-
fn map_buffer_writable<T: Copy>(&mut self, buf: BufferHandle<GlDevice, T>) -> WritableMapping<T, GlDevice> {
774+
fn map_buffer_writable<T: Copy>(&mut self, buf: BufferHandle<GlResources, T>) -> WritableMapping<T, GlDevice> {
769775
let map = self.map_buffer_raw(buf.cast(), MapAccess::Writable);
770776
WritableMapping {
771777
raw: map,
@@ -774,7 +780,7 @@ impl Device for GlDevice {
774780
}
775781
}
776782

777-
fn map_buffer_rw<T: Copy>(&mut self, buf: BufferHandle<GlDevice, T>) -> RWMapping<T, GlDevice> {
783+
fn map_buffer_rw<T: Copy>(&mut self, buf: BufferHandle<GlResources, T>) -> RWMapping<T, GlDevice> {
778784
let map = self.map_buffer_raw(buf.cast(), MapAccess::RW);
779785
RWMapping {
780786
raw: map,

src/device/gl_device/shade.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ fn query_parameters(gl: &gl::Gl, caps: &::Capabilities, prog: super::Program) ->
279279
(uniforms, textures)
280280
}
281281

282-
pub fn create_program(gl: &gl::Gl, caps: &::Capabilities, shaders: &[::ShaderHandle<super::GlDevice>], targets: Option<&[&str]>)
283-
-> (Result<::ProgramHandle<super::GlDevice>, ()>, Option<String>) {
282+
pub fn create_program(gl: &gl::Gl, caps: &::Capabilities, shaders: &[::ShaderHandle<super::GlResources>], targets: Option<&[&str]>)
283+
-> (Result<::ProgramHandle<super::GlResources>, ()>, Option<String>) {
284284
let name = unsafe { gl.CreateProgram() };
285285
for sh in shaders.iter() {
286286
unsafe { gl.AttachShader(name, sh.get_name()) };

0 commit comments

Comments
 (0)