You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.3 KiB
90 lines
3.3 KiB
// 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);
|
|
}
|