From 5e72914c486e0f4b58c173b9c0b454defd307a98 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 3 Jul 2023 03:15:59 +0200 Subject: [PATCH] vulkan: Port linear gradient to new ops This was the last user of GskVulkanOpRender, so delete that one, too. --- gsk/meson.build | 2 +- gsk/vulkan/gskvulkanlineargradientop.c | 147 ++++++++++++++++++ gsk/vulkan/gskvulkanlineargradientopprivate.h | 19 +++ gsk/vulkan/gskvulkanlineargradientpipeline.c | 89 ----------- .../gskvulkanlineargradientpipelineprivate.h | 39 ----- gsk/vulkan/gskvulkanrender.c | 4 - gsk/vulkan/gskvulkanrenderpass.c | 99 ++---------- gsk/vulkan/gskvulkanrenderprivate.h | 3 - 8 files changed, 182 insertions(+), 220 deletions(-) create mode 100644 gsk/vulkan/gskvulkanlineargradientop.c create mode 100644 gsk/vulkan/gskvulkanlineargradientopprivate.h delete mode 100644 gsk/vulkan/gskvulkanlineargradientpipeline.c delete mode 100644 gsk/vulkan/gskvulkanlineargradientpipelineprivate.h diff --git a/gsk/meson.build b/gsk/meson.build index f264ac03f3..e1c06513f1 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -120,7 +120,7 @@ if have_vulkan 'vulkan/gskvulkanglyphcache.c', 'vulkan/gskvulkanimage.c', 'vulkan/gskvulkaninsetshadowop.c', - 'vulkan/gskvulkanlineargradientpipeline.c', + 'vulkan/gskvulkanlineargradientop.c', 'vulkan/gskvulkanmemory.c', 'vulkan/gskvulkanoffscreenop.c', 'vulkan/gskvulkanop.c', diff --git a/gsk/vulkan/gskvulkanlineargradientop.c b/gsk/vulkan/gskvulkanlineargradientop.c new file mode 100644 index 0000000000..f3275cb5d2 --- /dev/null +++ b/gsk/vulkan/gskvulkanlineargradientop.c @@ -0,0 +1,147 @@ +#include "config.h" + +#include "gskvulkanlineargradientopprivate.h" + +#include "vulkan/resources/linear.vert.h" + +typedef struct _GskVulkanLinearGradientOp GskVulkanLinearGradientOp; + +struct _GskVulkanLinearGradientOp +{ + GskVulkanOp op; + + graphene_rect_t rect; + graphene_point_t start; + graphene_point_t end; + gboolean repeating; + GskColorStop *stops; + gsize n_stops; + + gsize buffer_offset; + gsize vertex_offset; +}; + +static void +gsk_vulkan_linear_gradient_op_finish (GskVulkanOp *op) +{ + GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op; + + g_free (self->stops); +} + +static void +gsk_vulkan_linear_gradient_op_upload (GskVulkanOp *op, + GskVulkanRenderPass *pass, + GskVulkanRender *render, + GskVulkanUploader *uploader, + const graphene_rect_t *clip, + const graphene_vec2_t *scale) +{ +} + +static inline gsize +round_up (gsize number, gsize divisor) +{ + return (number + divisor - 1) / divisor * divisor; +} + +static gsize +gsk_vulkan_linear_gradient_op_count_vertex_data (GskVulkanOp *op, + gsize n_bytes) +{ + GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op; + gsize vertex_stride; + + vertex_stride = gsk_vulkan_linear_info.pVertexBindingDescriptions[0].stride; + n_bytes = round_up (n_bytes, vertex_stride); + self->vertex_offset = n_bytes; + n_bytes += vertex_stride; + return n_bytes; +} + +static void +gsk_vulkan_linear_gradient_op_collect_vertex_data (GskVulkanOp *op, + GskVulkanRenderPass *pass, + GskVulkanRender *render, + guchar *data) +{ + GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op; + GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + self->vertex_offset); + + gsk_vulkan_rect_to_float (&self->rect, instance->rect); + gsk_vulkan_point_to_float (&self->start, instance->start); + gsk_vulkan_point_to_float (&self->end, instance->end); + instance->repeating = self->repeating; + instance->stop_offset = self->buffer_offset; + instance->stop_count = self->n_stops; +} + +static void +gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp *op, + GskVulkanRender *render) +{ + GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op; + guchar *mem; + + mem = gsk_vulkan_render_get_buffer_memory (render, + self->n_stops * sizeof (GskColorStop), + G_ALIGNOF (GskColorStop), + &self->buffer_offset); + memcpy (mem, self->stops, self->n_stops * sizeof (GskColorStop)); +} + +static VkPipeline +gsk_vulkan_linear_gradient_op_get_pipeline (GskVulkanOp *op) +{ + return VK_NULL_HANDLE; +} + +static void +gsk_vulkan_linear_gradient_op_command (GskVulkanOp *op, + GskVulkanRender *render, + VkPipelineLayout pipeline_layout, + VkCommandBuffer command_buffer) +{ + GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op; + + vkCmdDraw (command_buffer, + 6, 1, + 0, self->vertex_offset / gsk_vulkan_linear_info.pVertexBindingDescriptions[0].stride); +} + +static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = { + GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp), + "linear", + &gsk_vulkan_linear_info, + gsk_vulkan_linear_gradient_op_finish, + gsk_vulkan_linear_gradient_op_upload, + gsk_vulkan_linear_gradient_op_count_vertex_data, + gsk_vulkan_linear_gradient_op_collect_vertex_data, + gsk_vulkan_linear_gradient_op_reserve_descriptor_sets, + gsk_vulkan_linear_gradient_op_get_pipeline, + gsk_vulkan_linear_gradient_op_command +}; + +void +gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass, + const char *clip_type, + const graphene_rect_t *rect, + const graphene_point_t *offset, + const graphene_point_t *start, + const graphene_point_t *end, + gboolean repeating, + const GskColorStop *stops, + gsize n_stops) +{ + GskVulkanLinearGradientOp *self; + + self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS); + + ((GskVulkanOp *) 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); + self->repeating = repeating; + self->stops = g_memdup (stops, sizeof (GskColorStop) * n_stops); + self->n_stops = n_stops; +} diff --git a/gsk/vulkan/gskvulkanlineargradientopprivate.h b/gsk/vulkan/gskvulkanlineargradientopprivate.h new file mode 100644 index 0000000000..4e8de815a6 --- /dev/null +++ b/gsk/vulkan/gskvulkanlineargradientopprivate.h @@ -0,0 +1,19 @@ +#pragma once + +#include "gskvulkanopprivate.h" + +G_BEGIN_DECLS + +void gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass, + const char *clip_type, + const graphene_rect_t *rect, + const graphene_point_t *offset, + const graphene_point_t *start, + const graphene_point_t *end, + gboolean repeating, + const GskColorStop *stops, + gsize n_stops); + + +G_END_DECLS + diff --git a/gsk/vulkan/gskvulkanlineargradientpipeline.c b/gsk/vulkan/gskvulkanlineargradientpipeline.c deleted file mode 100644 index 3e62778f0b..0000000000 --- a/gsk/vulkan/gskvulkanlineargradientpipeline.c +++ /dev/null @@ -1,89 +0,0 @@ -#include "config.h" - -#include "gskvulkanlineargradientpipelineprivate.h" - -#include "vulkan/resources/linear.vert.h" - -struct _GskVulkanLinearGradientPipeline -{ - GObject parent_instance; -}; - -G_DEFINE_TYPE (GskVulkanLinearGradientPipeline, gsk_vulkan_linear_gradient_pipeline, GSK_TYPE_VULKAN_PIPELINE) - -static const VkPipelineVertexInputStateCreateInfo * -gsk_vulkan_linear_gradient_pipeline_get_input_state_create_info (GskVulkanPipeline *self) -{ - return &gsk_vulkan_linear_info; -} - -static void -gsk_vulkan_linear_gradient_pipeline_finalize (GObject *gobject) -{ - //GskVulkanLinearGradientPipeline *self = GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (gobject); - - G_OBJECT_CLASS (gsk_vulkan_linear_gradient_pipeline_parent_class)->finalize (gobject); -} - -static void -gsk_vulkan_linear_gradient_pipeline_class_init (GskVulkanLinearGradientPipelineClass *klass) -{ - GskVulkanPipelineClass *pipeline_class = GSK_VULKAN_PIPELINE_CLASS (klass); - - G_OBJECT_CLASS (klass)->finalize = gsk_vulkan_linear_gradient_pipeline_finalize; - - pipeline_class->get_input_state_create_info = gsk_vulkan_linear_gradient_pipeline_get_input_state_create_info; -} - -static void -gsk_vulkan_linear_gradient_pipeline_init (GskVulkanLinearGradientPipeline *self) -{ -} - -GskVulkanPipeline * -gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context, - VkPipelineLayout layout, - const char *shader_name, - VkRenderPass render_pass) -{ - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE, context, layout, shader_name, render_pass); -} - -void -gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GskVulkanLinearGradientPipeline *pipeline, - guchar *data, - const graphene_point_t *offset, - const graphene_rect_t *rect, - const graphene_point_t *start, - const graphene_point_t *end, - gboolean repeating, - gsize gradient_offset, - gsize n_stops) -{ - GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) data; - - instance->rect[0] = rect->origin.x + offset->x; - instance->rect[1] = rect->origin.y + offset->y; - instance->rect[2] = rect->size.width; - instance->rect[3] = rect->size.height; - instance->start[0] = start->x + offset->x; - instance->start[1] = start->y + offset->y; - instance->end[0] = end->x + offset->x; - instance->end[1] = end->y + offset->y; - instance->repeating = repeating; - instance->stop_offset = gradient_offset; - instance->stop_count = n_stops; -} - -gsize -gsk_vulkan_linear_gradient_pipeline_draw (GskVulkanLinearGradientPipeline *pipeline, - VkCommandBuffer command_buffer, - gsize offset, - gsize n_commands) -{ - vkCmdDraw (command_buffer, - 6, n_commands, - 0, offset); - - return n_commands; -} diff --git a/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h b/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h deleted file mode 100644 index 21bf10066f..0000000000 --- a/gsk/vulkan/gskvulkanlineargradientpipelineprivate.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include - -#include "gskvulkanpipelineprivate.h" -#include "gskrendernode.h" - -G_BEGIN_DECLS - -#define GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS 8 - -typedef struct _GskVulkanLinearGradientPipelineLayout GskVulkanLinearGradientPipelineLayout; - -#define GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE (gsk_vulkan_linear_gradient_pipeline_get_type ()) - -G_DECLARE_FINAL_TYPE (GskVulkanLinearGradientPipeline, gsk_vulkan_linear_gradient_pipeline, GSK, VULKAN_LINEAR_GRADIENT_PIPELINE, GskVulkanPipeline) - -GskVulkanPipeline * gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context, - VkPipelineLayout layout, - const char *shader_name, - VkRenderPass render_pass); - -void gsk_vulkan_linear_gradient_pipeline_collect_vertex_data - (GskVulkanLinearGradientPipeline*pipeline, - guchar *data, - const graphene_point_t *offset, - const graphene_rect_t *rect, - const graphene_point_t *start, - const graphene_point_t *end, - gboolean repeating, - gsize gradient_offset, - gsize n_stops); -gsize gsk_vulkan_linear_gradient_pipeline_draw (GskVulkanLinearGradientPipeline*pipeline, - VkCommandBuffer command_buffer, - gsize offset, - gsize n_commands); - -G_END_DECLS - diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index bd36a04aba..e39d0122bd 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -11,7 +11,6 @@ #include "gskvulkanrenderpassprivate.h" #include "gskvulkancolortextpipelineprivate.h" -#include "gskvulkanlineargradientpipelineprivate.h" #include "gskvulkantextpipelineprivate.h" #include "gskvulkanpushconstantsprivate.h" @@ -497,9 +496,6 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, guint num_textures; GskVulkanPipeline * (* create_func) (GdkVulkanContext *context, VkPipelineLayout layout, const char *name, VkRenderPass render_pass); } pipeline_info[GSK_VULKAN_N_PIPELINES] = { - { "linear", 0, gsk_vulkan_linear_gradient_pipeline_new }, - { "linear-clip", 0, gsk_vulkan_linear_gradient_pipeline_new }, - { "linear-clip-rounded", 0, gsk_vulkan_linear_gradient_pipeline_new }, { "mask", 1, gsk_vulkan_text_pipeline_new }, { "mask-clip", 1, gsk_vulkan_text_pipeline_new }, { "mask-clip-rounded", 1, gsk_vulkan_text_pipeline_new }, diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index db7b4f25a4..520e42d855 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -18,7 +18,7 @@ #include "gskvulkancolortextpipelineprivate.h" #include "gskvulkancrossfadeopprivate.h" #include "gskvulkaninsetshadowopprivate.h" -#include "gskvulkanlineargradientpipelineprivate.h" +#include "gskvulkanlineargradientopprivate.h" #include "gskvulkanopprivate.h" #include "gskvulkanrendererprivate.h" #include "gskvulkantextpipelineprivate.h" @@ -47,13 +47,10 @@ typedef struct _GskVulkanParseState GskVulkanParseState; typedef struct _GskVulkanOpAny GskVulkanOpAny; typedef union _GskVulkanOpAll GskVulkanOpAll; -typedef struct _GskVulkanOpRender GskVulkanOpRender; typedef struct _GskVulkanOpText GskVulkanOpText; typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants; typedef enum { - /* GskVulkanOpRender */ - GSK_VULKAN_OP_LINEAR_GRADIENT, /* GskVulkanOpText */ GSK_VULKAN_OP_TEXT, GSK_VULKAN_OP_COLOR_TEXT, @@ -61,18 +58,6 @@ typedef enum { GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS, } GskVulkanOpType; -/* render ops with 0, 1 or 2 sources */ -struct _GskVulkanOpRender -{ - GskVulkanOp base; - GskVulkanOpType type; - GskRenderNode *node; /* node that's the source of this op */ - graphene_point_t offset; /* offset of the node */ - GskVulkanPipeline *pipeline; /* pipeline to use */ - gsize vertex_offset; /* offset into vertex buffer */ - gsize buffer_offset; /* offset into buffer */ -}; - struct _GskVulkanOpText { GskVulkanOp base; @@ -109,7 +94,6 @@ struct _GskVulkanOpAny union _GskVulkanOpAll { GskVulkanOpAny any; - GskVulkanOpRender render; GskVulkanOpText text; GskVulkanOpPushConstants constants; }; @@ -527,23 +511,15 @@ gsk_vulkan_render_pass_add_linear_gradient_node (GskVulkanRenderPass *self const GskVulkanParseState *state, GskRenderNode *node) { - GskVulkanPipelineType pipeline_type; - GskVulkanOpRender op = { - .type = GSK_VULKAN_OP_LINEAR_GRADIENT, - .node = node, - .offset = state->offset, - }; - - if (gsk_vulkan_clip_contains_rect (&state->clip, &state->offset, &node->bounds)) - pipeline_type = GSK_VULKAN_PIPELINE_LINEAR_GRADIENT; - else if (state->clip.type == GSK_VULKAN_CLIP_RECT) - pipeline_type = GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP; - else - pipeline_type = GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP_ROUNDED; - - op.pipeline = gsk_vulkan_render_pass_get_pipeline (self, render, pipeline_type); - gsk_vulkan_render_pass_add_op (self, (GskVulkanOp *) &op); - + gsk_vulkan_linear_gradient_op (self, + gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds), + &node->bounds, + &state->offset, + gsk_linear_gradient_node_get_start (node), + gsk_linear_gradient_node_get_end (node), + gsk_render_node_get_node_type (node) == GSK_REPEATING_LINEAR_GRADIENT_NODE, + gsk_linear_gradient_node_get_color_stops (node, NULL), + gsk_linear_gradient_node_get_n_color_stops (node)); return TRUE; } @@ -1491,7 +1467,6 @@ gsk_vulkan_render_op_upload (GskVulkanOp *op_, default: g_assert_not_reached (); case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: - case GSK_VULKAN_OP_LINEAR_GRADIENT: break; } } @@ -1523,16 +1498,9 @@ gsk_vulkan_render_op_count_vertex_data (GskVulkanOp *op_, switch (op->any.type) { - case GSK_VULKAN_OP_LINEAR_GRADIENT: - vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline); - n_bytes = round_up (n_bytes, vertex_stride); - op->render.vertex_offset = n_bytes; - n_bytes += vertex_stride; - break; - case GSK_VULKAN_OP_TEXT: case GSK_VULKAN_OP_COLOR_TEXT: - vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline); + vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->text.pipeline); n_bytes = round_up (n_bytes, vertex_stride); op->text.vertex_offset = n_bytes; n_bytes += vertex_stride * op->text.num_glyphs; @@ -1585,8 +1553,8 @@ gsk_vulkan_render_op_collect_vertex_data (GskVulkanOp *op_, gsk_text_node_get_glyphs (op->text.node, NULL), gsk_text_node_get_color (op->text.node), &GRAPHENE_POINT_INIT ( - gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x, - gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y + gsk_text_node_get_offset (op->text.node)->x + op->text.offset.x, + gsk_text_node_get_offset (op->text.node)->y + op->text.offset.y ), op->text.start_glyph, op->text.num_glyphs, @@ -1603,26 +1571,14 @@ gsk_vulkan_render_op_collect_vertex_data (GskVulkanOp *op_, gsk_text_node_get_num_glyphs (op->text.node), gsk_text_node_get_glyphs (op->text.node, NULL), &GRAPHENE_POINT_INIT ( - gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x, - gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y + gsk_text_node_get_offset (op->text.node)->x + op->text.offset.x, + gsk_text_node_get_offset (op->text.node)->y + op->text.offset.y ), op->text.start_glyph, op->text.num_glyphs, op->text.scale); break; - case GSK_VULKAN_OP_LINEAR_GRADIENT: - gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline), - data + op->render.vertex_offset, - &op->render.offset, - &op->render.node->bounds, - gsk_linear_gradient_node_get_start (op->render.node), - gsk_linear_gradient_node_get_end (op->render.node), - gsk_render_node_get_node_type (op->render.node) == GSK_REPEATING_LINEAR_GRADIENT_NODE, - op->render.buffer_offset, - gsk_linear_gradient_node_get_n_color_stops (op->render.node)); - break; - default: g_assert_not_reached (); case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: @@ -1698,21 +1654,6 @@ gsk_vulkan_render_op_reserve_descriptor_sets (GskVulkanOp *op_, GSK_VULKAN_SAMPLER_DEFAULT); break; - case GSK_VULKAN_OP_LINEAR_GRADIENT: - { - gsize n_stops = gsk_linear_gradient_node_get_n_color_stops (op->render.node); - guchar *mem; - - mem = gsk_vulkan_render_get_buffer_memory (render, - n_stops * sizeof (GskColorStop), - G_ALIGNOF (GskColorStop), - &op->render.buffer_offset); - memcpy (mem, - gsk_linear_gradient_node_get_color_stops (op->render.node, NULL), - n_stops * sizeof (GskColorStop)); - } - break; - default: g_assert_not_reached (); @@ -1779,9 +1720,6 @@ gsk_vulkan_render_op_get_pipeline (GskVulkanOp *op_) switch (op->any.type) { - case GSK_VULKAN_OP_LINEAR_GRADIENT: - return gsk_vulkan_pipeline_get_pipeline (op->render.pipeline); - case GSK_VULKAN_OP_TEXT: case GSK_VULKAN_OP_COLOR_TEXT: return gsk_vulkan_pipeline_get_pipeline (op->text.pipeline); @@ -1819,13 +1757,6 @@ gsk_vulkan_render_op_command (GskVulkanOp *op_, op->text.num_glyphs); break; - case GSK_VULKAN_OP_LINEAR_GRADIENT: - gsk_vulkan_linear_gradient_pipeline_draw (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline), - command_buffer, - op->render.vertex_offset / gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline), - 1); - break; - case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: gsk_vulkan_push_constants_push (command_buffer, pipeline_layout, diff --git a/gsk/vulkan/gskvulkanrenderprivate.h b/gsk/vulkan/gskvulkanrenderprivate.h index ae8c0a32ee..7e605a1933 100644 --- a/gsk/vulkan/gskvulkanrenderprivate.h +++ b/gsk/vulkan/gskvulkanrenderprivate.h @@ -11,9 +11,6 @@ G_BEGIN_DECLS typedef enum { - GSK_VULKAN_PIPELINE_LINEAR_GRADIENT, - GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP, - GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP_ROUNDED, GSK_VULKAN_PIPELINE_TEXT, GSK_VULKAN_PIPELINE_TEXT_CLIP, GSK_VULKAN_PIPELINE_TEXT_CLIP_ROUNDED, -- 2.30.2