enum rhi_flags { Flag_VSync = 1 << 0, }; enum rhi_buffer_usage { BufferUsage_Vertex = 1 << 0, BufferUsage_Index = 1 << 1, BufferUsage_Uniform = 1 << 2, BufferUsage_CopySrc = 1 << 3, BufferUsage_CopyDst = 1 << 4, }; enum rhi_memory_usage { MemoryUsage_Unknown = 0, MemoryUsage_GpuOnly, MemoryUsage_CpuToGpu, MemoryUsage_GpuToCpu }; enum rhi_buffer_state { BufferState_Undefined = 0, BufferState_CopySrc, BufferState_CopyDst, BufferState_ShaderRead, BufferState_ShaderWrite, BufferState_Vertex, BufferState_Index, BufferState_Indirect, }; enum rhi_queue_type { QueueType_Graphics, QueueType_Transfer }; enum rhi_vertex_format { R32G32B32A32Float, R32G32B32Float, R32G32Float, R32G32B32A32Uint, }; enum rhi_input_rate { PerVertex, PerInstance }; enum rhi_filter { FilterLinear, FilterNearest, }; enum rhi_sampler_address_mode { AddressRepeat, AddressClampToEdge, }; enum rhi_shader_stage : uint32_t { Shader_Vertex = 1 << 0, Shader_Pixel = 1 << 1, }; enum rhi_texture_format { TextureFormatNone = 0, R8_UNORM, R8G8B8A8_sRGB, B8G8R8A8_sRGB, D32_Float, D32_Float_S8_UINT, }; enum rhi_texture_usage { TextureUsage_None = 0, TextureUsage_ShaderSampled = 1 << 0, TextureUsage_ColorTarget = 1 << 1, TextureUsage_DepthStencil = 1 << 2, TextureUsage_TransferSrc = 1 << 3, TextureUsage_TransferDst = 1 << 4, TextureUsage_Storage = 1 << 5, TextureUsage_Present = 1 << 6, }; enum rhi_texture_state { TextureState_Undefined, TextureState_ColorTarget, TextureState_DepthTarget, TextureState_ShaderRead, TextureState_Present, TextureState_TransferSrc, TextureState_TransferDst, }; // typedef struct rhi_texture_data* rhi_texture; typedef struct rhi_texture_view_data* rhi_texture_view; typedef rhi_texture_view rhi_depth_stencil_view; typedef rhi_texture_view rhi_sampled_texture_view; typedef rhi_texture_view rhi_render_target_view; typedef struct rhi_buffer_data* rhi_buffer; typedef struct rhi_cmdlist_data* rhi_cmdlist; typedef struct rhi_graphics_pipeline_data* rhi_graphics_pipeline; typedef struct rhi_sampler_data* rhi_sampler; typedef struct rhi_shader_data* rhi_shader; // #if defined(NDEBUG) #define RHI_VALIDATIONS false #else #define RHI_VALIDATIONS true #endif #define RHI_CHECKPOINTS false // struct rhi_limits { uint32_t CmdListsCount; uint32_t BuffersCount; uint32_t ConstantBufferViewsCount; uint32_t TexturesCount; uint32_t DepthStencilViewsCount; uint32_t RenderTargetViewsCount; uint32_t SampledTextureViewsCount; uint32_t SamplersCount; uint32_t ShadersCount; uint32_t GraphicsPipelinesCount; uint32_t MaxDrawCount; uint32_t MaxPassCount; uint32_t FrameConstantSize; uint32_t PassConstantSize; uint32_t DrawConstantSize; }; static rhi_limits DefaultGameRhiLimits() { rhi_limits limits{}; limits.CmdListsCount = 4; limits.BuffersCount = 256; limits.ConstantBufferViewsCount = 16; limits.TexturesCount = 512; limits.DepthStencilViewsCount = 8; limits.RenderTargetViewsCount = 8; limits.SampledTextureViewsCount = 256; limits.SamplersCount = 8; limits.ShadersCount = 64; limits.GraphicsPipelinesCount = 8; limits.MaxDrawCount = 1024; limits.MaxPassCount = 4; limits.FrameConstantSize = 1 << 14; limits.PassConstantSize = 1 << 13; limits.DrawConstantSize = 1 << 12; return limits; } struct rhi_init_desc { rhi_flags flags; rhi_limits limits; }; struct rhi_vertex_binding_desc { uint32_t binding; uint32_t stride; rhi_input_rate inputRate; }; struct rhi_vertex_attribute_desc { uint32_t binding; byteview semantic; rhi_vertex_format format; uint32_t offset; }; enum rhi_pipeline_flags { Pipeline_DepthWrite, Pipeline_DepthTest, Pipeline_CullFront, Pipeline_CullBack, Pipeline_CW, Pipeline_CCW, }; struct rhi_sampler_desc { }; struct rhi_texture_info { uint32_t width; uint32_t height; rhi_texture_format format; }; #include "commons/rhi/vulkan/rhi_vulkan.cc"