I was taking a look at the method and noticed it doesn't check what the newTextureWithDescriptor msg_send! returns.
According to the docs that call can return:
A new MTLTexture instance if the method completed successfully; otherwise nil.
The metal::Texture type wraps a NonNull<_> value (from cargo expand texture):
/// See <https://developer.apple.com/documentation/metal/mtltexture>
pub enum MTLTexture {}
#[repr(transparent)]
pub struct Texture(::foreign_types::export::NonNull<MTLTexture>);
So when that call fails new_texture will put a null ptr in a NonNull which is UB:
pub fn new_texture(&self, descriptor: &TextureDescriptorRef) -> Texture {
unsafe { msg_send![self, newTextureWithDescriptor: descriptor] }
}
Seems like there's people already hitting those cases and wgpu now checks if the wrapped ptr is null, but that doesn't deal with the UB.
Let me know if I'm missing something, otherwise I can create a PR to perform the check and make create_texture return an Option<Texture>
I was taking a look at the method and noticed it doesn't check what the
newTextureWithDescriptormsg_send!returns.According to the docs that call can return:
The
metal::Texturetype wraps aNonNull<_>value (fromcargo expand texture):So when that call fails
new_texturewill put a null ptr in aNonNullwhich is UB:Seems like there's people already hitting those cases and
wgpunow checks if the wrapped ptr is null, but that doesn't deal with the UB.Let me know if I'm missing something, otherwise I can create a PR to perform the check and make
create_texturereturn anOption<Texture>