#ifndef __MLX_GRAPHICS_PIPELINE__ #define __MLX_GRAPHICS_PIPELINE__ #include #include #include #include namespace mlx { struct GraphicPipelineDescriptor { std::shared_ptr vertex_shader; std::shared_ptr fragment_shader; std::vector> color_attachments; NonOwningPtr renderer = nullptr; bool clear_color_attachments = true; bool no_vertex_inputs = false; }; class GraphicPipeline : public Pipeline { public: GraphicPipeline() = default; void Init(const GraphicPipelineDescriptor& descriptor, std::string_view debug_name); bool BindPipeline(VkCommandBuffer cmd, std::size_t framebuffer_index, std::array clear) noexcept; void EndPipeline(VkCommandBuffer cmd) 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; #ifdef DEBUG std::string m_debug_name; #endif 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; }; } #endif