Cocoa: Select Vulkan surface extension at runtime
From upstream: 15d91801b7.
This commit is contained in:
parent
f6901e4a3d
commit
3581ffe04b
18
glfw/cocoa_platform.h
vendored
18
glfw/cocoa_platform.h
vendored
@ -71,8 +71,8 @@ typedef void (* GLFWapplicationwillfinishlaunchingfun)(void);
|
|||||||
typedef bool (* GLFWcocoatogglefullscreenfun)(GLFWwindow*);
|
typedef bool (* GLFWcocoatogglefullscreenfun)(GLFWwindow*);
|
||||||
typedef void (* GLFWcocoarenderframefun)(GLFWwindow*);
|
typedef void (* GLFWcocoarenderframefun)(GLFWwindow*);
|
||||||
|
|
||||||
#if defined(VK_USE_PLATFORM_MACOS_MVK)
|
|
||||||
typedef VkFlags VkMacOSSurfaceCreateFlagsMVK;
|
typedef VkFlags VkMacOSSurfaceCreateFlagsMVK;
|
||||||
|
typedef VkFlags VkMetalSurfaceCreateFlagsEXT;
|
||||||
|
|
||||||
typedef struct VkMacOSSurfaceCreateInfoMVK
|
typedef struct VkMacOSSurfaceCreateInfoMVK
|
||||||
{
|
{
|
||||||
@ -82,24 +82,16 @@ typedef struct VkMacOSSurfaceCreateInfoMVK
|
|||||||
const void* pView;
|
const void* pView;
|
||||||
} VkMacOSSurfaceCreateInfoMVK;
|
} VkMacOSSurfaceCreateInfoMVK;
|
||||||
|
|
||||||
typedef VkResult (APIENTRY *PFN_vkCreateMacOSSurfaceMVK)(VkInstance,const VkMacOSSurfaceCreateInfoMVK*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
typedef struct VkMetalSurfaceCreateInfoEXT
|
||||||
|
{
|
||||||
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
||||||
#define VK_EXT_metal_surface 1
|
|
||||||
typedef void CAMetalLayer;
|
|
||||||
|
|
||||||
#define VK_EXT_METAL_SURFACE_SPEC_VERSION 1
|
|
||||||
#define VK_EXT_METAL_SURFACE_EXTENSION_NAME "VK_EXT_metal_surface"
|
|
||||||
typedef VkFlags VkMetalSurfaceCreateFlagsEXT;
|
|
||||||
typedef struct VkMetalSurfaceCreateInfoEXT {
|
|
||||||
VkStructureType sType;
|
VkStructureType sType;
|
||||||
const void* pNext;
|
const void* pNext;
|
||||||
VkMetalSurfaceCreateFlagsEXT flags;
|
VkMetalSurfaceCreateFlagsEXT flags;
|
||||||
const CAMetalLayer* pLayer;
|
const void* pLayer;
|
||||||
} VkMetalSurfaceCreateInfoEXT;
|
} VkMetalSurfaceCreateInfoEXT;
|
||||||
|
|
||||||
|
typedef VkResult (APIENTRY *PFN_vkCreateMacOSSurfaceMVK)(VkInstance,const VkMacOSSurfaceCreateInfoMVK*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
||||||
typedef VkResult (APIENTRY *PFN_vkCreateMetalSurfaceEXT)(VkInstance,const VkMetalSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
typedef VkResult (APIENTRY *PFN_vkCreateMetalSurfaceEXT)(VkInstance,const VkMetalSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "posix_thread.h"
|
#include "posix_thread.h"
|
||||||
#include "cocoa_joystick.h"
|
#include "cocoa_joystick.h"
|
||||||
|
|||||||
@ -2079,19 +2079,16 @@ const char* _glfwPlatformGetClipboardString(void)
|
|||||||
|
|
||||||
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
|
||||||
{
|
{
|
||||||
#if defined(VK_USE_PLATFORM_MACOS_MVK)
|
if (_glfw.vk.KHR_surface && _glfw.vk.EXT_metal_surface)
|
||||||
if (!_glfw.vk.KHR_surface || !_glfw.vk.MVK_macos_surface)
|
{
|
||||||
return;
|
|
||||||
|
|
||||||
extensions[0] = "VK_KHR_surface";
|
|
||||||
extensions[1] = "VK_MVK_macos_surface";
|
|
||||||
|
|
||||||
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
||||||
if (!_glfw.vk.KHR_surface || !_glfw.vk.EXT_metal_surface)
|
|
||||||
return;
|
|
||||||
extensions[0] = "VK_KHR_surface";
|
extensions[0] = "VK_KHR_surface";
|
||||||
extensions[1] = "VK_EXT_metal_surface";
|
extensions[1] = "VK_EXT_metal_surface";
|
||||||
#endif
|
}
|
||||||
|
else if (_glfw.vk.KHR_surface && _glfw.vk.MVK_macos_surface)
|
||||||
|
{
|
||||||
|
extensions[0] = "VK_KHR_surface";
|
||||||
|
extensions[1] = "VK_MVK_macos_surface";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance UNUSED,
|
int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance UNUSED,
|
||||||
@ -2107,35 +2104,6 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
|
|||||||
VkSurfaceKHR* surface)
|
VkSurfaceKHR* surface)
|
||||||
{
|
{
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101100
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101100
|
||||||
VkResult err;
|
|
||||||
|
|
||||||
#if defined(VK_USE_PLATFORM_MACOS_MVK)
|
|
||||||
VkMacOSSurfaceCreateInfoMVK sci;
|
|
||||||
|
|
||||||
PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;
|
|
||||||
vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)
|
|
||||||
vkGetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK");
|
|
||||||
if (!vkCreateMacOSSurfaceMVK)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
|
||||||
"Cocoa: Vulkan instance missing VK_MVK_macos_surface extension");
|
|
||||||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
||||||
VkMetalSurfaceCreateInfoEXT sci;
|
|
||||||
|
|
||||||
PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;
|
|
||||||
vkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)
|
|
||||||
vkGetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT");
|
|
||||||
if (!vkCreateMetalSurfaceEXT)
|
|
||||||
{
|
|
||||||
_glfwInputError(GLFW_API_UNAVAILABLE,
|
|
||||||
"Cocoa: Vulkan instance missing VK_EXT_metal_surface extension");
|
|
||||||
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// HACK: Dynamically load Core Animation to avoid adding an extra
|
// HACK: Dynamically load Core Animation to avoid adding an extra
|
||||||
// dependency for the majority who don't use MoltenVK
|
// dependency for the majority who don't use MoltenVK
|
||||||
NSBundle* bundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/QuartzCore.framework"];
|
NSBundle* bundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/QuartzCore.framework"];
|
||||||
@ -2161,21 +2129,49 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
|
|||||||
[window->ns.view setLayer:window->ns.layer];
|
[window->ns.view setLayer:window->ns.layer];
|
||||||
[window->ns.view setWantsLayer:YES];
|
[window->ns.view setWantsLayer:YES];
|
||||||
|
|
||||||
|
VkResult err;
|
||||||
|
|
||||||
|
if (_glfw.vk.EXT_metal_surface)
|
||||||
|
{
|
||||||
|
VkMetalSurfaceCreateInfoEXT sci;
|
||||||
|
|
||||||
|
PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;
|
||||||
|
vkCreateMetalSurfaceEXT = (PFN_vkCreateMetalSurfaceEXT)
|
||||||
|
vkGetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT");
|
||||||
|
if (!vkCreateMetalSurfaceEXT)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
|
"Cocoa: Vulkan instance missing VK_EXT_metal_surface extension");
|
||||||
|
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&sci, 0, sizeof(sci));
|
||||||
|
sci.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
|
||||||
|
sci.pLayer = window->ns.layer;
|
||||||
|
|
||||||
|
err = vkCreateMetalSurfaceEXT(instance, &sci, allocator, surface);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VkMacOSSurfaceCreateInfoMVK sci;
|
||||||
|
|
||||||
|
PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK;
|
||||||
|
vkCreateMacOSSurfaceMVK = (PFN_vkCreateMacOSSurfaceMVK)
|
||||||
|
vkGetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK");
|
||||||
|
if (!vkCreateMacOSSurfaceMVK)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_API_UNAVAILABLE,
|
||||||
|
"Cocoa: Vulkan instance missing VK_MVK_macos_surface extension");
|
||||||
|
return VK_ERROR_EXTENSION_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&sci, 0, sizeof(sci));
|
memset(&sci, 0, sizeof(sci));
|
||||||
#if defined(VK_USE_PLATFORM_MACOS_MVK)
|
|
||||||
sci.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
sci.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
||||||
sci.pView = window->ns.view;
|
sci.pView = window->ns.view;
|
||||||
|
|
||||||
err = vkCreateMacOSSurfaceMVK(instance, &sci, allocator, surface);
|
err = vkCreateMacOSSurfaceMVK(instance, &sci, allocator, surface);
|
||||||
|
}
|
||||||
|
|
||||||
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
||||||
sci.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
|
|
||||||
sci.pNext = NULL;
|
|
||||||
sci.flags = 0;
|
|
||||||
sci.pLayer = window->ns.layer;
|
|
||||||
|
|
||||||
err = vkCreateMetalSurfaceEXT(instance, &sci, allocator, surface);
|
|
||||||
#endif
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
|||||||
3
glfw/internal.h
vendored
3
glfw/internal.h
vendored
@ -588,11 +588,8 @@ struct _GLFWlibrary
|
|||||||
#if defined(_GLFW_WIN32)
|
#if defined(_GLFW_WIN32)
|
||||||
bool KHR_win32_surface;
|
bool KHR_win32_surface;
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(_GLFW_COCOA)
|
||||||
#if defined(VK_USE_PLATFORM_MACOS_MVK)
|
|
||||||
bool MVK_macos_surface;
|
bool MVK_macos_surface;
|
||||||
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
||||||
bool EXT_metal_surface;
|
bool EXT_metal_surface;
|
||||||
#endif
|
|
||||||
#elif defined(_GLFW_X11)
|
#elif defined(_GLFW_X11)
|
||||||
bool KHR_xlib_surface;
|
bool KHR_xlib_surface;
|
||||||
bool KHR_xcb_surface;
|
bool KHR_xcb_surface;
|
||||||
|
|||||||
3
glfw/vulkan.c
vendored
3
glfw/vulkan.c
vendored
@ -128,13 +128,10 @@ bool _glfwInitVulkan(int mode)
|
|||||||
else if (strcmp(ep[i].extensionName, "VK_KHR_win32_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_KHR_win32_surface") == 0)
|
||||||
_glfw.vk.KHR_win32_surface = true;
|
_glfw.vk.KHR_win32_surface = true;
|
||||||
#elif defined(_GLFW_COCOA)
|
#elif defined(_GLFW_COCOA)
|
||||||
#if defined(VK_USE_PLATFORM_MACOS_MVK)
|
|
||||||
else if (strcmp(ep[i].extensionName, "VK_MVK_macos_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_MVK_macos_surface") == 0)
|
||||||
_glfw.vk.MVK_macos_surface = true;
|
_glfw.vk.MVK_macos_surface = true;
|
||||||
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
||||||
else if (strcmp(ep[i].extensionName, "VK_EXT_metal_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_EXT_metal_surface") == 0)
|
||||||
_glfw.vk.EXT_metal_surface = true;
|
_glfw.vk.EXT_metal_surface = true;
|
||||||
#endif
|
|
||||||
#elif defined(_GLFW_X11)
|
#elif defined(_GLFW_X11)
|
||||||
else if (strcmp(ep[i].extensionName, "VK_KHR_xlib_surface") == 0)
|
else if (strcmp(ep[i].extensionName, "VK_KHR_xlib_surface") == 0)
|
||||||
_glfw.vk.KHR_xlib_surface = true;
|
_glfw.vk.KHR_xlib_surface = true;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user