Expand description
The functions within this module use unsafe in order to retrieve their input as a slice of
bytes. This is necessary in order to upload data to the GPU via the wgpu
DeviceExt::create_buffer_init buffer constructor. This method is unsafe as the type T may contain
padding which is considered to be uninitialised memory in Rust and may potentially lead to
undefined behaviour.
These should be replaced in the future with something similar to zerocopy. Unfortunately, we
don’t gain much benefit from using zerocopy in our case as zerocopy provides no way to
implement the AsBytes trait for generic types (e.g. Vector*), even with their type
parameters filled (e.g. Vector2<f32>). This means we can’t derive AsBytes for the majority
of the types where we need to as derive(AsBytes) requires that all fields implement
AsBytes, and neither our Vector types or the palette color types can implement it.
There is a relatively new crate bytemuck which provides traits for this, however these traits
are unsafe and so we don’t gain much benefit in terms of safety, especially for our simple
use-case. There is a zeroable crate that attempts to derive the Zeroable trait from
bytemuck, however:
- there not yet any other publicly dependent crates or public discussion around the safety of the provided derives and
- we would still require implementing
Podunsafely.
Functions
- from⚠
- This is really an astonishingly unsafe function. Please don’t use it.