From a8ff291a1290a087afa983a4fe58985a3b86a4e3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 15 Jul 2023 12:47:35 +0200 Subject: [PATCH] vulkan: Make clip type an enum and add gsk_vulkan_shader_op_alloc() that sets it properly. --- gsk/vulkan/gskvulkanblendmodeop.c | 5 +- gsk/vulkan/gskvulkanblendmodeopprivate.h | 2 +- gsk/vulkan/gskvulkanblurop.c | 5 +- gsk/vulkan/gskvulkanbluropprivate.h | 2 +- gsk/vulkan/gskvulkanborderop.c | 5 +- gsk/vulkan/gskvulkanborderopprivate.h | 2 +- gsk/vulkan/gskvulkanclip.c | 14 ++--- gsk/vulkan/gskvulkanclipprivate.h | 8 ++- gsk/vulkan/gskvulkancolormatrixop.c | 9 ++- gsk/vulkan/gskvulkancolormatrixopprivate.h | 4 +- gsk/vulkan/gskvulkancolorop.c | 5 +- gsk/vulkan/gskvulkancoloropprivate.h | 2 +- gsk/vulkan/gskvulkancrossfadeop.c | 5 +- gsk/vulkan/gskvulkancrossfadeopprivate.h | 2 +- gsk/vulkan/gskvulkanglyphop.c | 5 +- gsk/vulkan/gskvulkanglyphopprivate.h | 2 +- gsk/vulkan/gskvulkaninsetshadowop.c | 5 +- gsk/vulkan/gskvulkaninsetshadowopprivate.h | 2 +- gsk/vulkan/gskvulkanlineargradientop.c | 5 +- gsk/vulkan/gskvulkanlineargradientopprivate.h | 2 +- gsk/vulkan/gskvulkanmaskop.c | 5 +- gsk/vulkan/gskvulkanmaskopprivate.h | 2 +- gsk/vulkan/gskvulkanoutsetshadowop.c | 5 +- gsk/vulkan/gskvulkanoutsetshadowopprivate.h | 2 +- gsk/vulkan/gskvulkanrender.c | 17 +++--- gsk/vulkan/gskvulkanrenderpass.c | 56 +++++++++---------- gsk/vulkan/gskvulkanrenderprivate.h | 3 +- gsk/vulkan/gskvulkanshaderop.c | 15 ++++- gsk/vulkan/gskvulkanshaderopprivate.h | 8 ++- gsk/vulkan/gskvulkantextureop.c | 5 +- gsk/vulkan/gskvulkantextureopprivate.h | 2 +- 31 files changed, 113 insertions(+), 98 deletions(-) diff --git a/gsk/vulkan/gskvulkanblendmodeop.c b/gsk/vulkan/gskvulkanblendmodeop.c index 81df72c6a3..21407a1f66 100644 --- a/gsk/vulkan/gskvulkanblendmodeop.c +++ b/gsk/vulkan/gskvulkanblendmodeop.c @@ -95,7 +95,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = { void gsk_vulkan_blend_mode_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *bounds, const graphene_point_t *offset, GskBlendMode blend_mode, @@ -108,9 +108,8 @@ gsk_vulkan_blend_mode_op (GskVulkanRender *render, { GskVulkanBlendModeOp *self; - self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS.parent_class); + self = (GskVulkanBlendModeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS, clip); - ((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; diff --git a/gsk/vulkan/gskvulkanblendmodeopprivate.h b/gsk/vulkan/gskvulkanblendmodeopprivate.h index 418c5f2649..c90d756dbf 100644 --- a/gsk/vulkan/gskvulkanblendmodeopprivate.h +++ b/gsk/vulkan/gskvulkanblendmodeopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_blend_mode_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *bounds, const graphene_point_t *offset, GskBlendMode blend_mode, diff --git a/gsk/vulkan/gskvulkanblurop.c b/gsk/vulkan/gskvulkanblurop.c index 76719ccbaf..910c9a2fe2 100644 --- a/gsk/vulkan/gskvulkanblurop.c +++ b/gsk/vulkan/gskvulkanblurop.c @@ -84,7 +84,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = { void gsk_vulkan_blur_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, @@ -95,9 +95,8 @@ gsk_vulkan_blur_op (GskVulkanRender *render, g_assert (radius > 0); - self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS.parent_class); + self = (GskVulkanBlurOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS, clip); - ((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); diff --git a/gsk/vulkan/gskvulkanbluropprivate.h b/gsk/vulkan/gskvulkanbluropprivate.h index 24a90a7195..681cc3e8cb 100644 --- a/gsk/vulkan/gskvulkanbluropprivate.h +++ b/gsk/vulkan/gskvulkanbluropprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_blur_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, diff --git a/gsk/vulkan/gskvulkanborderop.c b/gsk/vulkan/gskvulkanborderop.c index 2d157aea36..3015820fce 100644 --- a/gsk/vulkan/gskvulkanborderop.c +++ b/gsk/vulkan/gskvulkanborderop.c @@ -100,7 +100,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BORDER_OP_CLASS = { void gsk_vulkan_border_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const GskRoundedRect *outline, const graphene_point_t *offset, const float widths[4], @@ -109,9 +109,8 @@ gsk_vulkan_border_op (GskVulkanRender *render, GskVulkanBorderOp *self; guint i; - self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS.parent_class); + self = (GskVulkanBorderOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS, clip); - ((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++) diff --git a/gsk/vulkan/gskvulkanborderopprivate.h b/gsk/vulkan/gskvulkanborderopprivate.h index 85985e4a7a..cc3a2b3e20 100644 --- a/gsk/vulkan/gskvulkanborderopprivate.h +++ b/gsk/vulkan/gskvulkanborderopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_border_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const GskRoundedRect *outline, const graphene_point_t *offset, const float widths[4], diff --git a/gsk/vulkan/gskvulkanclip.c b/gsk/vulkan/gskvulkanclip.c index 4d066ada42..d9a300011f 100644 --- a/gsk/vulkan/gskvulkanclip.c +++ b/gsk/vulkan/gskvulkanclip.c @@ -285,16 +285,16 @@ gsk_vulkan_clip_contains_rect (const GskVulkanClip *self, } } -const char * -gsk_vulkan_clip_get_clip_type (const GskVulkanClip *self, - const graphene_point_t *offset, - const graphene_rect_t *rect) +GskVulkanShaderClip +gsk_vulkan_clip_get_shader_clip (const GskVulkanClip *self, + const graphene_point_t *offset, + const graphene_rect_t *rect) { if (gsk_vulkan_clip_contains_rect (self, offset, rect)) - return ""; + return GSK_VULKAN_SHADER_CLIP_NONE; else if (self->type == GSK_VULKAN_CLIP_RECT) - return "-clip"; + return GSK_VULKAN_SHADER_CLIP_RECT; else - return "-clip-rounded"; + return GSK_VULKAN_SHADER_CLIP_ROUNDED; } diff --git a/gsk/vulkan/gskvulkanclipprivate.h b/gsk/vulkan/gskvulkanclipprivate.h index 1fc592809a..1813497f1d 100644 --- a/gsk/vulkan/gskvulkanclipprivate.h +++ b/gsk/vulkan/gskvulkanclipprivate.h @@ -6,6 +6,12 @@ G_BEGIN_DECLS +typedef enum { + GSK_VULKAN_SHADER_CLIP_NONE, + GSK_VULKAN_SHADER_CLIP_RECT, + GSK_VULKAN_SHADER_CLIP_ROUNDED +} GskVulkanShaderClip; + typedef enum { /* The whole area is clipped, no drawing is necessary. * This can't be handled by return values because for return @@ -58,7 +64,7 @@ gboolean gsk_vulkan_clip_contains_rect (const G gboolean gsk_vulkan_clip_may_intersect_rect (const GskVulkanClip *self, const graphene_point_t *offset, const graphene_rect_t *rect) G_GNUC_WARN_UNUSED_RESULT; -const char * gsk_vulkan_clip_get_clip_type (const GskVulkanClip *self, +GskVulkanShaderClip gsk_vulkan_clip_get_shader_clip (const GskVulkanClip *self, const graphene_point_t *offset, const graphene_rect_t *rect); diff --git a/gsk/vulkan/gskvulkancolormatrixop.c b/gsk/vulkan/gskvulkancolormatrixop.c index f007ddfd4f..88ae643b44 100644 --- a/gsk/vulkan/gskvulkancolormatrixop.c +++ b/gsk/vulkan/gskvulkancolormatrixop.c @@ -91,7 +91,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = { void gsk_vulkan_color_matrix_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, @@ -101,9 +101,8 @@ gsk_vulkan_color_matrix_op (GskVulkanRender *render, { GskVulkanColorMatrixOp *self; - self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS.parent_class); + self = (GskVulkanColorMatrixOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS, clip); - ((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); @@ -113,7 +112,7 @@ gsk_vulkan_color_matrix_op (GskVulkanRender *render, void gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, @@ -133,7 +132,7 @@ gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render, graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0); gsk_vulkan_color_matrix_op (render, - clip_type, + clip, image, rect, offset, diff --git a/gsk/vulkan/gskvulkancolormatrixopprivate.h b/gsk/vulkan/gskvulkancolormatrixopprivate.h index e50cdbf10b..b2a490b005 100644 --- a/gsk/vulkan/gskvulkancolormatrixopprivate.h +++ b/gsk/vulkan/gskvulkancolormatrixopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_color_matrix_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, @@ -14,7 +14,7 @@ void gsk_vulkan_color_matrix_op (GskVulk const graphene_vec4_t *color_offset); void gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, diff --git a/gsk/vulkan/gskvulkancolorop.c b/gsk/vulkan/gskvulkancolorop.c index e5b5c21780..1caa47d63f 100644 --- a/gsk/vulkan/gskvulkancolorop.c +++ b/gsk/vulkan/gskvulkancolorop.c @@ -76,16 +76,15 @@ static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_OP_CLASS = { void gsk_vulkan_color_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *rect, const graphene_point_t *offset, const GdkRGBA *color) { GskVulkanColorOp *self; - self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS.parent_class); + self = (GskVulkanColorOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS, clip); - ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); self->color = *color; } diff --git a/gsk/vulkan/gskvulkancoloropprivate.h b/gsk/vulkan/gskvulkancoloropprivate.h index 904141b612..4b6e3442ff 100644 --- a/gsk/vulkan/gskvulkancoloropprivate.h +++ b/gsk/vulkan/gskvulkancoloropprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_color_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *rect, const graphene_point_t *offset, const GdkRGBA *color); diff --git a/gsk/vulkan/gskvulkancrossfadeop.c b/gsk/vulkan/gskvulkancrossfadeop.c index e563f57dba..4a7df63b5f 100644 --- a/gsk/vulkan/gskvulkancrossfadeop.c +++ b/gsk/vulkan/gskvulkancrossfadeop.c @@ -95,7 +95,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = { void gsk_vulkan_cross_fade_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *bounds, const graphene_point_t *offset, float progress, @@ -108,9 +108,8 @@ gsk_vulkan_cross_fade_op (GskVulkanRender *render, { GskVulkanCrossFadeOp *self; - self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS.parent_class); + self = (GskVulkanCrossFadeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS, clip); - ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds); self->progress = progress; diff --git a/gsk/vulkan/gskvulkancrossfadeopprivate.h b/gsk/vulkan/gskvulkancrossfadeopprivate.h index ec7e1d9260..92f2a78f8a 100644 --- a/gsk/vulkan/gskvulkancrossfadeopprivate.h +++ b/gsk/vulkan/gskvulkancrossfadeopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_cross_fade_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *bounds, const graphene_point_t *offset, float progress, diff --git a/gsk/vulkan/gskvulkanglyphop.c b/gsk/vulkan/gskvulkanglyphop.c index 2794491933..1edc4d1dbf 100644 --- a/gsk/vulkan/gskvulkanglyphop.c +++ b/gsk/vulkan/gskvulkanglyphop.c @@ -82,7 +82,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = { void gsk_vulkan_glyph_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, @@ -91,9 +91,8 @@ gsk_vulkan_glyph_op (GskVulkanRender *render, { GskVulkanGlyphOp *self; - self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS.parent_class); + self = (GskVulkanGlyphOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS, clip); - ((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); diff --git a/gsk/vulkan/gskvulkanglyphopprivate.h b/gsk/vulkan/gskvulkanglyphopprivate.h index 74f38832e6..3c40cdbaa3 100644 --- a/gsk/vulkan/gskvulkanglyphopprivate.h +++ b/gsk/vulkan/gskvulkanglyphopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_glyph_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, const graphene_rect_t *rect, const graphene_point_t *offset, diff --git a/gsk/vulkan/gskvulkaninsetshadowop.c b/gsk/vulkan/gskvulkaninsetshadowop.c index 6f8481a612..95ce8d894e 100644 --- a/gsk/vulkan/gskvulkaninsetshadowop.c +++ b/gsk/vulkan/gskvulkaninsetshadowop.c @@ -78,7 +78,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = { void gsk_vulkan_inset_shadow_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const GskRoundedRect *outline, const graphene_point_t *offset, const GdkRGBA *color, @@ -88,9 +88,8 @@ gsk_vulkan_inset_shadow_op (GskVulkanRender *render, { GskVulkanInsetShadowOp *self; - self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS.parent_class); + self = (GskVulkanInsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS, clip); - ((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; diff --git a/gsk/vulkan/gskvulkaninsetshadowopprivate.h b/gsk/vulkan/gskvulkaninsetshadowopprivate.h index eef7a16cca..664e0e667a 100644 --- a/gsk/vulkan/gskvulkaninsetshadowopprivate.h +++ b/gsk/vulkan/gskvulkaninsetshadowopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_inset_shadow_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const GskRoundedRect *outline, const graphene_point_t *offset, const GdkRGBA *color, diff --git a/gsk/vulkan/gskvulkanlineargradientop.c b/gsk/vulkan/gskvulkanlineargradientop.c index 2d9a1cfd57..61afebf0e0 100644 --- a/gsk/vulkan/gskvulkanlineargradientop.c +++ b/gsk/vulkan/gskvulkanlineargradientop.c @@ -90,7 +90,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = { void gsk_vulkan_linear_gradient_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *rect, const graphene_point_t *offset, const graphene_point_t *start, @@ -101,9 +101,8 @@ gsk_vulkan_linear_gradient_op (GskVulkanRender *render, { GskVulkanLinearGradientOp *self; - self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS.parent_class); + self = (GskVulkanLinearGradientOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS, clip); - ((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); diff --git a/gsk/vulkan/gskvulkanlineargradientopprivate.h b/gsk/vulkan/gskvulkanlineargradientopprivate.h index ce26f4cf85..6cc3c821d1 100644 --- a/gsk/vulkan/gskvulkanlineargradientopprivate.h +++ b/gsk/vulkan/gskvulkanlineargradientopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_linear_gradient_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_rect_t *rect, const graphene_point_t *offset, const graphene_point_t *start, diff --git a/gsk/vulkan/gskvulkanmaskop.c b/gsk/vulkan/gskvulkanmaskop.c index b422ea01c2..7b6f977240 100644 --- a/gsk/vulkan/gskvulkanmaskop.c +++ b/gsk/vulkan/gskvulkanmaskop.c @@ -106,7 +106,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = { void gsk_vulkan_mask_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_point_t *offset, GskVulkanImage *source, const graphene_rect_t *source_rect, @@ -118,9 +118,8 @@ gsk_vulkan_mask_op (GskVulkanRender *render, { GskVulkanMaskOp *self; - self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS.parent_class); + self = (GskVulkanMaskOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS, clip); - ((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); diff --git a/gsk/vulkan/gskvulkanmaskopprivate.h b/gsk/vulkan/gskvulkanmaskopprivate.h index 520b3c2daa..268bc47564 100644 --- a/gsk/vulkan/gskvulkanmaskopprivate.h +++ b/gsk/vulkan/gskvulkanmaskopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_mask_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const graphene_point_t *offset, GskVulkanImage *source, const graphene_rect_t *source_rect, diff --git a/gsk/vulkan/gskvulkanoutsetshadowop.c b/gsk/vulkan/gskvulkanoutsetshadowop.c index 0358ce3d4d..dcfd428199 100644 --- a/gsk/vulkan/gskvulkanoutsetshadowop.c +++ b/gsk/vulkan/gskvulkanoutsetshadowop.c @@ -78,7 +78,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = { void gsk_vulkan_outset_shadow_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const GskRoundedRect *outline, const graphene_point_t *offset, const GdkRGBA *color, @@ -88,9 +88,8 @@ gsk_vulkan_outset_shadow_op (GskVulkanRender *render, { GskVulkanOutsetShadowOp *self; - self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS.parent_class); + self = (GskVulkanOutsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS, clip); - ((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; diff --git a/gsk/vulkan/gskvulkanoutsetshadowopprivate.h b/gsk/vulkan/gskvulkanoutsetshadowopprivate.h index 4ff2b6c51b..b60069c31b 100644 --- a/gsk/vulkan/gskvulkanoutsetshadowopprivate.h +++ b/gsk/vulkan/gskvulkanoutsetshadowopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_outset_shadow_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, const GskRoundedRect *outline, const graphene_point_t *offset, const GdkRGBA *color, diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index 0ef3c98d7d..4f57fdedf2 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -87,7 +87,7 @@ typedef struct _RenderPassCacheKey RenderPassCacheKey; struct _PipelineCacheKey { const GskVulkanOpClass *op_class; - const /* interned */ char *clip_type; + GskVulkanShaderClip clip; VkFormat format; }; @@ -104,8 +104,8 @@ pipeline_cache_key_hash (gconstpointer data) const PipelineCacheKey *key = data; return GPOINTER_TO_UINT (key->op_class) ^ - GPOINTER_TO_UINT (key->clip_type) ^ - key->format; + key->clip ^ + (key->format << 2); } static gboolean @@ -116,7 +116,7 @@ pipeline_cache_key_equal (gconstpointer a, const PipelineCacheKey *keyb = b; return keya->op_class == keyb->op_class && - keya->clip_type == keyb->clip_type && + keya->clip == keyb->clip && keya->format == keyb->format; } @@ -522,10 +522,11 @@ gsk_vulkan_render_get_pipeline_layout (GskVulkanRender *self) VkPipeline gsk_vulkan_render_get_pipeline (GskVulkanRender *self, const GskVulkanOpClass *op_class, - const char *clip_type, + GskVulkanShaderClip clip, VkRenderPass render_pass) { const GskVulkanShaderOpClass *shader_op_class = (const GskVulkanShaderOpClass *) op_class; + static const char *clip_names[] = { "", "-clip", "-clip-rounded" }; PipelineCacheKey cache_key; VkPipeline pipeline; GdkDisplay *display; @@ -533,7 +534,7 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, cache_key = (PipelineCacheKey) { .op_class = op_class, - .clip_type = clip_type, + .clip = clip, .format = gsk_vulkan_image_get_vk_format (self->target) }; pipeline = g_hash_table_lookup (self->pipeline_cache, &cache_key); @@ -541,8 +542,8 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, return pipeline; display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (self->vulkan)); - 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); + vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_names[clip], ".vert.spv", NULL); + fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_names[clip], ".frag.spv", NULL); GSK_VK_CHECK (vkCreateGraphicsPipelines, gdk_vulkan_context_get_device (self->vulkan), gdk_vulkan_context_get_pipeline_cache (self->vulkan), diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 1c951a604e..59f338568d 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -275,7 +275,7 @@ gsk_vulkan_render_pass_add_fallback_node (GskVulkanRenderPass *self, &clipped); gsk_vulkan_texture_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, GSK_VULKAN_SAMPLER_DEFAULT, &node->bounds, @@ -351,13 +351,13 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self, if (state->clip.type == GSK_VULKAN_CLIP_ROUNDED) { graphene_rect_t cover; - const char *clip_type; + GskVulkanShaderClip shader_clip; float scale_x = graphene_vec2_get_x (&state->scale); float scale_y = graphene_vec2_get_y (&state->scale); clipped = GRAPHENE_RECT_INIT (int_clipped.x / scale_x, int_clipped.y / scale_y, int_clipped.width / scale_x, int_clipped.height / scale_y); - clip_type = gsk_vulkan_clip_get_clip_type (&state->clip, graphene_point_zero(), &clipped); - if (clip_type[0] != '\0') + shader_clip = gsk_vulkan_clip_get_shader_clip (&state->clip, graphene_point_zero(), &clipped); + if (shader_clip != GSK_VULKAN_SHADER_CLIP_NONE) { gsk_rounded_rect_get_largest_cover (&state->clip.rect, &clipped, &cover); int_clipped.x = ceil (cover.origin.x * scale_x); @@ -367,7 +367,7 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self, if (int_clipped.width == 0 || int_clipped.height == 0) { gsk_vulkan_color_op (render, - clip_type, + shader_clip, &clipped, graphene_point_zero (), color); @@ -377,19 +377,19 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self, int_clipped.width / scale_x, int_clipped.height / scale_y); if (clipped.origin.x != cover.origin.x) gsk_vulkan_color_op (render, - clip_type, + shader_clip, &GRAPHENE_RECT_INIT (clipped.origin.x, clipped.origin.y, cover.origin.x - clipped.origin.x, clipped.size.height), graphene_point_zero (), color); if (clipped.origin.y != cover.origin.y) gsk_vulkan_color_op (render, - clip_type, + shader_clip, &GRAPHENE_RECT_INIT (clipped.origin.x, clipped.origin.y, clipped.size.width, cover.origin.y - clipped.origin.y), graphene_point_zero (), color); if (clipped.origin.x + clipped.size.width != cover.origin.x + cover.size.width) gsk_vulkan_color_op (render, - clip_type, + shader_clip, &GRAPHENE_RECT_INIT (cover.origin.x + cover.size.width, clipped.origin.y, clipped.origin.x + clipped.size.width - cover.origin.x - cover.size.width, @@ -398,7 +398,7 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self, color); if (clipped.origin.y + clipped.size.height != cover.origin.y + cover.size.height) gsk_vulkan_color_op (render, - clip_type, + shader_clip, &GRAPHENE_RECT_INIT (clipped.origin.x, cover.origin.y + cover.size.height, clipped.size.width, @@ -415,7 +415,7 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self, } gsk_vulkan_color_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), &rect, graphene_point_zero (), color); @@ -430,7 +430,7 @@ gsk_vulkan_render_pass_add_linear_gradient_node (GskVulkanRenderPass *self GskRenderNode *node) { gsk_vulkan_linear_gradient_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), &node->bounds, &state->offset, gsk_linear_gradient_node_get_start (node), @@ -448,7 +448,7 @@ gsk_vulkan_render_pass_add_border_node (GskVulkanRenderPass *self, GskRenderNode *node) { gsk_vulkan_border_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), gsk_border_node_get_outline (node), &state->offset, gsk_border_node_get_widths (node), @@ -476,7 +476,7 @@ gsk_vulkan_render_pass_add_texture_node (GskVulkanRenderPass *self, } gsk_vulkan_texture_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, GSK_VULKAN_SAMPLER_DEFAULT, &node->bounds, @@ -519,7 +519,7 @@ gsk_vulkan_render_pass_add_texture_scale_node (GskVulkanRenderPass *self, } gsk_vulkan_texture_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, sampler, &node->bounds, @@ -539,7 +539,7 @@ gsk_vulkan_render_pass_add_inset_shadow_node (GskVulkanRenderPass *self, FALLBACK ("Blur support not implemented for inset shadows"); gsk_vulkan_inset_shadow_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), gsk_inset_shadow_node_get_outline (node), &state->offset, gsk_inset_shadow_node_get_color (node), @@ -561,7 +561,7 @@ gsk_vulkan_render_pass_add_outset_shadow_node (GskVulkanRenderPass *self, FALLBACK ("Blur support not implemented for outset shadows"); gsk_vulkan_outset_shadow_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), gsk_outset_shadow_node_get_outline (node), &state->offset, gsk_outset_shadow_node_get_color (node), @@ -745,7 +745,7 @@ gsk_vulkan_render_pass_add_opacity_node (GskVulkanRenderPass *self, return TRUE; gsk_vulkan_color_matrix_op_opacity (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, &node->bounds, &state->offset, @@ -773,7 +773,7 @@ gsk_vulkan_render_pass_add_color_matrix_node (GskVulkanRenderPass *self, return TRUE; gsk_vulkan_color_matrix_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, &node->bounds, &state->offset, @@ -907,7 +907,7 @@ gsk_vulkan_render_pass_add_repeat_node (GskVulkanRenderPass *self, gsk_repeat_node_get_child (node)); gsk_vulkan_texture_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, GSK_VULKAN_SAMPLER_REPEAT, &node->bounds, @@ -954,7 +954,7 @@ gsk_vulkan_render_pass_add_blend_node (GskVulkanRenderPass *self, } gsk_vulkan_blend_mode_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), &node->bounds, &state->offset, gsk_blend_node_get_blend_mode (node), @@ -998,7 +998,7 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self, return TRUE; gsk_vulkan_color_matrix_op_opacity (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &end_child->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &end_child->bounds), end_image, &node->bounds, &state->offset, @@ -1010,7 +1010,7 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self, else if (end_image == NULL) { gsk_vulkan_color_matrix_op_opacity (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &start_child->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &start_child->bounds), start_image, &node->bounds, &state->offset, @@ -1020,7 +1020,7 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self, } gsk_vulkan_cross_fade_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), &node->bounds, &state->offset, progress, @@ -1083,7 +1083,7 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass *self, glyph->draw_height / glyph->th); if (gsk_text_node_has_color_glyphs (node)) gsk_vulkan_texture_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &glyph_bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &glyph_bounds), glyph->atlas_image, GSK_VULKAN_SAMPLER_DEFAULT, &glyph_bounds, @@ -1091,7 +1091,7 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass *self, &glyph_tex_rect); else gsk_vulkan_glyph_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &glyph_bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &glyph_bounds), glyph->atlas_image, &glyph_bounds, &state->offset, @@ -1130,7 +1130,7 @@ gsk_vulkan_render_pass_add_blur_node (GskVulkanRenderPass *self, return TRUE; gsk_vulkan_blur_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), image, &node->bounds, &state->offset, @@ -1174,7 +1174,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self, graphene_rect_t bounds; if (graphene_rect_intersection (&source->bounds, &mask->bounds, &bounds)) gsk_vulkan_glyph_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &bounds), mask_image, &bounds, &state->offset, @@ -1192,7 +1192,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self, return TRUE; gsk_vulkan_mask_op (render, - gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds), &state->offset, source_image, &source->bounds, diff --git a/gsk/vulkan/gskvulkanrenderprivate.h b/gsk/vulkan/gskvulkanrenderprivate.h index 8342231e0d..84a2939361 100644 --- a/gsk/vulkan/gskvulkanrenderprivate.h +++ b/gsk/vulkan/gskvulkanrenderprivate.h @@ -3,6 +3,7 @@ #include #include +#include "gskvulkanclipprivate.h" #include "gskvulkanimageprivate.h" #include "gskvulkanprivate.h" #include "gskvulkanrenderpassprivate.h" @@ -44,7 +45,7 @@ gpointer gsk_vulkan_render_alloc_op (GskVulk 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, + GskVulkanShaderClip clip, VkRenderPass render_pass); VkRenderPass gsk_vulkan_render_get_render_pass (GskVulkanRender *self, VkFormat format, diff --git a/gsk/vulkan/gskvulkanshaderop.c b/gsk/vulkan/gskvulkanshaderop.c index 141271ecca..3364a387a0 100644 --- a/gsk/vulkan/gskvulkanshaderop.c +++ b/gsk/vulkan/gskvulkanshaderop.c @@ -52,7 +52,7 @@ gsk_vulkan_shader_op_command_n (GskVulkanOp *op, VK_PIPELINE_BIND_POINT_GRAPHICS, gsk_vulkan_render_get_pipeline (render, op->op_class, - self->clip_type, + self->clip, render_pass)); vkCmdDraw (command_buffer, @@ -71,3 +71,16 @@ gsk_vulkan_shader_op_command (GskVulkanOp *op, return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 1); } +GskVulkanShaderOp * +gsk_vulkan_shader_op_alloc (GskVulkanRender *render, + const GskVulkanShaderOpClass *op_class, + GskVulkanShaderClip clip) +{ + GskVulkanShaderOp *self; + + self = (GskVulkanShaderOp *) gsk_vulkan_op_alloc (render, &op_class->parent_class); + + self->clip = clip; + + return self; +} diff --git a/gsk/vulkan/gskvulkanshaderopprivate.h b/gsk/vulkan/gskvulkanshaderopprivate.h index e9f29bb90c..77f111981b 100644 --- a/gsk/vulkan/gskvulkanshaderopprivate.h +++ b/gsk/vulkan/gskvulkanshaderopprivate.h @@ -2,6 +2,8 @@ #include "gskvulkanopprivate.h" +#include "gskvulkanclipprivate.h" + G_BEGIN_DECLS typedef struct _GskVulkanShaderOp GskVulkanShaderOp; @@ -11,7 +13,7 @@ struct _GskVulkanShaderOp { GskVulkanOp parent_op; - const /* interned */ char *clip_type; + GskVulkanShaderClip clip; gsize vertex_offset; }; @@ -23,6 +25,10 @@ struct _GskVulkanShaderOpClass const VkPipelineVertexInputStateCreateInfo *vertex_input_state; }; +GskVulkanShaderOp * gsk_vulkan_shader_op_alloc (GskVulkanRender *render, + const GskVulkanShaderOpClass *op_class, + GskVulkanShaderClip clip); + 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 d0df51d420..806ca8dbfa 100644 --- a/gsk/vulkan/gskvulkantextureop.c +++ b/gsk/vulkan/gskvulkantextureop.c @@ -87,7 +87,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = { void gsk_vulkan_texture_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, GskVulkanRenderSampler sampler, const graphene_rect_t *rect, @@ -96,9 +96,8 @@ gsk_vulkan_texture_op (GskVulkanRender *render, { GskVulkanTextureOp *self; - self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS.parent_class); + self = (GskVulkanTextureOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS, clip); - ((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); diff --git a/gsk/vulkan/gskvulkantextureopprivate.h b/gsk/vulkan/gskvulkantextureopprivate.h index f67795cfb0..480943616c 100644 --- a/gsk/vulkan/gskvulkantextureopprivate.h +++ b/gsk/vulkan/gskvulkantextureopprivate.h @@ -5,7 +5,7 @@ G_BEGIN_DECLS void gsk_vulkan_texture_op (GskVulkanRender *render, - const char *clip_type, + GskVulkanShaderClip clip, GskVulkanImage *image, GskVulkanRenderSampler sampler, const graphene_rect_t *rect, -- 2.30.2