#include <stdbool.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+
struct vk_ctx
{
VkInstance inst;
+
VkPhysicalDevice pdev;
VkDevice dev;
VkCommandPool cmd_pool;
- VkCommandBuffer cmd_buf;
VkQueue queue;
int qfam_idx;
struct vk_swapchain
{
VkSwapchainKHR swapchain;
- VkSurfaceKHR surface;
VkSurfaceFormatKHR surf_fmt;
/* image properties */
VkFormat image_fmt;
VkExtent2D extent2d;
- uint32_t num_images;
- struct vk_image_obj *images;
+ uint32_t num_atts;
+ struct vk_attachment *atts;
};
-struct vk_image_props
+struct vk_att_props
{
uint32_t w;
uint32_t h;
VkImageLayout in_layout;
VkImageLayout end_layout;
+ bool is_depth;
+ bool is_swapchain;
bool need_export;
};
struct vk_mem_obj mobj;
};
-struct vk_image_attachment {
+struct vk_attachment {
struct vk_image_obj obj;
- struct vk_image_props props;
+ struct vk_att_props props;
};
struct vk_vertex_info
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);
+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);
/* images */
bool
vk_create_image(struct vk_ctx *ctx,
- struct vk_image_props *props,
+ struct vk_att_props *props,
struct vk_image_obj *img_obj);
void
vk_destroy_image(struct vk_ctx *ctx,
VkImageTiling tiling,
VkImageLayout in_layout,
VkImageLayout end_layout,
+ bool is_swapchain,
+ bool is_depth,
bool need_export,
- struct vk_image_props *props);
-
-bool
-vk_create_attachment_from_swapchain_image(struct vk_ctx *ctx,
- VkImage *swapchain_img,
- VkImageView *swapchain_view,
- struct vk_image_props *swapchain_props,
- struct vk_image_attachment *color_att);
+ struct vk_att_props *props);
/* buffers */
vk_destroy_semaphores(struct vk_ctx *ctx,
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,
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,
- struct vk_image_attachment *color_att,
- struct vk_image_attachment *depth_att,
+ int num_color_att,
+ struct vk_attachment *color_att,
+ struct vk_attachment *depth_att,
struct vk_vertex_info *vert_info,
struct vk_renderer *renderer);
vk_destroy_renderer(struct vk_ctx *ctx,
struct vk_renderer *pipeline);
-/* draw */
+/* fences and command buffers */
+bool
+vk_create_fence(struct vk_ctx *ctx,
+ VkFence *fence);
+
+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_destroy_cmd_buffers(struct vk_ctx *ctx,
+ uint32_t num_buffers,
+ VkCommandBuffer *buffers);
+
+/* draw */
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_attachment *attachments,
- uint32_t n_attachments,
- float x, float y, float w, float h);
+ 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_image_attachment *attachments,
+ struct vk_attachment *attachments,
uint32_t n_attachments,
float x, float y, float w, float h);
+void
+vk_set_viewport(struct vk_ctx *ctx,
+ VkCommandBuffer cmd_buf,
+ float x, float y,
+ float w, float h,
+ float near, float far);
+
/* swapchain */
bool
vk_destroy_swapchain(struct vk_ctx *ctx,
struct vk_swapchain *swapchain);
+bool
+vk_queue_present(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_attachment *src_img,
+ 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_attachment *img_att,
+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 */