vulkan游戏引擎核心vulkan_types.inl实现

1.vulkan_types.inl

#pragma once

#include "defines.h"

#include "core/asserts.h"

#include "renderer/renderer_types.inl"

#include <vulkan/vulkan.h>

#define VK_CHECK(expr) \

{ \

KASSERT(expr == VK_SUCCESS); \

}

typedef struct vulkan_buffer{

u64 total_size;

VkBuffer handle;

VkBufferUsageFlagBits usage;

b8 is_locked;

VkDeviceMemory memory;

i32 memory_index;

u32 memory_property_flags;

}vulkan_buffer;

typedef struct vulkan_swapchain_support_info{

VkSurfaceCapabilitiesKHR capabilities;

u32 format_count;

VkSurfaceFormatKHR* formats;

u32 present_mode_count;

VkPresentModeKHR* present_modes;

}vulkan_swapchain_support_info;

typedef struct vulkan_device{

VkPhysicalDevice physical_device;

VkDevice logical_device;

vulkan_swapchain_support_info swapchain_support;

i32 graphics_queue_index;

i32 present_queue_index;

i32 transfer_queue_index;

VkQueue graphics_queue;

VkQueue present_queue;

VkQueue transfer_queue;

VkCommandPool graphics_command_pool;

VkPhysicalDeviceProperties properties;

VkPhysicalDeviceFeatures features;

VkPhysicalDeviceMemoryProperties memory;

VkFormat depth_format;

}vulkan_device;

typedef struct vulkan_image{

VkImage handle;

VkDeviceMemory memory;

VkImageView view;

u32 width;

u32 height;

}vulkan_image;

typedef enum vulkan_render_pass_state{

READY,

RECORDING,

IN_RENDER_PASS,

RECORDING_ENDED,

SUBMITTED,

NOT_ALLOCATED

}vulkan_render_pass_state;

typedef struct vulkan_renderpass{

VkRenderPass handle;

f32 x,y,w,h;

f32 r,g,b,a;

f32 depth;

u32 stencil;

vulkan_render_pass_state state;

}vulkan_renderpass;

typedef struct vulkan_framebuffer{

VkFramebuffer handle;

u32 attachment_count;

VkImageView* attachments;

vulkan_renderpass* renderpass;

}vulkan_framebuffer;

typedef struct vulkan_swapchain{

VkSurfaceFormatKHR image_format;

u8 max_frames_in_flight;

VkSwapchainKHR handle;

u32 image_count;

VkImage* images;

VkImageView* views;

vulkan_image depth_attachment;

//framebuffers used for on-screen rendering

vulkan_framebuffer* framebuffers;

}vulkan_swapchain;

typedef enum vulkan_command_buffer_state{

COMMAND_BUFFER_STATE_READY,

COMMAND_BUFFER_STATE_RECORDING,

COMMAND_BUFFER_STATE_IN_RENDER_PASS,

COMMAND_BUFFER_STATE_RECORDING_ENDED,

COMMAND_BUFFER_STATE_SUBMITTED,

COMMAND_BUFFER_STATE_NOT_ALLOCATED

}vulkan_command_buffer_state;

typedef struct vulkan_command_buffer{

VkCommandBuffer handle;

vulkan_command_buffer_state state;

}vulkan_command_buffer;

typedef struct vulkan_shader_stage{

VkShaderModuleCreateInfo create_info;

VkShaderModule handle;

VkPipelineShaderStageCreateInfo shader_stage_create_info;

}vulkan_shader_stage;

typedef struct vulkan_pipeline{

VkPipeline handle;

VkPipelineLayout pipeline_layout;

}vulkan_pipeline;

#define OBJECT_SHADER_STAGE_COUNT 2

typedef struct vulkan_object_shader{

vulkan_shader_stage stages[OBJECT_SHADER_STAGE_COUNT];

VkDescriptorPool global_descriptor_pool;

VkDescriptorSetLayout global_descriptor_set_layout;

VkDescriptorSet global_descriptor_sets[3];

//b8 descriptor_updated[3];

global_uniform_object global_ubo;

vulkan_buffer global_uniform_buffer;

vulkan_pipeline pipeline;

}vulkan_object_shader;

typedef struct vulkan_fence{

VkFence handle;

b8 is_signaled;

}vulkan_fence;

typedef struct vulkan_context{

u32 framebuffer_width;

u32 framebuffer_height;

u64 framebuffer_size_generation;

u64 framebuffer_size_last_generation;

VkInstance instance;

VkAllocationCallbacks* allocator;

VkSurfaceKHR surface;

#if defined(_DEBUG)

VkDebugUtilsMessengerEXT debug_messenger;

//PFN_vkSetDebugUtilsObjectNameEXT pfnSetDebugUtilsObjectNameEXT;

/** @brief The function pointer to set free-form debug object tag data. */

#endif

vulkan_device device;

b8 validation_enabled;

vulkan_swapchain swapchain;

vulkan_renderpass main_renderpass;

vulkan_buffer object_vertex_buffer;

vulkan_buffer object_index_buffer;

//darray

vulkan_command_buffer* graphics_command_buffers;

//darray

VkSemaphore* image_available_semaphores;

//darray

VkSemaphore* queue_complete_semaphores;

u32 in_flight_fence_count;

vulkan_fence* in_flight_fences;

//Holds pointers to fences which exist and are owned elsewhere

vulkan_fence** images_in_flight;

u32 image_index;

u32 current_frame;

b8 recreating_swapchain;

vulkan_object_shader object_shader;

u64 geometry_vertex_offset;

u64 geometry_index_offset;

i32 (*find_memory_index)(u32 type_filter,u32 property_flags);

}vulkan_context;

typedef struct vulkan_texture_data{

vulkan_image image;

VkSampler sampler;

}vulkan_texture_data;

相关推荐
婷儿z9 分钟前
LVS+Keepalived高可用群集
linux·服务器·lvs
bksheng18 分钟前
【Linux】运行脚本后打屏同时保存到本地
linux·服务器
拉不动的猪35 分钟前
pc和移动页面切换的两种基本方案对比
前端·javascript·vue.js
Hilaku43 分钟前
前端日志调试也能专业化?我们这样设计日志系统
前端·javascript
李杰同志891631 小时前
iOS moya 实现双token 刷新并重试
前端
暴走的YH1 小时前
linux无网络环境下离线安装依赖包
linux·服务器·centos
前端小巷子1 小时前
跨标签页通信(五):IndexedDB
前端·面试·浏览器
LaoZhangAI1 小时前
2025全面评测:Flux AI图像生成器6大模型全解析【专业测评】
前端·后端
PioneerWang1 小时前
useContext及其原理解析
前端
用户7161912821761 小时前
告别繁琐的路由配置:vite-plugin-convention-routes 让你的 Vue 项目更优雅
前端