85 lines
2.2 KiB
C
85 lines
2.2 KiB
C
#ifndef GPU_H
|
|
#define GPU_H
|
|
|
|
#include "linear_alg.h"
|
|
#include "model.h"
|
|
|
|
#define GLFW_INCLUDE_VULKAN
|
|
#include <GLFW/glfw3.h>
|
|
|
|
#define MAX_FRAMES_IN_FLIGHT 4
|
|
|
|
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;
|
|
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, mat4_t light_vp, size_t model_count,
|
|
const gpu_model_t *models, const mat4_t **bone_matrices,
|
|
const mat4_t *model_transforms);
|
|
|
|
#endif
|