#pragma once #include #include #include #include "handle.hpp" #include "vec3.hpp" #include "vk-device-types.hpp" struct device_texture; struct device_buffer; struct device_pipeline; struct dispatch_params { enum class PARAM_BINDING : uint32_t { PARAM1, PARAM2, PARAM3, PARAM4, PARAM5, PARAM6, PARAM7, PARAM8, MAX }; handle pipeline; vec3u group_size; vec3u local_group_size; uint64_t params[static_cast(PARAM_BINDING::MAX)]; }; struct renderpass_params { private: struct rect { int32_t x; int32_t y; uint32_t width; uint32_t height; }; public: rect render_area; std::span> color_attachments; }; struct draw_params { handle pipeline; handle index_buffer; uint32_t vertex_count; uint32_t vertex_offset; uint32_t instance_count; uint64_t globals_address = 0U; // TODO: This is probably stupid and should be set elsewhere once ??? uint64_t instances_address = 0U; uint64_t uniforms_address = 0U; uint64_t vertex_address = 0U; }; struct draw_indexed_params { handle pipeline; handle index_buffer; uint32_t vertex_count; uint32_t vertex_offset; uint32_t index_offset; uint32_t instance_count; uint64_t globals_address = 0U; // TODO: This is probably stupid and should be set elsewhere once ??? uint64_t instances_address = 0U; uint64_t uniforms_address = 0U; uint64_t vertex_address = 0U; }; struct command_buffer { void start() const; void stop() const; void barrier(handle texture_handle, VkPipelineStageFlags2 stage, VkAccessFlags2 access, VkImageLayout layout) const; void copy(handle buffer_handle, handle texture_handle, VkDeviceSize offset = 0) const; VkCommandBuffer vk_command_buffer; QueueType queue_type; }; // General purpose queue struct graphics_command_buffer: public command_buffer { void dispatch(const dispatch_params& params) const; void begin_renderpass(const renderpass_params& params) const; void draw(const draw_params& params) const; void draw_indexed(const draw_indexed_params& params) const; void end_renderpass() const; }; struct compute_command_buffer: public command_buffer { void dispatch(const dispatch_params& params); }; struct transfer_command_buffer: public command_buffer { };