Skip to content

Commit 551a5d6

Browse files
committed
Remove Deref and DerefMut impls on Buffer
We want to migrate towards exposing either less structured buffers (`[u8]`, useful for different formats) or more structured buffers (`[Pixel]`, useful for ergonomics). `[u32]` is kind of in a weird state in between these and has confusing interactions with endianess. Since the current impls are not zero-cost on all backends, making them be a potential invisible performance cliff for users, we'd prefer for users to instead explicitly access the buffer's data in the format they desire.
1 parent bd9a043 commit 551a5d6

File tree

17 files changed

+18
-150
lines changed

17 files changed

+18
-150
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- Added `Buffer::pixel_rows()` for iterating over rows of the buffer data.
55
- Added `Buffer::pixels_iter()` for iterating over each pixel with its associated `x`/`y` coordinate.
66
- **Breaking:** Removed generic type parameters `D` and `W` from `Buffer<'_>` struct.
7+
- **Breaking:** Removed `Deref[Mut]` implementation on `Buffer<'_>`. Use `Buffer::pixels()` instead.
78

89
# 0.4.7
910

benches/buffer_mut.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ fn buffer_mut(c: &mut criterion::Criterion) {
4040
});
4141
});
4242

43-
c.bench_function("data()", |b| {
43+
c.bench_function("pixels()", |b| {
4444
let mut buffer = surface.buffer_mut().unwrap();
4545
b.iter(|| {
46-
let pixels: &mut [u32] = &mut buffer;
46+
let pixels: &mut [u32] = buffer.pixels();
4747
black_box(pixels);
4848
});
4949
});
@@ -52,7 +52,7 @@ fn buffer_mut(c: &mut criterion::Criterion) {
5252
let mut buffer = surface.buffer_mut().unwrap();
5353
b.iter(|| {
5454
let buffer = black_box(&mut buffer);
55-
buffer.fill(0x00000000);
55+
buffer.pixels().fill(0x00000000);
5656
});
5757
});
5858

examples/animation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ fn main() {
7070

7171
let frame = &frames[((elapsed * 60.0).round() as usize).clamp(0, 59)];
7272

73-
buffer.copy_from_slice(frame);
73+
buffer.pixels().copy_from_slice(frame);
7474
buffer.present().unwrap();
7575
}
7676
WindowEvent::CloseRequested

examples/drm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ mod imple {
128128

129129
// Start drawing.
130130
let mut buffer = surface.buffer_mut()?;
131-
draw_to_buffer(&mut buffer, tick);
131+
draw_to_buffer(buffer.pixels(), tick);
132132
buffer.present()?;
133133

134134
// Wait for the page flip to happen.

examples/fruit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ fn main() {
5858
let blue = pixel.0[2] as u32;
5959

6060
let color = blue | (green << 8) | (red << 16);
61-
buffer[(y * width + x) as usize] = color;
61+
buffer.pixels()[(y * width + x) as usize] = color;
6262
}
6363

6464
buffer.present().unwrap();

examples/libxcb.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ mod example {
124124
)
125125
.unwrap();
126126
let mut buffer = surface.buffer_mut().unwrap();
127-
buffer.fill(RED);
127+
buffer.pixels().fill(RED);
128128
buffer.present().unwrap();
129129
}
130130
Event::ConfigureNotify(configure_notify) => {

src/backend_dispatch.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,6 @@ macro_rules! make_dispatch {
166166
}
167167
}
168168

169-
#[inline]
170-
fn pixels(&self) -> &[u32] {
171-
match self {
172-
$(
173-
$(#[$attr])*
174-
Self::$name(inner) => inner.pixels(),
175-
)*
176-
}
177-
}
178-
179169
#[inline]
180170
fn pixels_mut(&mut self) -> &mut [u32] {
181171
match self {

src/backend_interface.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ pub(crate) trait SurfaceInterface<D: HasDisplayHandle + ?Sized, W: HasWindowHand
3737
pub(crate) trait BufferInterface {
3838
fn width(&self) -> NonZeroU32;
3939
fn height(&self) -> NonZeroU32;
40-
fn pixels(&self) -> &[u32];
4140
fn pixels_mut(&mut self) -> &mut [u32];
4241
fn age(&self) -> u8;
4342
fn present_with_damage(self, damage: &[Rect]) -> Result<(), SoftBufferError>;

src/backends/android.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,6 @@ impl BufferInterface for BufferImpl<'_> {
131131
NonZeroU32::new(self.native_window_buffer.height() as u32).unwrap()
132132
}
133133

134-
#[inline]
135-
fn pixels(&self) -> &[u32] {
136-
&self.buffer
137-
}
138-
139134
#[inline]
140135
fn pixels_mut(&mut self) -> &mut [u32] {
141136
&mut self.buffer

src/backends/cg.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,6 @@ impl BufferInterface for BufferImpl<'_> {
287287
NonZeroU32::new(self.height as u32).unwrap()
288288
}
289289

290-
#[inline]
291-
fn pixels(&self) -> &[u32] {
292-
&self.buffer
293-
}
294-
295290
#[inline]
296291
fn pixels_mut(&mut self) -> &mut [u32] {
297292
&mut self.buffer

0 commit comments

Comments
 (0)