| // 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(vk::Semaphore 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); | |
| } |