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;

相关推荐
葡萄城技术团队18 分钟前
【性能优化篇】面对万行数据也不卡顿?揭秘协同服务器的“片段机制 (Fragments)”
前端
程序员阿峰29 分钟前
2026前端必备:TensorFlow.js,浏览器里的AI引擎,不写Python也能玩转智能
前端
Jans30 分钟前
Shipfe — Rust 写的前端静态部署工具:一条命令上线 + 零停机 + 可回滚 + 自动清理
前端
徐小夕30 分钟前
JitWord 2.3: 墨定,行远
前端·vue.js·github
南果梨44 分钟前
OpenClaw 完整教程!从安装到使用(官方脚本版)
前端·git·开源
大雨还洅下1 小时前
前端手写: new操作符
前端
hqk1 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
是糖糖啊1 小时前
OpenClaw 从零到一实战指南(飞书接入)
前端·人工智能·后端
Despupilles2 小时前
第三篇、基本骨架结构
前端
swipe2 小时前
从原理到手写:彻底吃透 call / apply / bind 与 arguments 的底层逻辑
前端·javascript·面试