diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78de02a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea/ +.vscode/ +VulkanTest diff --git a/Makefile b/Makefile index 7490fcf..5d1825f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ -CFLAGS = -std=c++17 -o2 -I. -I$(VULKAN_SDK_PATH)/include -LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan -ldl -lpthread -lX11 -lXrandr -lXi +VULKAN_SDK_PATH = /Users/wanghao/VulkanSDK/1.4.328.1/macOS +CFLAGS = -std=c++17 -o2 -I. -I$(VULKAN_SDK_PATH)/include -I/opt/local/include +LDFLAGS = -L$(VULKAN_SDK_PATH)/lib -L/opt/local/lib `pkg-config --static --libs glfw3` -lvulkan -ldl -lpthread -lX11 # create list of all spv files and set as dependency vertSources = $(shell find ./shaders -type f -name "*.vert") diff --git a/hk_device.cpp b/hk_device.cpp index cf650f3..fc28176 100644 --- a/hk_device.cpp +++ b/hk_device.cpp @@ -92,11 +92,12 @@ namespace hk appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName = "No Engine"; appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); - appInfo.apiVersion = VK_API_VERSION_1_0; + appInfo.apiVersion = VK_API_VERSION_1_1; VkInstanceCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; + createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; auto extensions = getRequiredExtensions(); createInfo.enabledExtensionCount = static_cast(extensions.size()); @@ -183,8 +184,27 @@ namespace hk createInfo.pQueueCreateInfos = queueCreateInfos.data(); createInfo.pEnabledFeatures = &deviceFeatures; - createInfo.enabledExtensionCount = static_cast(deviceExtensions.size()); - createInfo.ppEnabledExtensionNames = deviceExtensions.data(); + + // Add device extensions, including portability subset if available (needed for MoltenVK) + std::vector enabledExtensions(deviceExtensions.begin(), deviceExtensions.end()); + + // Check if VK_KHR_portability_subset is available and add it if needed + uint32_t extensionCount; + vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, nullptr); + std::vector availableExtensions(extensionCount); + vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, availableExtensions.data()); + + for (const auto &extension : availableExtensions) + { + if (strcmp(extension.extensionName, "VK_KHR_portability_subset") == 0) + { + enabledExtensions.push_back("VK_KHR_portability_subset"); + break; + } + } + + createInfo.enabledExtensionCount = static_cast(enabledExtensions.size()); + createInfo.ppEnabledExtensionNames = enabledExtensions.data(); // might not really be necessary anymore because device specific validation layers // have been deprecated @@ -314,6 +334,9 @@ namespace hk extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); } + // Required for macOS MoltenVK portability + extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + return extensions; }