45VkExtent2D
ChooseSwapExtent(GLFWwindow* window,
const VkSurfaceCapabilitiesKHR& capabilities) {
46 if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
47 return capabilities.currentExtent;
50 glfwGetFramebufferSize(window, &width, &height);
52 VkExtent2D actualExtent = {
53 static_cast<uint32_t
>(width),
54 static_cast<uint32_t
>(height)
57 actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);
58 actualExtent.height = std::clamp(actualExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height);
78 win = glfwCreateWindow(Width, Height, title.c_str(),
nullptr,
nullptr);
81 int n = glfwGetError(&error);
93 vkWindow* vkwindow =
new vkWindow();
94 vkwindow->details =
new Details();
95 vkwindow->details->
Window = win;
96 vkwindow->details->
surface = surface;
97 glfwSetWindowUserPointer(win, vkwindow->details);
103 vkGetPhysicalDeviceSurfaceCapabilitiesKHR(pdevice, surface, &swapDetails.
capabilities);
104 uint32_t formatCount;
105 vkGetPhysicalDeviceSurfaceFormatsKHR(pdevice, surface, &formatCount,
nullptr);
106 if (formatCount != 0) {
107 swapDetails.
formats.resize(formatCount);
108 vkGetPhysicalDeviceSurfaceFormatsKHR(pdevice, surface, &formatCount, swapDetails.
formats.data());
110 uint32_t presentModeCount;
111 vkGetPhysicalDeviceSurfacePresentModesKHR(pdevice, surface, &presentModeCount,
nullptr);
113 if (presentModeCount != 0) {
115 vkGetPhysicalDeviceSurfacePresentModesKHR(pdevice, surface, &presentModeCount, swapDetails.
presentModes.data());
118 bool swapChainAdequate = !swapDetails.
formats.empty() && !swapDetails.
presentModes.empty();
120 if(!swapChainAdequate){
132 uint32_t imageCount = swapDetails.
capabilities.minImageCount + 1;
138 VkSwapchainCreateInfoKHR createInfo{};
139 createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
140 createInfo.surface = surface;
142 createInfo.minImageCount = imageCount;
143 createInfo.imageFormat = surfaceFormat.format;
144 createInfo.imageColorSpace = surfaceFormat.colorSpace;
145 createInfo.imageExtent = extent;
146 createInfo.imageArrayLayers = 1;
147 createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
148 createInfo.preTransform = swapDetails.
capabilities.currentTransform;
149 createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
150 createInfo.presentMode = presentMode;
151 createInfo.clipped = VK_TRUE;
154 createInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
155 createInfo.queueFamilyIndexCount = 2;
157 createInfo.pQueueFamilyIndices = queueFamilyIndices;
159 createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
160 createInfo.queueFamilyIndexCount = 0;
161 createInfo.pQueueFamilyIndices =
nullptr;
164 VkSwapchainKHR swapchain;
166 if (vkCreateSwapchainKHR(
vkBackend::GetDevice(), &createInfo,
nullptr, &swapchain) != VK_SUCCESS) {
168 throw std::runtime_error(
"failed to create swap chain!");
172 vkwindow->swapchain =
vkSwapchain(swapchain, surfaceFormat.format, extent);