diff --git a/README.md b/README.md index 808a7f04..7077d5ec 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ $ cmake -B .build0 -S xo-cmake -DCMAKE_INSTALL_PREFIX=${PREFIX} $ cmake --build .build0 $ cmake --install .build0 # phase 2 -$ cmake -B .build -S . -DCMAKE_INSTALL_PREFIX=${PREFIX} -DXO_ENABLE_EXAMPLES=1 +$ cmake -B .build -S . -DCMAKE_INSTALL_PREFIX=${PREFIX} -DXO_ENABLE_EXAMPLES=1 -DCMAKE_BUILD_TYPE=debug $ cmake --build .build --verbose $ cmake --install .build ``` diff --git a/xo-imgui/example/ex4a/VulkanApp.cpp b/xo-imgui/example/ex4a/VulkanApp.cpp index 1e5b7b0e..5452bbaa 100644 --- a/xo-imgui/example/ex4a/VulkanApp.cpp +++ b/xo-imgui/example/ex4a/VulkanApp.cpp @@ -36,14 +36,59 @@ MinimalImGuiVulkan::init_vulkan() { this->create_surface(); this->pick_physical_device(); this->create_logical_device(); - this->createSwapchain(); - this->createImageViews(); - this->createRenderPass(); // must come before createFrameBuffers - this->createFramebuffers(); + this->create_swapchain(); + this->create_image_views(); + this->create_render_pass(); // must come before createFrameBuffers + this->create_framebuffers(); this->create_command_pool(); this->create_command_buffers(); this->create_sync_objects(); this->create_descriptor_pool(); } +void +MinimalImGuiVulkan::create_instance() { + VkApplicationInfo appInfo{}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pApplicationName = "ImGui Vulkan App"; + 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; + + VkInstanceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + createInfo.pApplicationInfo = &appInfo; + + uint32_t extensionCount = 0; + if (!SDL_Vulkan_GetInstanceExtensions(window_, &extensionCount, nullptr)) { + throw std::runtime_error("Failed to get SDL Vulkan extensions!"); + } + + std::vector extensions(extensionCount); + if (!SDL_Vulkan_GetInstanceExtensions(window_, &extensionCount, extensions.data())) { + throw std::runtime_error("Failed to get SDL Vulkan extensions!"); + } + +#ifdef __apple__ + // Add portability extension for MoltenVK (macOS) + extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); +#endif + + createInfo.enabledExtensionCount = extensions.size(); + createInfo.ppEnabledExtensionNames = extensions.data(); + createInfo.enabledLayerCount = 0; + +#ifdef __apple__ + // CRITICAL: Enable portability enumeration flag for MoltenVK + createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; +#endif + + int result = vkCreateInstance(&createInfo, nullptr, &(this->instance_)); + if (result != VK_SUCCESS) { + printf("vkCreateInstance failed with error: %d\n", result); + throw std::runtime_error("Failed to create instance!"); + } +} + /* end VulkanApp.cpp */ diff --git a/xo-imgui/example/ex4a/VulkanApp.hpp b/xo-imgui/example/ex4a/VulkanApp.hpp index 82839cad..8340b745 100644 --- a/xo-imgui/example/ex4a/VulkanApp.hpp +++ b/xo-imgui/example/ex4a/VulkanApp.hpp @@ -19,56 +19,17 @@ public: private: /* create SDL window for application. - * populates @p window_ + * populates @ref window_ */ void init_sdl_window(); /* setup vulkan state. swapchain, command buffers etc */ void init_vulkan(); - void create_instance() { - VkApplicationInfo appInfo{}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pApplicationName = "ImGui Vulkan App"; - 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; - - VkInstanceCreateInfo createInfo{}; - createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - createInfo.pApplicationInfo = &appInfo; - - uint32_t extensionCount = 0; - if (!SDL_Vulkan_GetInstanceExtensions(window_, &extensionCount, nullptr)) { - throw std::runtime_error("Failed to get SDL Vulkan extensions!"); - } - - std::vector extensions(extensionCount); - if (!SDL_Vulkan_GetInstanceExtensions(window_, &extensionCount, extensions.data())) { - throw std::runtime_error("Failed to get SDL Vulkan extensions!"); - } - -#ifdef __apple__ - // Add portability extension for MoltenVK (macOS) - extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); -#endif - - createInfo.enabledExtensionCount = extensions.size(); - createInfo.ppEnabledExtensionNames = extensions.data(); - createInfo.enabledLayerCount = 0; - -#ifdef __apple__ - // CRITICAL: Enable portability enumeration flag for MoltenVK - createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; -#endif - - int result = vkCreateInstance(&createInfo, nullptr, &(this->instance_)); - if (result != VK_SUCCESS) { - printf("vkCreateInstance failed with error: %d\n", result); - throw std::runtime_error("Failed to create instance!"); - } - } + /* create vulkan instance. + * populates @ref instance_ + */ + void create_instance(); void create_surface() { if (!SDL_Vulkan_CreateSurface(window_, instance_, &surface)) { @@ -134,7 +95,7 @@ private: vkGetDeviceQueue(device, graphicsQueueFamily, 0, &graphicsQueue); } - void createSwapchain() { + void create_swapchain() { VkSurfaceCapabilitiesKHR capabilities; vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device_, surface, &capabilities); @@ -179,7 +140,7 @@ private: vkGetSwapchainImagesKHR(device, swapchain, &imageCount, swapchainImages.data()); } - void createImageViews() { + void create_image_views() { swapchainImageViews.resize(swapchainImages.size()); for (size_t i = 0; i < swapchainImages.size(); i++) { @@ -204,7 +165,7 @@ private: } } - void createRenderPass() { + void create_render_pass() { VkAttachmentDescription colorAttachment{}; colorAttachment.format = swapchainImageFormat; colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT; @@ -246,7 +207,7 @@ private: } } - void createFramebuffers() { + void create_framebuffers() { framebuffers.resize(swapchainImageViews.size()); for (size_t i = 0; i < swapchainImageViews.size(); i++) { @@ -441,7 +402,7 @@ private: case VK_SUBOPTIMAL_KHR: break; case VK_ERROR_OUT_OF_DATE_KHR: - recreateSwapchain(); + recreate_swapchain(); // deliberate earlyexit return; default: @@ -497,7 +458,7 @@ private: case VK_ERROR_OUT_OF_DATE_KHR: case VK_SUBOPTIMAL_KHR: framebuffer_resized_flag_ = false; - this->recreateSwapchain(); + this->recreate_swapchain(); break; default: throw std::runtime_error("failed to present swapchain image!"); @@ -557,7 +518,7 @@ private: } } - void recreateSwapchain() { + void recreate_swapchain() { // handle window minimization: wait until window has valid size int width = 0; int height = 0; @@ -576,9 +537,9 @@ private: this->cleanupSwapchain(); // create new swapchain - this->createSwapchain(); - this->createImageViews(); - this->createFramebuffers(); + this->create_swapchain(); + this->create_image_views(); + this->create_framebuffers(); } void cleanupFrameBuffers() {