| // Copyright 2021 The SwiftShader Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "Swapchain.hpp" |
| #include "Window.hpp" |
| |
| Swapchain::Swapchain(vk::PhysicalDevice physicalDevice, vk::Device device, Window &window) |
| : device(device) |
| { |
| vk::SurfaceKHR surface = window.getSurface(); |
| |
| // Create the swapchain |
| vk::SurfaceCapabilitiesKHR surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR(surface); |
| extent = surfaceCapabilities.currentExtent; |
| |
| vk::SwapchainCreateInfoKHR swapchainCreateInfo; |
| swapchainCreateInfo.surface = surface; |
| swapchainCreateInfo.minImageCount = 2; // double-buffered |
| swapchainCreateInfo.imageFormat = colorFormat; |
| swapchainCreateInfo.imageColorSpace = vk::ColorSpaceKHR::eSrgbNonlinear; |
| swapchainCreateInfo.imageExtent = extent; |
| swapchainCreateInfo.imageUsage = vk::ImageUsageFlagBits::eColorAttachment; |
| swapchainCreateInfo.preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity; |
| swapchainCreateInfo.imageArrayLayers = 1; |
| swapchainCreateInfo.imageSharingMode = vk::SharingMode::eExclusive; |
| swapchainCreateInfo.presentMode = vk::PresentModeKHR::eFifo; |
| swapchainCreateInfo.clipped = VK_TRUE; |
| swapchainCreateInfo.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque; |
| |
| swapchain = device.createSwapchainKHR(swapchainCreateInfo); |
| |
| // Obtain the images and create views for them |
| images = device.getSwapchainImagesKHR(swapchain); |
| |
| imageViews.resize(images.size()); |
| for(size_t i = 0; i < imageViews.size(); i++) |
| { |
| vk::ImageViewCreateInfo colorAttachmentView; |
| colorAttachmentView.image = images[i]; |
| colorAttachmentView.viewType = vk::ImageViewType::e2D; |
| colorAttachmentView.format = colorFormat; |
| colorAttachmentView.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; |
| colorAttachmentView.subresourceRange.baseMipLevel = 0; |
| colorAttachmentView.subresourceRange.levelCount = 1; |
| colorAttachmentView.subresourceRange.baseArrayLayer = 0; |
| colorAttachmentView.subresourceRange.layerCount = 1; |
| |
| imageViews[i] = device.createImageView(colorAttachmentView); |
| } |
| } |
| |
| Swapchain::~Swapchain() |
| { |
| for(auto &imageView : imageViews) |
| { |
| device.destroyImageView(imageView, nullptr); |
| } |
| |
| device.destroySwapchainKHR(swapchain, nullptr); |
| } |
| |
| void Swapchain::acquireNextImage(VkSemaphore presentCompleteSemaphore, uint32_t &imageIndex) |
| { |
| auto result = device.acquireNextImageKHR(swapchain, UINT64_MAX, presentCompleteSemaphore, vk::Fence()); |
| imageIndex = result.value; |
| } |
| |
| void Swapchain::queuePresent(vk::Queue queue, uint32_t imageIndex, vk::Semaphore waitSemaphore) |
| { |
| vk::PresentInfoKHR presentInfo; |
| presentInfo.pWaitSemaphores = &waitSemaphore; |
| presentInfo.waitSemaphoreCount = 1; |
| presentInfo.swapchainCount = 1; |
| presentInfo.pSwapchains = &swapchain; |
| presentInfo.pImageIndices = &imageIndex; |
| |
| queue.presentKHR(presentInfo); |
| } |