#ifndef __SCOP_GRAPHICS_PIPELINE__ #define __SCOP_GRAPHICS_PIPELINE__ #include #include #include #include #include #include #include #include namespace Scop { struct GraphicPipelineDescriptor { std::shared_ptr vertex_shader; std::shared_ptr fragment_shader; std::vector> color_attachments; NonOwningPtr depth = nullptr; NonOwningPtr renderer = nullptr; std::string name = {}; CullMode culling = CullMode::Front; bool no_vertex_inputs = false; bool depth_test_equal = false; bool clear_color_attachments = true; bool wireframe = false; }; class GraphicPipeline : public Pipeline { public: GraphicPipeline() = default; void Init(GraphicPipelineDescriptor descriptor); bool BindPipeline(VkCommandBuffer command_buffer, std::size_t framebuffer_index, std::array clear) noexcept; void EndPipeline(VkCommandBuffer command_buffer) noexcept override; void Destroy() noexcept; [[nodiscard]] inline VkPipeline GetPipeline() const override { return m_pipeline; } [[nodiscard]] inline VkPipelineLayout GetPipelineLayout() const override { return m_pipeline_layout; } [[nodiscard]] inline VkPipelineBindPoint GetPipelineBindPoint() const override { return VK_PIPELINE_BIND_POINT_GRAPHICS; } [[nodiscard]] inline bool IsPipelineBound() const noexcept { return s_bound_pipeline == this; } [[nodiscard]] inline GraphicPipelineDescriptor& GetDescription() noexcept { return m_description; } inline ~GraphicPipeline() noexcept { Destroy(); } private: void CreateFramebuffers(const std::vector>& render_targets, bool clear_attachments); void TransitionAttachments(VkCommandBuffer cmd = VK_NULL_HANDLE); // Private override to remove access bool BindPipeline(VkCommandBuffer) noexcept override { return false; }; private: static inline GraphicPipeline* s_bound_pipeline = nullptr; GraphicPipelineDescriptor m_description; std::vector m_framebuffers; std::vector m_clears; VkRenderPass m_renderpass = VK_NULL_HANDLE; VkPipeline m_pipeline = VK_NULL_HANDLE; VkPipelineLayout m_pipeline_layout = VK_NULL_HANDLE; }; } #endif