X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fvk.h;h=2750d84d90032077c41790d481209554a2a518bc;hb=8d3a8ecaf4f20ed8c460ab75724c7bf8363e905a;hp=97496b897a83c1a5122412bec6d229922f6c9ab8;hpb=5541e7b773b5b049eb2fb44bc82c4322005b947b;p=vkrt diff --git a/src/vk.h b/src/vk.h index 97496b8..2750d84 100644 --- a/src/vk.h +++ b/src/vk.h @@ -7,196 +7,311 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) struct vk_ctx { - VkInstance inst; - VkPhysicalDevice pdev; - VkDevice dev; - VkPipelineCache cache; + VkInstance inst; + VkPhysicalDevice pdev; + VkDevice dev; - VkCommandPool cmd_pool; - VkCommandBuffer cmd_buf; + VkCommandPool cmd_pool; + VkCommandBuffer *cmd_buffers; + uint32_t num_cmd_buffers; - VkQueue queue; - int qfam_idx; + VkQueue queue; + int qfam_idx; - uint8_t deviceUUID[VK_UUID_SIZE]; - uint8_t driverUUID[VK_UUID_SIZE]; + uint8_t deviceUUID[VK_UUID_SIZE]; + uint8_t driverUUID[VK_UUID_SIZE]; }; -struct vk_image_props +struct vk_cmd_buffer { - uint32_t w; - uint32_t h; - uint32_t depth; + VkCommandBuffer buffer; + VkSubmitInfo submit_info; +}; - uint32_t num_samples; - uint32_t num_levels; - uint32_t num_layers; +struct vk_swapchain +{ + VkSwapchainKHR swapchain; + VkSurfaceFormatKHR surf_fmt; - VkFormat format; - VkImageUsageFlagBits usage; - VkImageTiling tiling; + /* image properties */ + VkFormat image_fmt; + VkExtent2D extent2d; - VkImageLayout in_layout; - VkImageLayout end_layout; + uint32_t num_atts; + struct vk_attachment *atts; +}; + +struct vk_att_props +{ + uint32_t w; + uint32_t h; + uint32_t depth; + + uint32_t num_samples; + uint32_t num_levels; + uint32_t num_layers; + + VkFormat format; + VkImageUsageFlagBits usage; + VkImageTiling tiling; + + VkImageLayout in_layout; + VkImageLayout end_layout; + + bool is_depth; + bool is_swapchain; + bool need_export; }; struct vk_mem_obj { - VkDeviceMemory mem; - VkDeviceSize mem_sz; - bool dedicated; + VkDeviceMemory mem; + VkDeviceSize mem_sz; + + bool dedicated; }; struct vk_image_obj { - VkImage img; - struct vk_mem_obj mobj; -}; + VkImage img; + VkImageView img_view; -struct vk_buf -{ - VkBuffer buf; - struct vk_mem_obj mobj; + struct vk_mem_obj mobj; }; -struct vk_image_att { - struct vk_image_obj obj; - struct vk_image_props props; +struct vk_attachment { + struct vk_image_obj obj; + struct vk_att_props props; }; struct vk_vertex_info { - int num_verts; - int num_components; + int num_verts; + int num_components; + + VkPrimitiveTopology topology; +}; - VkPrimitiveTopology topology; +struct vk_buf +{ + VkBuffer buf; + struct vk_mem_obj mobj; }; struct vk_renderer { - VkPipeline pipeline; - VkPipelineLayout pipeline_layout; - VkRenderPass renderpass; - VkShaderModule vs; - VkShaderModule fs; - VkFramebuffer fb; - - struct vk_vertex_info vertex_info; + VkPipeline pipeline; + VkPipelineLayout pipeline_layout; + VkRenderPass renderpass; + VkShaderModule vs; + VkShaderModule fs; + VkFramebuffer fb; + + struct vk_vertex_info vertex_info; }; struct vk_dims { - float w; - float h; + float w; + float h; }; struct vk_semaphores { - VkSemaphore frame_ready; - VkSemaphore frame_done; + VkSemaphore frame_ready; + VkSemaphore frame_done; }; +#ifdef __cplusplus +extern "C" { +#endif + /* context */ -bool vk_init_ctx(struct vk_ctx *ctx); -bool vk_init_ctx_for_rendering(struct vk_ctx *ctx); -void vk_cleanup_ctx(struct vk_ctx *ctx); +bool vk_init_ctx(struct vk_ctx *ctx, + bool enable_layers); + +bool vk_init_ctx_for_rendering(struct vk_ctx *ctx, + bool enable_cache, + bool enable_layers); + +void vk_cleanup_ctx(struct vk_ctx *ctx, + bool enable_layers); /* images */ bool vk_create_image(struct vk_ctx *ctx, - struct vk_image_props *props, - struct vk_image_obj *img_obj); + struct vk_att_props *props, + struct vk_image_obj *img_obj); void vk_destroy_image(struct vk_ctx *ctx, - struct vk_image_obj *img_obj); - + struct vk_image_obj *img_obj); bool -vk_fill_ext_image_props(struct vk_ctx *ctx, - uint32_t w, uint32_t h, - uint32_t depth, - uint32_t num_samples, - uint32_t num_levels, - uint32_t num_layers, - VkFormat format, - VkImageTiling tiling, - VkImageUsageFlagBits usage, - VkImageLayout in_layout, - VkImageLayout end_layout, - struct vk_image_props *props); +vk_fill_image_props(struct vk_ctx *ctx, + uint32_t w, uint32_t h, + uint32_t depth, + uint32_t num_samples, + uint32_t num_levels, + uint32_t num_layers, + VkFormat format, + VkImageTiling tiling, + VkImageLayout in_layout, + VkImageLayout end_layout, + bool is_swapchain, + bool is_depth, + bool need_export, + struct vk_att_props *props); /* buffers */ bool vk_create_buffer(struct vk_ctx *ctx, - uint32_t sz, - VkBufferUsageFlagBits usage, - void *pnext, - struct vk_buf *bo); + bool is_external, + uint32_t sz, + VkBufferUsageFlagBits usage, + void *pnext, + struct vk_buf *bo); void vk_destroy_buffer(struct vk_ctx *ctx, - struct vk_buf *bo); + struct vk_buf *bo); bool vk_update_buffer_data(struct vk_ctx *ctx, - void *data, - uint32_t data_sz, - struct vk_buf *bo); + void *data, + uint32_t data_sz, + struct vk_buf *bo); -/* semaphores */ +bool +vk_create_ext_buffer(struct vk_ctx *ctx, + uint32_t sz, + VkBufferUsageFlagBits usage, + struct vk_buf *bo); + + +/* semaphores and fences */ bool vk_create_semaphores(struct vk_ctx *ctx, - struct vk_semaphores *semaphores); + bool is_external, + struct vk_semaphores *semaphores); void vk_destroy_semaphores(struct vk_ctx *ctx, - struct vk_semaphores *semaphores); + struct vk_semaphores *semaphores); + +bool +vk_create_fences(struct vk_ctx *ctx, + int num_cmd_buf, + VkFenceCreateFlagBits flags, + VkFence *fences); + +void +vk_destroy_fences(struct vk_ctx *ctc, + int num_fences, + VkFence *fences); /* renderer */ bool vk_create_renderer(struct vk_ctx *ctx, - const char *vs_src, - unsigned int vs_size, - const char *fs_src, - unsigned int fs_size, - bool enable_depth, - bool enable_stencil, - struct vk_image_att *color_att, - struct vk_image_att *depth_att, - struct vk_vertex_info *vert_info, - struct vk_renderer *renderer); + const char *vs_src, + unsigned int vs_size, + const char *fs_src, + unsigned int fs_size, + int w, int h, + uint32_t num_samples, + bool enable_depth, + bool enable_stencil, + int num_color_att, + struct vk_attachment *color_att, + struct vk_attachment *depth_att, + struct vk_vertex_info *vert_info, + struct vk_renderer *renderer); void vk_destroy_renderer(struct vk_ctx *ctx, - struct vk_renderer *pipeline); + struct vk_renderer *pipeline); /* draw */ +VkCommandBuffer +vk_create_cmd_buffer(struct vk_ctx *ctx); + +bool +vk_record_cmd_buffer(struct vk_ctx *ctx, + VkCommandBuffer cmd_buf, + struct vk_renderer *renderer, + struct vk_buf *vbo, + uint32_t vk_fb_color_count, + float *vk_fb_color, + uint32_t num_atts, + struct vk_attachment *atts, + float x, float y, + float w, float h); + +void +vk_reset_cmd_buf(struct vk_cmd_buffer *cmd_buf); + +void +vk_destroy_cmd_bufs(struct vk_ctx *ctx, + uint32_t num_buffers, + VkCommandBuffer *buffers); void vk_draw(struct vk_ctx *ctx, - struct vk_buf *vbo, - struct vk_renderer *renderer, - float *vk_fb_color, - uint32_t vk_fb_color_count, - struct vk_semaphores *semaphores, - struct vk_image_att *attachments, - uint32_t n_attachments, - float x, float y, float w, float h); + struct vk_semaphores *semaphores, + uint32_t num_buffers, + VkCommandBuffer *cmd_buf); + +void +vk_clear_color(struct vk_ctx *ctx, + VkCommandBuffer cmd_buf, + struct vk_buf *vbo, + struct vk_renderer *renderer, + float *vk_fb_color, + uint32_t vk_fb_color_count, + struct vk_semaphores *semaphores, + bool has_wait, bool has_signal, + struct vk_attachment *attachments, + uint32_t n_attachments, + float x, float y, float w, float h); + +/* swapchain */ + +bool +vk_create_swapchain(struct vk_ctx *ctx, + int width, int height, + bool vsync, + VkSurfaceKHR surf, + struct vk_swapchain *old_swapchain, + struct vk_swapchain *swapchain); +void +vk_destroy_swapchain(struct vk_ctx *ctx, + struct vk_swapchain *swapchain); + +bool +vk_present_queue(struct vk_swapchain *swapchain, + VkQueue queue, + uint32_t image_idx, + VkSemaphore wait_sema); /* transitions */ void vk_copy_image_to_buffer(struct vk_ctx *ctx, - struct vk_image_att *src_img, - struct vk_buf *dst_bo, - float w, float h); + VkCommandBuffer cmd_buf, + struct vk_attachment *src_img, + struct vk_buf *dst_bo, + float w, float h); void -vk_transition_image_layout(struct vk_image_att *img_att, - VkCommandBuffer cmd_buf, - VkImageLayout old_layout, - VkImageLayout new_layout, - uint32_t src_queue_family_index, - uint32_t dst_queue_family_index); +vk_transition_image_layout(struct vk_attachment *img_att, + VkCommandBuffer cmd_buf, + VkImageLayout old_layout, + VkImageLayout new_layout, + uint32_t src_queue_family_index, + uint32_t dst_queue_family_index); + + +#ifdef __cplusplus +} +#endif #endif /* VK_H */