diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | include/defines.hpp | 2 | ||||
| -rw-r--r-- | include/vk-api.hpp | 3 | ||||
| -rw-r--r-- | include/vulkan-loader.hpp | 4 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/vk-api.cpp | 17 | ||||
| -rw-r--r-- | src/vk-context.cpp | 2 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 9 | ||||
| -rw-r--r-- | src/vulkan-loader.cpp | 2 | ||||
| -rw-r--r-- | src/window.cpp | 7 |
10 files changed, 35 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index af44977..f857345 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ project(path-tracer VERSION 1.0 LANGUAGES CXX) find_package(imgui CONFIG REQUIRED) find_package(Vulkan REQUIRED) -if(UNIX) +if(${CMAKE_SYSTEM_NAME} EQUAL "Linux") find_package(X11 REQUIRED) endif() diff --git a/include/defines.hpp b/include/defines.hpp index 2cb14a0..2b56c7a 100644 --- a/include/defines.hpp +++ b/include/defines.hpp @@ -5,6 +5,8 @@ #define LINUX #elif defined(_WIN32) || defined(_WIN64) #define WINDOWS +#elif defined(__APPLE__) +#define MACOS #endif #endif // !__DEFINES_HPP_ diff --git a/include/vk-api.hpp b/include/vk-api.hpp index 284f75c..59d09b7 100644 --- a/include/vk-api.hpp +++ b/include/vk-api.hpp @@ -2,7 +2,6 @@ #define __VK_API_HPP_ #include <vector> -#include <optional> #include <string> #include "vk-context.hpp" @@ -101,7 +100,7 @@ class vkapi { void destroy_surface(VkSurfaceKHR surface); - Swapchain create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VkImageUsageFlags usages, std::optional<std::reference_wrapper<Swapchain>> old_swapchain); + Swapchain create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VkImageUsageFlags usages, VkSwapchainKHR old_swapchain); void destroy_swapchain(Swapchain& swapchain); void update_descriptor_set_buffer(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, Buffer& buffer); diff --git a/include/vulkan-loader.hpp b/include/vulkan-loader.hpp index 243221d..b4bef68 100644 --- a/include/vulkan-loader.hpp +++ b/include/vulkan-loader.hpp @@ -7,6 +7,8 @@ #define VK_USE_PLATFORM_WIN32_KHR #elif defined(LINUX) #define VK_USE_PLATFORM_XCB_KHR +#elif defined(MACOS) +#define VK_USE_PLATFORM_METAL_EXT #endif #define VK_NO_PROTOTYPES @@ -28,6 +30,8 @@ #define PLATFORM_VULKAN_INSTANCE_FUNCTIONS X(vkCreateWin32SurfaceKHR) #elif defined(VK_USE_PLATFORM_XCB_KHR) #define PLATFORM_VULKAN_INSTANCE_FUNCTIONS X(vkCreateXcbSurfaceKHR) +#elif defined(VK_USE_PLATFORM_METAL_EXT) +#define PLATFORM_VULKAN_INSTANCE_FUNCTIONS X(vkCreateMetalSurfaceEXT) #else #define PLATFORM_VULKAN_INSTANCE_FUNCTIONS #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5380cde..6ebef73 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES) include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${Vulkan_INCLUDE_DIRS}) -if(UNIX) +if(${CMAKE_SYSTEM_NAME} EQUAL "Linux") include_directories(${X11_xcb_INCLUDE_PATH}) endif() @@ -24,7 +24,7 @@ add_executable( window.cpp ) -if(UNIX) +if(${CMAKE_SYSTEM_NAME} EQUAL "Linux") list(APPEND LIBRARIES ${CMAKE_DL_LIBS} ${X11_xcb_LIB} ${X11_xkbcommon_LIB} ${X11_xkbcommon_X11_LIB}) endif() diff --git a/src/vk-api.cpp b/src/vk-api.cpp index 440af02..dc30520 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -666,6 +666,14 @@ VkSurfaceKHR vkapi::create_surface(window& wnd) { create_info.hwnd = wnd.win_handle; VKRESULT(vkCreateWin32SurfaceKHR(context.instance, &create_info, nullptr, &surface)) +#elif defined(MACOS) + VkMetalSurfaceCreateInfoEXT create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; + create_info.pNext = nullptr; + create_info.flags = 0; + // create_info.pLayer = GetModuleHandle(NULL); + + VKRESULT(vkCreateMetalSurfaceEXT(context.instance, &create_info, nullptr, &surface)) #endif return surface; @@ -676,7 +684,7 @@ void vkapi::destroy_surface(VkSurfaceKHR surface) { } -Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VkImageUsageFlags usages, std::optional<std::reference_wrapper<Swapchain>> old_swapchain) { +Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VkImageUsageFlags usages, VkSwapchainKHR old_swapchain) { Swapchain swapchain; VkBool32 queue_support_presentation = VK_FALSE; VKRESULT(vkGetPhysicalDeviceSurfaceSupportKHR(context.physical_device, context.queue_index, surface, &queue_support_presentation)) @@ -713,7 +721,6 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, VKRESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(context.physical_device, surface, &supported_present_modes_count, supported_present_modes.data())) swapchain.surface_format = supported_formats[0]; - VkSwapchainKHR old_swapchain_handle = (old_swapchain != std::nullopt) ? old_swapchain.value().get().handle : VK_NULL_HANDLE; VkSwapchainCreateInfoKHR create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; @@ -731,14 +738,10 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR; create_info.clipped = VK_TRUE; - create_info.oldSwapchain = old_swapchain_handle; + create_info.oldSwapchain = old_swapchain; VKRESULT(vkCreateSwapchainKHR(context.device, &create_info, nullptr, &swapchain.handle)) - if (old_swapchain != std::nullopt) { - destroy_swapchain(old_swapchain.value()); - } - uint32_t image_count = 0; VKRESULT(vkGetSwapchainImagesKHR(context.device, swapchain.handle, &image_count, VK_NULL_HANDLE)) diff --git a/src/vk-context.cpp b/src/vk-context.cpp index 936efb7..ce593ab 100644 --- a/src/vk-context.cpp +++ b/src/vk-context.cpp @@ -54,6 +54,8 @@ void vkcontext::create_instance() { "VK_KHR_xcb_surface" #elif defined(WINDOWS) "VK_KHR_win32_surface" +#elif defined(MACOS) + "VK_EXT_metal_surface" #endif }; diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index dfd2bca..8d074c5 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -2,8 +2,6 @@ #include <cstring> #include <cassert> -#include <functional> - #include "imgui.h" #include "vk-renderer.hpp" #include "thirdparty/vk_mem_alloc.h" @@ -34,7 +32,7 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT, - std::nullopt + VK_NULL_HANDLE ); compute_sets_bindings = { @@ -406,13 +404,16 @@ void vkrenderer::finish_frame() { void vkrenderer::recreate_swapchain() { VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX)) + Swapchain old_swapchain = swapchain; swapchain = api.create_swapchain( platform_surface, min_swapchain_image_count, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT, - std::optional<std::reference_wrapper<Swapchain>> { std::ref(swapchain) } + old_swapchain.handle ); + api.destroy_swapchain(old_swapchain); + api.destroy_images(accumulation_images); VkExtent3D image_size = { .width = swapchain.extent.width, diff --git a/src/vulkan-loader.cpp b/src/vulkan-loader.cpp index 2214bbf..044ccee 100644 --- a/src/vulkan-loader.cpp +++ b/src/vulkan-loader.cpp @@ -11,7 +11,7 @@ HMODULE vulkanLibrary = LoadLibrary("vulkan-1.dll"); #define LoadProcAddress GetProcAddress -#elif defined(LINUX) +#elif defined(LINUX) || defined(MACOS) #include <dlfcn.h> void *vulkanLibrary = dlopen( "libvulkan.so.1", RTLD_NOW ); diff --git a/src/window.cpp b/src/window.cpp index 320e282..793f67d 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -345,4 +345,11 @@ LRESULT window::message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lpar } return 0; } +#elif defined(MACOS) +window::window(uint32_t width, uint32_t height) { +} + +window::~window() {}; + +void window::poll_events() {} #endif |
