#ifndef __SCOP_GRAPHICS_PIPELINE__ #define __SCOP_GRAPHICS_PIPELINE__ #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; VkCullModeFlagBits culling = VK_CULL_MODE_FRONT_BIT; VkPolygonMode mode = VK_POLYGON_MODE_FILL; bool no_vertex_inputs = false; bool depth_test_equal = false; bool clear_color_attachments = true; }; class GraphicPipeline : public Pipeline { public: GraphicPipeline() = default; void Init(const 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; } ~GraphicPipeline() = default; 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: std::vector> m_attachments; std::vector m_framebuffers; std::vector m_clears; std::shared_ptr p_vertex_shader; std::shared_ptr p_fragment_shader; VkRenderPass m_renderpass = VK_NULL_HANDLE; VkPipeline m_pipeline = VK_NULL_HANDLE; VkPipelineLayout m_pipeline_layout = VK_NULL_HANDLE; NonOwningPtr p_renderer; NonOwningPtr p_depth; }; } #endif