여기까지가 딱 플랫폼 종속적인 코드 생성같음.
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;
}
프갤로