From b96155f1b8d69eb11d664db3c2de1ee3e227d9b9 Mon Sep 17 00:00:00 2001 From: Draklaw Date: Fri, 4 Mar 2022 19:43:39 +0100 Subject: [PATCH] Pipeline wrapper. --- CMakeLists.txt | 1 + src/VulkanTutorial.cpp | 11 ++----- src/VulkanTutorial.h | 3 +- src/vk/Pipeline.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++ src/vk/Pipeline.h | 62 ++++++++++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 src/vk/Pipeline.cpp create mode 100644 src/vk/Pipeline.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b8921f7..b7f36f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ add_executable(vk_expe src/vk/Semaphore.cpp src/vk/Framebuffer.cpp src/vk/ShaderModule.cpp + src/vk/Pipeline.cpp src/vk/Swapchain.cpp src/vk/Memory.cpp src/vk/Buffer.cpp diff --git a/src/VulkanTutorial.cpp b/src/VulkanTutorial.cpp index 25733d0..a8d6185 100644 --- a/src/VulkanTutorial.cpp +++ b/src/VulkanTutorial.cpp @@ -321,7 +321,7 @@ void VulkanTutorial::destroy_swapchain_objects() { m_framebuffers.clear(); - m_context.destroy_pipeline(m_pipeline); + m_pipeline.destroy(); m_context.destroy_pipeline_layout(m_pipeline_layout); m_render_pass.destroy(); } @@ -544,14 +544,7 @@ void VulkanTutorial::create_graphic_pipeline() { .basePipelineIndex = -1, }; - if(vkCreateGraphicsPipelines( - m_context.device(), - VK_NULL_HANDLE, - 1, &pipeline_info, - nullptr, - &m_pipeline - ) != VK_SUCCESS) - throw std::runtime_error("failed to create graphic pipeline"); + m_pipeline = vk::Pipeline(m_context, pipeline_info); } void VulkanTutorial::create_framebuffers() { diff --git a/src/VulkanTutorial.h b/src/VulkanTutorial.h index f6c3a6a..8783982 100644 --- a/src/VulkanTutorial.h +++ b/src/VulkanTutorial.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -75,7 +76,7 @@ private: vk::RenderPass m_render_pass; VkDescriptorSetLayout m_descriptor_set_layout = VK_NULL_HANDLE; VkPipelineLayout m_pipeline_layout = VK_NULL_HANDLE; - VkPipeline m_pipeline = VK_NULL_HANDLE; + vk::Pipeline m_pipeline; std::vector m_framebuffers; VkCommandPool m_command_pool = VK_NULL_HANDLE; vk::Buffer m_vertex_buffer; diff --git a/src/vk/Pipeline.cpp b/src/vk/Pipeline.cpp new file mode 100644 index 0000000..246d270 --- /dev/null +++ b/src/vk/Pipeline.cpp @@ -0,0 +1,71 @@ +// Copyright 2022 Simon Boyé + +#include +#include + +#include + + +namespace vk { + + +Pipeline::Pipeline() noexcept { +} + +Pipeline::Pipeline(Context& context, VkPipeline pipeline) + : m_context(&context) + , m_pipeline(pipeline) +{ + assert(m_context); + assert(m_pipeline != VK_NULL_HANDLE); +} + +Pipeline::Pipeline(Context& context, VkGraphicsPipelineCreateInfo create_info) + : m_context(&context) +{ + assert(m_context); + + if(vkCreateGraphicsPipelines( + m_context->device(), + VK_NULL_HANDLE, + 1, &create_info, + nullptr, + &m_pipeline + ) != VK_SUCCESS) + throw std::runtime_error("failed to create graphic pipeline"); +} + +Pipeline::Pipeline(Pipeline&& other) noexcept +{ + swap(*this, other); +} + +Pipeline::~Pipeline() noexcept { + if(!is_null()) + destroy(); +} + + +Pipeline& Pipeline::operator=(Pipeline&& other) noexcept { + swap(*this, other); + if(other) + other.destroy(); + return *this; +} + + +void Pipeline::destroy() noexcept { + assert(!is_null()); + assert(m_context); + + vkDestroyPipeline( + m_context->device(), + m_pipeline, + nullptr + ); + + m_pipeline = nullptr; +} + + +} diff --git a/src/vk/Pipeline.h b/src/vk/Pipeline.h new file mode 100644 index 0000000..cf8a692 --- /dev/null +++ b/src/vk/Pipeline.h @@ -0,0 +1,62 @@ +// Copyright 2022 Simon Boyé +#pragma once + +#include + +#include + + +namespace vk { + + +class Pipeline { +public: + Pipeline() noexcept; + Pipeline(Context& context, VkPipeline pipeline); + Pipeline(Context& context, VkGraphicsPipelineCreateInfo create_info); + Pipeline(const Pipeline&) = delete; + Pipeline(Pipeline&& other) noexcept; + ~Pipeline() noexcept; + + Pipeline& operator=(const Pipeline&) = delete; + Pipeline& operator=(Pipeline&& other) noexcept; + + explicit inline operator bool() const noexcept { + return !is_null(); + } + + inline bool is_null() const noexcept { + return m_pipeline == VK_NULL_HANDLE; + } + + inline const Context* context() const noexcept { + return m_context; + } + + inline Context* context() noexcept { + return m_context; + } + + inline operator VkPipeline() noexcept { + return m_pipeline; + } + + inline VkPipeline pipeline() noexcept { + return m_pipeline; + } + + friend inline void swap(Pipeline& pipeline_0, Pipeline& pipeline_1) noexcept { + using std::swap; + swap(pipeline_0.m_context, pipeline_1.m_context); + swap(pipeline_0.m_pipeline, pipeline_1.m_pipeline); + } + + void destroy() noexcept; + +private: + Context* m_context = nullptr; + VkPipeline m_pipeline = VK_NULL_HANDLE; +}; + + +}