/*
VulkanFramework
by John Ryland
Copyright (c) 2023
*/
////////////////////////////////////////////////////////////////////////////////////
// Vulkan SwapChain
#include "VulkanSwapChain.h"
#include <memory>
namespace Vulkan {
SwapChain::SwapChain(Device& device, Surface& surface)
: m_owner(device)
, m_surface(surface)
{
Create();
}
// virtual
SwapChain::~SwapChain()
{
Destroy();
}
// virtual
void SwapChain::Create()
{
m_presentMode = SelectPresentMode();
}
// virtual
void SwapChain::Destroy()
{
}
// virtual
VkPresentModeKHR SwapChain::SelectPresentMode()
{
return m_surface.m_presentMode;
}
} // Vulkan namespace
/*
struct SwapChainSupportDetails
{
VkSurfaceCapabilitiesKHR capabilities;
std::vector<VkSurfaceFormatKHR> formats;
std::vector<VkPresentModeKHR> presentModes;
};
void SwapChain::Prepare(uint32_t width, uint32_t height)
{
//ImGui_ImplVulkan_SetMinImageCount(m_MinImageCount);
//ImGui_ImplVulkanH_CreateOrResizeWindow(m_Instance, m_PhysicalDevice, m_Device, &m_MainWindowData, m_QueueFamily, m_Allocator, width, height, m_MinImageCount);
}
void SwapChain::FramePresent()
{
if (m_SwapChainRebuild)
return;
VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore;
VkPresentInfoKHR info = {};
info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
info.waitSemaphoreCount = 1;
info.pWaitSemaphores = &render_complete_semaphore;
info.swapchainCount = 1;
info.pSwapchains = &wd->Swapchain;
info.pImageIndices = &wd->FrameIndex;
VkResult err = vkQueuePresentKHR(m_Queue, &info);
if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR)
{
m_SwapChainRebuild = true;
return;
}
check_vk_result(err);
wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->ImageCount; // Now we can use the next set of semaphores
}
*/