#ifndef GPU_H #define GPU_H #include "linear_alg.h" #include "model.h" #define GLFW_INCLUDE_VULKAN #include #define MAX_FRAMES_IN_FLIGHT 4 typedef struct { mat4_t model; mat4_t view; mat4_t proj; } mvp_t; typedef struct { VkInstance inst; VkSurfaceKHR surface; VkPhysicalDevice physical_dev; VkDevice dev; VkQueue queue; VkSwapchainKHR swapchain; VkExtent2D swapchain_extent; uint32_t swapchain_img_count; VkImageView swapchain_img_views[MAX_FRAMES_IN_FLIGHT]; VkImage depth_img; VkDeviceMemory depth_img_mem; VkImageView depth_img_view; VkFramebuffer framebuffers[MAX_FRAMES_IN_FLIGHT]; VkShaderModule vert_shader; VkShaderModule frag_shader; VkDescriptorSetLayout desc_set_layout; VkDescriptorPool desc_pool; VkDescriptorSet desc_sets[MAX_FRAMES_IN_FLIGHT]; VkBuffer mvp_buffer; VkDeviceMemory mvp_buffer_mem; mvp_t *mvps; VkBuffer bone_matrix_buffer; VkDeviceMemory bone_matrix_buffer_mem; mat4_t *bone_matrices; VkPipelineLayout pipeline_layout; VkRenderPass render_pass; VkPipeline pipeline; VkCommandPool cmd_pool; VkCommandBuffer cmd_buf; VkFence in_flight; VkSemaphore render_fin; VkSemaphore img_avail; VkBuffer vertex_buf; VkDeviceMemory vertex_buf_mem; VkBuffer index_buf; VkDeviceMemory index_buf_mem; size_t index_count; } gpu_ctx_t; typedef struct { const char *application_name; GLFWwindow *window; } gpu_config_t; void gpu_init(gpu_ctx_t *ctx, const gpu_config_t *config, model_t model); void gpu_cleanup(const gpu_ctx_t *ctx); void gpu_render(const gpu_ctx_t *ctx, const mvp_t *mvp); #endif