vulkan: Split out color node special casing

It's done in multiple places, and because apps tend to use opacity +
color, we try to detect that, too.

Theoretically, other things, like color-matrix or crossfades, could be
added here, too.
This commit is contained in:
Benjamin Otte
2023-07-28 03:45:29 +02:00
parent 1382a2beaa
commit 78e3024924

View File

@@ -75,6 +75,33 @@ gsk_vulkan_render_pass_free (GskVulkanRenderPass *self)
g_free (self);
}
static gboolean
gsk_vulkan_render_pass_is_color_node (GskRenderNode *node,
GdkRGBA *out_color)
{
GskRenderNodeType node_type;
node_type = gsk_render_node_get_node_type (node);
if (node_type == GSK_COLOR_NODE)
{
*out_color = *gsk_color_node_get_color (node);
return TRUE;
}
else if (node_type == GSK_OPACITY_NODE)
{
if (!gsk_vulkan_render_pass_is_color_node (gsk_opacity_node_get_child (node),
out_color))
return FALSE;
out_color->alpha *= gsk_opacity_node_get_opacity (node);
return TRUE;
}
else
{
return FALSE;
}
}
static void
gsk_vulkan_render_pass_append_scissor (GskVulkanRender *render,
GskRenderNode *node,
@@ -1161,6 +1188,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self,
GskVulkanImage *source_image, *mask_image;
graphene_rect_t source_tex_rect, mask_tex_rect;
GskRenderNode *source, *mask;
GdkRGBA source_color;
GskMaskMode mode;
mode = gsk_mask_node_get_mask_mode (node);
@@ -1181,7 +1209,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self,
/* Use the glyph shader as an optimization */
if (mode == GSK_MASK_MODE_ALPHA &&
gsk_render_node_get_node_type (source) == GSK_COLOR_NODE)
gsk_vulkan_render_pass_is_color_node (source, &source_color))
{
graphene_rect_t bounds;
if (graphene_rect_intersection (&source->bounds, &mask->bounds, &bounds))
@@ -1191,7 +1219,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self,
&bounds,
&state->offset,
&mask_tex_rect,
gsk_color_node_get_color (source));
&source_color);
return TRUE;
}
@@ -1226,11 +1254,12 @@ gsk_vulkan_render_pass_add_fill_node (GskVulkanRenderPass *self,
graphene_rect_t clipped, child_tex_rect;
GskVulkanImage *child_image, *mask_image;
graphene_matrix_t projection;
GdkRGBA color;
int width, height;
child = gsk_fill_node_get_child (node);
if (gsk_render_node_get_node_type (child) == GSK_COLOR_NODE)
if (gsk_vulkan_render_pass_is_color_node (child, &color))
{
gsk_vulkan_fill_op (render,
gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
@@ -1238,7 +1267,7 @@ gsk_vulkan_render_pass_add_fill_node (GskVulkanRenderPass *self,
&node->bounds,
gsk_fill_node_get_path (node),
gsk_fill_node_get_fill_rule (node),
gsk_color_node_get_color (child));
&color);
return TRUE;
}
@@ -1308,11 +1337,12 @@ gsk_vulkan_render_pass_add_stroke_node (GskVulkanRenderPass *self,
{
GskRenderNode *child;
const GskStroke *stroke;
GdkRGBA color;
child = gsk_stroke_node_get_child (node);
stroke = gsk_stroke_node_get_stroke (node);
if (gsk_render_node_get_node_type (child) == GSK_COLOR_NODE)
if (gsk_vulkan_render_pass_is_color_node (child, &color))
{
gsk_vulkan_stroke_op (render,
gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
@@ -1323,7 +1353,7 @@ gsk_vulkan_render_pass_add_stroke_node (GskVulkanRenderPass *self,
stroke->line_cap,
stroke->line_join,
stroke->miter_limit,
gsk_color_node_get_color (child));
&color);
return TRUE;
}