Skip to content

Commit 211b059

Browse files
committed
Remove bytemuck dependency
1 parent 227a536 commit 211b059

File tree

3 files changed

+34
-10
lines changed

3 files changed

+34
-10
lines changed

Cargo.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ wayland-dlopen = ["wayland-sys/dlopen", "winit/wayland-dlopen"]
3434
# Enable the X11 backend.
3535
x11 = [
3636
"dep:as-raw-xcb-connection",
37-
"dep:bytemuck",
3837
"dep:fastrand",
3938
"dep:rustix",
4039
"dep:tiny-xlib",
@@ -45,7 +44,7 @@ x11 = [
4544
x11-dlopen = ["tiny-xlib/dlopen", "x11rb/dl-libxcb"]
4645

4746
# Enable the KMS/DRM backend.
48-
kms = ["dep:bytemuck", "dep:drm", "dep:rustix"]
47+
kms = ["dep:drm", "dep:rustix"]
4948

5049
# Common dependencies.
5150
[dependencies]
@@ -54,13 +53,11 @@ tracing = { version = "0.1.41", default-features = false }
5453

5554
# Android dependencies.
5655
[target.'cfg(target_os = "android")'.dependencies]
57-
bytemuck = "1.12.3"
5856
ndk = "0.9.0"
5957

6058
# Wayland, X11 and KMS/DRM dependencies.
6159
[target.'cfg(not(any(target_os = "android", target_vendor = "apple", target_os = "redox", target_family = "wasm", target_os = "windows")))'.dependencies]
6260
# Common
63-
bytemuck = { version = "1.12.3", optional = true }
6461
fastrand = { version = "2.0.0", optional = true }
6562
rustix = { version = "1.0.1", default-features = false, optional = true, features = [
6663
"fs",

src/backends/kms.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ use raw_window_handle::{HasDisplayHandle, HasWindowHandle, RawDisplayHandle, Raw
1313

1414
use std::collections::HashSet;
1515
use std::fmt;
16+
use std::mem::size_of;
1617
use std::num::NonZeroU32;
1718
use std::os::unix::io::{AsFd, BorrowedFd};
19+
use std::slice;
1820
use std::sync::Arc;
1921

2022
use crate::backend_interface::*;
@@ -316,7 +318,12 @@ impl BufferInterface for BufferImpl<'_> {
316318

317319
#[inline]
318320
fn pixels_mut(&mut self) -> &mut [u32] {
319-
bytemuck::cast_slice_mut(self.mapping.as_mut())
321+
let ptr = self.mapping.as_mut_ptr().cast::<u32>();
322+
let len = self.mapping.len() / size_of::<u32>();
323+
debug_assert_eq!(self.mapping.len() % size_of::<u32>(), 0);
324+
// SAFETY: `&mut [u8]` can be reinterpreted as `&mut [u32]`, assuming that the allocation
325+
// is aligned to at least a multiple of 4 bytes.
326+
unsafe { slice::from_raw_parts_mut(ptr, len) }
320327
}
321328

322329
#[inline]

src/backends/x11.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ use std::{
2121
collections::HashSet,
2222
fmt,
2323
fs::File,
24-
io, mem,
24+
io,
25+
mem::{self, size_of},
2526
num::{NonZeroU16, NonZeroU32},
2627
ptr::{null_mut, NonNull},
2728
slice,
@@ -383,8 +384,15 @@ impl<D: HasDisplayHandle + ?Sized, W: HasWindowHandle> SurfaceInterface<D, W> fo
383384
.swbuf_err("Failed to fetch image from window")?;
384385

385386
if reply.depth == self.depth && reply.visual == self.visual_id {
386-
let mut out = vec![0u32; reply.data.len() / 4];
387-
bytemuck::cast_slice_mut::<u32, u8>(&mut out).copy_from_slice(&reply.data);
387+
let mut out = vec![0; reply.data.len() / size_of::<u32>()];
388+
// SAFETY: `u32` can be re-interpreted as `[u8; 4]`.
389+
let out_u8s = unsafe {
390+
slice::from_raw_parts_mut(
391+
out.as_mut_ptr().cast::<u8>(),
392+
out.len() * size_of::<u32>(),
393+
)
394+
};
395+
out_u8s.copy_from_slice(&reply.data);
388396
Ok(out)
389397
} else {
390398
Err(SoftBufferError::PlatformError(
@@ -443,6 +451,11 @@ impl BufferInterface for BufferImpl<'_> {
443451
// This is a suboptimal strategy, raise a stink in the debug logs.
444452
tracing::debug!("Falling back to non-SHM method for window drawing.");
445453

454+
// SAFETY: `u32` can be re-interpreted as `[u8; 4]`.
455+
let data = unsafe {
456+
slice::from_raw_parts(wire.as_ptr().cast::<u8>(), wire.len() * size_of::<u32>())
457+
};
458+
446459
self.connection
447460
.put_image(
448461
xproto::ImageFormat::Z_PIXMAP,
@@ -454,7 +467,7 @@ impl BufferInterface for BufferImpl<'_> {
454467
0,
455468
0,
456469
self.depth,
457-
bytemuck::cast_slice(wire),
470+
data,
458471
)
459472
.map(|c| c.ignore_error())
460473
.push_err()
@@ -598,7 +611,14 @@ impl ShmBuffer {
598611
let buffer_size = seg.buffer_size();
599612

600613
// SAFETY: No other code should be able to access the segment.
601-
bytemuck::cast_slice_mut(unsafe { &mut seg.as_mut()[..buffer_size] })
614+
let segment = unsafe { &mut seg.as_mut()[..buffer_size] };
615+
616+
let ptr = segment.as_mut_ptr().cast::<u32>();
617+
let len = segment.len() / size_of::<u32>();
618+
debug_assert_eq!(segment.len() % size_of::<u32>(), 0);
619+
// SAFETY: The segment buffer is a multiple of `u32`, and we assume that the
620+
// memmap allocation is aligned to at least a multiple of 4 bytes.
621+
unsafe { slice::from_raw_parts_mut(ptr, len) }
602622
}
603623
None => {
604624
// Nothing has been allocated yet.

0 commit comments

Comments
 (0)