#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 */