Skip to content

Commit 257df74

Browse files
Fix for missing surface info on macOS and iOS (#214)
* Fix for missing surface info on macOS and iOS * Missed a couple of things for iOS and portability extension
1 parent b302c07 commit 257df74

4 files changed

Lines changed: 61 additions & 36 deletions

File tree

appleutils.mm

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1-
#ifdef VK_USE_PLATFORM_IOS_MVK
2-
// iOS Utility Functions
3-
#import <UIKit/UIKit.h>
1+
#ifdef VK_USE_PLATFORM_METAL_EXT
42

3+
#import <Foundation/Foundation.h>
4+
#import <QuartzCore/CAMetalLayer.h>
5+
#include <TargetConditionals.h>
6+
7+
#if TARGET_OS_IPHONE
8+
#include <UIKit/UIView.h>
9+
#else
10+
#import <AppKit/AppKit.h>
11+
#endif
12+
13+
#import <Metal/Metal.h>
14+
#import <MetalKit/MetalKit.h>
515

616
extern "C" void setWorkingFolderForiOS(void)
717
{
@@ -22,4 +32,22 @@
2232
return cWorkingFolder;
2333
}
2434

35+
36+
extern "C" void *makeViewMetalCompatible(void* handle)
37+
{
38+
#if TARGET_OS_IPHONE
39+
UIView* view = (__bridge UIView*)handle;
40+
assert([view isKindOfClass:[UIView class]]);
41+
42+
void *pLayer =(__bridge void*)view.layer;
43+
return pLayer;
44+
#else
45+
NSView* view = (__bridge NSView*)handle;
46+
assert([view isKindOfClass:[NSView class]]);
47+
48+
void *pLayer = (__bridge void *)view.layer;
49+
return pLayer;
50+
#endif
51+
}
52+
2553
#endif

vulkanCapsViewer.pro

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ android {
5959
android/res/values/libs.xml
6060
}
6161
macx {
62-
DEFINES += VK_USE_PLATFORM_MACOS_MVK
62+
DEFINES += VK_USE_PLATFORM_METAL_EXT
6363
VULKAN_DYLIB = $(VULKAN_SDK)/lib/libvulkan.dylib
6464
LIBS += $$VULKAN_DYLIB -framework Cocoa -framework QuartzCore
6565
OBJECTIVE_SOURCES += appleutils.mm
@@ -68,8 +68,9 @@ macx {
6868
ios {
6969
TARGET = "Vulkan Caps Viewer"
7070
QMAKE_INFO_PLIST = iOS/Info.plist
71-
DEFINES += VK_USE_PLATFORM_IOS_MVK
72-
LIBS += /Users/lunarg/dev/VulkanSDK/MoltenVK/MoltenVk.xcframework/ios-arm64/libMoltenVK.a
71+
DEFINES += VK_USE_PLATFORM_METAL_EXT
72+
DEFINES += VK_USE_PLATFORM_MACOS_MVK
73+
LIBS += $(VULKAN_SDK)/lib/MoltenVk.xcframework/ios-arm64/libMoltenVK.a
7374
LIBS += -framework QuartzCore
7475
OBJECTIVE_SOURCES += appleutils.mm
7576
ICON = $${PWD}/iOS/vulkanCapsViewer.png

vulkancapsviewer.cpp

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@
7474
#ifdef __APPLE__
7575
#include <vulkan/vulkan_metal.h>
7676

77-
#ifdef VK_USE_PLATFORM_IOS_MVK
77+
78+
#ifdef VK_USE_PLATFORM_METAL_EXT
7879
extern "C" const char *getWorkingFolderForiOS(void);
80+
extern "C" void *makeViewMetalCompatible(void* handle);
7981
#endif
8082
#endif
8183

@@ -119,12 +121,9 @@ OSInfo getOperatingSystem()
119121
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
120122
osInfo.type = 2;
121123
#endif
122-
#if defined(VK_USE_PLATFORM_MACOS_MVK)
124+
#if defined(VK_USE_PLATFORM_METAL_EXT)
123125
osInfo.type = 3;
124126
#endif
125-
#if defined(VK_USE_PLATFORM_IOS_MVK)
126-
osInfo.type = 4;
127-
#endif
128127

129128
return osInfo;
130129
}
@@ -307,7 +306,7 @@ VulkanCapsViewer::VulkanCapsViewer(QWidget *parent)
307306
VulkanCapsViewer::~VulkanCapsViewer()
308307
{
309308
// Free up hidden window used on Apple platforms
310-
#if defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)
309+
#if defined(VK_USE_PLATFORM_METAL_EXT)
311310
if(pMetalSurrogate != nullptr)
312311
delete pMetalSurrogate;
313312
#endif
@@ -623,13 +622,9 @@ bool VulkanCapsViewer::initVulkan()
623622
VK_KHR_XCB_SURFACE_EXTENSION_NAME,
624623
#endif
625624

626-
//#if defined(VK_USE_PLATFORM_MACOS_MVK)
627-
// VK_MVK_MACOS_SURFACE_EXTENSION_NAME,
628-
//#endif
629-
//
630-
//#if defined(VK_USE_PLATFORM_IOS_MVK)
631-
// VK_MVK_IOS_SURFACE_EXTENSION_NAME,
632-
//#endif
625+
#if defined(VK_USE_PLATFORM_METAL_EXT)
626+
VK_EXT_METAL_SURFACE_EXTENSION_NAME,
627+
#endif
633628
};
634629

635630
std::vector<const char*> enabledExtensions = {};
@@ -643,9 +638,6 @@ bool VulkanCapsViewer::initVulkan()
643638
enabledExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
644639
}
645640

646-
#if __APPLE__
647-
enabledExtensions.push_back("VK_EXT_metal_surface");
648-
#endif
649641

650642
std::vector<std::string> surfaceExtensionsAvailable = {};
651643

@@ -683,13 +675,14 @@ bool VulkanCapsViewer::initVulkan()
683675
if (strcmp(ext.extensionName, VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME) == 0) {
684676
enabledExtensions.push_back(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME);
685677
}
686-
}
687678

688679
#if defined(__APPLE__) && (VK_HEADER_VERSION >= 216)
689-
instanceCreateInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
690-
enabledExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
691-
enabledExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
680+
if(strcmp(ext.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) {
681+
instanceCreateInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
682+
enabledExtensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
683+
}
692684
#endif
685+
}
693686

694687
instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
695688
instanceCreateInfo.enabledExtensionCount = (uint32_t)enabledExtensions.size();
@@ -812,13 +805,16 @@ bool VulkanCapsViewer::initVulkan()
812805
#endif
813806

814807
// This works for deskop and iOS devices
815-
#if __APPLE__
816-
VkMetalSurfaceCreateInfoEXT info = {};
817-
info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
818-
info.pNext = nullptr;
819-
info.pLayer = (void*)pMetalSurrogate->winId();
820-
info.flags = 0;
821-
vkCreateMetalSurfaceEXT(vulkanContext.instance, &info, nullptr, &vulkanContext.surface);
808+
#if defined(VK_USE_PLATFORM_METAL_EXT)
809+
if(surface_extension == VK_EXT_METAL_SURFACE_EXTENSION_NAME) {
810+
pMetalSurrogate = new QVukanSurrogate;
811+
VkMetalSurfaceCreateInfoEXT info = {};
812+
info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
813+
info.pNext = nullptr;
814+
info.pLayer = (void*)makeViewMetalCompatible((void*)pMetalSurrogate->winId());
815+
info.flags = 0;
816+
surfaceResult = vkCreateMetalSurfaceEXT(vulkanContext.instance, &info, nullptr, &vulkanContext.surface);
817+
}
822818
#endif
823819

824820
if (surfaceResult == VK_SUCCESS) {
@@ -865,7 +861,7 @@ void VulkanCapsViewer::getGPUinfo(VulkanDeviceInfo *GPU, uint32_t id, VkPhysical
865861
}
866862

867863
std::vector<const char*> enabledExtensions;
868-
#if defined(VK_USE_PLATFORM_MACOS_MVK) && (VK_HEADER_VERSION >= 216)
864+
#if defined(__APPLE__) && (VK_HEADER_VERSION >= 216)
869865
enabledExtensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
870866
#endif
871867

vulkancapsviewer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
extern "C" void setWorkingFolderForiOS(void);
4949
#endif
5050

51-
#if defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)
51+
#if defined(VK_USE_PLATFORM_METAL_EXT)
5252
// An unseen window for macOS and iOS that has a Metal surface
5353
// attached.
5454
class QVukanSurrogate: public QWindow
@@ -85,7 +85,7 @@ class VulkanCapsViewer : public QMainWindow
8585
private:
8686
uint32_t instanceApiVersion;
8787
int selectedDeviceIndex = 0;
88-
#if defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)
88+
#if defined(VK_USE_PLATFORM_METAL_EXT)
8989
QVukanSurrogate *pMetalSurrogate = nullptr;
9090
#endif
9191
Ui::vulkanCapsViewerClass ui;

0 commit comments

Comments
 (0)