removed gph-math, will use a c library
[vkrt] / src / vk.h
index ff5c025..772f2e3 100644 (file)
--- a/src/vk.h
+++ b/src/vk.h
@@ -5,14 +5,30 @@
 #include <stdbool.h>
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+
+enum GEOM_BIND {
+    VERTEX_BIND,
+    NORMAL_BIND,
+    TEXCOORD_BIND,
+    TANGENT_BIND,
+    IDX_BIND
+};
+
+enum GEOM_LOC {
+    VERTEX_LOC,
+    NORMAL_LOC,
+    TANGENT_LOC,
+    IDX_LOC
+};
+
 struct vk_ctx
 {
     VkInstance inst;
+
     VkPhysicalDevice pdev;
     VkDevice dev;
 
     VkCommandPool cmd_pool;
-    VkCommandBuffer cmd_buf;
 
     VkQueue queue;
     int qfam_idx;
@@ -21,27 +37,7 @@ struct vk_ctx
     uint8_t driverUUID[VK_UUID_SIZE];
 };
 
-struct vk_swap_image_obj
-{
-    VkImage image;
-    VkImageView image_view;
-};
-
-struct vk_swapchain
-{
-    VkSwapchainKHR swapchain;
-    VkSurfaceKHR surface;
-    VkSurfaceFormatKHR surf_fmt;
-
-    /* image properties */
-    VkFormat image_fmt;
-    VkExtent2D extent2d;
-
-    uint32_t num_images;
-    struct vk_swap_image_obj *images;
-};
-
-struct vk_image_props
+struct vk_att_props
 {
     uint32_t w;
     uint32_t h;
@@ -58,9 +54,30 @@ struct vk_image_props
     VkImageLayout in_layout;
     VkImageLayout end_layout;
 
+    bool is_depth;
+    bool is_swapchain;
     bool need_export;
 };
 
+struct vk_swapchain
+{
+    VkSwapchainKHR swapchain;
+    VkSurfaceFormatKHR surf_fmt;
+
+    /* image properties */
+    /* FIXME: do I really need those 2?*/
+    VkFormat image_fmt;
+    VkExtent2D extent2d;
+
+    struct vk_att_props img_props;
+
+    uint32_t num_images;
+    VkImage *images;
+    VkImageView *views;
+};
+
+/* for allocated images */
+
 struct vk_mem_obj {
     VkDeviceMemory mem;
     VkDeviceSize mem_sz;
@@ -75,23 +92,32 @@ struct vk_image_obj {
     struct vk_mem_obj mobj;
 };
 
-struct vk_image_att {
+struct vk_attachment {
     struct vk_image_obj obj;
-    struct vk_image_props props;
+    struct vk_att_props props;
 };
 
-struct vk_vertex_info
+struct vk_buf
 {
-    int num_verts;
-    int num_components;
+    VkBuffer buf;
+    struct vk_mem_obj mobj;
+};
 
-    VkPrimitiveTopology topology;
+struct vk_vbo {
+    int num_vertices;
+    struct vk_buf vbo;
+
+    /* int num_components; */
 };
 
-struct vk_buf
+struct vk_geometry
 {
-    VkBuffer buf;
-    struct vk_mem_obj mobj;
+    struct vk_vbo vertices;
+    struct vk_vbo normals;
+    struct vk_vbo tangents;
+    struct vk_vbo indices;
+
+    VkPrimitiveTopology topo;
 };
 
 struct vk_renderer
@@ -101,9 +127,8 @@ struct vk_renderer
     VkRenderPass renderpass;
     VkShaderModule vs;
     VkShaderModule fs;
-    VkFramebuffer fb;
 
-    struct vk_vertex_info vertex_info;
+    struct vk_geometry *geometry;
 };
 
 struct vk_dims
@@ -118,42 +143,67 @@ struct vk_semaphores
     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_ext_image(struct vk_ctx *ctx,
+                    struct vk_att_props *props,
+                    struct vk_image_obj *img);
 
 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,
                  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,
-                        VkImageLayout in_layout,
-                        VkImageLayout end_layout,
-                        bool need_export,
-                        struct vk_image_props *props);
+vk_create_image_view(struct vk_ctx *ctx,
+                     VkImage image,
+                     VkImageViewType view_type,
+                     VkFormat format,
+                     bool is_swapchain,
+                     VkImageView *image_view);
 
 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_att *color_att);
+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);
+
+struct vk_attachment
+vk_create_attachment_from_obj(struct vk_image_obj *obj,
+                              struct vk_att_props *props);
+
+struct vk_attachment
+vk_create_attachment(VkImage image,
+                     VkImageView view,
+                     struct vk_att_props *props);
 
 /* buffers */
 
@@ -180,7 +230,7 @@ vk_create_ext_buffer(struct vk_ctx *ctx,
                      struct vk_buf *bo);
 
 
-/* semaphores */
+/* semaphores and fences */
 
 bool
 vk_create_semaphores(struct vk_ctx *ctx,
@@ -190,7 +240,27 @@ void
 vk_destroy_semaphores(struct vk_ctx *ctx,
                       struct vk_semaphores *semaphores);
 
+void
+vk_destroy_fences(struct vk_ctx *ctc,
+                  int num_fences,
+                  VkFence *fences);
+
 /* renderer */
+bool
+vk_create_framebuffer(struct vk_ctx *ctx,
+                      int width, int height,
+                      int num_color_atts,
+                      VkImageView *color_views,
+                      VkImageView *depth_view,
+                      VkRenderPass rb,
+                      VkFramebuffer *fb);
+
+bool
+vk_create_renderpass(struct vk_ctx *ctx,
+                     uint32_t num_color_atts,
+                     struct vk_att_props *color_props,
+                     struct vk_att_props *depth_props,
+                     VkRenderPass *renderpass);
 
 bool
 vk_create_renderer(struct vk_ctx *ctx,
@@ -198,42 +268,73 @@ vk_create_renderer(struct vk_ctx *ctx,
                    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_att *color_att,
-                   struct vk_image_att *depth_att,
-                   struct vk_vertex_info *vert_info,
+                   int num_color_att,
+                   struct vk_att_props *color_props,
+                   struct vk_att_props *depth_props,
+                   struct vk_geometry *geometry,
                    struct vk_renderer *renderer);
 
 void
 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,
+                     uint32_t vk_fb_color_count,
+                     float *vk_fb_color,
+                     VkFramebuffer fb,
+                     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_att *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,
+               VkFramebuffer fb,
                struct vk_semaphores *semaphores,
                bool has_wait, bool has_signal,
-               struct vk_image_att *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
@@ -247,20 +348,32 @@ void
 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_att *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_att *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 */