#pragma once #include #include #include #include "shaders/Pipeline.hpp" namespace lft { class Recording; class RecordingBindPoint { private: const Recording* m_recording; Pipeline m_pipeline; VkPipelineBindPoint m_bind_point; public: RecordingBindPoint( const Recording* recording, const Pipeline pipeline, VkPipelineBindPoint bind_point ); const RecordingBindPoint& bind_descriptor_set( uint32_t set, VkDescriptorSet descriptor_set ) const; const RecordingBindPoint& bind_descriptor_sets( uint32_t first_set, const std::vector& descriptor_sets ) const; const RecordingBindPoint& push_constants( VkShaderStageFlags shader_stages, uint32_t offset, uint32_t size, const void* data ) const; }; class Recording { private: VkCommandBuffer m_cmdbuf; std::optional m_latest_graphics_pipeline; public: GET(m_cmdbuf, cmdbuf); Recording(VkCommandBuffer cmdbuf) : m_cmdbuf(cmdbuf) {} /** * Binds pipeline. Will bind all the descriptor sets, etc. to it after. */ inline const RecordingBindPoint bind_graphics_pipeline(const Pipeline& pipeline) const { return RecordingBindPoint(this, pipeline, VK_PIPELINE_BIND_POINT_GRAPHICS); } /** * Binds pipeline. Will bind all the descriptor sets, etc. to it after. */ inline const RecordingBindPoint bind_compute_pipeline(const Pipeline& pipeline) const { return RecordingBindPoint(this, pipeline, VK_PIPELINE_BIND_POINT_COMPUTE); } inline const Recording& draw( uint32_t vertex_count, uint32_t instance_count, uint32_t first_vertex, uint32_t first_instance ) const { vkCmdDraw(m_cmdbuf, vertex_count, instance_count, first_vertex, first_instance); return *this; } inline const Recording& draw_indexed( uint32_t index_count, uint32_t instance_count, uint32_t first_index, uint32_t vertex_offset, uint32_t first_instance ) const { vkCmdDrawIndexed(m_cmdbuf, index_count, instance_count, first_index, vertex_offset, first_instance); return *this; } inline const Recording& bind_vertex_buffers( const std::vector buffers, std::vector offsets ) const { std::vector vertex_buffers(buffers.size()); std::transform(buffers.begin(), buffers.end(), vertex_buffers.begin(), [](const Buffer& buffer) { return buffer.buf; }); vkCmdBindVertexBuffers(m_cmdbuf, 0, vertex_buffers.size(), vertex_buffers.data(), offsets.data()); return *this; } inline const Recording& bind_index_buffer( const Buffer index_buffer, std::size_t offset, VkIndexType index_type ) const { vkCmdBindIndexBuffer(m_cmdbuf, index_buffer.buf, offset, index_type); return *this; } inline const Recording& dispatch( uint32_t group_count_x, uint32_t group_count_y, uint32_t group_count_z ) const { vkCmdDispatch(m_cmdbuf, group_count_x, group_count_y, group_count_z); return *this; } }; }