| git.druid.rocks | index | militantprogrammer | astral_canvas | src/ | render/ | vk.h |
src/render/vk.h
#ifndef VK_H
#define VK_H
#include "../platform/platform.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <vulkan/vulkan.h>
#define VK_TRY(expr) \
do { \
VkResult vulkanResult = (expr); \
if (vulkanResult != VK_SUCCESS) { \
fprintf(stderr, "vulkan: %s failed (%d)\n", #expr, (int)vulkanResult); \
return -1; \
} \
} while (0)
enum { VK_MAX_FRAMES = 2 };
enum { VK_MAX_SWAPCHAIN_IMAGES = 8 };
/*
* Per in-flight frame's command buffer and GPU/CPU sync. Rendering
* resources (uniforms, glyphs, descriptors) live on Renderer, not here.
*/
typedef struct {
VkCommandBuffer commandBuffer;
VkSemaphore imageAvailable;
VkSemaphore renderFinished;
VkFence inFlight;
} VkFrame;
/*
* Vulkan device and swapchain. Created against the existing X11 or Wayland
* window via Platform.createVulkanSurface. Does not draw; that is render.c.
*
* Destroy with vk_destroy() *before* platformClose().
*/
typedef struct {
VkInstance instance;
VkDebugUtilsMessengerEXT debug;
PFN_vkDestroyDebugUtilsMessengerEXT destroyDebug;
VkSurfaceKHR surface;
VkPhysicalDevice physicalDevice;
VkDevice device;
uint32_t graphicsFamily;
uint32_t presentFamily;
VkQueue graphicsQueue;
VkQueue presentQueue;
VkSwapchainKHR swapchain;
VkFormat swapchainFormat;
VkExtent2D extent;
uint32_t swapchainImageCount;
VkImage swapchainImages[VK_MAX_SWAPCHAIN_IMAGES];
VkImageView swapchainViews[VK_MAX_SWAPCHAIN_IMAGES];
VkFramebuffer swapchainFramebuffers[VK_MAX_SWAPCHAIN_IMAGES];
VkFence swapchainBusyFences[VK_MAX_SWAPCHAIN_IMAGES];
VkRenderPass renderPass;
VkCommandPool commandPool;
VkFrame frames[VK_MAX_FRAMES];
uint32_t frameIndex;
bool ready;
} VkContext;
int vk_init(VkContext *vulkan, Platform *platform);
int vk_recreate_swapchain(VkContext *vulkan, Platform *platform);
void vk_destroy(VkContext *vulkan);
int vk_find_memory_type(VkPhysicalDevice physicalDevice, uint32_t filter,
VkMemoryPropertyFlags properties);
int vk_create_host_buffer(VkContext *vulkan, VkDeviceSize size, VkBufferUsageFlags usage,
VkBuffer *buffer, VkDeviceMemory *memory, void **mapped);
void vk_image_barrier(VkCommandBuffer commandBuffer, VkImage image,
VkImageLayout oldLayout, VkImageLayout newLayout,
VkAccessFlags sourceAccess, VkAccessFlags destinationAccess,
VkPipelineStageFlags sourceStage, VkPipelineStageFlags destinationStage);
#endif