From: Benjamin Otte Date: Thu, 6 Jul 2023 04:40:09 +0000 (+0200) Subject: vulkan: Add VulkanOp->next X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~60^2~46 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f35053b837e7f69c880fa836a62d11c399158dca;p=gtk4.git vulkan: Add VulkanOp->next 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. --- diff --git a/gsk/gskprivate.h b/gsk/gskprivate.h index b9e32b00db..150b89eb78 100644 --- a/gsk/gskprivate.h +++ b/gsk/gskprivate.h @@ -7,8 +7,5 @@ G_BEGIN_DECLS void gsk_ensure_resources (void); -typedef struct _GskVulkanRender GskVulkanRender; -typedef struct _GskVulkanRenderPass GskVulkanRenderPass; - G_END_DECLS diff --git a/gsk/vulkan/gskvulkanopprivate.h b/gsk/vulkan/gskvulkanopprivate.h index c198e1b3e3..b4ff29efaf 100644 --- a/gsk/vulkan/gskvulkanopprivate.h +++ b/gsk/vulkan/gskvulkanopprivate.h @@ -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 diff --git a/gsk/vulkan/gskvulkanprivate.h b/gsk/vulkan/gskvulkanprivate.h index 1ec1f9b720..4a24822863 100644 --- a/gsk/vulkan/gskvulkanprivate.h +++ b/gsk/vulkan/gskvulkanprivate.h @@ -7,6 +7,10 @@ #include #include +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) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 9bf055cf3d..21c4776c04 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -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, diff --git a/gsk/vulkan/gskvulkanrenderpassprivate.h b/gsk/vulkan/gskvulkanrenderpassprivate.h index 5201db6df3..3040ce624c 100644 --- a/gsk/vulkan/gskvulkanrenderpassprivate.h +++ b/gsk/vulkan/gskvulkanrenderpassprivate.h @@ -4,8 +4,8 @@ #include #include "gskvulkanbufferprivate.h" +#include "gskvulkanprivate.h" #include "gskvulkanrenderprivate.h" -#include "gsk/gskprivate.h" G_BEGIN_DECLS diff --git a/gsk/vulkan/gskvulkanrenderprivate.h b/gsk/vulkan/gskvulkanrenderprivate.h index 9983a6ccff..3ae0a1e2a9 100644 --- a/gsk/vulkan/gskvulkanrenderprivate.h +++ b/gsk/vulkan/gskvulkanrenderprivate.h @@ -4,8 +4,8 @@ #include #include "gskvulkanimageprivate.h" +#include "gskvulkanprivate.h" #include "gskvulkanrenderpassprivate.h" -#include "gsk/gskprivate.h" G_BEGIN_DECLS