Skip to content

Commit fae6287

Browse files
authored
bevy_render: delegate buffer aligning to render_resource_context (#842)
1 parent ec7ad42 commit fae6287

File tree

6 files changed

+50
-62
lines changed

6 files changed

+50
-62
lines changed

crates/bevy_render/src/render_graph/nodes/render_resources_node.rs

+16-52
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,6 @@ use bevy_utils::HashMap;
1515
use renderer::{AssetRenderResourceBindings, BufferId, RenderResourceType, RenderResources};
1616
use std::{hash::Hash, marker::PhantomData, ops::DerefMut};
1717

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-
2418
#[derive(Debug)]
2519
struct QueuedBufferWrite {
2620
buffer: BufferId,
@@ -42,13 +36,9 @@ struct BufferArray<I> {
4236
}
4337

4438
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 {
4640
BufferArray {
47-
item_size: if align {
48-
get_aligned_dynamic_uniform_size(item_size)
49-
} else {
50-
item_size
51-
},
41+
item_size,
5242
len: 0,
5343
buffer_capacity: 0,
5444
min_capacity,
@@ -158,13 +148,18 @@ where
158148
T: renderer::RenderResources,
159149
{
160150
/// 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+
) {
162156
if self.buffer_arrays.len() != render_resources.render_resources_len() {
163157
let mut buffer_arrays = Vec::with_capacity(render_resources.render_resources_len());
164158
for render_resource in render_resources.iter() {
165159
if let Some(RenderResourceType::Buffer) = render_resource.resource_type() {
166160
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)));
168163
} else {
169164
buffer_arrays.push(None);
170165
}
@@ -247,8 +242,10 @@ where
247242
Some(RenderResourceType::Buffer) => {
248243
let size = render_resource.buffer_byte_len().unwrap();
249244
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);
250247
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;
252249
let (target_buffer, target_offset) = if dynamic_uniforms {
253250
let binding = buffer_array.get_binding(id).unwrap();
254251
let dynamic_index = if let RenderResourceBinding::Buffer {
@@ -270,7 +267,7 @@ where
270267
size: current_size, ..
271268
}) = render_resource_context.get_buffer_info(buffer_id)
272269
{
273-
if size == current_size {
270+
if aligned_size == current_size {
274271
matching_buffer = Some(buffer_id);
275272
} else {
276273
render_resource_context.remove_buffer(buffer_id);
@@ -291,7 +288,7 @@ where
291288
}
292289

293290
let buffer = render_resource_context.create_buffer(BufferInfo {
294-
size,
291+
size: aligned_size,
295292
buffer_usage: BufferUsage::COPY_DST | usage,
296293
..Default::default()
297294
});
@@ -432,7 +429,7 @@ fn render_resources_node_system<T: RenderResources>(
432429
uniform_buffer_arrays.begin_update();
433430
// initialize uniform buffer arrays using the first RenderResources
434431
if let Some((_, first, _, _)) = query.iter_mut().next() {
435-
uniform_buffer_arrays.initialize(first);
432+
uniform_buffer_arrays.initialize(first, render_resource_context);
436433
}
437434

438435
for entity in query.removed::<T>() {
@@ -482,23 +479,6 @@ fn render_resources_node_system<T: RenderResources>(
482479
state
483480
.uniform_buffer_arrays
484481
.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-
}
502482
}
503483
}
504484

@@ -579,7 +559,7 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
579559
// initialize uniform buffer arrays using the first RenderResources
580560
if let Some(first_handle) = modified_assets.get(0) {
581561
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);
583563
}
584564

585565
for asset_handle in modified_assets.iter() {
@@ -620,22 +600,6 @@ fn asset_render_resources_node_system<T: RenderResources + Asset>(
620600
state
621601
.uniform_buffer_arrays
622602
.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-
}
639603
}
640604

641605
for (asset_handle, draw, mut render_pipelines) in query.iter_mut() {

crates/bevy_render/src/render_graph/nodes/texture_copy_node.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@ pub struct TextureCopyNode {
1212
pub texture_event_reader: EventReader<AssetEvent<Texture>>,
1313
}
1414

15-
pub const ALIGNMENT: usize = 256;
16-
fn get_aligned(data_size: f32) -> usize {
17-
ALIGNMENT * ((data_size / ALIGNMENT as f32).ceil() as usize)
18-
}
19-
2015
impl Node for TextureCopyNode {
2116
fn update(
2217
&mut self,
@@ -34,7 +29,9 @@ impl Node for TextureCopyNode {
3429
if let Some(texture) = textures.get(handle) {
3530
let texture_descriptor: TextureDescriptor = texture.into();
3631
let width = texture.size.x() as usize;
37-
let aligned_width = get_aligned(texture.size.x());
32+
let aligned_width = render_context
33+
.resources()
34+
.get_aligned_texture_size(texture.size.x() as usize);
3835
let format_size = texture.format.pixel_size();
3936
let mut aligned_data =
4037
vec![0; format_size * aligned_width * texture.size.y() as usize];

crates/bevy_render/src/renderer/headless_render_resource_context.rs

+8
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,12 @@ impl RenderResourceContext for HeadlessRenderResourceContext {
140140
) -> bool {
141141
false
142142
}
143+
144+
fn get_aligned_uniform_size(&self, size: usize, _dynamic: bool) -> usize {
145+
size
146+
}
147+
148+
fn get_aligned_texture_size(&self, size: usize) -> usize {
149+
size
150+
}
143151
}

crates/bevy_render/src/renderer/render_resource/shared_buffers.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@ impl SharedBuffers {
3131
buffer_usage: BufferUsage,
3232
) -> Option<RenderResourceBinding> {
3333
if let Some(size) = render_resource.buffer_byte_len() {
34+
let aligned_size = self
35+
.render_resource_context
36+
.get_aligned_uniform_size(size, false);
3437
// PERF: this buffer will be slow
3538
let staging_buffer = self.render_resource_context.create_buffer(BufferInfo {
36-
size,
39+
size: aligned_size,
3740
buffer_usage: BufferUsage::COPY_SRC | BufferUsage::MAP_WRITE,
3841
mapped_at_creation: true,
3942
});
@@ -49,7 +52,7 @@ impl SharedBuffers {
4952
self.render_resource_context.unmap_buffer(staging_buffer);
5053

5154
let destination_buffer = self.render_resource_context.create_buffer(BufferInfo {
52-
size,
55+
size: aligned_size,
5356
buffer_usage: BufferUsage::COPY_DST | buffer_usage,
5457
..Default::default()
5558
});
@@ -68,7 +71,7 @@ impl SharedBuffers {
6871
buffers.push(destination_buffer);
6972
Some(RenderResourceBinding::Buffer {
7073
buffer: destination_buffer,
71-
range: 0..size as u64,
74+
range: 0..aligned_size as u64,
7275
dynamic_index: None,
7376
})
7477
} else {

crates/bevy_render/src/renderer/render_resource_context.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ pub trait RenderResourceContext: Downcast + Send + Sync + 'static {
3333
fn remove_texture(&self, texture: TextureId);
3434
fn remove_sampler(&self, sampler: SamplerId);
3535
fn get_buffer_info(&self, buffer: BufferId) -> Option<BufferInfo>;
36-
36+
fn get_aligned_uniform_size(&self, size: usize, dynamic: bool) -> usize;
37+
fn get_aligned_texture_size(&self, data_size: usize) -> usize;
3738
fn set_asset_resource_untyped(
3839
&self,
3940
handle: HandleUntyped,

crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs

+15
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ pub struct WgpuRenderResourceContext {
2626
pub resources: WgpuResources,
2727
}
2828

29+
pub const BIND_BUFFER_ALIGNMENT: usize = 256;
30+
pub const TEXTURE_ALIGNMENT: usize = 256;
31+
2932
impl WgpuRenderResourceContext {
3033
pub fn new(device: Arc<wgpu::Device>) -> Self {
3134
WgpuRenderResourceContext {
@@ -553,4 +556,16 @@ impl RenderResourceContext for WgpuRenderResourceContext {
553556
let buffer = buffers.get(&id).unwrap();
554557
buffer.unmap();
555558
}
559+
560+
fn get_aligned_texture_size(&self, size: usize) -> usize {
561+
(size + TEXTURE_ALIGNMENT - 1) & !(TEXTURE_ALIGNMENT - 1)
562+
}
563+
564+
fn get_aligned_uniform_size(&self, size: usize, dynamic: bool) -> usize {
565+
if dynamic {
566+
(size + BIND_BUFFER_ALIGNMENT - 1) & !(BIND_BUFFER_ALIGNMENT - 1)
567+
} else {
568+
size
569+
}
570+
}
556571
}

0 commit comments

Comments
 (0)