Do not constantly create new surfaces with MoltenVK on macOS

Querying the VkSurfaceKHR for a window is expected to create the surface once
and then return the same value afterwards.

Task-number: QTBUG-82600
Change-Id: Ib3e99dfca4d940de1a14348eb1909d372a7dde04
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
bb10
Laszlo Agocs 2020-03-02 09:58:50 +01:00
parent 23fd7bdf01
commit 7b8616859a
3 changed files with 8 additions and 7 deletions

View File

@ -107,7 +107,7 @@ void *QCocoaNativeInterface::nativeResourceForWindow(const QByteArray &resourceS
#if QT_CONFIG(vulkan)
} else if (resourceString == "vkSurface") {
if (QVulkanInstance *instance = window->vulkanInstance())
return static_cast<QCocoaVulkanInstance *>(instance->handle())->createSurface(window);
return static_cast<QCocoaVulkanInstance *>(instance->handle())->surface(window);
#endif
}
return nullptr;

View File

@ -61,9 +61,11 @@ public:
void createOrAdoptInstance() override;
VkSurfaceKHR *createSurface(QWindow *window);
VkSurfaceKHR createSurface(NSView *view);
VkSurfaceKHR *surface(QWindow *window);
private:
VkSurfaceKHR createSurface(NSView *view);
QVulkanInstance *m_instance = nullptr;
QLibrary m_lib;
VkSurfaceKHR m_nullSurface = nullptr;

View File

@ -57,12 +57,11 @@ void QCocoaVulkanInstance::createOrAdoptInstance()
initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_MVK_macos_surface"));
}
VkSurfaceKHR *QCocoaVulkanInstance::createSurface(QWindow *window)
VkSurfaceKHR *QCocoaVulkanInstance::surface(QWindow *window)
{
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
if (cocoaWindow->m_vulkanSurface)
destroySurface(cocoaWindow->m_vulkanSurface);
cocoaWindow->m_vulkanSurface = createSurface(cocoaWindow->m_view);
if (!cocoaWindow->m_vulkanSurface)
cocoaWindow->m_vulkanSurface = createSurface(cocoaWindow->m_view);
return &cocoaWindow->m_vulkanSurface;
}