vulkan: Create the first real VulkanOp
authorBenjamin Otte <otte@redhat.com>
Sat, 24 Jun 2023 02:49:39 +0000 (04:49 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:12:36 +0000 (12:12 +0200)
Split out the scissor op into its own implementation as a proof of
concept of how ops are meant to look when they are actually working.

gsk/meson.build
gsk/vulkan/gskvulkanop.c
gsk/vulkan/gskvulkanopprivate.h
gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkanscissorop.c [new file with mode: 0644]
gsk/vulkan/gskvulkanscissoropprivate.h [new file with mode: 0644]

index bfec80f6c0833e1bbd2c77c75472a6af1f249c08..e5c51a72ae25bb59d45da6bd5babc3ded4a7cc35 100644 (file)
@@ -128,6 +128,7 @@ if have_vulkan
     'vulkan/gskvulkanrender.c',
     'vulkan/gskvulkanrenderer.c',
     'vulkan/gskvulkanrenderpass.c',
+    'vulkan/gskvulkanscissorop.c',
     'vulkan/gskvulkanshader.c',
     'vulkan/gskvulkantextpipeline.c',
     'vulkan/gskvulkantexturepipeline.c',
index 6c8aaaa776713e34a5b10ac69b4f0c6a3d0d5209..20f7f22b5e262cae70119362a24d6b9754eda074 100644 (file)
@@ -2,6 +2,13 @@
 
 #include "gskvulkanopprivate.h"
 
+void
+gsk_vulkan_op_init (GskVulkanOp            *op,
+                    const GskVulkanOpClass *op_class)
+{
+  op->op_class = op_class;
+}
+
 void
 gsk_vulkan_op_finish (GskVulkanOp *op)
 {
index e808bf49bd559b3895a715abe7cf68fe26a0fc58..92c380e75f92c4222a9305621144b9374efbaa07 100644 (file)
@@ -40,6 +40,11 @@ struct _GskVulkanOpClass
                                                                          VkCommandBuffer         command_buffer);
 };
 
+/* ensures alignment of ops to multipes of 16 bytes - and that makes graphene happy */
+#define GSK_VULKAN_OP_SIZE(struct_name) ((sizeof(struct_name) + 15) & ~15)
+
+void                    gsk_vulkan_op_init                              (GskVulkanOp            *op,
+                                                                         const GskVulkanOpClass *op_class);
 void                    gsk_vulkan_op_finish                            (GskVulkanOp            *op);
 
 void                    gsk_vulkan_op_upload                            (GskVulkanOp            *op,
index 12322fd8930abf89b414105204d23a2fbe50e2a6..b41bf16363308f7edf21e09b615e4334427dd954 100644 (file)
@@ -24,6 +24,7 @@
 #include "gskvulkantexturepipelineprivate.h"
 #include "gskvulkanimageprivate.h"
 #include "gskvulkanpushconstantsprivate.h"
+#include "gskvulkanscissoropprivate.h"
 #include "gskvulkanrendererprivate.h"
 #include "gskprivate.h"
 
@@ -45,7 +46,6 @@ typedef union  _GskVulkanOpAll GskVulkanOpAll;
 typedef struct _GskVulkanOpRender GskVulkanOpRender;
 typedef struct _GskVulkanOpText GskVulkanOpText;
 typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants;
-typedef struct _GskVulkanOpScissor GskVulkanOpScissor;
 
 typedef enum {
   /* GskVulkanOpRender */
@@ -70,8 +70,6 @@ typedef enum {
   GSK_VULKAN_OP_COLOR_TEXT,
   /* GskVulkanOpPushConstants */
   GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS,
-  /* GskVulkanOpScissor */
-  GSK_VULKAN_OP_SCISSOR,
 } GskVulkanOpType;
 
 /* render ops with 0, 1 or 2 sources */
@@ -120,14 +118,6 @@ struct _GskVulkanOpPushConstants
   GskRoundedRect          clip;
 };
 
-struct _GskVulkanOpScissor
-{
-  GskVulkanOp             base;
-  GskVulkanOpType         type;
-  GskRenderNode          *node; /* node that's the source of this op */
-  cairo_rectangle_int_t   rect;
-};
-
 struct _GskVulkanOpAny
 {
   GskVulkanOp             base;
@@ -141,7 +131,6 @@ union _GskVulkanOpAll
   GskVulkanOpRender        render;
   GskVulkanOpText          text;
   GskVulkanOpPushConstants constants;
-  GskVulkanOpScissor       scissor;
 };
 
 struct _GskVulkanRenderPass
@@ -293,6 +282,12 @@ gsk_vulkan_render_pass_free (GskVulkanRenderPass *self)
   g_free (self);
 }
 
+static inline gsize
+round_up (gsize number, gsize divisor)
+{
+  return (number + divisor - 1) / divisor * divisor;
+}
+
 static gpointer
 gsk_vulkan_render_pass_alloc_op (GskVulkanRenderPass *self,
                                  gsize                size)
@@ -319,13 +314,8 @@ gsk_vulkan_render_pass_append_scissor (GskVulkanRenderPass       *self,
                                        GskRenderNode             *node,
                                        const GskVulkanParseState *state)
 {
-  GskVulkanOpScissor op = {
-    .type  = GSK_VULKAN_OP_SCISSOR,
-    .node  = node,
-    .rect  = state->scissor
-  };
-
-  gsk_vulkan_render_pass_add_op (self, (GskVulkanOp *) &op);
+  gsk_vulkan_scissor_op_init (gsk_vulkan_render_pass_alloc_op (self, gsk_vulkan_scissor_op_size ()),
+                              &state->scissor);
 }
 
 static void
@@ -1836,17 +1826,10 @@ gsk_vulkan_render_op_upload (GskVulkanOp           *op_,
         case GSK_VULKAN_OP_BORDER:
         case GSK_VULKAN_OP_INSET_SHADOW:
         case GSK_VULKAN_OP_OUTSET_SHADOW:
-        case GSK_VULKAN_OP_SCISSOR:
           break;
         }
 }
 
-static inline gsize
-round_up (gsize number, gsize divisor)
-{
-  return (number + divisor - 1) / divisor * divisor;
-}
-
 static gsize
 gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self)
 {
@@ -1908,7 +1891,6 @@ gsk_vulkan_render_op_count_vertex_data (GskVulkanOp *op_,
           g_assert_not_reached ();
 
         case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
-        case GSK_VULKAN_OP_SCISSOR:
           break;
         }
 
@@ -2130,7 +2112,6 @@ gsk_vulkan_render_op_collect_vertex_data (GskVulkanOp         *op_,
         default:
           g_assert_not_reached ();
         case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
-        case GSK_VULKAN_OP_SCISSOR:
           break;
         }
 }
@@ -2277,7 +2258,6 @@ gsk_vulkan_render_op_reserve_descriptor_sets (GskVulkanOp     *op_,
         case GSK_VULKAN_OP_INSET_SHADOW:
         case GSK_VULKAN_OP_OUTSET_SHADOW:
         case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
-        case GSK_VULKAN_OP_SCISSOR:
           break;
         }
 }
@@ -2352,7 +2332,6 @@ gsk_vulkan_render_op_get_pipeline (GskVulkanOp *op_)
       return op->text.pipeline;
 
     case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
-    case GSK_VULKAN_OP_SCISSOR:
       return NULL;
 
     default:
@@ -2454,16 +2433,6 @@ gsk_vulkan_render_op_command (GskVulkanOp      *op_,
                                           &op->constants.clip);
           break;
 
-        case GSK_VULKAN_OP_SCISSOR:
-          vkCmdSetScissor (command_buffer,
-                           0,
-                           1,
-                           &(VkRect2D) {
-                             { op->scissor.rect.x, op->scissor.rect.y },
-                             { op->scissor.rect.width, op->scissor.rect.height },
-                           });
-          break;
-
         case GSK_VULKAN_OP_CROSS_FADE:
           if (!op->render.source || !op->render.source2)
             break;
diff --git a/gsk/vulkan/gskvulkanscissorop.c b/gsk/vulkan/gskvulkanscissorop.c
new file mode 100644 (file)
index 0000000..e763306
--- /dev/null
@@ -0,0 +1,98 @@
+#include "config.h"
+
+#include "gskvulkanscissoropprivate.h"
+
+typedef struct _GskVulkanScissorOp GskVulkanScissorOp;
+
+struct _GskVulkanScissorOp
+{
+  GskVulkanOp op;
+
+  cairo_rectangle_int_t rect;
+};
+
+static void
+gsk_vulkan_scissor_op_finish (GskVulkanOp *op)
+{
+}
+
+static void
+gsk_vulkan_scissor_op_upload (GskVulkanOp           *op,
+                              GskVulkanRenderPass   *pass,
+                              GskVulkanRender       *render,
+                              GskVulkanUploader     *uploader,
+                              const graphene_rect_t *clip,
+                              const graphene_vec2_t *scale)
+{
+}
+
+static gsize
+gsk_vulkan_scissor_op_count_vertex_data (GskVulkanOp *op,
+                                         gsize        n_bytes)
+{
+  return n_bytes;
+}
+
+static void
+gsk_vulkan_scissor_op_collect_vertex_data (GskVulkanOp         *op,
+                                           GskVulkanRenderPass *pass,
+                                           GskVulkanRender     *render,
+                                           guchar              *data)
+{
+}
+
+static void
+gsk_vulkan_scissor_op_reserve_descriptor_sets (GskVulkanOp     *op,
+                                               GskVulkanRender *render)
+{
+}
+
+static GskVulkanPipeline *
+gsk_vulkan_scissor_op_get_pipeline (GskVulkanOp *op)
+{
+  return NULL;
+}
+
+static void
+gsk_vulkan_scissor_op_command (GskVulkanOp      *op,
+                               VkPipelineLayout  pipeline_layout,
+                               VkCommandBuffer   command_buffer)
+{
+  GskVulkanScissorOp *self = (GskVulkanScissorOp *) op;
+
+  vkCmdSetScissor (command_buffer,
+                   0,
+                   1,
+                   &(VkRect2D) {
+                     { self->rect.x, self->rect.y },
+                     { self->rect.width, self->rect.height },
+                   });
+}
+
+static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
+  GSK_VULKAN_OP_SIZE (GskVulkanScissorOp),
+  gsk_vulkan_scissor_op_finish,
+  gsk_vulkan_scissor_op_upload,
+  gsk_vulkan_scissor_op_count_vertex_data,
+  gsk_vulkan_scissor_op_collect_vertex_data,
+  gsk_vulkan_scissor_op_reserve_descriptor_sets,
+  gsk_vulkan_scissor_op_get_pipeline,
+  gsk_vulkan_scissor_op_command
+};
+
+gsize
+gsk_vulkan_scissor_op_size (void)
+{
+  return GSK_VULKAN_SCISSOR_OP_CLASS.size;
+}
+
+void
+gsk_vulkan_scissor_op_init (GskVulkanOp                 *op,
+                            const cairo_rectangle_int_t *rect)
+{
+  GskVulkanScissorOp *self = (GskVulkanScissorOp *) op;
+
+  gsk_vulkan_op_init (op, &GSK_VULKAN_SCISSOR_OP_CLASS);
+
+  self->rect = *rect;
+}
diff --git a/gsk/vulkan/gskvulkanscissoropprivate.h b/gsk/vulkan/gskvulkanscissoropprivate.h
new file mode 100644 (file)
index 0000000..6e46512
--- /dev/null
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "gskvulkanopprivate.h"
+
+G_BEGIN_DECLS
+
+gsize                   gsk_vulkan_scissor_op_size                      (void) G_GNUC_CONST;
+
+void                    gsk_vulkan_scissor_op_init                      (GskVulkanOp                    *op,
+                                                                         const cairo_rectangle_int_t    *rect);
+
+
+G_END_DECLS
+