@@ -15,12 +15,6 @@ use bevy_utils::HashMap;
15
15
use renderer:: { AssetRenderResourceBindings , BufferId , RenderResourceType , RenderResources } ;
16
16
use std:: { hash:: Hash , marker:: PhantomData , ops:: DerefMut } ;
17
17
18
- pub const BIND_BUFFER_ALIGNMENT : usize = 256 ;
19
-
20
- fn get_aligned_dynamic_uniform_size ( data_size : usize ) -> usize {
21
- BIND_BUFFER_ALIGNMENT * ( ( data_size as f32 / BIND_BUFFER_ALIGNMENT as f32 ) . ceil ( ) as usize )
22
- }
23
-
24
18
#[ derive( Debug ) ]
25
19
struct QueuedBufferWrite {
26
20
buffer : BufferId ,
@@ -42,13 +36,9 @@ struct BufferArray<I> {
42
36
}
43
37
44
38
impl < I : Hash + Eq > BufferArray < I > {
45
- pub fn new ( item_size : usize , min_capacity : usize , align : bool ) -> Self {
39
+ pub fn new ( item_size : usize , min_capacity : usize ) -> Self {
46
40
BufferArray {
47
- item_size : if align {
48
- get_aligned_dynamic_uniform_size ( item_size)
49
- } else {
50
- item_size
51
- } ,
41
+ item_size,
52
42
len : 0 ,
53
43
buffer_capacity : 0 ,
54
44
min_capacity,
@@ -158,13 +148,18 @@ where
158
148
T : renderer:: RenderResources ,
159
149
{
160
150
/// Initialize this UniformBufferArrays using information from a RenderResources value.
161
- fn initialize ( & mut self , render_resources : & T ) {
151
+ fn initialize (
152
+ & mut self ,
153
+ render_resources : & T ,
154
+ render_resource_context : & dyn RenderResourceContext ,
155
+ ) {
162
156
if self . buffer_arrays . len ( ) != render_resources. render_resources_len ( ) {
163
157
let mut buffer_arrays = Vec :: with_capacity ( render_resources. render_resources_len ( ) ) ;
164
158
for render_resource in render_resources. iter ( ) {
165
159
if let Some ( RenderResourceType :: Buffer ) = render_resource. resource_type ( ) {
166
160
let size = render_resource. buffer_byte_len ( ) . unwrap ( ) ;
167
- buffer_arrays. push ( Some ( BufferArray :: new ( size, 10 , true ) ) ) ;
161
+ let aligned_size = render_resource_context. get_aligned_uniform_size ( size, true ) ;
162
+ buffer_arrays. push ( Some ( BufferArray :: new ( aligned_size, 10 ) ) ) ;
168
163
} else {
169
164
buffer_arrays. push ( None ) ;
170
165
}
@@ -247,8 +242,10 @@ where
247
242
Some ( RenderResourceType :: Buffer ) => {
248
243
let size = render_resource. buffer_byte_len ( ) . unwrap ( ) ;
249
244
let render_resource_name = uniforms. get_render_resource_name ( i) . unwrap ( ) ;
245
+ let aligned_size =
246
+ render_resource_context. get_aligned_uniform_size ( size, false ) ;
250
247
let buffer_array = self . buffer_arrays [ i] . as_mut ( ) . unwrap ( ) ;
251
- let range = 0 ..size as u64 ;
248
+ let range = 0 ..aligned_size as u64 ;
252
249
let ( target_buffer, target_offset) = if dynamic_uniforms {
253
250
let binding = buffer_array. get_binding ( id) . unwrap ( ) ;
254
251
let dynamic_index = if let RenderResourceBinding :: Buffer {
@@ -270,7 +267,7 @@ where
270
267
size : current_size, ..
271
268
} ) = render_resource_context. get_buffer_info ( buffer_id)
272
269
{
273
- if size == current_size {
270
+ if aligned_size == current_size {
274
271
matching_buffer = Some ( buffer_id) ;
275
272
} else {
276
273
render_resource_context. remove_buffer ( buffer_id) ;
@@ -291,7 +288,7 @@ where
291
288
}
292
289
293
290
let buffer = render_resource_context. create_buffer ( BufferInfo {
294
- size,
291
+ size : aligned_size ,
295
292
buffer_usage : BufferUsage :: COPY_DST | usage,
296
293
..Default :: default ( )
297
294
} ) ;
@@ -432,7 +429,7 @@ fn render_resources_node_system<T: RenderResources>(
432
429
uniform_buffer_arrays. begin_update ( ) ;
433
430
// initialize uniform buffer arrays using the first RenderResources
434
431
if let Some ( ( _, first, _, _) ) = query. iter_mut ( ) . next ( ) {
435
- uniform_buffer_arrays. initialize ( first) ;
432
+ uniform_buffer_arrays. initialize ( first, render_resource_context ) ;
436
433
}
437
434
438
435
for entity in query. removed :: < T > ( ) {
@@ -482,23 +479,6 @@ fn render_resources_node_system<T: RenderResources>(
482
479
state
483
480
. uniform_buffer_arrays
484
481
. copy_staging_buffer_to_final_buffers ( & mut state. command_queue , staging_buffer) ;
485
- } else {
486
- // TODO: can we just remove this?
487
- let mut staging_buffer: [ u8 ; 0 ] = [ ] ;
488
- for ( entity, uniforms, draw, mut render_pipelines) in query. iter_mut ( ) {
489
- if !draw. is_visible {
490
- continue ;
491
- }
492
-
493
- state. uniform_buffer_arrays . write_uniform_buffers (
494
- entity,
495
- & uniforms,
496
- state. dynamic_uniforms ,
497
- render_resource_context,
498
- & mut render_pipelines. bindings ,
499
- & mut staging_buffer,
500
- ) ;
501
- }
502
482
}
503
483
}
504
484
@@ -579,7 +559,7 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
579
559
// initialize uniform buffer arrays using the first RenderResources
580
560
if let Some ( first_handle) = modified_assets. get ( 0 ) {
581
561
let asset = assets. get ( * first_handle) . expect ( EXPECT_ASSET_MESSAGE ) ;
582
- uniform_buffer_arrays. initialize ( asset) ;
562
+ uniform_buffer_arrays. initialize ( asset, render_resource_context ) ;
583
563
}
584
564
585
565
for asset_handle in modified_assets. iter ( ) {
@@ -620,22 +600,6 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
620
600
state
621
601
. uniform_buffer_arrays
622
602
. copy_staging_buffer_to_final_buffers ( & mut state. command_queue , staging_buffer) ;
623
- } else {
624
- let mut staging_buffer: [ u8 ; 0 ] = [ ] ;
625
- for asset_handle in modified_assets. iter ( ) {
626
- let asset = assets. get ( * asset_handle) . expect ( EXPECT_ASSET_MESSAGE ) ;
627
- let mut render_resource_bindings =
628
- asset_render_resource_bindings. get_or_insert_mut ( & Handle :: < T > :: weak ( * asset_handle) ) ;
629
- // TODO: only setup buffer if we haven't seen this handle before
630
- state. uniform_buffer_arrays . write_uniform_buffers (
631
- * asset_handle,
632
- & asset,
633
- state. dynamic_uniforms ,
634
- render_resource_context,
635
- & mut render_resource_bindings,
636
- & mut staging_buffer,
637
- ) ;
638
- }
639
603
}
640
604
641
605
for ( asset_handle, draw, mut render_pipelines) in query. iter_mut ( ) {
0 commit comments