vulkan: Introduce GskVulkanShaderOp
authorBenjamin Otte <otte@redhat.com>
Sat, 15 Jul 2023 09:39:18 +0000 (11:39 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 11:16:43 +0000 (13:16 +0200)
It's the new base class for shaders now.

We're doing deep inheritance now, woohoo!

Also, port all the shader ops to it.

25 files changed:
gsk/meson.build
gsk/vulkan/gskvulkanblendmodeop.c
gsk/vulkan/gskvulkanblurop.c
gsk/vulkan/gskvulkanborderop.c
gsk/vulkan/gskvulkanclearop.c
gsk/vulkan/gskvulkancolormatrixop.c
gsk/vulkan/gskvulkancolorop.c
gsk/vulkan/gskvulkancrossfadeop.c
gsk/vulkan/gskvulkandownloadop.c
gsk/vulkan/gskvulkanglyphop.c
gsk/vulkan/gskvulkaninsetshadowop.c
gsk/vulkan/gskvulkanlineargradientop.c
gsk/vulkan/gskvulkanmaskop.c
gsk/vulkan/gskvulkanop.c
gsk/vulkan/gskvulkanopprivate.h
gsk/vulkan/gskvulkanoutsetshadowop.c
gsk/vulkan/gskvulkanpushconstantsop.c
gsk/vulkan/gskvulkanrender.c
gsk/vulkan/gskvulkanrenderpassop.c
gsk/vulkan/gskvulkanrenderprivate.h
gsk/vulkan/gskvulkanscissorop.c
gsk/vulkan/gskvulkanshaderop.c [new file with mode: 0644]
gsk/vulkan/gskvulkanshaderopprivate.h [new file with mode: 0644]
gsk/vulkan/gskvulkantextureop.c
gsk/vulkan/gskvulkanuploadop.c

index 74cf758ca3d691e51c37ba719d31129692137d28..5a86498679ab3b8b501944ed92a2b32ff037338e 100644 (file)
@@ -133,6 +133,7 @@ if have_vulkan
     'vulkan/gskvulkanrenderpass.c',
     'vulkan/gskvulkanrenderpassop.c',
     'vulkan/gskvulkanscissorop.c',
+    'vulkan/gskvulkanshaderop.c',
     'vulkan/gskvulkantextureop.c',
     'vulkan/gskvulkanuploadop.c',
   ])
index c90ca935a8e99ea4164d16d2032dd114b5393dd5..81df72c6a33f879b4d83c7f134478dc875a37f37 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanblendmodeopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/blend-mode.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanBlendModeOp GskVulkanBlendModeOp;
 
 struct _GskVulkanBlendModeOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   graphene_rect_t bounds;
   GskBlendMode blend_mode;
@@ -50,7 +51,7 @@ gsk_vulkan_blend_mode_op_collect_vertex_data (GskVulkanOp *op,
                                               guchar      *data)
 {
   GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
-  GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) (data + op->vertex_offset);
+  GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_vulkan_rect_to_float (&self->bounds, instance->rect);
   gsk_vulkan_rect_to_float (&self->top.rect, instance->top_rect);
@@ -77,32 +78,19 @@ gsk_vulkan_blend_mode_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                           GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static GskVulkanOp *
-gsk_vulkan_blend_mode_op_command (GskVulkanOp      *op,
-                                  GskVulkanRender  *render,
-                                  VkPipelineLayout  pipeline_layout,
-                                  VkCommandBuffer   command_buffer)
-{
-  GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
-
-  vkCmdDraw (command_buffer,
-             6, 1,
-             0, self->vertex_offset / gsk_vulkan_blend_mode_info.pVertexBindingDescriptions[0].stride);
-
-  return op->next;
-}
-
 static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp),
-  GSK_VULKAN_STAGE_COMMAND,
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_blend_mode_op_finish,
+    gsk_vulkan_blend_mode_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_blend_mode_op_collect_vertex_data,
+    gsk_vulkan_blend_mode_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "blend-mode",
   &gsk_vulkan_blend_mode_info,
-  gsk_vulkan_blend_mode_op_finish,
-  gsk_vulkan_blend_mode_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_blend_mode_op_collect_vertex_data,
-  gsk_vulkan_blend_mode_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -120,9 +108,9 @@ gsk_vulkan_blend_mode_op (GskVulkanRender        *render,
 {
   GskVulkanBlendModeOp *self;
 
-  self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS);
+  self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
   self->blend_mode = blend_mode;
 
index d81a9134412bacd883dd54c8d4229633f0844924..76719ccbafb78e7015330d1d79ca5bd640b2b4dc 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanbluropprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/blur.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanBlurOp GskVulkanBlurOp;
 
 struct _GskVulkanBlurOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskVulkanImage *image;
   graphene_rect_t rect;
@@ -47,7 +48,7 @@ gsk_vulkan_blur_op_collect_vertex_data (GskVulkanOp *op,
                                         guchar      *data)
 {
   GskVulkanBlurOp *self = (GskVulkanBlurOp *) op;
-  GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) (data + op->vertex_offset);
+  GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_vulkan_rect_to_float (&self->rect, instance->rect);
   gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect);
@@ -66,17 +67,19 @@ gsk_vulkan_blur_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                    GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_BLUR_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanBlurOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanBlurOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_blur_op_finish,
+    gsk_vulkan_blur_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_blur_op_collect_vertex_data,
+    gsk_vulkan_blur_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "blur",
   &gsk_vulkan_blur_info,
-  gsk_vulkan_blur_op_finish,
-  gsk_vulkan_blur_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_blur_op_collect_vertex_data,
-  gsk_vulkan_blur_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -92,9 +95,9 @@ gsk_vulkan_blur_op (GskVulkanRender         *render,
 
   g_assert (radius > 0);
 
-  self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS);
+  self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->image = g_object_ref (image);
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);
index bb85cfaadc10f20816af561fb93990ea7f6e140a..2d157aea362eea64ec28f2e674cbb96a0899213b 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanborderopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 #include "gsk/gskroundedrectprivate.h"
 
 #include "vulkan/resources/border.vert.h"
@@ -11,7 +12,7 @@ typedef struct _GskVulkanBorderOp GskVulkanBorderOp;
 
 struct _GskVulkanBorderOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskRoundedRect outline;
   float widths[4];
@@ -56,7 +57,7 @@ gsk_vulkan_border_op_collect_vertex_data (GskVulkanOp *op,
                                           guchar      *data)
 {
   GskVulkanBorderOp *self = (GskVulkanBorderOp *) op;
-  GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) (data + op->vertex_offset);
+  GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
   guint i;
 
   gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->rect);
@@ -74,25 +75,27 @@ gsk_vulkan_border_op_reserve_descriptor_sets (GskVulkanOp     *op,
 }
 
 static GskVulkanOp *
-gsk_vulkan_border_op_command (GskVulkanOp      *op,
+gsk_vulkan_border_op_command (GskVulkanOp     *op,
                               GskVulkanRender *render,
-                              VkPipelineLayout  pipeline_layout,
-                              VkCommandBuffer   command_buffer)
+                              VkRenderPass     render_pass,
+                              VkCommandBuffer  command_buffer)
 {
-  return gsk_vulkan_op_draw_command_n (op, render, pipeline_layout, command_buffer, 8);
+  return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 8);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_BORDER_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanBorderOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_BORDER_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanBorderOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_border_op_finish,
+    gsk_vulkan_border_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_border_op_collect_vertex_data,
+    gsk_vulkan_border_op_reserve_descriptor_sets,
+    gsk_vulkan_border_op_command
+  },
   "border",
   &gsk_vulkan_border_info,
-  gsk_vulkan_border_op_finish,
-  gsk_vulkan_border_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_border_op_collect_vertex_data,
-  gsk_vulkan_border_op_reserve_descriptor_sets,
-  gsk_vulkan_border_op_command
 };
 
 void
@@ -106,9 +109,9 @@ gsk_vulkan_border_op (GskVulkanRender         *render,
   GskVulkanBorderOp *self;
   guint i;
 
-  self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS);
+  self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->outline = *outline;
   gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
   for (i = 0; i < 4; i++)
index 193d10eee552625209b49b7f778e056ed0d40eb0..f8123bea2a385afb5165c92a5fad2d6d077a4f78 100644 (file)
@@ -62,7 +62,7 @@ gsk_vulkan_init_clear_value (VkClearValue  *value,
 static GskVulkanOp *
 gsk_vulkan_clear_op_command (GskVulkanOp      *op,
                              GskVulkanRender  *render,
-                             VkPipelineLayout  pipeline_layout,
+                             VkRenderPass      render_pass,
                              VkCommandBuffer   command_buffer)
 {
   GskVulkanClearOp *self = (GskVulkanClearOp *) op;
@@ -93,8 +93,6 @@ gsk_vulkan_clear_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanClearOp),
   GSK_VULKAN_STAGE_COMMAND,
-  NULL,
-  NULL,
   gsk_vulkan_clear_op_finish,
   gsk_vulkan_clear_op_print,
   gsk_vulkan_clear_op_count_vertex_data,
index ba126b47e8ff3cdc79d6ed1d14488f93ca5eb5fa..f007ddfd4f5c0f25813131886068a40a9ad0c061 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkancolormatrixopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/color-matrix.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanColorMatrixOp GskVulkanColorMatrixOp;
 
 struct _GskVulkanColorMatrixOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskVulkanImage *image;
   graphene_matrix_t color_matrix;
@@ -47,7 +48,7 @@ gsk_vulkan_color_matrix_op_collect_vertex_data (GskVulkanOp *op,
                                                 guchar      *data)
 {
   GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op;
-  GskVulkanColorMatrixInstance *instance = (GskVulkanColorMatrixInstance *) (data + op->vertex_offset);
+  GskVulkanColorMatrixInstance *instance = (GskVulkanColorMatrixInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   instance->rect[0] = self->rect.origin.x;
   instance->rect[1] = self->rect.origin.y;
@@ -73,17 +74,19 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                    GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_color_matrix_op_finish,
+    gsk_vulkan_color_matrix_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_color_matrix_op_collect_vertex_data,
+    gsk_vulkan_color_matrix_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "color-matrix",
   &gsk_vulkan_color_matrix_info,
-  gsk_vulkan_color_matrix_op_finish,
-  gsk_vulkan_color_matrix_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_color_matrix_op_collect_vertex_data,
-  gsk_vulkan_color_matrix_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -98,9 +101,9 @@ gsk_vulkan_color_matrix_op (GskVulkanRender         *render,
 {
   GskVulkanColorMatrixOp *self;
 
-  self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS);
+  self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->image = g_object_ref (image);
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);
index f07a427a46b9b7c0770018f3481252a00e823ff7..e5b5c2178056897d1bfe1801ba4f91c1bb6ae5a8 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkancoloropprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/color.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanColorOp GskVulkanColorOp;
 
 struct _GskVulkanColorOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   graphene_rect_t rect;
   GdkRGBA color;
@@ -40,7 +41,7 @@ gsk_vulkan_color_op_collect_vertex_data (GskVulkanOp *op,
                                          guchar      *data)
 {
   GskVulkanColorOp *self = (GskVulkanColorOp *) op;
-  GskVulkanColorInstance *instance = (GskVulkanColorInstance *) (data + op->vertex_offset);
+  GskVulkanColorInstance *instance = (GskVulkanColorInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   instance->rect[0] = self->rect.origin.x;
   instance->rect[1] = self->rect.origin.y;
@@ -58,17 +59,19 @@ gsk_vulkan_color_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static const GskVulkanOpClass GSK_VULKAN_COLOR_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanColorOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanColorOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_color_op_finish,
+    gsk_vulkan_color_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_color_op_collect_vertex_data,
+    gsk_vulkan_color_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "color",
   &gsk_vulkan_color_info,
-  gsk_vulkan_color_op_finish,
-  gsk_vulkan_color_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_color_op_collect_vertex_data,
-  gsk_vulkan_color_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -80,9 +83,9 @@ gsk_vulkan_color_op (GskVulkanRender        *render,
 {
   GskVulkanColorOp *self;
 
-  self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS);
+  self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   self->color = *color;
 }
index 04f0561b6b45bb8b03871741edfe44961c09b098..e563f57dba69717dbfeee5e35dd45886b5ff8f03 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkancrossfadeopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/cross-fade.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanCrossFadeOp GskVulkanCrossFadeOp;
 
 struct _GskVulkanCrossFadeOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   graphene_rect_t bounds;
   float progress;
@@ -50,7 +51,7 @@ gsk_vulkan_cross_fade_op_collect_vertex_data (GskVulkanOp *op,
                                               guchar      *data)
 {
   GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
-  GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + op->vertex_offset);
+  GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_vulkan_rect_to_float (&self->bounds, instance->rect);
   gsk_vulkan_rect_to_float (&self->start.rect, instance->start_rect);
@@ -77,17 +78,19 @@ gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                        GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_cross_fade_op_finish,
+    gsk_vulkan_cross_fade_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_cross_fade_op_collect_vertex_data,
+    gsk_vulkan_cross_fade_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "cross-fade",
   &gsk_vulkan_cross_fade_info,
-  gsk_vulkan_cross_fade_op_finish,
-  gsk_vulkan_cross_fade_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_cross_fade_op_collect_vertex_data,
-  gsk_vulkan_cross_fade_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -105,9 +108,9 @@ gsk_vulkan_cross_fade_op (GskVulkanRender        *render,
 {
   GskVulkanCrossFadeOp *self;
 
-  self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS);
+  self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
   self->progress = progress;
 
index 9396721f7f74a1d70fa5d3a24f79d6a92a3909c9..756ba41c0a8e88f03693867a8632c9f23d9e20fa 100644 (file)
@@ -28,7 +28,6 @@ gsk_vulkan_download_op_reserve_descriptor_sets (GskVulkanOp     *op,
 static GskVulkanOp *
 gsk_vulkan_download_op_command_with_area (GskVulkanOp                 *op,
                                           GskVulkanRender             *render,
-                                          VkPipelineLayout             pipeline_layout,
                                           VkCommandBuffer              command_buffer,
                                           GskVulkanImage              *image,
                                           const cairo_rectangle_int_t *area,
@@ -190,14 +189,13 @@ gsk_vulkan_download_op_print (GskVulkanOp *op,
 static GskVulkanOp *
 gsk_vulkan_download_op_command (GskVulkanOp      *op,
                                 GskVulkanRender  *render,
-                                VkPipelineLayout  pipeline_layout,
+                                VkRenderPass      render_pass,
                                 VkCommandBuffer   command_buffer)
 {
   GskVulkanDownloadOp *self = (GskVulkanDownloadOp *) op;
 
   return gsk_vulkan_download_op_command_with_area (op,
                                                    render,
-                                                   pipeline_layout,
                                                    command_buffer,
                                                    self->image,
                                                    &(cairo_rectangle_int_t) {
@@ -211,8 +209,6 @@ gsk_vulkan_download_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_DOWNLOAD_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanDownloadOp),
   GSK_VULKAN_STAGE_COMMAND,
-  NULL,
-  NULL,
   gsk_vulkan_download_op_finish,
   gsk_vulkan_download_op_print,
   gsk_vulkan_download_op_count_vertex_data,
index d5eb52ccdc5dacf337f82711368d0f261defa2d4..2794491933b365f0c56d53d9412f241589c0f3b3 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanglyphopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/glyph.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanGlyphOp GskVulkanGlyphOp;
 
 struct _GskVulkanGlyphOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskVulkanImage *image;
   graphene_rect_t rect;
@@ -47,7 +48,7 @@ gsk_vulkan_glyph_op_collect_vertex_data (GskVulkanOp         *op,
                                          guchar              *data)
 {
   GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op;
-  GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + op->vertex_offset);
+  GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_vulkan_rect_to_float (&self->rect, instance->rect);
   gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect);
@@ -64,17 +65,19 @@ gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp     *op,
   self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_glyph_op_finish,
+    gsk_vulkan_glyph_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_glyph_op_collect_vertex_data,
+    gsk_vulkan_glyph_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "glyph",
   &gsk_vulkan_glyph_info,
-  gsk_vulkan_glyph_op_finish,
-  gsk_vulkan_glyph_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_glyph_op_collect_vertex_data,
-  gsk_vulkan_glyph_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -88,9 +91,9 @@ gsk_vulkan_glyph_op (GskVulkanRender        *render,
 {
   GskVulkanGlyphOp *self;
 
-  self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS);
+  self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->image = g_object_ref (image);
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);
index dc984627d1657f031284d3f74357ef80c800d713..6f8481a61205ff43760290ba93677734c8ce70fd 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkaninsetshadowopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 #include "gsk/gskroundedrectprivate.h"
 
 #include "vulkan/resources/inset-shadow.vert.h"
@@ -11,7 +12,7 @@ typedef struct _GskVulkanInsetShadowOp GskVulkanInsetShadowOp;
 
 struct _GskVulkanInsetShadowOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskRoundedRect outline;
   GdkRGBA color;
@@ -45,7 +46,7 @@ gsk_vulkan_inset_shadow_op_collect_vertex_data (GskVulkanOp *op,
                                                 guchar      *data)
 {
   GskVulkanInsetShadowOp *self = (GskVulkanInsetShadowOp *) op;
-  GskVulkanInsetShadowInstance *instance = (GskVulkanInsetShadowInstance *) (data + op->vertex_offset);
+  GskVulkanInsetShadowInstance *instance = (GskVulkanInsetShadowInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->outline);
   gsk_vulkan_rgba_to_float (&self->color, instance->color);
@@ -60,17 +61,19 @@ gsk_vulkan_inset_shadow_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static const GskVulkanOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_inset_shadow_op_finish,
+    gsk_vulkan_inset_shadow_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_inset_shadow_op_collect_vertex_data,
+    gsk_vulkan_inset_shadow_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "inset-shadow",
   &gsk_vulkan_inset_shadow_info,
-  gsk_vulkan_inset_shadow_op_finish,
-  gsk_vulkan_inset_shadow_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_inset_shadow_op_collect_vertex_data,
-  gsk_vulkan_inset_shadow_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -85,9 +88,9 @@ gsk_vulkan_inset_shadow_op (GskVulkanRender         *render,
 {
   GskVulkanInsetShadowOp *self;
 
-  self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS);
+  self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->outline = *outline;
   gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
   self->color = *color;
index 44d02842b371fba7b1a2a6173077ca0e619cf856..2d9a1cfd57c6b93322bbad92b7a7db0a59b75386 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanlineargradientopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/linear.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanLinearGradientOp GskVulkanLinearGradientOp;
 
 struct _GskVulkanLinearGradientOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   graphene_rect_t rect;
   graphene_point_t start;
@@ -48,7 +49,7 @@ gsk_vulkan_linear_gradient_op_collect_vertex_data (GskVulkanOp *op,
                                                    guchar      *data)
 {
   GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
-  GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + op->vertex_offset);
+  GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_vulkan_rect_to_float (&self->rect, instance->rect);
   gsk_vulkan_point_to_float (&self->start, instance->start);
@@ -72,17 +73,19 @@ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp     *op,
   memcpy (mem, self->stops, self->n_stops * sizeof (GskColorStop));
 }
 
-static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_linear_gradient_op_finish,
+    gsk_vulkan_linear_gradient_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_linear_gradient_op_collect_vertex_data,
+    gsk_vulkan_linear_gradient_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "linear",
   &gsk_vulkan_linear_info,
-  gsk_vulkan_linear_gradient_op_finish,
-  gsk_vulkan_linear_gradient_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_linear_gradient_op_collect_vertex_data,
-  gsk_vulkan_linear_gradient_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -98,9 +101,9 @@ gsk_vulkan_linear_gradient_op (GskVulkanRender        *render,
 {
   GskVulkanLinearGradientOp *self;
 
-  self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS);
+  self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   self->start = GRAPHENE_POINT_INIT (start->x + offset->x, start->y + offset->y);
   self->end = GRAPHENE_POINT_INIT (end->x + offset->x, end->y + offset->y);
index 700d0ef3486e27ca7ce44cbdf9dd9c4a76f5df5a..b422ea01c2a1b5de21574441dce8ed77336140f2 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanmaskopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/mask.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanMaskOp GskVulkanMaskOp;
 
 struct _GskVulkanMaskOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   struct {
     GskVulkanImage *image;
@@ -67,7 +68,7 @@ gsk_vulkan_mask_op_collect_vertex_data (GskVulkanOp *op,
                                         guchar      *data)
 {
   GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
-  GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + op->vertex_offset);
+  GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_vulkan_rect_to_float (&self->source.rect, instance->source_rect);
   gsk_vulkan_rect_to_float (&self->source.tex_rect, instance->source_tex_rect);
@@ -88,17 +89,19 @@ gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp     *op,
   self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->mask.image, GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanMaskOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanMaskOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_mask_op_finish,
+    gsk_vulkan_mask_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_mask_op_collect_vertex_data,
+    gsk_vulkan_mask_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "mask",
   &gsk_vulkan_mask_info,
-  gsk_vulkan_mask_op_finish,
-  gsk_vulkan_mask_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_mask_op_collect_vertex_data,
-  gsk_vulkan_mask_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -115,9 +118,9 @@ gsk_vulkan_mask_op (GskVulkanRender        *render,
 {
   GskVulkanMaskOp *self;
 
-  self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS);
+  self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->source.image = g_object_ref (source);
   graphene_rect_offset_r (source_rect, offset->x, offset->y, &self->source.rect);
   gsk_vulkan_normalize_tex_coords (&self->source.tex_rect, source_rect, source_tex_rect);
index 0854639fac3f2fab08293a7ff8bafcb31923e1d3..e6e567dc723ee44ee6dd3fb99cd86961455bb532 100644 (file)
@@ -52,65 +52,9 @@ gsk_vulkan_op_reserve_descriptor_sets (GskVulkanOp     *op,
 GskVulkanOp *
 gsk_vulkan_op_command (GskVulkanOp      *op,
                        GskVulkanRender  *render,
-                       VkPipelineLayout  pipeline_layout,
+                       VkRenderPass      render_pass,
                        VkCommandBuffer   command_buffer)
 {
-  return op->op_class->command (op, render, pipeline_layout, command_buffer);
-}
-
-static inline gsize
-round_up (gsize number, gsize divisor)
-{
-  return (number + divisor - 1) / divisor * divisor;
-}
-
-gsize
-gsk_vulkan_op_draw_count_vertex_data (GskVulkanOp *op,
-                                      gsize        n_bytes)
-{
-  gsize vertex_stride;
-
-  vertex_stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
-  n_bytes = round_up (n_bytes, vertex_stride);
-  op->vertex_offset = n_bytes;
-  n_bytes += vertex_stride;
-  return n_bytes;
-}
-
-GskVulkanOp *
-gsk_vulkan_op_draw_command_n (GskVulkanOp      *op,
-                              GskVulkanRender *render,
-                              VkPipelineLayout  pipeline_layout,
-                              VkCommandBuffer   command_buffer,
-                              gsize             instance_scale)
-{
-  GskVulkanOp *next;
-  gsize stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
-  gsize i;
-
-  i = 1;
-  for (next = op->next; next && i < 10 * 1000; next = next->next)
-    {
-      if (next->op_class != op->op_class ||
-          next->vertex_offset != op->vertex_offset + i * stride)
-        break;
-
-      i++;
-    }
-
-  vkCmdDraw (command_buffer,
-             6 * instance_scale, i,
-             0, op->vertex_offset / stride);
-
-  return next;
-}
-
-GskVulkanOp *
-gsk_vulkan_op_draw_command (GskVulkanOp      *op,
-                            GskVulkanRender *render,
-                            VkPipelineLayout  pipeline_layout,
-                            VkCommandBuffer   command_buffer)
-{
-  return gsk_vulkan_op_draw_command_n (op, render, pipeline_layout, command_buffer, 1);
+  return op->op_class->command (op, render, render_pass, command_buffer);
 }
 
index 7f21c5b70d310b0366a980aac926a248e6fca2f2..30bfc1ad8d302f66125b801f5f7d000bece3c93f 100644 (file)
@@ -19,9 +19,7 @@ struct _GskVulkanOp
 {
   const GskVulkanOpClass *op_class;
 
-  const /* interned */ char *clip_type;
   GskVulkanOp *next;
-  gsize vertex_offset;
 };
 
 struct _GskVulkanOpClass
@@ -29,9 +27,6 @@ struct _GskVulkanOpClass
   gsize                 size;
   GskVulkanStage        stage;
 
-  const char *          shader_name;
-  const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
-
   void                  (* finish)                                      (GskVulkanOp            *op);
 
   void                  (* print)                                       (GskVulkanOp            *op,
@@ -46,7 +41,7 @@ struct _GskVulkanOpClass
                                                                          GskVulkanRender        *render);
   GskVulkanOp *         (* command)                                     (GskVulkanOp            *op,
                                                                          GskVulkanRender        *render,
-                                                                         VkPipelineLayout        pipeline_layout,
+                                                                         VkRenderPass            render_pass,
                                                                          VkCommandBuffer         command_buffer);
 };
 
@@ -69,19 +64,7 @@ void                    gsk_vulkan_op_reserve_descriptor_sets           (GskVulk
                                                                          GskVulkanRender        *render);
 GskVulkanOp *           gsk_vulkan_op_command                           (GskVulkanOp            *op,
                                                                          GskVulkanRender        *render,
-                                                                         VkPipelineLayout        pipeline_layout,
-                                                                         VkCommandBuffer         command_buffer);
-
-gsize                   gsk_vulkan_op_draw_count_vertex_data            (GskVulkanOp            *op,
-                                                                         gsize                   n_bytes);
-GskVulkanOp *           gsk_vulkan_op_draw_command_n                    (GskVulkanOp            *op,
-                                                                         GskVulkanRender        *render,
-                                                                         VkPipelineLayout        pipeline_layout,
-                                                                         VkCommandBuffer         command_buffer,
-                                                                         gsize                   instance_scale);
-GskVulkanOp *           gsk_vulkan_op_draw_command                      (GskVulkanOp            *op,
-                                                                         GskVulkanRender        *render,
-                                                                         VkPipelineLayout        pipeline_layout,
+                                                                         VkRenderPass            render_pass,
                                                                          VkCommandBuffer         command_buffer);
 
 G_END_DECLS
index 1e7e2139b32ee6ee32314af767f71dead9c5683e..0358ce3d4dfb0925d346e0fa298da867624782a1 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkanoutsetshadowopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 #include "gsk/gskroundedrectprivate.h"
 
 #include "vulkan/resources/outset-shadow.vert.h"
@@ -11,7 +12,7 @@ typedef struct _GskVulkanOutsetShadowOp GskVulkanOutsetShadowOp;
 
 struct _GskVulkanOutsetShadowOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskRoundedRect outline;
   GdkRGBA color;
@@ -45,7 +46,7 @@ gsk_vulkan_outset_shadow_op_collect_vertex_data (GskVulkanOp *op,
                                                  guchar      *data)
 {
   GskVulkanOutsetShadowOp *self = (GskVulkanOutsetShadowOp *) op;
-  GskVulkanOutsetShadowInstance *instance = (GskVulkanOutsetShadowInstance *) (data + op->vertex_offset);
+  GskVulkanOutsetShadowInstance *instance = (GskVulkanOutsetShadowInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->outline);
   gsk_vulkan_rgba_to_float (&self->color, instance->color);
@@ -60,17 +61,19 @@ gsk_vulkan_outset_shadow_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static const GskVulkanOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_outset_shadow_op_finish,
+    gsk_vulkan_outset_shadow_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_outset_shadow_op_collect_vertex_data,
+    gsk_vulkan_outset_shadow_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "outset-shadow",
   &gsk_vulkan_outset_shadow_info,
-  gsk_vulkan_outset_shadow_op_finish,
-  gsk_vulkan_outset_shadow_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_outset_shadow_op_collect_vertex_data,
-  gsk_vulkan_outset_shadow_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -85,9 +88,9 @@ gsk_vulkan_outset_shadow_op (GskVulkanRender         *render,
 {
   GskVulkanOutsetShadowOp *self;
 
-  self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS);
+  self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->outline = *outline;
   gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
   self->color = *color;
index 7296fe87420de0b55ba559a4097b54bf108234c5..d730155c4851657f1bab798a92350a387459ee2b 100644 (file)
@@ -79,13 +79,13 @@ gsk_vulkan_push_constants_op_reserve_descriptor_sets (GskVulkanOp     *op,
 static GskVulkanOp *
 gsk_vulkan_push_constants_op_command (GskVulkanOp      *op,
                                       GskVulkanRender  *render,
-                                      VkPipelineLayout  pipeline_layout,
+                                      VkRenderPass      render_pass,
                                       VkCommandBuffer   command_buffer)
 {
   GskVulkanPushConstantsOp *self = (GskVulkanPushConstantsOp *) op;
 
   vkCmdPushConstants (command_buffer,
-                      pipeline_layout,
+                      gsk_vulkan_render_get_pipeline_layout (render),
                       VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
                       0,
                       sizeof (self->instance),
@@ -97,8 +97,6 @@ gsk_vulkan_push_constants_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanPushConstantsOp),
   GSK_VULKAN_STAGE_COMMAND,
-  NULL,
-  NULL,
   gsk_vulkan_push_constants_op_finish,
   gsk_vulkan_push_constants_op_print,
   gsk_vulkan_push_constants_op_count_vertex_data,
index 20cfd59b3ed290050f0e1f220ed749372a4b3e55..0ef3c98d7d4de227b64f1e740b8411f91a8bfdb1 100644 (file)
@@ -14,6 +14,7 @@
 #include "gskvulkanrendererprivate.h"
 #include "gskvulkanrenderpassprivate.h"
 #include "gskvulkanrenderpassopprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "gdk/gdkvulkancontextprivate.h"
 
@@ -512,13 +513,19 @@ gsk_vulkan_render_add_node (GskVulkanRender       *self,
   gsk_vulkan_render_verbose_print (self, "after sort");
 }
 
+VkPipelineLayout
+gsk_vulkan_render_get_pipeline_layout (GskVulkanRender *self)
+{
+  return self->pipeline_layout;
+}
+
 VkPipeline
 gsk_vulkan_render_get_pipeline (GskVulkanRender        *self,
                                 const GskVulkanOpClass *op_class,
                                 const char             *clip_type,
-                                VkFormat                format,
                                 VkRenderPass            render_pass)
 {
+  const GskVulkanShaderOpClass *shader_op_class = (const GskVulkanShaderOpClass *) op_class;
   PipelineCacheKey cache_key;
   VkPipeline pipeline;
   GdkDisplay *display;
@@ -527,15 +534,15 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender        *self,
   cache_key = (PipelineCacheKey) {
     .op_class = op_class,
     .clip_type = clip_type,
-    .format = format,
+    .format = gsk_vulkan_image_get_vk_format (self->target)
   };
   pipeline = g_hash_table_lookup (self->pipeline_cache, &cache_key);
   if (pipeline)
     return pipeline;
 
   display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (self->vulkan));
-  vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", op_class->shader_name, clip_type, ".vert.spv", NULL);
-  fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", op_class->shader_name, clip_type, ".frag.spv", NULL);
+  vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_type, ".vert.spv", NULL);
+  fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_type, ".frag.spv", NULL);
 
   GSK_VK_CHECK (vkCreateGraphicsPipelines, gdk_vulkan_context_get_device (self->vulkan),
                                            gdk_vulkan_context_get_pipeline_cache (self->vulkan),
@@ -557,7 +564,7 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender        *self,
                                                        .pName = "main",
                                                    },
                                                },
-                                               .pVertexInputState = op_class->vertex_input_state,
+                                               .pVertexInputState = shader_op_class->vertex_input_state,
                                                .pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
                                                    .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
                                                    .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
@@ -920,7 +927,7 @@ gsk_vulkan_render_submit (GskVulkanRender *self)
   op = self->first_op;
   while (op)
     {
-      op = gsk_vulkan_op_command (op, self, self->pipeline_layout, command_buffer);
+      op = gsk_vulkan_op_command (op, self, VK_NULL_HANDLE, command_buffer);
     }
 
   gsk_vulkan_command_pool_submit_buffer (self->command_pool,
index 895c19cb21949ea443c0a23bef4e9da569167b9b..f01aa217a8c739b764d7afaf68ff469b7ccb698a 100644 (file)
@@ -67,15 +67,15 @@ gsk_vulkan_render_pass_op_reserve_descriptor_sets (GskVulkanOp     *op,
 static GskVulkanOp *
 gsk_vulkan_render_pass_op_command (GskVulkanOp      *op,
                                    GskVulkanRender  *render,
-                                   VkPipelineLayout  pipeline_layout,
+                                   VkRenderPass      render_pass,
                                    VkCommandBuffer   command_buffer)
 {
   GskVulkanRenderPassOp *self = (GskVulkanRenderPassOp *) op;
-  VkPipeline current_pipeline = VK_NULL_HANDLE;
-  const GskVulkanOpClass *current_pipeline_class = NULL;
-  const char *current_pipeline_clip_type = NULL;
   VkRenderPass vk_render_pass;
 
+  /* nesting render passes not allowed */
+  g_assert (render_pass == VK_NULL_HANDLE);
+
   vk_render_pass = gsk_vulkan_render_get_render_pass (render,
                                                       gsk_vulkan_image_get_vk_format (self->image),
                                                       self->initial_layout,
@@ -114,26 +114,10 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp      *op,
   op = op->next;
   while (op->op_class->stage != GSK_VULKAN_STAGE_END_PASS)
     {
-      if (op->op_class->shader_name &&
-          (op->op_class != current_pipeline_class ||
-           current_pipeline_clip_type != op->clip_type))
-        {
-          current_pipeline = gsk_vulkan_render_get_pipeline (render,
-                                                             op->op_class,
-                                                             op->clip_type,
-                                                             gsk_vulkan_image_get_vk_format (self->image),
-                                                             vk_render_pass);
-          vkCmdBindPipeline (command_buffer,
-                             VK_PIPELINE_BIND_POINT_GRAPHICS,
-                             current_pipeline);
-          current_pipeline_class = op->op_class;
-          current_pipeline_clip_type = op->clip_type;
-        }
-
-      op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer);
+      op = gsk_vulkan_op_command (op, render, vk_render_pass, command_buffer);
     }
 
-  op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer);
+  op = gsk_vulkan_op_command (op, render, vk_render_pass, command_buffer);
 
   return op;
 }
@@ -141,8 +125,6 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanRenderPassOp),
   GSK_VULKAN_STAGE_BEGIN_PASS,
-  NULL,
-  NULL,
   gsk_vulkan_render_pass_op_finish,
   gsk_vulkan_render_pass_op_print,
   gsk_vulkan_render_pass_op_count_vertex_data,
@@ -204,7 +186,7 @@ gsk_vulkan_render_pass_end_op_reserve_descriptor_sets (GskVulkanOp     *op,
 static GskVulkanOp *
 gsk_vulkan_render_pass_end_op_command (GskVulkanOp      *op,
                                        GskVulkanRender  *render,
-                                       VkPipelineLayout  pipeline_layout,
+                                       VkRenderPass      render_pass,
                                        VkCommandBuffer   command_buffer)
 {
   GskVulkanRenderPassEndOp *self = (GskVulkanRenderPassEndOp *) op;
@@ -220,8 +202,6 @@ gsk_vulkan_render_pass_end_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_END_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanRenderPassEndOp),
   GSK_VULKAN_STAGE_END_PASS,
-  NULL,
-  NULL,
   gsk_vulkan_render_pass_end_op_finish,
   gsk_vulkan_render_pass_end_op_print,
   gsk_vulkan_render_pass_end_op_count_vertex_data,
index 506e717c998d6320b9d756edd29b112e202b5b87..8342231e0df1950690a3eeb26356df09005eaa2e 100644 (file)
@@ -41,10 +41,10 @@ GdkVulkanContext *      gsk_vulkan_render_get_context                   (GskVulk
 gpointer                gsk_vulkan_render_alloc_op                      (GskVulkanRender        *self,
                                                                          gsize                   size);
 
+VkPipelineLayout        gsk_vulkan_render_get_pipeline_layout           (GskVulkanRender        *self);
 VkPipeline              gsk_vulkan_render_get_pipeline                  (GskVulkanRender        *self,
                                                                          const GskVulkanOpClass *op_class,
                                                                          const char             *clip_type,
-                                                                         VkFormat                format,
                                                                          VkRenderPass            render_pass);
 VkRenderPass            gsk_vulkan_render_get_render_pass               (GskVulkanRender        *self,
                                                                          VkFormat                format,
index b0bc0be18a0f96c7a848cf042e6b013b59edd970..5a374e03992dd505dd2201e9a5cd2d359badb5a7 100644 (file)
@@ -53,7 +53,7 @@ gsk_vulkan_scissor_op_reserve_descriptor_sets (GskVulkanOp     *op,
 static GskVulkanOp *
 gsk_vulkan_scissor_op_command (GskVulkanOp      *op,
                                GskVulkanRender  *render,
-                               VkPipelineLayout  pipeline_layout,
+                               VkRenderPass      render_pass,
                                VkCommandBuffer   command_buffer)
 {
   GskVulkanScissorOp *self = (GskVulkanScissorOp *) op;
@@ -72,8 +72,6 @@ gsk_vulkan_scissor_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanScissorOp),
   GSK_VULKAN_STAGE_COMMAND,
-  NULL,
-  NULL,
   gsk_vulkan_scissor_op_finish,
   gsk_vulkan_scissor_op_print,
   gsk_vulkan_scissor_op_count_vertex_data,
diff --git a/gsk/vulkan/gskvulkanshaderop.c b/gsk/vulkan/gskvulkanshaderop.c
new file mode 100644 (file)
index 0000000..141271e
--- /dev/null
@@ -0,0 +1,73 @@
+#include "config.h"
+
+#include "gskvulkanshaderopprivate.h"
+
+static inline gsize
+round_up (gsize number, gsize divisor)
+{
+  return (number + divisor - 1) / divisor * divisor;
+}
+
+gsize
+gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op,
+                                        gsize        n_bytes)
+{
+  GskVulkanShaderOp *self = (GskVulkanShaderOp *) op;
+  GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class);
+  gsize vertex_stride;
+
+  vertex_stride = shader_op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
+  n_bytes = round_up (n_bytes, vertex_stride);
+  self->vertex_offset = n_bytes;
+  n_bytes += vertex_stride;
+  return n_bytes;
+}
+
+GskVulkanOp *
+gsk_vulkan_shader_op_command_n (GskVulkanOp      *op,
+                                GskVulkanRender  *render,
+                                VkRenderPass      render_pass,
+                                VkCommandBuffer   command_buffer,
+                                gsize             instance_scale)
+{
+  GskVulkanShaderOp *self = (GskVulkanShaderOp *) op;
+  GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class);
+  GskVulkanOp *next;
+  gsize stride = shader_op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
+  gsize i;
+
+  i = 1;
+  for (next = op->next; next && i < 10 * 1000; next = next->next)
+    {
+      GskVulkanShaderOp *next_shader = (GskVulkanShaderOp *) next;
+  
+      if (next->op_class != op->op_class ||
+          next_shader->vertex_offset != self->vertex_offset + i * stride)
+        break;
+
+      i++;
+    }
+
+  vkCmdBindPipeline (command_buffer,
+                     VK_PIPELINE_BIND_POINT_GRAPHICS,
+                     gsk_vulkan_render_get_pipeline (render,
+                                                     op->op_class,
+                                                     self->clip_type,
+                                                     render_pass));
+
+  vkCmdDraw (command_buffer,
+             6 * instance_scale, i,
+             0, self->vertex_offset / stride);
+
+  return next;
+}
+
+GskVulkanOp *
+gsk_vulkan_shader_op_command (GskVulkanOp      *op,
+                              GskVulkanRender *render,
+                              VkRenderPass      render_pass,
+                              VkCommandBuffer   command_buffer)
+{
+  return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 1);
+}
+
diff --git a/gsk/vulkan/gskvulkanshaderopprivate.h b/gsk/vulkan/gskvulkanshaderopprivate.h
new file mode 100644 (file)
index 0000000..e9f29bb
--- /dev/null
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "gskvulkanopprivate.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GskVulkanShaderOp GskVulkanShaderOp;
+typedef struct _GskVulkanShaderOpClass GskVulkanShaderOpClass;
+
+struct _GskVulkanShaderOp
+{
+  GskVulkanOp parent_op;
+
+  const /* interned */ char *clip_type;
+  gsize vertex_offset;
+};
+
+struct _GskVulkanShaderOpClass
+{
+  GskVulkanOpClass      parent_class;
+
+  const char *          shader_name;
+  const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
+};
+
+gsize                   gsk_vulkan_shader_op_count_vertex_data          (GskVulkanOp            *op,
+                                                                         gsize                   n_bytes);
+GskVulkanOp *           gsk_vulkan_shader_op_command_n                  (GskVulkanOp            *op,
+                                                                         GskVulkanRender        *render,
+                                                                         VkRenderPass            render_pass,
+                                                                         VkCommandBuffer         command_buffer,
+                                                                         gsize                   instance_scale);
+GskVulkanOp *           gsk_vulkan_shader_op_command                    (GskVulkanOp            *op,
+                                                                         GskVulkanRender        *render,
+                                                                         VkRenderPass            render_pass,
+                                                                         VkCommandBuffer         command_buffer);
+
+G_END_DECLS
+
index 9bad4f1992e99c5c8eeca572b1ec8864c89e602e..d0df51d4209fed42fe51f7ff20e307c635f07565 100644 (file)
@@ -3,6 +3,7 @@
 #include "gskvulkantextureopprivate.h"
 
 #include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
 
 #include "vulkan/resources/texture.vert.h"
 
@@ -10,7 +11,7 @@ typedef struct _GskVulkanTextureOp GskVulkanTextureOp;
 
 struct _GskVulkanTextureOp
 {
-  GskVulkanOp op;
+  GskVulkanShaderOp op;
 
   GskVulkanImage *image;
   GskVulkanRenderSampler sampler;
@@ -47,7 +48,7 @@ gsk_vulkan_texture_op_collect_vertex_data (GskVulkanOp *op,
                                            guchar      *data)
 {
   GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
-  GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) (data + op->vertex_offset);
+  GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
 
   instance->rect[0] = self->rect.origin.x;
   instance->rect[1] = self->rect.origin.y;
@@ -69,17 +70,19 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp     *op,
   self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanTextureOp),
-  GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
+  {
+    GSK_VULKAN_OP_SIZE (GskVulkanTextureOp),
+    GSK_VULKAN_STAGE_COMMAND,
+    gsk_vulkan_texture_op_finish,
+    gsk_vulkan_texture_op_print,
+    gsk_vulkan_shader_op_count_vertex_data,
+    gsk_vulkan_texture_op_collect_vertex_data,
+    gsk_vulkan_texture_op_reserve_descriptor_sets,
+    gsk_vulkan_shader_op_command
+  },
   "texture",
   &gsk_vulkan_texture_info,
-  gsk_vulkan_texture_op_finish,
-  gsk_vulkan_texture_op_print,
-  gsk_vulkan_op_draw_count_vertex_data,
-  gsk_vulkan_texture_op_collect_vertex_data,
-  gsk_vulkan_texture_op_reserve_descriptor_sets,
-  gsk_vulkan_op_draw_command
 };
 
 void
@@ -93,9 +96,9 @@ gsk_vulkan_texture_op (GskVulkanRender        *render,
 {
   GskVulkanTextureOp *self;
 
-  self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS);
+  self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS.parent_class);
 
-  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
   self->image = g_object_ref (image);
   self->sampler = sampler;
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
index 7ddc29918e8beb7a95522296289dd36859797162..ff66dff5c8ca326658a02b373b425c323f7259ae 100644 (file)
@@ -28,7 +28,6 @@ gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp     *op,
 static GskVulkanOp *
 gsk_vulkan_upload_op_command_with_area (GskVulkanOp                 *op,
                                         GskVulkanRender             *render,
-                                        VkPipelineLayout             pipeline_layout,
                                         VkCommandBuffer              command_buffer,
                                         GskVulkanImage              *image,
                                         const cairo_rectangle_int_t *area,
@@ -147,7 +146,6 @@ gsk_vulkan_upload_op_command_with_area (GskVulkanOp                 *op,
 static GskVulkanOp *
 gsk_vulkan_upload_op_command (GskVulkanOp      *op,
                               GskVulkanRender  *render,
-                              VkPipelineLayout  pipeline_layout,
                               VkCommandBuffer   command_buffer,
                               GskVulkanImage   *image,
                               void              (* draw_func) (GskVulkanOp *, guchar *, gsize),
@@ -173,7 +171,6 @@ gsk_vulkan_upload_op_command (GskVulkanOp      *op,
 
   return gsk_vulkan_upload_op_command_with_area (op,
                                                  render,
-                                                 pipeline_layout,
                                                  command_buffer,
                                                  image,
                                                  &(cairo_rectangle_int_t) {
@@ -237,14 +234,13 @@ gsk_vulkan_upload_texture_op_draw (GskVulkanOp *op,
 static GskVulkanOp *
 gsk_vulkan_upload_texture_op_command (GskVulkanOp      *op,
                                       GskVulkanRender  *render,
-                                      VkPipelineLayout  pipeline_layout,
+                                      VkRenderPass      render_pass,
                                       VkCommandBuffer   command_buffer)
 {
   GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
 
   return gsk_vulkan_upload_op_command (op,
                                        render,
-                                       pipeline_layout,
                                        command_buffer,
                                        self->image,
                                        gsk_vulkan_upload_texture_op_draw,
@@ -254,8 +250,6 @@ gsk_vulkan_upload_texture_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanUploadTextureOp),
   GSK_VULKAN_STAGE_UPLOAD,
-  NULL,
-  NULL,
   gsk_vulkan_upload_texture_op_finish,
   gsk_vulkan_upload_texture_op_print,
   gsk_vulkan_upload_op_count_vertex_data,
@@ -353,14 +347,13 @@ gsk_vulkan_upload_cairo_op_draw (GskVulkanOp *op,
 static GskVulkanOp *
 gsk_vulkan_upload_cairo_op_command (GskVulkanOp      *op,
                                     GskVulkanRender  *render,
-                                    VkPipelineLayout  pipeline_layout,
+                                    VkRenderPass      render_pass,
                                     VkCommandBuffer   command_buffer)
 {
   GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op;
 
   return gsk_vulkan_upload_op_command (op,
                                        render,
-                                       pipeline_layout,
                                        command_buffer,
                                        self->image,
                                        gsk_vulkan_upload_cairo_op_draw,
@@ -370,8 +363,6 @@ gsk_vulkan_upload_cairo_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanUploadCairoOp),
   GSK_VULKAN_STAGE_UPLOAD,
-  NULL,
-  NULL,
   gsk_vulkan_upload_cairo_op_finish,
   gsk_vulkan_upload_cairo_op_print,
   gsk_vulkan_upload_op_count_vertex_data,
@@ -483,14 +474,13 @@ gsk_vulkan_upload_glyph_op_draw (GskVulkanOp *op,
 static GskVulkanOp *
 gsk_vulkan_upload_glyph_op_command (GskVulkanOp      *op,
                                     GskVulkanRender  *render,
-                                    VkPipelineLayout  pipeline_layout,
+                                    VkRenderPass      render_pass,
                                     VkCommandBuffer   command_buffer)
 {
   GskVulkanUploadGlyphOp *self = (GskVulkanUploadGlyphOp *) op;
 
   return gsk_vulkan_upload_op_command_with_area (op,
                                                  render,
-                                                 pipeline_layout,
                                                  command_buffer,
                                                  self->image,
                                                  &self->area,
@@ -501,8 +491,6 @@ gsk_vulkan_upload_glyph_op_command (GskVulkanOp      *op,
 static const GskVulkanOpClass GSK_VULKAN_UPLOAD_GLYPH_OP_CLASS = {
   GSK_VULKAN_OP_SIZE (GskVulkanUploadGlyphOp),
   GSK_VULKAN_STAGE_UPLOAD,
-  NULL,
-  NULL,
   gsk_vulkan_upload_glyph_op_finish,
   gsk_vulkan_upload_glyph_op_print,
   gsk_vulkan_upload_op_count_vertex_data,