macOS: Add QSurfaceType::MetalSurface

Add API to activate previously added Metal layer implementation.
This provides minimal support, and unlike VulkanSurface
there is no separate QWindow subclass.

What this does do is configure the QWindow to use a
Metal layer, and to send expose/update events when
the layer content should be redrawn. Qt will also update
the layer’s drawableSize and contentsScale when needed.

Application code can make use of this by accessing
the QWindow layer, which will be a CAMetalLayer:

  CAMetalLayer *metalLayer = reinterpret_cast<CAMetalLayer *>(
    reinterpret_cast<NSView *>(window->winId()).layer);

Change-Id: I514f5186133c3e610fd4e53ca91fe9c85c6d016e
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Morten Johan Sørvig 2018-04-04 14:11:43 +02:00
parent 1332cca091
commit ee60a044c9
4 changed files with 17 additions and 9 deletions

View File

@ -80,6 +80,10 @@ QT_BEGIN_NAMESPACE
in conjunction with OpenVG contexts.
\value VulkanSurface The surface is a Vulkan compatible surface and can be used
in conjunction with the Vulkan graphics API.
\value MetalSurface The surface is a Metal compatible surface and can be used
in conjunction with Apple's Metal graphics API. This surface type is supported
on macOS only.
*/

View File

@ -66,7 +66,8 @@ public:
OpenGLSurface,
RasterGLSurface,
OpenVGSurface,
VulkanSurface
VulkanSurface,
MetalSurface
};
virtual ~QSurface();

View File

@ -133,6 +133,12 @@
}
}
- (BOOL)shouldUseMetalLayer:(QSurface::SurfaceType)surfaceType
{
// MetalSurface needs a layer, and so does VulkanSurface (via MoltenVK)
return surfaceType == QWindow::MetalSurface || surfaceType == QWindow::VulkanSurface;
}
- (BOOL)wantsLayer
{
Q_ASSERT(m_platformWindow);
@ -144,16 +150,14 @@
bool layerRequested = qt_mac_resolveOption(false, m_platformWindow->window(),
"_q_mac_wantsLayer", "QT_MAC_WANTS_LAYER");
// Support Vulkan via MoltenVK, which requires a Metal layer
bool layerForVulkan = (m_platformWindow->window()->surfaceType() == QWindow::VulkanSurface);
bool layerForSurfaceType = [self shouldUseMetalLayer:m_platformWindow->window()->surfaceType()];
return layerRequested || layerForVulkan;
return layerRequested || layerForSurfaceType;
}
- (CALayer *)makeBackingLayer
{
// Support Vulkan via MoltenVK, which requires a Metal layer
bool makeMetalLayer = (m_platformWindow->window()->surfaceType() == QWindow::VulkanSurface);
bool makeMetalLayer = [self shouldUseMetalLayer:m_platformWindow->window()->surfaceType()];
if (makeMetalLayer) {
// Check if Metal is supported. If it isn't then it's most likely
// too late at this point and the QWindow will be non-functional,

View File

@ -111,15 +111,14 @@ void *QWindowsNativeInterface::nativeResourceForWindow(const QByteArray &resourc
return 0;
}
break;
case QWindow::OpenGLSurface:
case QWindow::OpenVGSurface:
break;
case QWindow::VulkanSurface:
#if QT_CONFIG(vulkan)
if (type == VkSurface)
return bw->surface(nullptr, nullptr); // returns the address of the VkSurfaceKHR, not the value, as expected
#endif
break;
default:
break;
}
qWarning("%s: Invalid key '%s' requested.", __FUNCTION__, resource.constData());
return 0;