#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 { vec3_t sun_dir; float cloudiness; } light_params_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 shadow_img; VkDeviceMemory shadow_mem; VkImageView shadow_view; VkImage depth_img; VkDeviceMemory depth_mem; VkImageView depth_view; VkSampler shadow_sampler; VkFramebuffer shadow_framebuf; VkFramebuffer framebuffers[MAX_FRAMES_IN_FLIGHT]; VkShaderModule floor_vert_shader; VkShaderModule model_vert_shader; VkShaderModule frag_shader; VkDescriptorSetLayout floor_desc_set_layout; VkDescriptorSetLayout desc_set_layout; VkDescriptorPool desc_pool; VkImage colour_img; VkDeviceMemory colour_mem; VkImageView colour_view; VkRenderPass shadow_pass; VkRenderPass render_pass; VkDescriptorSet floor_desc_sets[MAX_FRAMES_IN_FLIGHT]; VkPipelineLayout floor_pipeline_layout; VkPipeline floor_pipeline; VkPipelineLayout model_pipeline_layout; VkPipeline shadow_pipeline; VkPipeline model_pipeline; VkCommandPool cmd_pool; VkCommandBuffer cmd_buf; VkFence in_flight; VkSemaphore render_fin; VkSemaphore img_avail; VkBuffer staging_buf; VkDeviceMemory staging_mem; void *staging_ptr; VkCommandPool transient_cmd_pool; } gpu_ctx_t; typedef struct { mat4_t *transform_ptr; mat4_t *bone_ptr; VkBuffer vertex_buf; VkDeviceMemory vertex_mem; VkBuffer index_buf; VkDeviceMemory index_mem; VkDescriptorSet desc_sets[MAX_FRAMES_IN_FLIGHT]; VkBuffer transform_buf; VkDeviceMemory transform_mem; VkBuffer bone_buf; VkDeviceMemory bone_mem; size_t index_count; size_t bone_count; } gpu_model_t; void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name); void gpu_cleanup(const gpu_ctx_t *ctx); void gpu_model_load( const gpu_ctx_t *ctx, const model_t *model, gpu_model_t *out); void gpu_model_cleanup(const gpu_ctx_t *ctx, const gpu_model_t *model); void gpu_render( const gpu_ctx_t *ctx, mat4_t vp, light_params_t light, size_t model_count, const gpu_model_t *models, const mat4_t **bone_matrices, const mat4_t *model_transforms); #endif