From f15ade11b7de3687f6ca6a2ce6911c73250d5ab4 Mon Sep 17 00:00:00 2001 From: Draklaw Date: Fri, 4 Mar 2022 23:15:33 +0100 Subject: [PATCH] ImageView wrapper. --- CMakeLists.txt | 1 + src/vk/ImageView.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++ src/vk/ImageView.h | 61 +++++++++++++++++++++++++++++++++++++++++++ src/vk/Swapchain.cpp | 15 +++-------- src/vk/Swapchain.h | 5 ++-- 5 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 src/vk/ImageView.cpp create mode 100644 src/vk/ImageView.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ca77826..a9d2956 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,7 @@ add_executable(vk_expe src/vk/Pipeline.cpp src/vk/Memory.cpp src/vk/Buffer.cpp + src/vk/ImageView.cpp src/vk/Swapchain.cpp src/vk/RenderPass.cpp diff --git a/src/vk/ImageView.cpp b/src/vk/ImageView.cpp new file mode 100644 index 0000000..3926234 --- /dev/null +++ b/src/vk/ImageView.cpp @@ -0,0 +1,62 @@ +// Copyright 2022 Simon Boyé + +#include +#include + +#include + + +namespace vk { + + +ImageView::ImageView() noexcept { +} + +ImageView::ImageView(Context& context, const VkImageViewCreateInfo& create_info) + : m_context(&context) +{ + assert(m_context); + + if(vkCreateImageView( + context.device(), + &create_info, + nullptr, + &m_image_view + ) != VK_SUCCESS) + throw std::runtime_error("failed to create image view"); +} + +ImageView::ImageView(ImageView&& other) noexcept +{ + swap(*this, other); +} + +ImageView::~ImageView() noexcept { + if(!is_null()) + destroy(); +} + + +ImageView& ImageView::operator=(ImageView&& other) noexcept { + swap(*this, other); + if(other) + other.destroy(); + return *this; +} + + +void ImageView::destroy() noexcept { + assert(!is_null()); + assert(m_context); + + vkDestroyImageView( + m_context->device(), + m_image_view, + nullptr + ); + + m_image_view = nullptr; +} + + +} diff --git a/src/vk/ImageView.h b/src/vk/ImageView.h new file mode 100644 index 0000000..90e5e8f --- /dev/null +++ b/src/vk/ImageView.h @@ -0,0 +1,61 @@ +// Copyright 2022 Simon Boyé +#pragma once + +#include + +#include + + +namespace vk { + + +class ImageView { +public: + ImageView() noexcept; + ImageView(Context& context, const VkImageViewCreateInfo& create_info); + ImageView(const ImageView&) = delete; + ImageView(ImageView&& other) noexcept; + ~ImageView() noexcept; + + ImageView& operator=(const ImageView&) = delete; + ImageView& operator=(ImageView&& other) noexcept; + + explicit inline operator bool() const noexcept { + return !is_null(); + } + + inline bool is_null() const noexcept { + return m_image_view == VK_NULL_HANDLE; + } + + inline const Context* context() const noexcept { + return m_context; + } + + inline Context* context() noexcept { + return m_context; + } + + inline operator VkImageView() noexcept { + return m_image_view; + } + + inline VkImageView image_view() noexcept { + return m_image_view; + } + + friend inline void swap(ImageView& image_view_0, ImageView& image_view_1) noexcept { + using std::swap; + swap(image_view_0.m_context, image_view_1.m_context); + swap(image_view_0.m_image_view, image_view_1.m_image_view); + } + + void destroy() noexcept; + +private: + Context* m_context = nullptr; + VkImageView m_image_view = VK_NULL_HANDLE; +}; + + +} diff --git a/src/vk/Swapchain.cpp b/src/vk/Swapchain.cpp index 889c370..d6d18cf 100644 --- a/src/vk/Swapchain.cpp +++ b/src/vk/Swapchain.cpp @@ -293,7 +293,7 @@ void Swapchain::create() { image_resources.image = swapchain_images[index]; - VkImageViewCreateInfo view_info { + image_resources.view = ImageView(*m_context, VkImageViewCreateInfo { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .image = image_resources.image, .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -311,16 +311,7 @@ void Swapchain::create() { .baseArrayLayer = 0, .layerCount = 1, }, - }; - - if(vkCreateImageView( - m_context->device(), - &view_info, - nullptr, - &image_resources.view - ) != VK_SUCCESS) { - throw std::runtime_error("failed to create swapchain image view"); - } + }); image_resources.render_done = Fence(*m_context, VK_FENCE_CREATE_SIGNALED_BIT); } @@ -344,7 +335,7 @@ void Swapchain::destroy() { for(auto& image_resources: m_image_resources) { image_resources.render_done.destroy(); - m_context->destroy_image_view(image_resources.view); + image_resources.view.destroy(); } m_context->destroy_swapchain(m_swapchain); diff --git a/src/vk/Swapchain.h b/src/vk/Swapchain.h index dff401b..8969892 100644 --- a/src/vk/Swapchain.h +++ b/src/vk/Swapchain.h @@ -1,8 +1,9 @@ // Copyright 2022 Simon Boyé #pragma once -#include #include +#include +#include #include @@ -76,7 +77,7 @@ public: private: struct ImageResources { VkImage image = VK_NULL_HANDLE; - VkImageView view = VK_NULL_HANDLE; + ImageView view; Fence render_done; };