@@ -159,25 +159,25 @@ impl<T: Copy, I> Handle<T, I> {
159
159
160
160
/// Type-safe buffer handle
161
161
#[ derive( Copy , Debug , PartialEq , Clone ) ]
162
- pub struct BufferHandle < T > {
163
- raw : RawBufferHandle ,
162
+ pub struct BufferHandle < B , T > {
163
+ raw : RawBufferHandle < B > ,
164
164
}
165
165
166
- impl < T > BufferHandle < T > {
166
+ impl < B , T > BufferHandle < B , T > {
167
167
/// Create a type-safe BufferHandle from a RawBufferHandle
168
- pub fn from_raw ( handle : RawBufferHandle ) -> BufferHandle < T > {
168
+ pub fn from_raw ( handle : RawBufferHandle < B > ) -> BufferHandle < B , T > {
169
169
BufferHandle {
170
170
raw : handle,
171
171
}
172
172
}
173
173
174
174
/// Cast the type this BufferHandle references
175
- pub fn cast < U > ( self ) -> BufferHandle < U > {
175
+ pub fn cast < U > ( self ) -> BufferHandle < B , U > {
176
176
BufferHandle :: from_raw ( self . raw )
177
177
}
178
178
179
179
/// Get the underlying GL name for this BufferHandle
180
- pub fn get_name ( & self ) -> back :: Buffer {
180
+ pub fn get_name ( & self ) -> B {
181
181
self . raw . get_name ( )
182
182
}
183
183
@@ -187,7 +187,7 @@ impl<T> BufferHandle<T> {
187
187
}
188
188
189
189
/// Get the underlying raw Handle
190
- pub fn raw ( & self ) -> RawBufferHandle {
190
+ pub fn raw ( & self ) -> RawBufferHandle < B > {
191
191
self . raw
192
192
}
193
193
@@ -200,8 +200,8 @@ impl<T> BufferHandle<T> {
200
200
}
201
201
}
202
202
203
- /// Raw (untyped) Buffer Handle
204
- pub type RawBufferHandle = Handle < back :: Buffer , BufferInfo > ;
203
+ /// Raw (untyped) buffer handle
204
+ pub type RawBufferHandle < B > = Handle < B , BufferInfo > ;
205
205
/// Array Buffer Handle
206
206
pub type ArrayBufferHandle = Handle < back:: ArrayBuffer , ( ) > ;
207
207
/// Shader Handle
@@ -321,11 +321,11 @@ pub struct BufferInfo {
321
321
/// such as OpenGL (prior to GLNG) and DirectX (prior to DX12)
322
322
#[ allow( missing_docs) ]
323
323
#[ derive( Copy , Debug ) ]
324
- pub enum Command {
324
+ pub enum Command < B > {
325
325
BindProgram ( back:: Program ) ,
326
326
BindArrayBuffer ( back:: ArrayBuffer ) ,
327
- BindAttribute ( AttributeSlot , back :: Buffer , attrib:: Format ) ,
328
- BindIndex ( back :: Buffer ) ,
327
+ BindAttribute ( AttributeSlot , B , attrib:: Format ) ,
328
+ BindIndex ( B ) ,
329
329
BindFrameBuffer ( target:: Access , back:: FrameBuffer ) ,
330
330
/// Unbind any surface from the specified target slot
331
331
UnbindTarget ( target:: Access , target:: Target ) ,
@@ -334,7 +334,7 @@ pub enum Command {
334
334
/// Bind a level of the texture to the specified target slot
335
335
BindTargetTexture ( target:: Access , target:: Target , back:: Texture ,
336
336
target:: Level , Option < target:: Layer > ) ,
337
- BindUniformBlock ( back:: Program , UniformBufferSlot , UniformBlockIndex , back :: Buffer ) ,
337
+ BindUniformBlock ( back:: Program , UniformBufferSlot , UniformBlockIndex , B ) ,
338
338
BindUniform ( shade:: Location , shade:: UniformValue ) ,
339
339
BindTexture ( TextureSlot , tex:: TextureKind , back:: Texture , Option < SamplerHandle > ) ,
340
340
SetDrawColorBuffers ( usize ) ,
@@ -345,7 +345,7 @@ pub enum Command {
345
345
SetDepthStencilState ( Option < state:: Depth > , Option < state:: Stencil > , state:: CullMode ) ,
346
346
SetBlendState ( Option < state:: Blend > ) ,
347
347
SetColorMask ( state:: ColorMask ) ,
348
- UpdateBuffer ( back :: Buffer , draw:: DataPointer , usize ) ,
348
+ UpdateBuffer ( B , draw:: DataPointer , usize ) ,
349
349
UpdateTexture ( tex:: TextureKind , back:: Texture , tex:: ImageInfo , draw:: DataPointer ) ,
350
350
// drawing
351
351
Clear ( target:: ClearData , target:: Mask ) ,
@@ -357,8 +357,10 @@ pub enum Command {
357
357
/// An interface for performing draw calls using a specific graphics API
358
358
#[ allow( missing_docs) ]
359
359
pub trait Device {
360
-
361
- type CommandBuffer : draw:: CommandBuffer ;
360
+ /// Raw buffer
361
+ type Buffer ;
362
+ /// Command buffer to collect calls and data
363
+ type CommandBuffer : draw:: CommandBuffer < Self :: Buffer > ;
362
364
363
365
/// Returns the capabilities available to the specific API implementation
364
366
fn get_capabilities < ' a > ( & ' a self ) -> & ' a Capabilities ;
@@ -368,12 +370,16 @@ pub trait Device {
368
370
fn submit ( & mut self , buffer : ( & Self :: CommandBuffer , & draw:: DataBuffer ) ) ;
369
371
370
372
// resource creation
371
- fn create_buffer_raw ( & mut self , size : usize , usage : BufferUsage ) -> BufferHandle < ( ) > ;
372
- fn create_buffer < T > ( & mut self , num : usize , usage : BufferUsage ) -> BufferHandle < T > {
373
+ fn create_buffer_raw ( & mut self , size : usize , usage : BufferUsage )
374
+ -> BufferHandle < Self :: Buffer , ( ) > ;
375
+ fn create_buffer < T > ( & mut self , num : usize , usage : BufferUsage )
376
+ -> BufferHandle < Self :: Buffer , T > {
373
377
self . create_buffer_raw ( num * mem:: size_of :: < T > ( ) , usage) . cast ( )
374
378
}
375
- fn create_buffer_static_raw ( & mut self , data : & [ u8 ] ) -> BufferHandle < ( ) > ;
376
- fn create_buffer_static < T : Copy > ( & mut self , data : & [ T ] ) -> BufferHandle < T > {
379
+ fn create_buffer_static_raw ( & mut self , data : & [ u8 ] )
380
+ -> BufferHandle < Self :: Buffer , ( ) > ;
381
+ fn create_buffer_static < T : Copy > ( & mut self , data : & [ T ] )
382
+ -> BufferHandle < Self :: Buffer , T > {
377
383
self . create_buffer_static_raw ( as_byte_slice ( data) ) . cast ( )
378
384
}
379
385
fn create_array_buffer ( & mut self ) -> Result < ArrayBufferHandle , ( ) > ;
@@ -387,8 +393,8 @@ pub trait Device {
387
393
fn create_sampler ( & mut self , info : tex:: SamplerInfo ) -> SamplerHandle ;
388
394
389
395
// resource deletion
390
- fn delete_buffer_raw ( & mut self , buf : BufferHandle < ( ) > ) ;
391
- fn delete_buffer < T > ( & mut self , buf : BufferHandle < T > ) {
396
+ fn delete_buffer_raw ( & mut self , buf : BufferHandle < Self :: Buffer , ( ) > ) ;
397
+ fn delete_buffer < T > ( & mut self , buf : BufferHandle < Self :: Buffer , T > ) {
392
398
self . delete_buffer_raw ( buf. cast ( ) ) ;
393
399
}
394
400
fn delete_shader ( & mut self , ShaderHandle ) ;
@@ -398,17 +404,27 @@ pub trait Device {
398
404
fn delete_sampler ( & mut self , SamplerHandle ) ;
399
405
400
406
/// Update the information stored in a specific buffer
401
- fn update_buffer_raw ( & mut self , buf : BufferHandle < ( ) > , data : & [ u8 ] ,
407
+ fn update_buffer_raw ( & mut self , buf : BufferHandle < Self :: Buffer , ( ) > , data : & [ u8 ] ,
402
408
offset_bytes : usize ) ;
403
- fn update_buffer < T : Copy > ( & mut self , buf : BufferHandle < T > , data : & [ T ] ,
404
- offset_elements : usize ) {
405
- self . update_buffer_raw ( buf. cast ( ) , as_byte_slice ( data) , mem:: size_of :: < T > ( ) * offset_elements)
409
+ fn update_buffer < T : Copy > ( & mut self , buf : BufferHandle < Self :: Buffer , T > ,
410
+ data : & [ T ] , offset_elements : usize ) {
411
+ self . update_buffer_raw (
412
+ buf. cast ( ) ,
413
+ as_byte_slice ( data) ,
414
+ mem:: size_of :: < T > ( ) * offset_elements
415
+ )
406
416
}
407
- fn map_buffer_raw ( & mut self , buf : BufferHandle < ( ) > , access : MapAccess ) -> back:: RawMapping ;
417
+ fn map_buffer_raw ( & mut self , buf : BufferHandle < Self :: Buffer , ( ) > ,
418
+ access : MapAccess ) -> back:: RawMapping ;
408
419
fn unmap_buffer_raw ( & mut self , map : back:: RawMapping ) ;
409
- fn map_buffer_readable < T : Copy > ( & mut self , buf : BufferHandle < T > ) -> ReadableMapping < T , Self > ;
410
- fn map_buffer_writable < T : Copy > ( & mut self , buf : BufferHandle < T > ) -> WritableMapping < T , Self > ;
411
- fn map_buffer_rw < T : Copy > ( & mut self , buf : BufferHandle < T > ) -> RWMapping < T , Self > ;
420
+ fn map_buffer_readable < T : Copy > ( & mut self ,
421
+ buf : BufferHandle < Self :: Buffer , T > )
422
+ -> ReadableMapping < T , Self > ;
423
+ fn map_buffer_writable < T : Copy > ( & mut self ,
424
+ buf : BufferHandle < Self :: Buffer , T > )
425
+ -> WritableMapping < T , Self > ;
426
+ fn map_buffer_rw < T : Copy > ( & mut self , buf : BufferHandle < Self :: Buffer , T > )
427
+ -> RWMapping < T , Self > ;
412
428
413
429
/// Update the information stored in a texture
414
430
fn update_texture_raw ( & mut self , tex : & TextureHandle , img : & tex:: ImageInfo ,
@@ -427,7 +443,8 @@ mod test {
427
443
use super :: { BufferHandle , Handle } ;
428
444
use super :: { BufferInfo , BufferUsage } ;
429
445
430
- fn mock_buffer < T > ( usage : BufferUsage , len : usize ) -> BufferHandle < T > {
446
+ fn mock_buffer < T > ( usage : BufferUsage , len : usize )
447
+ -> BufferHandle < Self :: Buffer , T > {
431
448
BufferHandle {
432
449
raw : Handle (
433
450
0 ,
0 commit comments