Fix MoltenVK integration with more recent Vulkan SDKs.

This commit is contained in:
Jean-Philip Desjardins 2025-03-24 18:28:36 -04:00
parent 01d094c0c3
commit 06d5188cc5
6 changed files with 37 additions and 5 deletions

View file

@ -273,6 +273,8 @@ if(TARGET_PLATFORM_MACOS)
${QT_SOURCES}
macos/InputProviderMacOsHid.cpp
macos/InputProviderMacOsHid.h
macos/LayerFromView.mm
macos/LayerFromView.h
)
FILE(GLOB ARCADE_DEFS ${CMAKE_CURRENT_SOURCE_DIR}/../../arcadedefs/*.arcadedef)
set(OSX_RES
@ -283,7 +285,8 @@ if(TARGET_PLATFORM_MACOS)
list(APPEND OSX_RES ${CMAKE_CURRENT_SOURCE_DIR}/../../ee_functions.xml)
endif()
if(USE_GSH_VULKAN)
list(APPEND OSX_RES $ENV{VULKAN_SDK}/../MoltenVK/dylib/macOS/libMoltenVk.dylib)
cmake_path(GET Vulkan_LIBRARY PARENT_PATH VULKAN_LIB_DIR)
list(APPEND OSX_RES ${VULKAN_LIB_DIR}/libMoltenVk.dylib)
endif()
add_executable(Play MACOSX_BUNDLE ${QT_SOURCES} ${QT_MOC_SRCS} ${QT_RES_SOURCES} ${QT_UI_HEADERS} ${OSX_RES} ${ARCADE_DEFS})
# Set a custom plist file for the app bundle
@ -306,9 +309,6 @@ if(TARGET_PLATFORM_MACOS)
)
SET_SOURCE_FILES_PROPERTIES(${ARCADE_DEFS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/arcadedefs")
list(APPEND UI_QT_PROJECT_LIBS "-framework IOKit -framework CoreFoundation")
if(USE_GSH_VULKAN)
target_include_directories(Play PRIVATE $ENV{VULKAN_SDK}/../MoltenVK/include)
endif()
elseif(TARGET_PLATFORM_WIN32)
set(QT_SOURCES
${QT_SOURCES}

View file

@ -1,6 +1,7 @@
#include "GSH_VulkanQt.h"
#include "vulkan/StructDefs.h"
#include "vulkan/Loader.h"
#include "vulkanwindow.h"
#include <QWindow>
#include <QGuiApplication>
@ -37,7 +38,7 @@ void CGSH_VulkanQt::InitializeImpl()
#ifdef __APPLE__
VkMacOSSurfaceCreateInfoMVK surfaceCreateInfo = {};
surfaceCreateInfo.pView = reinterpret_cast<const void*>(m_renderWindow->winId());
surfaceCreateInfo.pView = static_cast<VulkanWindow*>(m_renderWindow)->GetMetalLayer();
auto result = m_instance.vkCreateMacOSSurfaceMVK(m_instance, &surfaceCreateInfo, nullptr, &m_context->surface);
CHECKVULKANERROR(result);
#endif

View file

@ -0,0 +1,3 @@
#pragma once
void* GetLayerFromView(void*);

View file

@ -0,0 +1,8 @@
#include "LayerFromView.h"
#include <AppKit/AppKit.h>
void* GetLayerFromView(void* viewPtr)
{
NSView* view = (NSView*)viewPtr;
return [view layer];
}

View file

@ -1,7 +1,18 @@
#include "vulkanwindow.h"
#include "macos/LayerFromView.h"
VulkanWindow::VulkanWindow(QWindow* parent)
: OutputWindow(parent)
{
setSurfaceType(QWindow::VulkanSurface);
#ifdef __APPLE__
m_metalLayer = GetLayerFromView(reinterpret_cast<void*>(winId()));
#endif
}
#ifdef __APPLE__
void* VulkanWindow::GetMetalLayer() const
{
return m_metalLayer;
}
#endif

View file

@ -8,4 +8,13 @@ class VulkanWindow : public OutputWindow
public:
explicit VulkanWindow(QWindow* parent = 0);
~VulkanWindow() = default;
#ifdef __APPLE__
void* GetMetalLayer() const;
#endif
private:
#ifdef __APPLE__
void* m_metalLayer = nullptr;
#endif
};