mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	vulkan: Use newer VK_EXT_metal_surface to create surface for MoltenVK.
This commit is contained in:
		@@ -19,11 +19,9 @@
 | 
				
			|||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
// ensure include order
 | 
					// ensure include order
 | 
				
			||||||
#include <vulkan/vulkan_win32.h>
 | 
					#include <vulkan/vulkan_win32.h>
 | 
				
			||||||
#elif defined(__APPLE__)
 | 
					 | 
				
			||||||
#include <vulkan/vulkan_macos.h>
 | 
					 | 
				
			||||||
#elif defined(__ANDROID__)
 | 
					#elif defined(__ANDROID__)
 | 
				
			||||||
#include <vulkan/vulkan_android.h>
 | 
					#include <vulkan/vulkan_android.h>
 | 
				
			||||||
#else
 | 
					#elif !defined(__APPLE__)
 | 
				
			||||||
#include <X11/Xlib.h>
 | 
					#include <X11/Xlib.h>
 | 
				
			||||||
#include <vulkan/vulkan_wayland.h>
 | 
					#include <vulkan/vulkan_wayland.h>
 | 
				
			||||||
#include <vulkan/vulkan_xlib.h>
 | 
					#include <vulkan/vulkan_xlib.h>
 | 
				
			||||||
@@ -68,7 +66,7 @@ namespace {
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
#elif defined(__APPLE__)
 | 
					#elif defined(__APPLE__)
 | 
				
			||||||
    case Core::Frontend::WindowSystemType::Cocoa:
 | 
					    case Core::Frontend::WindowSystemType::Cocoa:
 | 
				
			||||||
        extensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME);
 | 
					        extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
#elif defined(__ANDROID__)
 | 
					#elif defined(__ANDROID__)
 | 
				
			||||||
    case Core::Frontend::WindowSystemType::Android:
 | 
					    case Core::Frontend::WindowSystemType::Android:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,11 +11,9 @@
 | 
				
			|||||||
#include <windows.h>
 | 
					#include <windows.h>
 | 
				
			||||||
// ensure include order
 | 
					// ensure include order
 | 
				
			||||||
#include <vulkan/vulkan_win32.h>
 | 
					#include <vulkan/vulkan_win32.h>
 | 
				
			||||||
#elif defined(__APPLE__)
 | 
					 | 
				
			||||||
#include <vulkan/vulkan_macos.h>
 | 
					 | 
				
			||||||
#elif defined(__ANDROID__)
 | 
					#elif defined(__ANDROID__)
 | 
				
			||||||
#include <vulkan/vulkan_android.h>
 | 
					#include <vulkan/vulkan_android.h>
 | 
				
			||||||
#else
 | 
					#elif !defined(__APPLE__)
 | 
				
			||||||
#include <X11/Xlib.h>
 | 
					#include <X11/Xlib.h>
 | 
				
			||||||
#include <vulkan/vulkan_wayland.h>
 | 
					#include <vulkan/vulkan_wayland.h>
 | 
				
			||||||
#include <vulkan/vulkan_xlib.h>
 | 
					#include <vulkan/vulkan_xlib.h>
 | 
				
			||||||
@@ -44,12 +42,13 @@ vk::SurfaceKHR CreateSurface(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
#elif defined(__APPLE__)
 | 
					#elif defined(__APPLE__)
 | 
				
			||||||
    if (window_info.type == Core::Frontend::WindowSystemType::Cocoa) {
 | 
					    if (window_info.type == Core::Frontend::WindowSystemType::Cocoa) {
 | 
				
			||||||
        const VkMacOSSurfaceCreateInfoMVK mvk_ci{VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK,
 | 
					        const VkMetalSurfaceCreateInfoEXT macos_ci = {
 | 
				
			||||||
                                                 nullptr, 0, window_info.render_surface};
 | 
					            .pLayer = static_cast<const CAMetalLayer*>(window_info.render_surface),
 | 
				
			||||||
        const auto vkCreateMacOSSurfaceMVK = reinterpret_cast<PFN_vkCreateMacOSSurfaceMVK>(
 | 
					        };
 | 
				
			||||||
            dld.vkGetInstanceProcAddr(*instance, "vkCreateMacOSSurfaceMVK"));
 | 
					        const auto vkCreateMetalSurfaceEXT = reinterpret_cast<PFN_vkCreateMetalSurfaceEXT>(
 | 
				
			||||||
        if (!vkCreateMacOSSurfaceMVK ||
 | 
					            dld.vkGetInstanceProcAddr(*instance, "vkCreateMetalSurfaceEXT"));
 | 
				
			||||||
            vkCreateMacOSSurfaceMVK(*instance, &mvk_ci, nullptr, &unsafe_surface) != VK_SUCCESS) {
 | 
					        if (!vkCreateMetalSurfaceEXT ||
 | 
				
			||||||
 | 
					            vkCreateMetalSurfaceEXT(*instance, &macos_ci, nullptr, &unsafe_surface) != VK_SUCCESS) {
 | 
				
			||||||
            LOG_ERROR(Render_Vulkan, "Failed to initialize Metal surface");
 | 
					            LOG_ERROR(Render_Vulkan, "Failed to initialize Metal surface");
 | 
				
			||||||
            throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
 | 
					            throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,8 @@
 | 
				
			|||||||
#define VK_NO_PROTOTYPES
 | 
					#define VK_NO_PROTOTYPES
 | 
				
			||||||
#ifdef _WIN32
 | 
					#ifdef _WIN32
 | 
				
			||||||
#define VK_USE_PLATFORM_WIN32_KHR
 | 
					#define VK_USE_PLATFORM_WIN32_KHR
 | 
				
			||||||
 | 
					#elif defined(__APPLE__)
 | 
				
			||||||
 | 
					#define VK_USE_PLATFORM_METAL_EXT
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#include <vulkan/vulkan.h>
 | 
					#include <vulkan/vulkan.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if !defined(WIN32) && !defined(__APPLE__)
 | 
					#if !defined(WIN32) && !defined(__APPLE__)
 | 
				
			||||||
#include <qpa/qplatformnativeinterface.h>
 | 
					#include <qpa/qplatformnativeinterface.h>
 | 
				
			||||||
 | 
					#elif defined(__APPLE__)
 | 
				
			||||||
 | 
					#include <objc/message.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace QtCommon {
 | 
					namespace QtCommon {
 | 
				
			||||||
@@ -37,9 +39,12 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window)
 | 
				
			|||||||
    Core::Frontend::EmuWindow::WindowSystemInfo wsi;
 | 
					    Core::Frontend::EmuWindow::WindowSystemInfo wsi;
 | 
				
			||||||
    wsi.type = GetWindowSystemType();
 | 
					    wsi.type = GetWindowSystemType();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(WIN32)
 | 
				
			||||||
    // Our Win32 Qt external doesn't have the private API.
 | 
					    // Our Win32 Qt external doesn't have the private API.
 | 
				
			||||||
#if defined(WIN32) || defined(__APPLE__)
 | 
					    wsi.render_surface = reinterpret_cast<void*>(window->winId());
 | 
				
			||||||
    wsi.render_surface = window ? reinterpret_cast<void*>(window->winId()) : nullptr;
 | 
					#elif defined(__APPLE__)
 | 
				
			||||||
 | 
					    wsi.render_surface = reinterpret_cast<void* (*)(id, SEL)>(objc_msgSend)(
 | 
				
			||||||
 | 
					        reinterpret_cast<id>(window->winId()), sel_registerName("layer"));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface();
 | 
					    QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface();
 | 
				
			||||||
    wsi.display_connection = pni->nativeResourceForWindow("display", window);
 | 
					    wsi.display_connection = pni->nativeResourceForWindow("display", window);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user