vulkan: Handle images in the ShaderOp
authorBenjamin Otte <otte@redhat.com>
Sat, 15 Jul 2023 11:28:08 +0000 (13:28 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 11:16:43 +0000 (13:16 +0200)
This looks more convoluted in this commit, but future commits will
hopefully make up for it.

14 files changed:
gsk/vulkan/gskvulkanblendmodeop.c
gsk/vulkan/gskvulkanblurop.c
gsk/vulkan/gskvulkanborderop.c
gsk/vulkan/gskvulkancolormatrixop.c
gsk/vulkan/gskvulkancolorop.c
gsk/vulkan/gskvulkancrossfadeop.c
gsk/vulkan/gskvulkanglyphop.c
gsk/vulkan/gskvulkaninsetshadowop.c
gsk/vulkan/gskvulkanlineargradientop.c
gsk/vulkan/gskvulkanmaskop.c
gsk/vulkan/gskvulkanoutsetshadowop.c
gsk/vulkan/gskvulkanshaderop.c
gsk/vulkan/gskvulkanshaderopprivate.h
gsk/vulkan/gskvulkantextureop.c

index 21407a1f66595b9830a8b7ddf902393ca6d772f6..e4ad4b5d6b13b4adb0c9c4898b0b56afd6704f29 100644 (file)
@@ -17,22 +17,12 @@ struct _GskVulkanBlendModeOp
   GskBlendMode blend_mode;
 
   struct {
-    GskVulkanImage *image;
     graphene_rect_t rect;
     graphene_rect_t tex_rect;
     guint32 image_descriptor;
   } top, bottom;
 };
 
-static void
-gsk_vulkan_blend_mode_op_finish (GskVulkanOp *op)
-{
-  GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
-
-  g_object_unref (self->top.image);
-  g_object_unref (self->bottom.image);
-}
-
 static void
 gsk_vulkan_blend_mode_op_print (GskVulkanOp *op,
                                 GString     *string,
@@ -69,12 +59,13 @@ gsk_vulkan_blend_mode_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                   GskVulkanRender *render)
 {
   GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
   self->top.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
-                                                                       self->top.image,
+                                                                       shader->images[0],
                                                                        GSK_VULKAN_SAMPLER_DEFAULT);
   self->bottom.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
-                                                                          self->bottom.image,
+                                                                          shader->images[1],
                                                                           GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
@@ -82,7 +73,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = {
   {
     GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp),
     GSK_VULKAN_STAGE_COMMAND,
-    gsk_vulkan_blend_mode_op_finish,
+    gsk_vulkan_shader_op_finish,
     gsk_vulkan_blend_mode_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_blend_mode_op_collect_vertex_data,
@@ -90,6 +81,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "blend-mode",
+  2,
   &gsk_vulkan_blend_mode_info,
 };
 
@@ -108,16 +100,20 @@ gsk_vulkan_blend_mode_op (GskVulkanRender        *render,
 {
   GskVulkanBlendModeOp *self;
 
-  self = (GskVulkanBlendModeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS, clip);
+  self = (GskVulkanBlendModeOp *) gsk_vulkan_shader_op_alloc (render,
+                                                              &GSK_VULKAN_BLEND_MODE_OP_CLASS,
+                                                              clip,
+                                                              (GskVulkanImage *[2]) {
+                                                                  top_image,
+                                                                  bottom_image
+                                                              });
 
   graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
   self->blend_mode = blend_mode;
 
-  self->top.image = g_object_ref (top_image);
   graphene_rect_offset_r (top_rect, offset->x, offset->y, &self->top.rect);
   gsk_vulkan_normalize_tex_coords (&self->top.tex_rect, bounds, top_tex_rect);
 
-  self->bottom.image = g_object_ref (bottom_image);
   graphene_rect_offset_r (bottom_rect, offset->x, offset->y, &self->bottom.rect);
   gsk_vulkan_normalize_tex_coords (&self->bottom.tex_rect, bounds, bottom_tex_rect);
 }
index 910c9a2fe2cf132235c3e34f14b3b3f9dceb46a7..6b121cdc08429bea9ccfe590d690903d174c0948 100644 (file)
@@ -13,7 +13,6 @@ struct _GskVulkanBlurOp
 {
   GskVulkanShaderOp op;
 
-  GskVulkanImage *image;
   graphene_rect_t rect;
   graphene_rect_t tex_rect;
   float radius;
@@ -21,14 +20,6 @@ struct _GskVulkanBlurOp
   guint32 image_descriptor;
 };
 
-static void
-gsk_vulkan_blur_op_finish (GskVulkanOp *op)
-{
-  GskVulkanBlurOp *self = (GskVulkanBlurOp *) op;
-
-  g_object_unref (self->image);
-}
-
 static void
 gsk_vulkan_blur_op_print (GskVulkanOp *op,
                           GString     *string,
@@ -61,9 +52,10 @@ gsk_vulkan_blur_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                             GskVulkanRender *render)
 {
   GskVulkanBlurOp *self = (GskVulkanBlurOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
   self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
-                                                                   self->image,
+                                                                   shader->images[0],
                                                                    GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
@@ -71,7 +63,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = {
   {
     GSK_VULKAN_OP_SIZE (GskVulkanBlurOp),
     GSK_VULKAN_STAGE_COMMAND,
-    gsk_vulkan_blur_op_finish,
+    gsk_vulkan_shader_op_finish,
     gsk_vulkan_blur_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_blur_op_collect_vertex_data,
@@ -79,6 +71,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "blur",
+  1,
   &gsk_vulkan_blur_info,
 };
 
@@ -95,9 +88,8 @@ gsk_vulkan_blur_op (GskVulkanRender         *render,
 
   g_assert (radius > 0);
 
-  self = (GskVulkanBlurOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS, clip);
+  self = (GskVulkanBlurOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS, clip, &image);
 
-  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);
   self->radius = radius;
index 3015820fce5687e55556fd656fac2880571b8093..f72827b54cb75d5bfc32bae9348f021166e7dd49 100644 (file)
@@ -95,6 +95,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BORDER_OP_CLASS = {
     gsk_vulkan_border_op_command
   },
   "border",
+  0,
   &gsk_vulkan_border_info,
 };
 
@@ -109,7 +110,7 @@ gsk_vulkan_border_op (GskVulkanRender         *render,
   GskVulkanBorderOp *self;
   guint i;
 
-  self = (GskVulkanBorderOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS, clip);
+  self = (GskVulkanBorderOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS, clip, NULL);
 
   self->outline = *outline;
   gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
index 88ae643b44138d05a445adb85761a755c10c20f0..1a377fc726c5b0c0774cc1622788c2ed039cc870 100644 (file)
@@ -13,7 +13,6 @@ struct _GskVulkanColorMatrixOp
 {
   GskVulkanShaderOp op;
 
-  GskVulkanImage *image;
   graphene_matrix_t color_matrix;
   graphene_vec4_t color_offset;
   graphene_rect_t rect;
@@ -22,14 +21,6 @@ struct _GskVulkanColorMatrixOp
   guint32 image_descriptor;
 };
 
-static void
-gsk_vulkan_color_matrix_op_finish (GskVulkanOp *op)
-{
-  GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op;
-
-  g_object_unref (self->image);
-}
-
 static void
 gsk_vulkan_color_matrix_op_print (GskVulkanOp *op,
                                   GString     *string,
@@ -68,9 +59,10 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                     GskVulkanRender *render)
 {
   GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
   self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
-                                                                   self->image,
+                                                                   shader->images[0],
                                                                    GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
@@ -78,7 +70,7 @@ 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_shader_op_finish,
     gsk_vulkan_color_matrix_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_color_matrix_op_collect_vertex_data,
@@ -86,6 +78,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "color-matrix",
+  1,
   &gsk_vulkan_color_matrix_info,
 };
 
@@ -101,9 +94,8 @@ gsk_vulkan_color_matrix_op (GskVulkanRender         *render,
 {
   GskVulkanColorMatrixOp *self;
 
-  self = (GskVulkanColorMatrixOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS, clip);
+  self = (GskVulkanColorMatrixOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS, clip, &image);
 
-  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);
   self->color_matrix = *color_matrix;
index 1caa47d63f56f446a38b2f06e9ed9758e2435957..4f6756d3024ea61b822648d420acf305db4b2d85 100644 (file)
@@ -71,6 +71,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "color",
+  0,
   &gsk_vulkan_color_info,
 };
 
@@ -83,7 +84,7 @@ gsk_vulkan_color_op (GskVulkanRender        *render,
 {
   GskVulkanColorOp *self;
 
-  self = (GskVulkanColorOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS, clip);
+  self = (GskVulkanColorOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS, clip, NULL);
 
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   self->color = *color;
index 4a7df63b5fd1e1005cfebbe68034021e252d1da8..2f0d3ea590e42b71242042a0337486b088793283 100644 (file)
@@ -17,22 +17,12 @@ struct _GskVulkanCrossFadeOp
   float progress;
 
   struct {
-    GskVulkanImage *image;
     graphene_rect_t rect;
     graphene_rect_t tex_rect;
     guint32 image_descriptor;
   } start, end;
 };
 
-static void
-gsk_vulkan_cross_fade_op_finish (GskVulkanOp *op)
-{
-  GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
-
-  g_object_unref (self->start.image);
-  g_object_unref (self->end.image);
-}
-
 static void
 gsk_vulkan_cross_fade_op_print (GskVulkanOp *op,
                                 GString     *string,
@@ -69,12 +59,13 @@ gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                   GskVulkanRender *render)
 {
   GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
   self->start.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
-                                                                         self->start.image,
+                                                                         shader->images[0],
                                                                          GSK_VULKAN_SAMPLER_DEFAULT);
   self->end.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
-                                                                       self->end.image,
+                                                                       shader->images[1],
                                                                        GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
@@ -82,7 +73,7 @@ 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_shader_op_finish,
     gsk_vulkan_cross_fade_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_cross_fade_op_collect_vertex_data,
@@ -90,6 +81,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "cross-fade",
+  2,
   &gsk_vulkan_cross_fade_info,
 };
 
@@ -108,16 +100,20 @@ gsk_vulkan_cross_fade_op (GskVulkanRender        *render,
 {
   GskVulkanCrossFadeOp *self;
 
-  self = (GskVulkanCrossFadeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS, clip);
+  self = (GskVulkanCrossFadeOp *) gsk_vulkan_shader_op_alloc (render,
+                                                              &GSK_VULKAN_CROSS_FADE_OP_CLASS,
+                                                              clip,
+                                                              (GskVulkanImage *[2]) {
+                                                                  start_image,
+                                                                  end_image
+                                                              });
 
   graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
   self->progress = progress;
 
-  self->start.image = g_object_ref (start_image);
   graphene_rect_offset_r (start_rect, offset->x, offset->y, &self->start.rect);
   gsk_vulkan_normalize_tex_coords (&self->start.tex_rect, bounds, start_tex_rect);
 
-  self->end.image = g_object_ref (end_image);
   graphene_rect_offset_r (end_rect, offset->x, offset->y, &self->end.rect);
   gsk_vulkan_normalize_tex_coords (&self->end.tex_rect, bounds, end_tex_rect);
 }
index 1edc4d1dbfff8cc7881618985afee9c7a69cbde3..8b7effef9928639460af5552e6c1e50644ba2d2c 100644 (file)
@@ -21,14 +21,6 @@ struct _GskVulkanGlyphOp
   guint32 image_descriptor;
 };
 
-static void
-gsk_vulkan_glyph_op_finish (GskVulkanOp *op)
-{
-  GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op;
-
-  g_object_unref (self->image);
-}
-
 static void
 gsk_vulkan_glyph_op_print (GskVulkanOp *op,
                            GString     *string,
@@ -61,15 +53,16 @@ gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                              GskVulkanRender *render)
 {
   GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
-  self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT);
+  self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
 static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
   {
     GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp),
     GSK_VULKAN_STAGE_COMMAND,
-    gsk_vulkan_glyph_op_finish,
+    gsk_vulkan_shader_op_finish,
     gsk_vulkan_glyph_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_glyph_op_collect_vertex_data,
@@ -77,6 +70,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "glyph",
+  1,
   &gsk_vulkan_glyph_info,
 };
 
@@ -91,9 +85,8 @@ gsk_vulkan_glyph_op (GskVulkanRender        *render,
 {
   GskVulkanGlyphOp *self;
 
-  self = (GskVulkanGlyphOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS, clip);
+  self = (GskVulkanGlyphOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS, clip, &image);
 
-  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);
   self->color = *color;
index 95ce8d894e515d696edf323eb73028e98d482850..0a0ee89372c8572268e204ac820a07b3a393b4d5 100644 (file)
@@ -73,6 +73,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "inset-shadow",
+  0,
   &gsk_vulkan_inset_shadow_info,
 };
 
@@ -88,7 +89,7 @@ gsk_vulkan_inset_shadow_op (GskVulkanRender         *render,
 {
   GskVulkanInsetShadowOp *self;
 
-  self = (GskVulkanInsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS, clip);
+  self = (GskVulkanInsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS, clip, NULL);
 
   self->outline = *outline;
   gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
index 61afebf0e0f19e36d5cd679e95b472dd2bdfffa3..caa0b60dfd8c9a1be9b6f49c5b6ecd3db95e11ca 100644 (file)
@@ -85,6 +85,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "linear",
+  0,
   &gsk_vulkan_linear_info,
 };
 
@@ -101,7 +102,7 @@ gsk_vulkan_linear_gradient_op (GskVulkanRender        *render,
 {
   GskVulkanLinearGradientOp *self;
 
-  self = (GskVulkanLinearGradientOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS, clip);
+  self = (GskVulkanLinearGradientOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS, clip, NULL);
 
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   self->start = GRAPHENE_POINT_INIT (start->x + offset->x, start->y + offset->y);
index 7b6f9772402eedb224484892d803234f2b05df15..71df86bdca8a02172b49875f45303bfbab00a4cc 100644 (file)
@@ -14,7 +14,6 @@ struct _GskVulkanMaskOp
   GskVulkanShaderOp op;
 
   struct {
-    GskVulkanImage *image;
     graphene_rect_t rect;
     graphene_rect_t tex_rect;
     guint32 image_descriptor;
@@ -22,15 +21,6 @@ struct _GskVulkanMaskOp
   GskMaskMode mask_mode;
 };
 
-static void
-gsk_vulkan_mask_op_finish (GskVulkanOp *op)
-{
-  GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
-
-  g_object_unref (self->source.image);
-  g_object_unref (self->mask.image);
-}
-
 static void
 gsk_vulkan_mask_op_print (GskVulkanOp *op,
                           GString     *string,
@@ -84,16 +74,17 @@ gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                             GskVulkanRender *render)
 {
   GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
-  self->source.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->source.image, GSK_VULKAN_SAMPLER_DEFAULT);
-  self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->mask.image, GSK_VULKAN_SAMPLER_DEFAULT);
+  self->source.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], GSK_VULKAN_SAMPLER_DEFAULT);
+  self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[1], GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
 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_shader_op_finish,
     gsk_vulkan_mask_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_mask_op_collect_vertex_data,
@@ -101,6 +92,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "mask",
+  2,
   &gsk_vulkan_mask_info,
 };
 
@@ -118,12 +110,16 @@ gsk_vulkan_mask_op (GskVulkanRender        *render,
 {
   GskVulkanMaskOp *self;
 
-  self = (GskVulkanMaskOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS, clip);
+  self = (GskVulkanMaskOp *) gsk_vulkan_shader_op_alloc (render,
+                                                         &GSK_VULKAN_COLOR_MASK_OP_CLASS,
+                                                         clip,
+                                                         (GskVulkanImage *[2]) {
+                                                             source,
+                                                             mask,
+                                                         });
 
-  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);
-  self->mask.image = g_object_ref (mask);
   graphene_rect_offset_r (mask_rect, offset->x, offset->y, &self->mask.rect);
   gsk_vulkan_normalize_tex_coords (&self->mask.tex_rect, mask_rect, mask_tex_rect);
   self->mask_mode = mask_mode;
index dcfd4281991d9f80736f4057d156686f412bf0a4..aa3d0b5b92a132e2eae89ef5ae254ae7fbed7cbd 100644 (file)
@@ -73,6 +73,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "outset-shadow",
+  0,
   &gsk_vulkan_outset_shadow_info,
 };
 
@@ -88,7 +89,7 @@ gsk_vulkan_outset_shadow_op (GskVulkanRender         *render,
 {
   GskVulkanOutsetShadowOp *self;
 
-  self = (GskVulkanOutsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS, clip);
+  self = (GskVulkanOutsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS, clip, NULL);
 
   self->outline = *outline;
   gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
index 3364a387a00c698d410d0f46a2257ce1c8c6d5b8..aea6ff53e6c32f3258cc27e1c2cf16528f970aab 100644 (file)
@@ -2,6 +2,17 @@
 
 #include "gskvulkanshaderopprivate.h"
 
+void
+gsk_vulkan_shader_op_finish (GskVulkanOp *op)
+{
+  GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class);
+  GskVulkanShaderOp *self = (GskVulkanShaderOp *) op;
+  gsize i;
+
+  for (i = 0; i < shader_op_class->n_images; i++)
+    g_object_unref (self->images[i]);
+}
+
 static inline gsize
 round_up (gsize number, gsize divisor)
 {
@@ -74,13 +85,18 @@ gsk_vulkan_shader_op_command (GskVulkanOp      *op,
 GskVulkanShaderOp *
 gsk_vulkan_shader_op_alloc (GskVulkanRender              *render,
                             const GskVulkanShaderOpClass *op_class,
-                            GskVulkanShaderClip           clip)
+                            GskVulkanShaderClip           clip,
+                            GskVulkanImage              **images)
 {
   GskVulkanShaderOp *self;
+  gsize i;
 
   self = (GskVulkanShaderOp *) gsk_vulkan_op_alloc (render, &op_class->parent_class);
 
   self->clip = clip;
 
+  for (i = 0; i < op_class->n_images; i++)
+    self->images[i] = g_object_ref (images[i]);
+
   return self;
 }
index 77f111981bc13614fc695d415c2e58668d5b78d3..d76b3f12337ee470bdc7b55bbcecec70f46363ec 100644 (file)
@@ -15,6 +15,7 @@ struct _GskVulkanShaderOp
 
   GskVulkanShaderClip clip;
   gsize vertex_offset;
+  GskVulkanImage *images[2];
 };
 
 struct _GskVulkanShaderOpClass
@@ -22,13 +23,16 @@ struct _GskVulkanShaderOpClass
   GskVulkanOpClass      parent_class;
 
   const char *          shader_name;
+  gsize                 n_images;
   const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
 };
 
 GskVulkanShaderOp *     gsk_vulkan_shader_op_alloc                      (GskVulkanRender        *render,
                                                                          const GskVulkanShaderOpClass *op_class,
-                                                                         GskVulkanShaderClip     clip);
+                                                                         GskVulkanShaderClip     clip,
+                                                                         GskVulkanImage        **images);
 
+void                    gsk_vulkan_shader_op_finish                     (GskVulkanOp            *op);
 gsize                   gsk_vulkan_shader_op_count_vertex_data          (GskVulkanOp            *op,
                                                                          gsize                   n_bytes);
 GskVulkanOp *           gsk_vulkan_shader_op_command_n                  (GskVulkanOp            *op,
index 806ca8dbfaee08a0e50507b9f3b2213af11a3fc1..b40031a105436f644d7d06702c2cf64df478709c 100644 (file)
@@ -13,7 +13,6 @@ struct _GskVulkanTextureOp
 {
   GskVulkanShaderOp op;
 
-  GskVulkanImage *image;
   GskVulkanRenderSampler sampler;
   graphene_rect_t rect;
   graphene_rect_t tex_rect;
@@ -21,25 +20,18 @@ struct _GskVulkanTextureOp
   guint32 image_descriptor;
 };
 
-static void
-gsk_vulkan_texture_op_finish (GskVulkanOp *op)
-{
-  GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
-
-  g_object_unref (self->image);
-}
-
 static void
 gsk_vulkan_texture_op_print (GskVulkanOp *op,
                              GString     *string,
                              guint        indent)
 {
   GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
   print_indent (string, indent);
   print_rect (string, &self->rect);
   g_string_append (string, "texture ");
-  print_image (string, self->image);
+  print_image (string, shader->images[0]);
   print_newline (string);
 }
 
@@ -66,15 +58,16 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                GskVulkanRender *render)
 {
   GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
+  GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
 
-  self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler);
+  self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], self->sampler);
 }
 
 static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
   {
     GSK_VULKAN_OP_SIZE (GskVulkanTextureOp),
     GSK_VULKAN_STAGE_COMMAND,
-    gsk_vulkan_texture_op_finish,
+    gsk_vulkan_shader_op_finish,
     gsk_vulkan_texture_op_print,
     gsk_vulkan_shader_op_count_vertex_data,
     gsk_vulkan_texture_op_collect_vertex_data,
@@ -82,6 +75,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
     gsk_vulkan_shader_op_command
   },
   "texture",
+  1,
   &gsk_vulkan_texture_info,
 };
 
@@ -96,9 +90,11 @@ gsk_vulkan_texture_op (GskVulkanRender        *render,
 {
   GskVulkanTextureOp *self;
 
-  self = (GskVulkanTextureOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS, clip);
+  self = (GskVulkanTextureOp *) gsk_vulkan_shader_op_alloc (render,
+                                                            &GSK_VULKAN_TEXTURE_OP_CLASS,
+                                                            clip,
+                                                            &image);
 
-  self->image = g_object_ref (image);
   self->sampler = sampler;
   graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
   gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);