From ef4930723ba041ed2fbe1598290e26a852bb7d92 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 15 Jul 2023 13:28:08 +0200 Subject: [PATCH] vulkan: Handle images in the ShaderOp This looks more convoluted in this commit, but future commits will hopefully make up for it. --- gsk/vulkan/gskvulkanblendmodeop.c | 28 +++++++++++--------------- gsk/vulkan/gskvulkanblurop.c | 18 +++++------------ gsk/vulkan/gskvulkanborderop.c | 3 ++- gsk/vulkan/gskvulkancolormatrixop.c | 18 +++++------------ gsk/vulkan/gskvulkancolorop.c | 3 ++- gsk/vulkan/gskvulkancrossfadeop.c | 28 +++++++++++--------------- gsk/vulkan/gskvulkanglyphop.c | 17 +++++----------- gsk/vulkan/gskvulkaninsetshadowop.c | 3 ++- gsk/vulkan/gskvulkanlineargradientop.c | 3 ++- gsk/vulkan/gskvulkanmaskop.c | 28 +++++++++++--------------- gsk/vulkan/gskvulkanoutsetshadowop.c | 3 ++- gsk/vulkan/gskvulkanshaderop.c | 18 ++++++++++++++++- gsk/vulkan/gskvulkanshaderopprivate.h | 6 +++++- gsk/vulkan/gskvulkantextureop.c | 24 +++++++++------------- 14 files changed, 93 insertions(+), 107 deletions(-) diff --git a/gsk/vulkan/gskvulkanblendmodeop.c b/gsk/vulkan/gskvulkanblendmodeop.c index 21407a1f66..e4ad4b5d6b 100644 --- a/gsk/vulkan/gskvulkanblendmodeop.c +++ b/gsk/vulkan/gskvulkanblendmodeop.c @@ -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); } diff --git a/gsk/vulkan/gskvulkanblurop.c b/gsk/vulkan/gskvulkanblurop.c index 910c9a2fe2..6b121cdc08 100644 --- a/gsk/vulkan/gskvulkanblurop.c +++ b/gsk/vulkan/gskvulkanblurop.c @@ -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; diff --git a/gsk/vulkan/gskvulkanborderop.c b/gsk/vulkan/gskvulkanborderop.c index 3015820fce..f72827b54c 100644 --- a/gsk/vulkan/gskvulkanborderop.c +++ b/gsk/vulkan/gskvulkanborderop.c @@ -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); diff --git a/gsk/vulkan/gskvulkancolormatrixop.c b/gsk/vulkan/gskvulkancolormatrixop.c index 88ae643b44..1a377fc726 100644 --- a/gsk/vulkan/gskvulkancolormatrixop.c +++ b/gsk/vulkan/gskvulkancolormatrixop.c @@ -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; diff --git a/gsk/vulkan/gskvulkancolorop.c b/gsk/vulkan/gskvulkancolorop.c index 1caa47d63f..4f6756d302 100644 --- a/gsk/vulkan/gskvulkancolorop.c +++ b/gsk/vulkan/gskvulkancolorop.c @@ -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; diff --git a/gsk/vulkan/gskvulkancrossfadeop.c b/gsk/vulkan/gskvulkancrossfadeop.c index 4a7df63b5f..2f0d3ea590 100644 --- a/gsk/vulkan/gskvulkancrossfadeop.c +++ b/gsk/vulkan/gskvulkancrossfadeop.c @@ -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); } diff --git a/gsk/vulkan/gskvulkanglyphop.c b/gsk/vulkan/gskvulkanglyphop.c index 1edc4d1dbf..8b7effef99 100644 --- a/gsk/vulkan/gskvulkanglyphop.c +++ b/gsk/vulkan/gskvulkanglyphop.c @@ -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; diff --git a/gsk/vulkan/gskvulkaninsetshadowop.c b/gsk/vulkan/gskvulkaninsetshadowop.c index 95ce8d894e..0a0ee89372 100644 --- a/gsk/vulkan/gskvulkaninsetshadowop.c +++ b/gsk/vulkan/gskvulkaninsetshadowop.c @@ -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); diff --git a/gsk/vulkan/gskvulkanlineargradientop.c b/gsk/vulkan/gskvulkanlineargradientop.c index 61afebf0e0..caa0b60dfd 100644 --- a/gsk/vulkan/gskvulkanlineargradientop.c +++ b/gsk/vulkan/gskvulkanlineargradientop.c @@ -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); diff --git a/gsk/vulkan/gskvulkanmaskop.c b/gsk/vulkan/gskvulkanmaskop.c index 7b6f977240..71df86bdca 100644 --- a/gsk/vulkan/gskvulkanmaskop.c +++ b/gsk/vulkan/gskvulkanmaskop.c @@ -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; diff --git a/gsk/vulkan/gskvulkanoutsetshadowop.c b/gsk/vulkan/gskvulkanoutsetshadowop.c index dcfd428199..aa3d0b5b92 100644 --- a/gsk/vulkan/gskvulkanoutsetshadowop.c +++ b/gsk/vulkan/gskvulkanoutsetshadowop.c @@ -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); diff --git a/gsk/vulkan/gskvulkanshaderop.c b/gsk/vulkan/gskvulkanshaderop.c index 3364a387a0..aea6ff53e6 100644 --- a/gsk/vulkan/gskvulkanshaderop.c +++ b/gsk/vulkan/gskvulkanshaderop.c @@ -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; } diff --git a/gsk/vulkan/gskvulkanshaderopprivate.h b/gsk/vulkan/gskvulkanshaderopprivate.h index 77f111981b..d76b3f1233 100644 --- a/gsk/vulkan/gskvulkanshaderopprivate.h +++ b/gsk/vulkan/gskvulkanshaderopprivate.h @@ -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, diff --git a/gsk/vulkan/gskvulkantextureop.c b/gsk/vulkan/gskvulkantextureop.c index 806ca8dbfa..b40031a105 100644 --- a/gsk/vulkan/gskvulkantextureop.c +++ b/gsk/vulkan/gskvulkantextureop.c @@ -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); -- 2.30.2