Skip to content

Commit a7429b7

Browse files
committed
Parameterise handles over Device
For now we just use `GlDevice` when we refer to them
1 parent 82160f1 commit a7429b7

File tree

15 files changed

+199
-169
lines changed

15 files changed

+199
-169
lines changed

examples/deferred/main.rs

Lines changed: 8 additions & 5 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,
104+
light_pos_buf: gfx::RawBufferHandle<gfx::GlDevice>,
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,
124+
light_pos_buf: gfx::RawBufferHandle<gfx::GlDevice>,
125125
#[name = "u_Radius"]
126126
radius: f32,
127127
}
@@ -307,7 +307,9 @@ fn calculate_color(height: f32) -> [f32; 3] {
307307
}
308308
}
309309

310-
fn create_g_buffer(width: u16, height: u16, device: &mut gfx::GlDevice) -> (gfx::Frame, TextureHandle, TextureHandle, TextureHandle, TextureHandle) {
310+
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>) {
311313
let mut frame = gfx::Frame::new(width, height);
312314

313315
let texture_info_float = gfx::tex::TextureInfo {
@@ -343,7 +345,8 @@ fn create_g_buffer(width: u16, height: u16, device: &mut gfx::GlDevice) -> (gfx:
343345
(frame, texture_pos, texture_normal, texture_diffuse, texture_depth)
344346
}
345347

346-
fn create_res_buffer(width: u16, height: u16, device: &mut gfx::GlDevice, texture_depth: TextureHandle) -> (gfx::Frame, TextureHandle, TextureHandle) {
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>) {
347350
let mut frame = gfx::Frame::new(width, height);
348351

349352
let texture_info_float = gfx::tex::TextureInfo {
@@ -567,7 +570,7 @@ fn main() {
567570
tex: (texture_pos, Some(sampler)),
568571
};
569572

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

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

src/device/draw.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
//! Command Buffer device interface
1616
17+
use std::fmt;
18+
1719
use attrib;
1820
use back;
1921
use shade;
@@ -77,13 +79,13 @@ impl DataBuffer {
7779
/// An interface of the abstract command buffer. It collects commands in an
7880
/// efficient API-specific manner, to be ready for execution on the device.
7981
pub trait CommandBuffer {
80-
type Buffer;
81-
type ArrayBuffer;
82-
type Program;
83-
type FrameBuffer;
84-
type Surface;
85-
type Texture;
86-
type Sampler;
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;
8789

8890
/// An empty constructor
8991
fn new() -> Self;
@@ -113,7 +115,7 @@ pub trait CommandBuffer {
113115
fn bind_uniform(&mut self, shade::Location, shade::UniformValue);
114116
/// Bind a texture
115117
fn bind_texture(&mut self, ::TextureSlot, tex::TextureKind, back::Texture,
116-
Option<::SamplerHandle>);
118+
Option<::SamplerHandle<back::GlDevice>>);
117119
/// Select, which color buffers are going to be targetted by the shader
118120
fn set_draw_color_buffers(&mut self, usize);
119121
/// Set primitive topology

src/device/gl_device/draw.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
1717
use std::slice;
1818

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

@@ -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>),
36+
BindTexture(TextureSlot, tex::TextureKind, Texture, Option<::SamplerHandle<back::GlDevice>>),
3737
SetDrawColorBuffers(usize),
3838
SetPrimitiveState(state::Primitive),
3939
SetViewport(target::Rect),
@@ -125,7 +125,7 @@ impl draw::CommandBuffer for CommandBuffer {
125125
self.buf.push(Command::BindUniform(loc, value));
126126
}
127127
fn bind_texture(&mut self, slot: ::TextureSlot, kind: ::tex::TextureKind,
128-
tex: Texture, sampler: Option<::SamplerHandle>) {
128+
tex: Texture, sampler: Option<::SamplerHandle<back::GlDevice>>) {
129129
self.buf.push(Command::BindTexture(slot, kind, tex, sampler));
130130
}
131131

src/device/gl_device/lib.rs

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,6 @@ impl GlError {
8080
}
8181
}
8282

83-
static RESET_CB: &'static [Command] = &[
84-
Command::BindProgram(0),
85-
Command::BindArrayBuffer(0),
86-
//BindAttribute
87-
Command::BindIndex(0),
88-
Command::BindFrameBuffer(Access::Draw, 0),
89-
Command::BindFrameBuffer(Access::Read, 0),
90-
//UnbindTarget
91-
//BindUniformBlock
92-
//BindUniform
93-
//BindTexture
94-
Command::SetPrimitiveState(::state::Primitive {
95-
front_face: WindingOrder::CounterClockwise,
96-
method: RasterMethod::Fill(CullMode::Back),
97-
offset: None,
98-
}),
99-
Command::SetViewport(::target::Rect{x: 0, y: 0, w: 0, h: 0}),
100-
Command::SetScissor(None),
101-
Command::SetDepthStencilState(None, None, CullMode::Nothing),
102-
Command::SetBlendState(None),
103-
Command::SetColorMask(::state::MASK_ALL),
104-
];
105-
10683
fn primitive_to_gl(prim_type: ::PrimitiveType) -> gl::types::GLenum {
10784
match prim_type {
10885
PrimitiveType::Point => gl::POINTS,
@@ -582,9 +559,26 @@ impl Device for GlDevice {
582559

583560
fn reset_state(&mut self) {
584561
let data = ::draw::DataBuffer::new();
585-
for com in RESET_CB.iter() {
586-
self.process(com, &data);
587-
}
562+
self.process(&Command::BindProgram(0), &data);
563+
self.process(&Command::BindArrayBuffer(0), &data);
564+
// self.process(&command::BindAttribute, &data);
565+
self.process(&Command::BindIndex(0), &data);
566+
self.process(&Command::BindFrameBuffer(Access::Draw, 0), &data);
567+
self.process(&Command::BindFrameBuffer(Access::Read, 0), &data);
568+
// self.process(&command::UnbindTarget, &data);
569+
// self.process(&command::BindUniformBlock, &data);
570+
// self.process(&command::BindUniform, &data);
571+
// self.process(&command::BindTexture, &data);
572+
self.process(&Command::SetPrimitiveState(::state::Primitive {
573+
front_face: WindingOrder::CounterClockwise,
574+
method: RasterMethod::Fill(CullMode::Back),
575+
offset: None,
576+
}), &data);
577+
self.process(&Command::SetViewport(::target::Rect{x: 0, y: 0, w: 0, h: 0}), &data);
578+
self.process(&Command::SetScissor(None), &data);
579+
self.process(&Command::SetDepthStencilState(None, None, CullMode::Nothing), &data);
580+
self.process(&Command::SetBlendState(None), &data);
581+
self.process(&Command::SetColorMask(::state::MASK_ALL), &data);
588582
}
589583

590584
fn submit(&mut self, (cb, db): (&CommandBuffer, &::draw::DataBuffer)) {
@@ -594,7 +588,7 @@ impl Device for GlDevice {
594588
}
595589
}
596590

597-
fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> ::BufferHandle<()> {
591+
fn create_buffer_raw(&mut self, size: usize, usage: BufferUsage) -> ::BufferHandle<GlDevice, ()> {
598592
let name = self.create_buffer_internal();
599593
let info = ::BufferInfo {
600594
usage: usage,
@@ -604,7 +598,7 @@ impl Device for GlDevice {
604598
::BufferHandle::from_raw(::Handle(name, info))
605599
}
606600

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

610604
let info = ::BufferInfo {
@@ -616,7 +610,7 @@ impl Device for GlDevice {
616610
::BufferHandle::from_raw(::Handle(name, info))
617611
}
618612

619-
fn create_array_buffer(&mut self) -> Result<::ArrayBufferHandle, ()> {
613+
fn create_array_buffer(&mut self) -> Result<::ArrayBufferHandle<GlDevice>, ()> {
620614
if self.caps.array_buffer_supported {
621615
let mut name = 0 as ArrayBuffer;
622616
unsafe {
@@ -631,7 +625,7 @@ impl Device for GlDevice {
631625
}
632626

633627
fn create_shader(&mut self, stage: ::shade::Stage, code: &[u8])
634-
-> Result<::ShaderHandle, ::shade::CreateShaderError> {
628+
-> Result<::ShaderHandle<GlDevice>, ::shade::CreateShaderError> {
635629
let (name, info) = shade::create_shader(&self.gl, stage, code);
636630
info.map(|info| {
637631
let level = if name.is_err() { LogLevel::Error } else { LogLevel::Warn };
@@ -640,7 +634,7 @@ impl Device for GlDevice {
640634
name.map(|sh| ::Handle(sh, stage))
641635
}
642636

643-
fn create_program(&mut self, shaders: &[::ShaderHandle], targets: Option<&[&str]>) -> Result<::ProgramHandle, ()> {
637+
fn create_program(&mut self, shaders: &[::ShaderHandle<GlDevice>], targets: Option<&[&str]>) -> Result<::ProgramHandle<GlDevice>, ()> {
644638
let (prog, log) = shade::create_program(&self.gl, &self.caps, shaders, targets);
645639
log.map(|log| {
646640
let level = if prog.is_err() { LogLevel::Error } else { LogLevel::Warn };
@@ -649,7 +643,7 @@ impl Device for GlDevice {
649643
prog
650644
}
651645

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

665659
fn create_surface(&mut self, info: ::tex::SurfaceInfo) ->
666-
Result<::SurfaceHandle, ::tex::SurfaceError> {
660+
Result<::SurfaceHandle<GlDevice>, ::tex::SurfaceError> {
667661
tex::make_surface(&self.gl, &info).map(|suf| ::Handle(suf, info))
668662
}
669663

670664
fn create_texture(&mut self, info: ::tex::TextureInfo) ->
671-
Result<::TextureHandle, ::tex::TextureError> {
665+
Result<::TextureHandle<GlDevice>, ::tex::TextureError> {
672666
if info.width == 0 || info.height == 0 || info.levels == 0 {
673667
return Err(::tex::TextureError::InvalidTextureInfo(info))
674668
}
@@ -681,7 +675,7 @@ impl Device for GlDevice {
681675
name.map(|tex| ::Handle(tex, info))
682676
}
683677

684-
fn create_sampler(&mut self, info: ::tex::SamplerInfo) -> ::SamplerHandle {
678+
fn create_sampler(&mut self, info: ::tex::SamplerInfo) -> ::SamplerHandle<GlDevice> {
685679
let sam = if self.caps.sampler_objects_supported {
686680
tex::make_sampler(&self.gl, &info)
687681
} else {
@@ -690,61 +684,61 @@ impl Device for GlDevice {
690684
::Handle(sam, info)
691685
}
692686

693-
fn delete_buffer_raw(&mut self, handle: ::BufferHandle<()>) {
687+
fn delete_buffer_raw(&mut self, handle: ::BufferHandle<GlDevice, ()>) {
694688
let name = handle.get_name();
695689
unsafe {
696690
self.gl.DeleteBuffers(1, &name);
697691
}
698692
}
699693

700-
fn delete_shader(&mut self, handle: ::ShaderHandle) {
694+
fn delete_shader(&mut self, handle: ::ShaderHandle<GlDevice>) {
701695
unsafe { self.gl.DeleteShader(handle.get_name()) };
702696
}
703697

704-
fn delete_program(&mut self, handle: ::ProgramHandle) {
698+
fn delete_program(&mut self, handle: ::ProgramHandle<GlDevice>) {
705699
unsafe { self.gl.DeleteProgram(handle.get_name()) };
706700
}
707701

708-
fn delete_surface(&mut self, handle: ::SurfaceHandle) {
702+
fn delete_surface(&mut self, handle: ::SurfaceHandle<GlDevice>) {
709703
let name = handle.get_name();
710704
unsafe {
711705
self.gl.DeleteRenderbuffers(1, &name);
712706
}
713707
}
714708

715-
fn delete_texture(&mut self, handle: ::TextureHandle) {
709+
fn delete_texture(&mut self, handle: ::TextureHandle<GlDevice>) {
716710
let name = handle.get_name();
717711
unsafe {
718712
self.gl.DeleteTextures(1, &name);
719713
}
720714
}
721715

722-
fn delete_sampler(&mut self, handle: ::SamplerHandle) {
716+
fn delete_sampler(&mut self, handle: ::SamplerHandle<GlDevice>) {
723717
let name = handle.get_name();
724718
unsafe {
725719
self.gl.DeleteSamplers(1, &name);
726720
}
727721
}
728722

729-
fn update_buffer_raw(&mut self, buffer: ::BufferHandle<()>, data: &[u8],
723+
fn update_buffer_raw(&mut self, buffer: ::BufferHandle<GlDevice, ()>, data: &[u8],
730724
offset_bytes: usize) {
731725
debug_assert!(offset_bytes + data.len() <= buffer.get_info().size);
732726
self.update_sub_buffer(buffer.get_name(), data.as_ptr(), data.len(),
733727
offset_bytes)
734728
}
735729

736-
fn update_texture_raw(&mut self, texture: &::TextureHandle,
730+
fn update_texture_raw(&mut self, texture: &::TextureHandle<GlDevice>,
737731
img: &::tex::ImageInfo, data: &[u8])
738732
-> Result<(), ::tex::TextureError> {
739733
tex::update_texture(&self.gl, texture.get_info().kind,
740734
texture.get_name(), img, data.as_ptr(), data.len())
741735
}
742736

743-
fn generate_mipmap(&mut self, texture: &::TextureHandle) {
737+
fn generate_mipmap(&mut self, texture: &::TextureHandle<GlDevice>) {
744738
tex::generate_mipmap(&self.gl, texture.get_info().kind, texture.get_name());
745739
}
746740

747-
fn map_buffer_raw(&mut self, buf: BufferHandle<()>, access: MapAccess) -> RawMapping {
741+
fn map_buffer_raw(&mut self, buf: BufferHandle<GlDevice, ()>, access: MapAccess) -> RawMapping {
748742
let ptr;
749743
unsafe { self.gl.BindBuffer(gl::ARRAY_BUFFER, buf.get_name()) };
750744
ptr = unsafe { self.gl.MapBuffer(gl::ARRAY_BUFFER, match access {
@@ -762,7 +756,7 @@ impl Device for GlDevice {
762756
unsafe { self.gl.UnmapBuffer(map.target) };
763757
}
764758

765-
fn map_buffer_readable<T: Copy>(&mut self, buf: BufferHandle<T>) -> ReadableMapping<T, GlDevice> {
759+
fn map_buffer_readable<T: Copy>(&mut self, buf: BufferHandle<GlDevice, T>) -> ReadableMapping<T, GlDevice> {
766760
let map = self.map_buffer_raw(buf.cast(), MapAccess::Readable);
767761
ReadableMapping {
768762
raw: map,
@@ -771,7 +765,7 @@ impl Device for GlDevice {
771765
}
772766
}
773767

774-
fn map_buffer_writable<T: Copy>(&mut self, buf: BufferHandle<T>) -> WritableMapping<T, GlDevice> {
768+
fn map_buffer_writable<T: Copy>(&mut self, buf: BufferHandle<GlDevice, T>) -> WritableMapping<T, GlDevice> {
775769
let map = self.map_buffer_raw(buf.cast(), MapAccess::Writable);
776770
WritableMapping {
777771
raw: map,
@@ -780,7 +774,7 @@ impl Device for GlDevice {
780774
}
781775
}
782776

783-
fn map_buffer_rw<T: Copy>(&mut self, buf: BufferHandle<T>) -> RWMapping<T, GlDevice> {
777+
fn map_buffer_rw<T: Copy>(&mut self, buf: BufferHandle<GlDevice, T>) -> RWMapping<T, GlDevice> {
784778
let map = self.map_buffer_raw(buf.cast(), MapAccess::RW);
785779
RWMapping {
786780
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], targets: Option<&[&str]>)
283-
-> (Result<::ProgramHandle, ()>, Option<String>) {
282+
pub fn create_program(gl: &gl::Gl, caps: &::Capabilities, shaders: &[::ShaderHandle<super::GlDevice>], targets: Option<&[&str]>)
283+
-> (Result<::ProgramHandle<super::GlDevice>, ()>, 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)