ImageView wrapper.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
62
src/vk/ImageView.cpp
Normal file
62
src/vk/ImageView.cpp
Normal file
@@ -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
Normal file
61
src/vk/ImageView.h
Normal file
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
// Copyright 2022 Simon Boyé
|
||||
#pragma once
|
||||
|
||||
#include <vk/Semaphore.h>
|
||||
#include <vk/Context.h>
|
||||
#include <vk/Semaphore.h>
|
||||
#include <vk/ImageView.h>
|
||||
|
||||
#include <core/utils.h>
|
||||
|
||||
@@ -76,7 +77,7 @@ public:
|
||||
private:
|
||||
struct ImageResources {
|
||||
VkImage image = VK_NULL_HANDLE;
|
||||
VkImageView view = VK_NULL_HANDLE;
|
||||
ImageView view;
|
||||
Fence render_done;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user