Browse Source

ImageView wrapper.

master
Draklaw 4 years ago
parent
commit
f15ade11b7
  1. 1
      CMakeLists.txt
  2. 62
      src/vk/ImageView.cpp
  3. 61
      src/vk/ImageView.h
  4. 15
      src/vk/Swapchain.cpp
  5. 5
      src/vk/Swapchain.h

1
CMakeLists.txt

@ -46,6 +46,7 @@ add_executable(vk_expe
src/vk/Pipeline.cpp src/vk/Pipeline.cpp
src/vk/Memory.cpp src/vk/Memory.cpp
src/vk/Buffer.cpp src/vk/Buffer.cpp
src/vk/ImageView.cpp
src/vk/Swapchain.cpp src/vk/Swapchain.cpp
src/vk/RenderPass.cpp src/vk/RenderPass.cpp

62
src/vk/ImageView.cpp

@ -0,0 +1,62 @@
// Copyright 2022 Simon Boyé
#include <vk/ImageView.h>
#include <vk/Context.h>
#include <cassert>
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;
}
}

61
src/vk/ImageView.h

@ -0,0 +1,61 @@
// Copyright 2022 Simon Boyé
#pragma once
#include <vk/forward.h>
#include <vulkan/vulkan.h>
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;
};
}

15
src/vk/Swapchain.cpp

@ -293,7 +293,7 @@ void Swapchain::create() {
image_resources.image = swapchain_images[index]; image_resources.image = swapchain_images[index];
VkImageViewCreateInfo view_info { image_resources.view = ImageView(*m_context, VkImageViewCreateInfo {
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = image_resources.image, .image = image_resources.image,
.viewType = VK_IMAGE_VIEW_TYPE_2D, .viewType = VK_IMAGE_VIEW_TYPE_2D,
@ -311,16 +311,7 @@ void Swapchain::create() {
.baseArrayLayer = 0, .baseArrayLayer = 0,
.layerCount = 1, .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); 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) { for(auto& image_resources: m_image_resources) {
image_resources.render_done.destroy(); image_resources.render_done.destroy();
m_context->destroy_image_view(image_resources.view); image_resources.view.destroy();
} }
m_context->destroy_swapchain(m_swapchain); m_context->destroy_swapchain(m_swapchain);

5
src/vk/Swapchain.h

@ -1,8 +1,9 @@
// Copyright 2022 Simon Boyé // Copyright 2022 Simon Boyé
#pragma once #pragma once
#include <vk/Semaphore.h>
#include <vk/Context.h> #include <vk/Context.h>
#include <vk/Semaphore.h>
#include <vk/ImageView.h>
#include <core/utils.h> #include <core/utils.h>
@ -76,7 +77,7 @@ public:
private: private:
struct ImageResources { struct ImageResources {
VkImage image = VK_NULL_HANDLE; VkImage image = VK_NULL_HANDLE;
VkImageView view = VK_NULL_HANDLE; ImageView view;
Fence render_done; Fence render_done;
}; };

Loading…
Cancel
Save