mirror of
https://github.com/seekrs/MacroLibX.git
synced 2026-01-12 07:03:34 +00:00
fixing compatibility, workign on renderer
This commit is contained in:
39
src/renderer/swapchain/vk_framebuffer.cpp
git.filemode.normal_file
39
src/renderer/swapchain/vk_framebuffer.cpp
git.filemode.normal_file
@@ -0,0 +1,39 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_framebuffer.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:18:06 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/17 23:34:57 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include <volk.h>
|
||||
#include <renderer/core/render_core.h>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
void FrameBuffer::init(SwapChain* swapchain, ImageView& image)
|
||||
{
|
||||
VkImageView attachments[] = { image() };
|
||||
|
||||
VkFramebufferCreateInfo framebufferInfo{};
|
||||
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||
framebufferInfo.renderPass = Render_Core::get().getRenderPass().get();
|
||||
framebufferInfo.attachmentCount = 1;
|
||||
framebufferInfo.pAttachments = attachments;
|
||||
framebufferInfo.width = swapchain->_swapChainExtent.width;
|
||||
framebufferInfo.height = swapchain->_swapChainExtent.height;
|
||||
framebufferInfo.layers = 1;
|
||||
|
||||
if(vkCreateFramebuffer(Render_Core::get().getDevice().get(), &framebufferInfo, nullptr, &_framebuffer) != VK_SUCCESS)
|
||||
core::error::report(e_kind::fatal_error, "Vulkan : failed to create a framebuffer");
|
||||
}
|
||||
|
||||
void FrameBuffer::destroy() noexcept
|
||||
{
|
||||
vkDestroyFramebuffer(Render_Core::get().getDevice().get(), _framebuffer, nullptr);
|
||||
}
|
||||
}
|
||||
34
src/renderer/swapchain/vk_framebuffer.h
git.filemode.normal_file
34
src/renderer/swapchain/vk_framebuffer.h
git.filemode.normal_file
@@ -0,0 +1,34 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_framebuffer.h :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:19:44 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/18 01:07:54 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifndef __MLX_VK_FRAMEBUFFER__
|
||||
#define __MLX_VK_FRAMEBUFFER__
|
||||
|
||||
#include <volk.h>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
class FrameBuffer
|
||||
{
|
||||
public:
|
||||
void init(class SwapChain* swapchain, class ImageView& image);
|
||||
void destroy() noexcept;
|
||||
|
||||
inline VkFramebuffer& operator()() noexcept { return _framebuffer; }
|
||||
inline VkFramebuffer& get() noexcept { return _framebuffer; }
|
||||
|
||||
private:
|
||||
VkFramebuffer _framebuffer = VK_NULL_HANDLE;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __MLX_VK_FRAMEBUFFER__
|
||||
44
src/renderer/swapchain/vk_imageview.cpp
git.filemode.normal_file
44
src/renderer/swapchain/vk_imageview.cpp
git.filemode.normal_file
@@ -0,0 +1,44 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_imageview.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:20:49 by maldavid #+# #+# */
|
||||
/* Updated: 2022/10/06 18:21:51 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "vk_swapchain.h"
|
||||
#include "vk_imageview.h"
|
||||
#include <renderer/core/render_core.h>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
void ImageView::init(SwapChain* swapchain, VkImage& image)
|
||||
{
|
||||
VkImageViewCreateInfo createInfo{};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||
createInfo.image = image;
|
||||
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
createInfo.format = swapchain->_swapChainImageFormat;
|
||||
createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
createInfo.subresourceRange.baseMipLevel = 0;
|
||||
createInfo.subresourceRange.levelCount = 1;
|
||||
createInfo.subresourceRange.baseArrayLayer = 0;
|
||||
createInfo.subresourceRange.layerCount = 1;
|
||||
|
||||
if(vkCreateImageView(Render_Core::get().getDevice().get(), &createInfo, nullptr, &_image) != VK_SUCCESS)
|
||||
core::error::report(e_kind::fatal_error, "Vulkan : failed to create an image view");
|
||||
}
|
||||
|
||||
void ImageView::destroy() noexcept
|
||||
{
|
||||
vkDestroyImageView(Render_Core::get().getDevice().get(), _image, nullptr);
|
||||
}
|
||||
}
|
||||
34
src/renderer/swapchain/vk_imageview.h
git.filemode.normal_file
34
src/renderer/swapchain/vk_imageview.h
git.filemode.normal_file
@@ -0,0 +1,34 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_imageview.h :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:20:19 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/18 01:07:51 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifndef __MLX_VK_IMAGE_VIEW__
|
||||
#define __MLX_VK_IMAGE_VIEW__
|
||||
|
||||
#include <volk.h>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
class ImageView
|
||||
{
|
||||
public:
|
||||
void init(class SwapChain* swapchain, VkImage& image);
|
||||
void destroy() noexcept;
|
||||
|
||||
inline VkImageView& operator()() noexcept { return _image; }
|
||||
inline VkImageView& get() noexcept { return _image; }
|
||||
|
||||
private:
|
||||
VkImageView _image = VK_NULL_HANDLE;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __MLX_VK_IMAGE_VIEW__
|
||||
84
src/renderer/swapchain/vk_render_pass.cpp
git.filemode.normal_file
84
src/renderer/swapchain/vk_render_pass.cpp
git.filemode.normal_file
@@ -0,0 +1,84 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_render_pass.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:21:36 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/18 01:13:49 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "vk_render_pass.h"
|
||||
#include <renderer/core/render_core.h>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
void RenderPass::init()
|
||||
{
|
||||
VkAttachmentDescription colorAttachment{};
|
||||
colorAttachment.format = Render_Core::get().getSwapChain()._swapChainImageFormat;
|
||||
colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||
colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||
|
||||
VkAttachmentReference colorAttachmentRef{};
|
||||
colorAttachmentRef.attachment = 0;
|
||||
colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
|
||||
VkSubpassDescription subpass{};
|
||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||
subpass.colorAttachmentCount = 1;
|
||||
subpass.pColorAttachments = &colorAttachmentRef;
|
||||
|
||||
VkRenderPassCreateInfo renderPassInfo{};
|
||||
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||
renderPassInfo.attachmentCount = 1;
|
||||
renderPassInfo.pAttachments = &colorAttachment;
|
||||
renderPassInfo.subpassCount = 1;
|
||||
renderPassInfo.pSubpasses = &subpass;
|
||||
|
||||
if(vkCreateRenderPass(Render_Core::get().getDevice().get(), &renderPassInfo, nullptr, &_renderPass) != VK_SUCCESS)
|
||||
core::error::report(e_kind::fatal_error, "Vulkan : failed to create render pass");
|
||||
}
|
||||
|
||||
void RenderPass::begin()
|
||||
{
|
||||
if(_is_running)
|
||||
return;
|
||||
|
||||
static const VkClearValue clearColor = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||
|
||||
VkRenderPassBeginInfo renderPassInfo{};
|
||||
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||
renderPassInfo.renderPass = _renderPass;
|
||||
renderPassInfo.framebuffer = Render_Core::get().getSwapChain()._framebuffers[Render_Core::get().getImageIndex()].get();
|
||||
renderPassInfo.renderArea.offset = { 0, 0 };
|
||||
renderPassInfo.renderArea.extent = Render_Core::get().getSwapChain()._swapChainExtent;
|
||||
renderPassInfo.clearValueCount = 1;
|
||||
renderPassInfo.pClearValues = &clearColor;
|
||||
|
||||
vkCmdBeginRenderPass(Render_Core::get().getActiveCmdBuffer().get(), &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
_is_running = true;
|
||||
}
|
||||
|
||||
void RenderPass::end()
|
||||
{
|
||||
if(!_is_running)
|
||||
return;
|
||||
|
||||
vkCmdEndRenderPass(Render_Core::get().getActiveCmdBuffer().get());
|
||||
_is_running = false;
|
||||
}
|
||||
|
||||
void RenderPass::destroy() noexcept
|
||||
{
|
||||
vkDestroyRenderPass(Render_Core::get().getDevice().get(), _renderPass, nullptr);
|
||||
}
|
||||
}
|
||||
38
src/renderer/swapchain/vk_render_pass.h
git.filemode.normal_file
38
src/renderer/swapchain/vk_render_pass.h
git.filemode.normal_file
@@ -0,0 +1,38 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_render_pass.h :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:22:00 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/18 01:07:47 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifndef __MLX_VK_RENDER_PASS__
|
||||
#define __MLX_VK_RENDER_PASS__
|
||||
|
||||
#include <volk.h>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
class RenderPass
|
||||
{
|
||||
public:
|
||||
void init();
|
||||
void destroy() noexcept;
|
||||
|
||||
void begin();
|
||||
void end();
|
||||
|
||||
inline VkRenderPass& operator()() noexcept { return _renderPass; }
|
||||
inline VkRenderPass& get() noexcept { return _renderPass; }
|
||||
|
||||
private:
|
||||
VkRenderPass _renderPass = VK_NULL_HANDLE;
|
||||
bool _is_running = false;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __MLX_VK_RENDER_PASS__
|
||||
158
src/renderer/swapchain/vk_swapchain.cpp
git.filemode.normal_file
158
src/renderer/swapchain/vk_swapchain.cpp
git.filemode.normal_file
@@ -0,0 +1,158 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_swapchain.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:22:28 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/18 01:01:32 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include <renderer/core/render_core.h>
|
||||
#include <platform/window.h>
|
||||
#include <SDL2/SDL_vulkan.h>
|
||||
#include <algorithm>
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
void SwapChain::init()
|
||||
{
|
||||
_swapChainSupport = querySwapChainSupport(Render_Core::get().getDevice().getPhysicalDevice());
|
||||
|
||||
VkSurfaceFormatKHR surfaceFormat = Render_Core::get().getSurface().chooseSwapSurfaceFormat(_swapChainSupport.formats);
|
||||
VkPresentModeKHR presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;
|
||||
VkExtent2D extent = chooseSwapExtent(_swapChainSupport.capabilities);
|
||||
|
||||
uint32_t imageCount = _swapChainSupport.capabilities.minImageCount + 1;
|
||||
if(_swapChainSupport.capabilities.maxImageCount > 0 && imageCount > _swapChainSupport.capabilities.maxImageCount)
|
||||
imageCount = _swapChainSupport.capabilities.maxImageCount;
|
||||
|
||||
VkSwapchainCreateInfoKHR createInfo{};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||
createInfo.surface = Render_Core::get().getSurface().get();
|
||||
|
||||
createInfo.minImageCount = imageCount;
|
||||
createInfo.imageFormat = surfaceFormat.format;
|
||||
createInfo.imageColorSpace = surfaceFormat.colorSpace;
|
||||
createInfo.imageExtent = extent;
|
||||
createInfo.imageArrayLayers = 1;
|
||||
createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||
|
||||
Queues::QueueFamilyIndices indices = Render_Core::get().getQueue().findQueueFamilies(Render_Core::get().getDevice().getPhysicalDevice());
|
||||
uint32_t queueFamilyIndices[] = {indices.graphicsFamily.value(), indices.presentFamily.value()};
|
||||
|
||||
if(indices.graphicsFamily != indices.presentFamily)
|
||||
{
|
||||
createInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
|
||||
createInfo.queueFamilyIndexCount = 2;
|
||||
createInfo.pQueueFamilyIndices = queueFamilyIndices;
|
||||
}
|
||||
else
|
||||
createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||
|
||||
createInfo.preTransform = _swapChainSupport.capabilities.currentTransform;
|
||||
createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
|
||||
createInfo.presentMode = presentMode;
|
||||
createInfo.clipped = VK_TRUE;
|
||||
|
||||
createInfo.oldSwapchain = VK_NULL_HANDLE;
|
||||
|
||||
VkDevice device = Render_Core::get().getDevice().get();
|
||||
|
||||
if(vkCreateSwapchainKHR(device, &createInfo, nullptr, &_swapChain) != VK_SUCCESS)
|
||||
core::error::report(e_kind::fatal_error, "Vulkan : failed to create swapchain");
|
||||
|
||||
vkGetSwapchainImagesKHR(device, _swapChain, &imageCount, nullptr);
|
||||
_swapChainImages.resize(imageCount);
|
||||
vkGetSwapchainImagesKHR(device, _swapChain, &imageCount, _swapChainImages.data());
|
||||
|
||||
_swapChainImageFormat = surfaceFormat.format;
|
||||
_swapChainExtent = extent;
|
||||
|
||||
_imageViews.resize(_swapChainImages.size());
|
||||
|
||||
for(size_t i = 0; i < _swapChainImages.size(); i++)
|
||||
{
|
||||
_imageViews.emplace_back();
|
||||
_imageViews.back().init(this, _swapChainImages[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void SwapChain::initFB()
|
||||
{
|
||||
_framebuffers.resize(_imageViews.size());
|
||||
|
||||
for(size_t i = 0; i < _imageViews.size(); i++)
|
||||
{
|
||||
_framebuffers.emplace_back();
|
||||
_framebuffers.back().init(this, _imageViews[i]);
|
||||
}
|
||||
}
|
||||
|
||||
SwapChain::SwapChainSupportDetails SwapChain::querySwapChainSupport(VkPhysicalDevice device)
|
||||
{
|
||||
SwapChain::SwapChainSupportDetails details;
|
||||
VkSurfaceKHR surface = Render_Core::get().getSurface().get();
|
||||
|
||||
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities);
|
||||
|
||||
uint32_t formatCount = 0;
|
||||
vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);
|
||||
|
||||
if(formatCount != 0)
|
||||
{
|
||||
details.formats.resize(formatCount);
|
||||
vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data());
|
||||
}
|
||||
return details;
|
||||
}
|
||||
|
||||
VkExtent2D SwapChain::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities)
|
||||
{
|
||||
if(capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max())
|
||||
return capabilities.currentExtent;
|
||||
|
||||
int width, height;
|
||||
SDL_Vulkan_GetDrawableSize(Render_Core::get().getWindow()->getNativeWindow(), &width, &height);
|
||||
|
||||
VkExtent2D actualExtent = { static_cast<uint32_t>(width), static_cast<uint32_t>(height) };
|
||||
|
||||
actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);
|
||||
actualExtent.height = std::clamp(actualExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height);
|
||||
|
||||
return actualExtent;
|
||||
}
|
||||
|
||||
void SwapChain::recreate()
|
||||
{
|
||||
destroyFB();
|
||||
destroy();
|
||||
Render_Core::get().getRenderPass().destroy();
|
||||
|
||||
init();
|
||||
Render_Core::get().getRenderPass().init();
|
||||
initFB();
|
||||
}
|
||||
|
||||
void SwapChain::destroyFB() noexcept
|
||||
{
|
||||
vkDeviceWaitIdle(Render_Core::get().getDevice().get());
|
||||
|
||||
for(size_t i = 0; i < _framebuffers.size(); i++)
|
||||
_framebuffers[i].destroy();
|
||||
}
|
||||
|
||||
void SwapChain::destroy() noexcept
|
||||
{
|
||||
vkDeviceWaitIdle(Render_Core::get().getDevice().get());
|
||||
|
||||
for(size_t i = 0; i < _imageViews.size(); i++)
|
||||
_imageViews[i].destroy();
|
||||
|
||||
if(_swapChain != VK_NULL_HANDLE)
|
||||
vkDestroySwapchainKHR(Render_Core::get().getDevice().get(), _swapChain, nullptr);
|
||||
_swapChain = VK_NULL_HANDLE;
|
||||
}
|
||||
}
|
||||
65
src/renderer/swapchain/vk_swapchain.h
git.filemode.normal_file
65
src/renderer/swapchain/vk_swapchain.h
git.filemode.normal_file
@@ -0,0 +1,65 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* vk_swapchain.h :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/10/06 18:23:27 by maldavid #+# #+# */
|
||||
/* Updated: 2022/12/18 01:07:44 by maldavid ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifndef __MLX_VK_SWAPCHAIN__
|
||||
#define __MLX_VK_SWAPCHAIN__
|
||||
|
||||
#include <vector>
|
||||
#include <volk.h>
|
||||
#include "vk_imageview.h"
|
||||
#include "vk_framebuffer.h"
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
class SwapChain
|
||||
{
|
||||
friend class FrameBuffer;
|
||||
friend class ImageView;
|
||||
friend class GraphicPipeline;
|
||||
friend class RenderPass;
|
||||
friend class RendererComponent;
|
||||
|
||||
public:
|
||||
struct SwapChainSupportDetails
|
||||
{
|
||||
VkSurfaceCapabilitiesKHR capabilities;
|
||||
std::vector<VkSurfaceFormatKHR> formats;
|
||||
};
|
||||
|
||||
void init();
|
||||
void initFB();
|
||||
void destroy() noexcept;
|
||||
void destroyFB() noexcept;
|
||||
|
||||
void recreate();
|
||||
|
||||
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device);
|
||||
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);
|
||||
|
||||
inline SwapChainSupportDetails getSupport() noexcept { return _swapChainSupport; }
|
||||
inline VkSwapchainKHR& operator()() noexcept { return _swapChain; }
|
||||
inline VkSwapchainKHR& get() noexcept { return _swapChain; }
|
||||
inline FrameBuffer& getFrameBuffer(int i) { return _framebuffers[i]; }
|
||||
inline size_t getImagesNumber() const noexcept { return _swapChainImages.size(); }
|
||||
|
||||
private:
|
||||
SwapChainSupportDetails _swapChainSupport;
|
||||
VkSwapchainKHR _swapChain;
|
||||
std::vector<VkImage> _swapChainImages;
|
||||
VkFormat _swapChainImageFormat;
|
||||
VkExtent2D _swapChainExtent;
|
||||
std::vector<FrameBuffer> _framebuffers;
|
||||
std::vector<ImageView> _imageViews;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // __MLX_VK_SWAPCHAIN__
|
||||
Reference in New Issue
Block a user