#pragma once
#include <volk.h>
#include <array>
#include <cassert>
#include <cstdint>
#include <type_traits>
#include "backend/rhi_types.h"
namespace rhi {
struct Device;
} // namespace rhi
namespace vk {
using namespace rhi;
VkFormat image_format_to_vk(ImageFormat format);
ImageFormat image_format_from_vk(VkFormat format);
VkImageViewType image_view_type_to_vk(TextureViewDimension type);
VkComponentSwizzle component_swizzle_to_vk(ComponentSwizzle swizzle);
VkImageUsageFlags image_usage_to_vk(Device &device, ImageDesc const &desc);
VkImageAspectFlags image_aspect_to_vk(ImageAspect aspect);
VkImageAspectFlags image_aspect_bit_to_vk(ImageAspect flag);
VkSamplerAddressMode sampler_address_to_vk(SamplerAddressMode mode);
VkFilter sampler_filter_to_vk(SamplerFilter filter);
VkCompareOp sampler_comparison_to_vk(SamplerComparisonFunc func);
VkPrimitiveTopology pipeline_topology_to_vk(rhi::PipelineTopology topology);
VkPolygonMode pipeline_fill_mode_to_vk(rhi::PipelineFillMode fill_mode);
VkCullModeFlags pipeline_cull_mode_to_vk(rhi::PipelineCullMode cull_mode);
VkFrontFace triangle_winding_to_vk(rhi::PipelineTriangleWindingOrder winding);
VkCompareOp pipeline_compare_op_to_vk(rhi::PipelineCompareOp compare_op);
VkShaderStageFlags shader_stage_to_vk(rhi::ShaderStage stages);
VkBlendFactor pipeline_blend_factor_to_vk(rhi::PipelineBlendFactor factor);
VkBlendOp pipeline_blend_op_to_vk(rhi::PipelineBlendOp op);
VkSampleCountFlagBits sample_count_to_vk(rhi::SampleCount samples);
VkCommandPoolCreateFlags to_vk_cmd_pool_flags(CmdPoolUsage flags);
VkCommandBufferLevel to_vk_cmd_buffer_level(CmdBufferLevel level);
VkCommandBufferUsageFlags to_vk_cmd_buffer_usage_flags(CmdBufferUsage flags);
VkPipelineStageFlags2 pipeline_stage_flags_to_vk(PipelineStages stages);
struct StateSync {
VkPipelineStageFlags2 stages = 0;
VkAccessFlags2 access = 0;
VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED;
};
StateSync image_state_to_vk(ResourceState state, ImageAspect aspect);
StateSync buffer_state_to_vk(ResourceState state);
} // namespace vk