#if !defined(LD_VULKAN_CORE_H_) #define LD_VULKAN_CORE_H_ #if OS_WINDOWS #define VK_USE_PLATFORM_WIN32_KHR 1 #if defined(CreateSemaphore) // Sigh #undef CreateSemaphore #endif #elif OS_LINUX #define VK_USE_PLATFORM_XLIB_KHR 1 #define VK_USE_PLATFORM_WAYLAND_KHR 1 #endif #if defined(function) #undef function #endif #define VK_NO_PROTOTYPES 1 #include #define function static #define VK_MAX_FRAMES_IN_FLIGHT 8 #define VK_NUM_SCRATCH 8 typedef struct Vk_CommandBuffer Vk_CommandBuffer; struct Vk_CommandBuffer { VkCommandBuffer handle; VkFence fence; }; typedef struct Vk_Frame Vk_Frame; struct Vk_Frame { VkCommandPool pool; VkCommandBuffer cmd; VkSemaphore acquire, complete; VkFence fence; U32 next_scratch; Vk_CommandBuffer scratch[VK_NUM_SCRATCH]; U32 image; // swapchain image index }; typedef struct Vk_Image Vk_Image; struct Vk_Image { VkDeviceMemory memory; VkDeviceSize size; VkImage handle; VkImageView view; VkFormat format; VkImageUsageFlags usage; U32 width, height; }; typedef struct Vk_Buffer Vk_Buffer; struct Vk_Buffer { VkDeviceMemory memory; VkDeviceSize size; VkBuffer handle; void *data; // if mapped host visible memory }; typedef struct Vk_Context Vk_Context; struct Vk_Context { void *lib; PFN_vkGetInstanceProcAddr GetInstanceProcAddr; PFN_vkCreateInstance CreateInstance; #define VK_INSTANCE_FUNCTIONS #define VK_DEVICE_FUNCTIONS #define VK_FUNC(x) PFN_vk##x x #include "functions.h" #undef VK_FUNC VkResult err; VkInstance instance; VkSurfaceKHR surface; VkPhysicalDevice gpu; VkDevice device; U32 n_frames; // monotonically increasing U32 in_flight; // number of frames in flight, number of swapchain images + 1 Vk_Frame frames[VK_MAX_FRAMES_IN_FLIGHT]; struct { U32 family; VkQueue handle; } queue; struct { VkSwapchainKHR handle; U32 n_images; VkImage images[8]; VkImageView views[8]; VkSurfaceFormatKHR format; U32 width; U32 height; } swapchain; }; extern Vk_Context vk; function bool Vk_Setup(SDL_Window *window); function Vk_Frame *Vk_FrameBegin(SDL_Window *window); function void Vk_FrameEnd(); function Vk_CommandBuffer *Vk_CommandBufferPush(); function void Vk_CommandBufferSubmit(Vk_CommandBuffer *cmds, B32 wait); function Vk_Buffer Vk_BufferCreate(U64 size, B32 host_visible); #endif // LD_VULKAN_CORE_H_