여기까지가 딱 플랫폼 종속적인 코드 생성같음.

bool VulkanApp::OnInit() { frame_ = new wxFrame{nullptr, wxID_ANY, wxT("Hello, World!")}; frame_->Show(); std::vector<const char*> instanceExtensionNames{VK_KHR_SURFACE_EXTENSION_NAME}; VkResult ret{}; VkPhysicalDevice vkPhysicalDevice{}; VkInstanceCreateInfo instanceDesc{}; VkPhysicalDeviceProperties vkDeviceProps{}; instanceDesc.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; #if defined(WIN32) instanceExtensionNames.emplace_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else instanceExtensionNames.emplace_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); instanceExtensionNames.emplace_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); #endif instanceDesc.ppEnabledExtensionNames = instanceExtensionNames.data(); instanceDesc.enabledExtensionCount = instanceExtensionNames.size(); ret = vkCreateInstance(&instanceDesc, nullptr, &vkInstance_); uint32_t physicalDeviceCount{1}; vkEnumeratePhysicalDevices(vkInstance_, &physicalDeviceCount, &vkPhysicalDevice); vkGetPhysicalDeviceProperties(vkPhysicalDevice, &vkDeviceProps); wxLogGeneric(wxLOG_Info, wxT("Device Name: %s, API Version: %d.%d.%d"), vkDeviceProps.deviceName, VK_API_VERSION_MAJOR(vkDeviceProps.apiVersion), VK_API_VERSION_MINOR(vkDeviceProps.apiVersion), VK_API_VERSION_PATCH(vkDeviceProps.apiVersion)); VkDeviceCreateInfo deviceDesc{}; deviceDesc.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; vkCreateDevice(vkPhysicalDevice, &deviceDesc, nullptr, &vkDevice_); if(vkDevice_ == nullptr) wxLogGeneric(wxLOG_Error, "Failed to create device"); else wxLogStatus( "Success to create device"); vkGetPhysicalDeviceMemoryProperties(vkPhysicalDevice, &vkMemoryProps_); // 스왑체인 생성을 위한 서페이스 생성 #if defined(__WXGTK3__) GdkDisplay *display = gdk_display_get_default (); #if !defined(WIN32) if(GDK_IS_X11_DISPLAY (display)) { VkXlibSurfaceCreateInfoKHR surfaceDesc{}; surfaceDesc.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; surfaceDesc.window = gdk_x11_window_get_xid(frame_->GTKGetDrawingWindow()); surfaceDesc.dpy = gdk_x11_display_get_xdisplay(display); ret = vkCreateXlibSurfaceKHR(vkInstance_, &surfaceDesc, nullptr, &vkSurface_); } else if(GDK_IS_WAYLAND_DISPLAY(display)) { VkWaylandSurfaceCreateInfoKHR surfaceDesc{}; surfaceDesc.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; surfaceDesc.display = gdk_wayland_display_get_wl_display(display); surfaceDesc.surface = gdk_wayland_window_get_wl_surface(frame_->GTKGetDrawingWindow()); ret = vkCreateWaylandSurfaceKHR(vkInstance_, &surfaceDesc, nullptr, &vkSurface_); } #else // TODO: create surface using Win32 #endif #elif defined(__WXMSW__) VkWin32SurfaceCreateInfoKHR surfaceDesc{}; surfaceDesc.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; surfaceDesc.hinstance = GetModuleHandle(nullptr); surfaceDesc.hwnd = frame_->GetHWND(); ret = vkCreateWin32SurfaceKHR(vkInstance_, &surfaceDesc, nullptr, &vkSurface_); #endif const char* errorCodeStr = nullptr; switch(ret) { case VK_ERROR_OUT_OF_DEVICE_MEMORY: errorCodeStr = "VK_ERROR_OUT_OF_DEVICE_MEMORY"; break; case VK_ERROR_OUT_OF_HOST_MEMORY: errorCodeStr = "VK_ERROR_OUT_OF_HOST_MEMORY"; break; default: errorCodeStr = "Unknown"; break; } if(vkSurface_ == nullptr) wxLogGeneric(wxLOG_Error, "Failed to create surface. ret code: %s", errorCodeStr); else wxLogStatus( "Success to create surface"); uint32_t queueCount{}; std::vector<VkQueueFamilyProperties> queueFamilyProps{}; vkGetPhysicalDeviceQueueFamilyProperties(vkPhysicalDevice, &queueCount, nullptr); { // for(auto i{0u}; i < queueCount) } //vkGetPhysicalDeviceSurfaceSupportKHR() // 이제 스왑체인을 생성하자 VkSwapchainCreateInfoKHR swapChainDesc{}; swapChainDesc.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; swapChainDesc.surface = vkSurface_; //swapChainDesc. // vkCreateSwapchainKHR(vkDevice_, ) return true; }