vulkan: Add VulkanOp->next
authorBenjamin Otte <otte@redhat.com>
Thu, 6 Jul 2023 04:40:09 +0000 (06:40 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:13:00 +0000 (12:13 +0200)
Set it after creating all the ops and then use it for iterating.

Note that we cannot set it while creating the ops because the array may
be realloc()ed into a different memory region which would invalidate all
the pointers.

It currently has no use, but that will come later.

Also put the typedefs into headers in gsk/vulkan, they have nthing to do
outside that directory.

gsk/gskprivate.h
gsk/vulkan/gskvulkanopprivate.h
gsk/vulkan/gskvulkanprivate.h
gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkanrenderpassprivate.h
gsk/vulkan/gskvulkanrenderprivate.h

index b9e32b00db5afe1eb050be027704439d819f1d1d..150b89eb78d42be50bba8e8c892bc213a28faf9e 100644 (file)
@@ -7,8 +7,5 @@ G_BEGIN_DECLS
 
 void gsk_ensure_resources (void);
 
-typedef struct _GskVulkanRender GskVulkanRender;
-typedef struct _GskVulkanRenderPass GskVulkanRenderPass;
-
 G_END_DECLS
 
index c198e1b3e373ef12d6cea20fd083f4b2ff8c6b70..b4ff29efafb374b86c8705790ae2e02eee195b7f 100644 (file)
@@ -7,13 +7,13 @@
 G_BEGIN_DECLS
 
 typedef struct _GskVulkanOp GskVulkanOp;
-typedef struct _GskVulkanOpClass GskVulkanOpClass;
 
 struct _GskVulkanOp
 {
   const GskVulkanOpClass *op_class;
 
   const /* interned */ char *clip_type;
+  GskVulkanOp *next;
 };
 
 struct _GskVulkanOpClass
index 1ec1f9b7200035d5f6e0b09a81d6ce637925e077..4a248228635c563823ad05cb76a6dd77f3120f19 100644 (file)
@@ -7,6 +7,10 @@
 #include <gdk/gdk.h>
 #include <graphene.h>
 
+typedef struct _GskVulkanOpClass GskVulkanOpClass;
+typedef struct _GskVulkanRender GskVulkanRender;
+typedef struct _GskVulkanRenderPass GskVulkanRenderPass;
+
 static inline VkResult
 gsk_vulkan_handle_result (VkResult    res,
                           const char *called_function)
index 9bf055cf3db68a1c3864b02d66afb3909780ab9a..21c4776c04e47ce1363ca9c3555573516ea654ff 100644 (file)
@@ -78,6 +78,23 @@ static GQuark fallback_pixels_quark;
 static GQuark texture_pixels_quark;
 #endif
 
+static void
+gsk_vulkan_render_pass_seal (GskVulkanRenderPass *self)
+{
+  GskVulkanOp *last, *op;
+  guint i;
+
+  last = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, 0);
+
+  for (i = last->op_class->size; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+    {
+      op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
+
+      last->next = op;
+      last = op;
+    }
+}
+
 static void
 gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
                             GskVulkanRender     *render,
@@ -176,6 +193,8 @@ gsk_vulkan_render_pass_new (GdkVulkanContext      *context,
 
   gsk_vulkan_render_pass_add (self, render, node);
 
+  gsk_vulkan_render_pass_seal (self);
+
   return self;
 }
 
@@ -1381,18 +1400,24 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
   gsk_vulkan_render_pass_add_node (self, render, &state, node);
 }
 
+static GskVulkanOp *
+gsk_vulkan_render_pass_get_first_op (GskVulkanRenderPass *self)
+{
+  if (gsk_vulkan_render_ops_get_size (&self->render_ops) == 0)
+    return NULL;
+
+  return (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, 0);
+}
+
 void
 gsk_vulkan_render_pass_upload (GskVulkanRenderPass  *self,
                                GskVulkanRender      *render,
                                GskVulkanUploader    *uploader)
 {
   GskVulkanOp *op;
-  guint i;
 
-  for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+  for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
     {
-      op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
       gsk_vulkan_op_upload (op, self, render, uploader);
     }
 }
@@ -1402,13 +1427,10 @@ gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self)
 {
   GskVulkanOp *op;
   gsize n_bytes;
-  guint i;
 
   n_bytes = 0;
-  for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+  for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
     {
-      op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
       n_bytes = gsk_vulkan_op_count_vertex_data (op, n_bytes);
     }
 
@@ -1421,12 +1443,9 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
                                             guchar              *data)
 {
   GskVulkanOp *op;
-  guint i;
 
-  for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+  for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
     {
-      op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
       gsk_vulkan_op_collect_vertex_data (op, self, render, data);
     }
 }
@@ -1458,12 +1477,9 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
                                                 GskVulkanRender     *render)
 {
   GskVulkanOp *op;
-  guint i;
 
-  for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+  for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
     {
-      op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
       gsk_vulkan_op_reserve_descriptor_sets (op, render);
     }
 }
@@ -1477,7 +1493,6 @@ gsk_vulkan_render_pass_draw_rect (GskVulkanRenderPass     *self,
   VkPipeline current_pipeline = VK_NULL_HANDLE;
   VkPipeline op_pipeline;
   GskVulkanOp *op;
-  guint i;
   GskVulkanBuffer *vertex_buffer;
 
   vertex_buffer = gsk_vulkan_render_pass_get_vertex_data (self, render);
@@ -1491,10 +1506,8 @@ gsk_vulkan_render_pass_draw_rect (GskVulkanRenderPass     *self,
                             },
                             (VkDeviceSize[1]) { 0 });
 
-  for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+  for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
     {
-      op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
       if (op->op_class->shader_name)
         {
           op_pipeline = gsk_vulkan_render_create_pipeline (render,
index 5201db6df3bfed374f6c71f2c67a66fdea6ceaf6..3040ce624cdf7c87d421b48afb9f926231575758 100644 (file)
@@ -4,8 +4,8 @@
 #include <gsk/gskrendernode.h>
 
 #include "gskvulkanbufferprivate.h"
+#include "gskvulkanprivate.h"
 #include "gskvulkanrenderprivate.h"
-#include "gsk/gskprivate.h"
 
 G_BEGIN_DECLS
 
index 9983a6ccff8eaac2c29a37e5a84d72bd5639c61a..3ae0a1e2a9a299c2352eed09388d48821e385726 100644 (file)
@@ -4,8 +4,8 @@
 #include <gsk/gskrendernode.h>
 
 #include "gskvulkanimageprivate.h"
+#include "gskvulkanprivate.h"
 #include "gskvulkanrenderpassprivate.h"
-#include "gsk/gskprivate.h"
 
 G_BEGIN_DECLS