vcl/Library_vcl.mk | 1 + vcl/inc/quartz/cgutils.h | 4 ++++ vcl/quartz/cgutils.mm | 43 +++++++++++++++++++++++++++++++++++++++++++ vcl/skia/SkiaHelper.cxx | 23 +++++++++++++++++++---- 4 files changed, 67 insertions(+), 4 deletions(-)
New commits: commit fe3fa1699f12eb007d26bbb19f5ff80826bc384f Author: Patrick Luby <plub...@neooffice.org> AuthorDate: Sat Sep 30 18:03:45 2023 -0400 Commit: Patrick Luby <plub...@neooffice.org> CommitDate: Sun Oct 1 16:44:47 2023 +0200 tdf#156881 Disable Metal with AMD Radeon Pro 5XXX GPUs on macOS Catalina When running macOS Catalina on a 2019 MacBook Pro, unexpected drawing artifacts are drawn so disable Metal for the AMD Radeon Pro GPUs listed for that model in https://support.apple.com/kb/SP809. Change-Id: Iffe44da1f07af2f3bbc367051b5ea4d522216eb7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157443 Tested-by: Jenkins Reviewed-by: Patrick Luby <plub...@neooffice.org> diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 6eb5043defed..d6a370706a86 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -714,6 +714,7 @@ $(eval $(call gb_Library_add_objcxxobjects,vcl,\ $(eval $(call gb_Library_use_system_darwin_frameworks,vcl,\ Cocoa \ CoreFoundation \ + Metal \ )) endif diff --git a/vcl/inc/quartz/cgutils.h b/vcl/inc/quartz/cgutils.h index 6c499448c721..786b21458d4f 100644 --- a/vcl/inc/quartz/cgutils.h +++ b/vcl/inc/quartz/cgutils.h @@ -31,4 +31,8 @@ CGImageRef VCL_DLLPUBLIC CreateWithSalBitmapAndMask(const SalBitmap& rBitmap, const SalBitmap& rMask, int nX, int nY, int nWidth, int nHeight); +#ifdef MACOSX +bool VCL_DLLPUBLIC DefaultMTLDeviceIsSupported(); +#endif + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/quartz/cgutils.mm b/vcl/quartz/cgutils.mm index c6a490d44885..0d611bec11d1 100644 --- a/vcl/quartz/cgutils.mm +++ b/vcl/quartz/cgutils.mm @@ -26,6 +26,12 @@ #include <ios/iosinst.hxx> #endif +#ifdef MACOSX +#include <premac.h> +#include <Metal/Metal.h> +#include <postmac.h> +#endif + static void CFRTLFree(void* /*info*/, const void* data, size_t /*size*/) { std::free( const_cast<void*>(data) ); @@ -85,4 +91,41 @@ CGImageRef CreateWithSalBitmapAndMask( const SalBitmap& rBitmap, const SalBitmap return xMaskedImage; } +#ifdef MACOSX + +bool DefaultMTLDeviceIsSupported() +{ + id<MTLDevice> pMetalDevice = MTLCreateSystemDefaultDevice(); + if (!pMetalDevice || !pMetalDevice.name) + { + SAL_WARN("vcl.skia", "MTLCreateSystemDefaultDevice() returned nil"); + return false; + } + + SAL_WARN("vcl.skia", "Default MTLDevice is \"" << [pMetalDevice.name UTF8String] << "\""); + + bool bRet = true; + + // tdf#156881 Disable Metal with AMD Radeon Pro 5XXX GPUs on macOS Catalina + // When running macOS Catalina on a 2019 MacBook Pro, unexpected drawing + // artifacts are drawn so disable Metal for the AMD Radeon Pro GPUs listed + // for that model in https://support.apple.com/kb/SP809. + if (@available(macOS 11, *)) + { + // No known problems with macOS Big Sur or later + } + else + { + static NSString* pAMDRadeonPro5300Prefix = @"AMD Radeon Pro 5300M"; + static NSString* pAMDRadeonPro5500Prefix = @"AMD Radeon Pro 5500M"; + if ([pMetalDevice.name hasPrefix:pAMDRadeonPro5300Prefix] || [pMetalDevice.name hasPrefix:pAMDRadeonPro5500Prefix]) + bRet = false; + } + + [pMetalDevice release]; + return bRet; +} + +#endif + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/skia/SkiaHelper.cxx b/vcl/skia/SkiaHelper.cxx index 41ce5518112e..712ba39d75e3 100644 --- a/vcl/skia/SkiaHelper.cxx +++ b/vcl/skia/SkiaHelper.cxx @@ -85,6 +85,12 @@ bool isAlphaMaskBlendingEnabled() { return false; } #include <fstream> +#ifdef SK_METAL +#ifdef MACOSX +#include <quartz/cgutils.h> +#endif +#endif + namespace SkiaHelper { static OUString getCacheFolder() @@ -276,10 +282,19 @@ static void checkDeviceDenylisted(bool blockDisable = false) } if (grDirectContext) // Metal was initialized properly { - // Try to assume Metal always works, given that Mac doesn't have such as wide range of HW vendors as PC. - // If there turns out to be problems, handle it similarly to Vulkan. - SAL_INFO("vcl.skia", "Using Skia Metal mode"); - writeSkiaMetalInfo(); +#ifdef MACOSX + if (!blockDisable && !DefaultMTLDeviceIsSupported()) + { + SAL_INFO("vcl.skia", "Metal default device not supported"); + disableRenderMethod(RenderMetal); + useRaster = true; + } + else +#endif + { + SAL_INFO("vcl.skia", "Using Skia Metal mode"); + writeSkiaMetalInfo(); + } } else {