From b70c2724b2288231b727eb37e7b3333aed9e69c7 Mon Sep 17 00:00:00 2001 From: daslastic Date: Thu, 8 Feb 2024 02:38:48 -0500 Subject: [PATCH] allow positional buffer updates --- src/graphics.rs | 1 + src/graphics/gl.rs | 9 ++++++--- src/graphics/metal.rs | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/graphics.rs b/src/graphics.rs index b888c395..a958d785 100644 --- a/src/graphics.rs +++ b/src/graphics.rs @@ -1201,6 +1201,7 @@ pub trait RenderingBackend { fn new_buffer(&mut self, type_: BufferType, usage: BufferUsage, data: BufferSource) -> BufferId; fn buffer_update(&mut self, buffer: BufferId, data: BufferSource); + fn buffer_update_at(&mut self, buffer: BufferId, data: BufferSource, at: usize); /// Size of buffer in bytes. /// For 1 element, u16 buffer this will return 2. diff --git a/src/graphics/gl.rs b/src/graphics/gl.rs index ab5a445f..5f49d035 100644 --- a/src/graphics/gl.rs +++ b/src/graphics/gl.rs @@ -1181,7 +1181,7 @@ impl RenderingBackend for GlContext { BufferId(self.buffers.len() - 1) } - fn buffer_update(&mut self, buffer: BufferId, data: BufferSource) { + fn buffer_update_at(&mut self, buffer: BufferId, data: BufferSource, at: usize) { let data = match data { BufferSource::Slice(data) => data, _ => panic!("buffer_update expects BufferSource::slice"), @@ -1201,11 +1201,14 @@ impl RenderingBackend for GlContext { let gl_target = gl_buffer_target(&buffer.buffer_type); self.cache.store_buffer_binding(gl_target); self.cache - .bind_buffer(gl_target, buffer.gl_buf, buffer.index_type); - unsafe { glBufferSubData(gl_target, 0, size as _, data.ptr as _) }; + .bind_buffer(gl_target, buffer.gl_buf, buffer.index_type); unsafe { glBufferSubData(gl_target, (at * size) as i64, size as _, data.ptr as _) }; self.cache.restore_buffer_binding(gl_target); } + fn buffer_update(&mut self, buffer: BufferId, data: BufferSource) { + self.buffer_update_at(buffer, data, 0); + } + /// Size of buffer in bytes fn buffer_size(&mut self, buffer: BufferId) -> usize { self.buffers[buffer.0].size diff --git a/src/graphics/metal.rs b/src/graphics/metal.rs index 98ad801b..c72dab1d 100644 --- a/src/graphics/metal.rs +++ b/src/graphics/metal.rs @@ -626,7 +626,7 @@ impl RenderingBackend for MetalContext { BufferId(self.buffers.len() - 1) } - fn buffer_update(&mut self, buffer: BufferId, data: BufferSource) { + fn buffer_update_at(&mut self, buffer: BufferId, data: BufferSource, at: usize) { let data = match data { BufferSource::Slice(data) => data, _ => panic!("buffer_update expects BufferSource::slice"), @@ -639,11 +639,15 @@ impl RenderingBackend for MetalContext { std::ptr::copy(data.ptr, dest, data.size); #[cfg(target_os = "macos")] - msg_send_![buffer.raw[buffer.next_value], didModifyRange:NSRange::new(0, data.size as u64)]; + msg_send_![buffer.raw[buffer.next_value], didModifyRange:NSRange::new((at * data.size) as u64, data.size as u64)]; } buffer.value = buffer.next_value; } + fn buffer_update(&mut self, buffer: BufferId, data: BufferSource) { + self.buffer_update_at(buffer, data, 0); + } + fn new_shader( &mut self, shader: ShaderSource,