#ifndef GRAPHICS_H #define GRAPHICS_H #include #include #include #include #include "common.h" // from vulkan source #define MAKE_VERSION(major, minor, patch) \ ((((u32)(major)) << 22U) | (((u32)(minor)) << 12U) | ((u32)(patch))) typedef uint32_t u32; typedef struct vertex { vec3 pos; vec3 normal; vec3 color; } vertex_t; typedef struct buffer { VkBuffer buffer; VkDeviceMemory memory; } buffer_t; typedef struct graphics { VkInstance instance; VkDebugUtilsMessengerEXT debug_messenger; VkPhysicalDevice physical_device; VkDevice logical_device; VkQueue graphics_queue; VkQueue present_queue; VkQueue transfer_queue; VkSurfaceKHR surface; struct pipeline { VkRenderPass render_pass; VkDescriptorSetLayout descriptor_layout; // VkDescriptorSetLayout *descriptor_layouts; VkPipelineLayout layout; VkPipeline pipeline; } pipeline; struct swap_chain { VkSwapchainKHR swap_chain; VkImage *images; VkImageView *image_views; VkFramebuffer *framebuffers; u32 nimages; VkFormat image_format; VkExtent2D extent; } swap_chain; struct command { VkCommandPool pool; VkCommandBuffer buffer; } command_graphics, command_transfer; struct descriptor { VkDescriptorPool pool; VkDescriptorSetLayout layout; VkDescriptorSet set; } ubo_descriptor; struct sync { VkSemaphore semph_image_available; VkSemaphore semph_render_finished; VkFence fence_inflight; } sync; buffer_t vertex_buffer; buffer_t index_buffer; struct { buffer_t buffer; void *mapped_data; int (*update_ubo)(void *ubo); } ubo; } * graphics_t; struct graphics_info { char *name; u32 version; const char* const* extensions; u32 ext_count; vertex_t *vertices; size_t nvertices; u32 *indices; size_t nindices; size_t ubo_size; int (*update_ubo)(void *ubo); int (*surface_func)(VkInstance instance, VkSurfaceKHR *surface); }; graphics_t graphics_create(struct graphics_info *info); void graphics_destroy(graphics_t device); int graphics_draw_frame(graphics_t device); #endif