#ifndef _RENDER_H_ #define _RENDER_H_ #include #include #include "render/window.h" #include "render/buffer.h" #include "render/shader.h" #include "render/mesh.h" #define MAX_FRAMES 2 struct image { VkImage image; VkDeviceMemory memory; VkImageView view; }; struct renderer { struct window *win; VkInstance instance; VkSurfaceKHR surface; struct { uint32_t cap, len; struct phy_gpu { VkPhysicalDevice gpu; size_t graphics_queue; size_t present_queue; struct surface_caps { VkSurfaceCapabilitiesKHR caps; struct { uint32_t len; VkSurfaceFormatKHR *data; } formats; struct { uint32_t len; VkPresentModeKHR *data; } present_modes; } surface_caps; } *gpus; struct phy_gpu *chosen; } phy_gpus; struct { VkDevice device; VkQueue gfx_queue; VkQueue present_queue; } gpu; struct { VkSwapchainKHR swapchain; VkFormat format; VkExtent2D extent; struct { uint32_t len; struct { VkImage image; VkImageView view; VkFramebuffer framebuffer; } *data; } images; } swapchain; struct { VkCommandPool pool; VkCommandBuffer buffers[MAX_FRAMES]; } command; struct { VkPipelineLayout layout; VkPipeline gfx; VkPipeline blend; } pipeline; struct { VkSemaphore image_available[MAX_FRAMES]; VkSemaphore render_finished[MAX_FRAMES]; VkFence in_flight[MAX_FRAMES]; } locks; struct { VkDescriptorSetLayout layout; VkDescriptorPool pool; VkDescriptorSet sets[MAX_FRAMES]; } descriptor; struct image depth; struct { struct buffer buffer; void *data; } uniform[MAX_FRAMES]; VkRenderPass render_pass; VkRenderPass blend_pass; VkFramebuffer blend_framebuffer[MAX_FRAMES]; struct buffer node[MAX_FRAMES]; struct buffer count[MAX_FRAMES]; struct image head[MAX_FRAMES]; VkImageView head_view[MAX_FRAMES]; uint32_t max_count; uint32_t current_frame; }; struct renderer *renderer_init(struct window *win); void renderer_destroy(struct renderer *ren); void renderer_draw(struct renderer *ren, size_t mesh_count, struct mesh meshes[mesh_count]); void renderer_resize(struct renderer *ren); #endif