From 6f629547d5b9a257b0c361b82714fa6f6879f3e7 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Fri, 25 Nov 2022 16:44:03 +0000 Subject: [PATCH] macOS: Handle unavailable Metal device --- .../native/juce_ios_UIViewComponentPeer.mm | 5 ++++- .../native/juce_mac_CGMetalLayerRenderer.h | 19 ++++++++++++++----- .../native/juce_mac_NSViewComponentPeer.mm | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index aad028dae19d..95ecb9fda4ed 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -1398,7 +1398,10 @@ - (UITextRange*) rangeEnclosingPosition: (JuceUITextPosition*) position #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS if (@available (iOS 13, *)) - metalRenderer = std::make_unique> (view, comp.isOpaque()); + { + metalRenderer = CoreGraphicsMetalLayerRenderer::create (view, comp.isOpaque()); + jassert (metalRenderer != nullptr); + } #endif if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) diff --git a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h index 791379c771c2..bfa8f0cb8ac7 100644 --- a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h +++ b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h @@ -35,12 +35,11 @@ class CoreGraphicsMetalLayerRenderer { public: //============================================================================== - CoreGraphicsMetalLayerRenderer (ViewType* view, bool isOpaque) + static auto create (ViewType* view, bool isOpaque) { - device.reset (MTLCreateSystemDefaultDevice()); - commandQueue.reset ([device.get() newCommandQueue]); - - attach (view, isOpaque); + ObjCObjectHandle> device { MTLCreateSystemDefaultDevice() }; + return rawToUniquePtr (device != nullptr ? new CoreGraphicsMetalLayerRenderer (device, view, isOpaque) + : nullptr); } ~CoreGraphicsMetalLayerRenderer() @@ -223,6 +222,16 @@ class CoreGraphicsMetalLayerRenderer } private: + //============================================================================== + CoreGraphicsMetalLayerRenderer (ObjCObjectHandle> mtlDevice, + ViewType* view, + bool isOpaque) + : device (mtlDevice), + commandQueue ([device.get() newCommandQueue]) + { + attach (view, isOpaque); + } + //============================================================================== static auto alignTo (size_t n, size_t alignment) { diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 65b588f92b86..269dd29c942b 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -151,7 +151,7 @@ static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept #if USE_COREGRAPHICS_RENDERING #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS if (@available (macOS 10.14, *)) - metalRenderer = std::make_unique> (view, getComponent().isOpaque()); + metalRenderer = CoreGraphicsMetalLayerRenderer::create (view, getComponent().isOpaque()); #endif if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) {