From 7caa03918347442dd76c3857099ef57a63f104d1 Mon Sep 17 00:00:00 2001 From: Stuart Carnie Date: Mon, 2 Dec 2024 06:23:58 +1100 Subject: [PATCH] Metal: Ensure `texture_create_from_extension` returns correct pixel format --- .../metal/rendering_device_driver_metal.mm | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/metal/rendering_device_driver_metal.mm b/drivers/metal/rendering_device_driver_metal.mm index 784c9d5ae8a..976020abf1d 100644 --- a/drivers/metal/rendering_device_driver_metal.mm +++ b/drivers/metal/rendering_device_driver_metal.mm @@ -358,11 +358,25 @@ RDD::TextureID RenderingDeviceDriverMetal::texture_create(const TextureFormat &p } RDD::TextureID RenderingDeviceDriverMetal::texture_create_from_extension(uint64_t p_native_texture, TextureType p_type, DataFormat p_format, uint32_t p_array_layers, bool p_depth_stencil) { - id obj = (__bridge id)(void *)(uintptr_t)p_native_texture; + id res = (__bridge id)(void *)(uintptr_t)p_native_texture; - // We only need to create a RDD::TextureID for an existing, natively-provided texture. + // If the requested format is different, we need to create a view. + MTLPixelFormat format = pixel_formats->getMTLPixelFormat(p_format); + if (res.pixelFormat != format) { + MTLTextureSwizzleChannels swizzle = MTLTextureSwizzleChannelsMake( + MTLTextureSwizzleRed, + MTLTextureSwizzleGreen, + MTLTextureSwizzleBlue, + MTLTextureSwizzleAlpha); + res = [res newTextureViewWithPixelFormat:format + textureType:res.textureType + levels:NSMakeRange(0, res.mipmapLevelCount) + slices:NSMakeRange(0, p_array_layers) + swizzle:swizzle]; + ERR_FAIL_NULL_V_MSG(res, TextureID(), "Unable to create texture view."); + } - return rid::make(obj); + return rid::make(res); } RDD::TextureID RenderingDeviceDriverMetal::texture_create_shared(TextureID p_original_texture, const TextureView &p_view) {