rendernode: Change to gsk_render_node_get_preferred_depth()

Instead of just tracking preferred_high_depth(), track the actual depth
we'd like to have.
This commit is contained in:
Benjamin Otte
2023-06-15 20:27:13 +02:00
parent 9015ed1c43
commit 8b8dfcdfb4
7 changed files with 76 additions and 32 deletions

View File

@@ -584,6 +584,41 @@ gdk_memory_format_get_depth (GdkMemoryFormat format)
return memory_formats[format].depth;
}
/*<private>
* gdk_memory_depth_merge:
* @depth1: the first depth
* @depth2: the second depth
*
* Returns a depth that can accomodate both given depths
* without any loss of precision.
*
* Returns: The merged depth
**/
GdkMemoryDepth
gdk_memory_depth_merge (GdkMemoryDepth depth1,
GdkMemoryDepth depth2)
{
switch (depth1)
{
case GDK_MEMORY_U8:
return depth2;
case GDK_MEMORY_FLOAT32:
return GDK_MEMORY_FLOAT32;
case GDK_MEMORY_U16:
case GDK_MEMORY_FLOAT16:
if (depth2 == depth1 || depth2 == GDK_MEMORY_U8)
return depth1;
else
return GDK_MEMORY_FLOAT32;
default:
g_assert_not_reached ();
return GDK_MEMORY_U8;
}
}
gboolean
gdk_memory_format_gl_format (GdkMemoryFormat format,
gboolean gles,

View File

@@ -42,6 +42,8 @@ gsize gdk_memory_format_alignment (GdkMemoryFormat
GdkMemoryAlpha gdk_memory_format_alpha (GdkMemoryFormat format) G_GNUC_CONST;
gsize gdk_memory_format_bytes_per_pixel (GdkMemoryFormat format) G_GNUC_CONST;
GdkMemoryDepth gdk_memory_format_get_depth (GdkMemoryFormat format) G_GNUC_CONST;
GdkMemoryDepth gdk_memory_depth_merge (GdkMemoryDepth depth1,
GdkMemoryDepth depth2) G_GNUC_CONST;
gboolean gdk_memory_format_gl_format (GdkMemoryFormat format,
gboolean gles,
guint gl_major,

View File

@@ -296,7 +296,7 @@ gsk_gl_renderer_render (GskRenderer *renderer,
viewport.size.height = gdk_surface_get_height (surface) * scale;
gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->context),
gsk_render_node_prefers_high_depth (root),
gsk_render_node_get_preferred_depth (root) != GDK_MEMORY_U8,
update_area);
gdk_gl_context_make_current (self->context);
@@ -373,7 +373,7 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer,
return texture;
}
if (gsk_render_node_prefers_high_depth (root) &&
if (gsk_render_node_get_preferred_depth (root) != GDK_MEMORY_U8 &&
gdk_gl_context_check_version (self->context, "3.0", "3.0"))
format = GL_RGBA32F;
else

View File

@@ -194,7 +194,7 @@ static inline int
get_target_format (GskGLRenderJob *job,
const GskRenderNode *node)
{
if (gsk_render_node_prefers_high_depth (node))
if (gsk_render_node_get_preferred_depth (node) != GDK_MEMORY_U8)
return job->target_format;
return GL_RGBA8;

View File

@@ -675,10 +675,10 @@ gsk_value_dup_render_node (const GValue *value)
return gsk_render_node_ref (value->data[0].v_pointer);
}
gboolean
gsk_render_node_prefers_high_depth (const GskRenderNode *node)
GdkMemoryDepth
gsk_render_node_get_preferred_depth (const GskRenderNode *node)
{
return node->prefers_high_depth;
return node->preferred_depth;
}
/* Whether we need an offscreen to handle opacity correctly for this node.

View File

@@ -1734,7 +1734,7 @@ gsk_texture_node_new (GdkTexture *texture,
self->texture = g_object_ref (texture);
graphene_rect_init_from_rect (&node->bounds, bounds);
node->prefers_high_depth = gdk_memory_format_get_depth (gdk_texture_get_format (texture)) != GDK_MEMORY_U8;
node->preferred_depth = gdk_memory_format_get_depth (gdk_texture_get_format (texture));
return node;
}
@@ -1960,7 +1960,7 @@ gsk_texture_scale_node_new (GdkTexture *texture,
graphene_rect_init_from_rect (&node->bounds, bounds);
self->filter = filter;
node->prefers_high_depth = gdk_memory_format_get_depth (gdk_texture_get_format (texture)) != GDK_MEMORY_U8;
node->preferred_depth = gdk_memory_format_get_depth (gdk_texture_get_format (texture));
return node;
}
@@ -3193,14 +3193,16 @@ gsk_container_node_new (GskRenderNode **children,
self->children[0] = gsk_render_node_ref (children[0]);
graphene_rect_init_from_rect (&bounds, &(children[0]->bounds));
node->prefers_high_depth = gsk_render_node_prefers_high_depth (children[0]);
node->preferred_depth = gdk_memory_depth_merge (node->preferred_depth,
gsk_render_node_get_preferred_depth (children[0]));
for (guint i = 1; i < n_children; i++)
{
self->children[i] = gsk_render_node_ref (children[i]);
self->disjoint = self->disjoint && !graphene_rect_intersection (&bounds, &(children[i]->bounds), NULL);
graphene_rect_union (&bounds, &(children[i]->bounds), &bounds);
node->prefers_high_depth = node->prefers_high_depth || gsk_render_node_prefers_high_depth (children[i]);
node->preferred_depth = gdk_memory_depth_merge (node->preferred_depth,
gsk_render_node_get_preferred_depth (children[i]));
node->offscreen_for_opacity = node->offscreen_for_opacity || children[i]->offscreen_for_opacity;
}
@@ -3478,7 +3480,7 @@ gsk_transform_node_new (GskRenderNode *child,
&child->bounds,
&node->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -3630,7 +3632,7 @@ gsk_opacity_node_new (GskRenderNode *child,
graphene_rect_init_from_rect (&node->bounds, &child->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -3868,7 +3870,7 @@ gsk_color_matrix_node_new (GskRenderNode *child,
graphene_rect_init_from_rect (&node->bounds, &child->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -4035,7 +4037,7 @@ gsk_repeat_node_new (const graphene_rect_t *bounds,
else
graphene_rect_init_from_rect (&self->child_bounds, &child->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -4183,7 +4185,7 @@ gsk_clip_node_new (GskRenderNode *child,
graphene_rect_intersection (&self->clip, &child->bounds, &node->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -4331,7 +4333,7 @@ gsk_rounded_clip_node_new (GskRenderNode *child,
graphene_rect_intersection (&self->clip.bounds, &child->bounds, &node->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -4573,7 +4575,7 @@ gsk_shadow_node_new (GskRenderNode *child,
gsk_shadow_node_get_bounds (self, &node->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -4783,7 +4785,8 @@ gsk_blend_node_new (GskRenderNode *bottom,
graphene_rect_union (&bottom->bounds, &top->bounds, &node->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (bottom) || gsk_render_node_prefers_high_depth (top);
node->preferred_depth = gdk_memory_depth_merge (gsk_render_node_get_preferred_depth (bottom),
gsk_render_node_get_preferred_depth (top));
return node;
}
@@ -4948,7 +4951,8 @@ gsk_cross_fade_node_new (GskRenderNode *start,
graphene_rect_union (&start->bounds, &end->bounds, &node->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (start) || gsk_render_node_prefers_high_depth (end);
node->preferred_depth = gdk_memory_depth_merge (gsk_render_node_get_preferred_depth (start),
gsk_render_node_get_preferred_depth (end));
return node;
}
@@ -5576,7 +5580,7 @@ gsk_blur_node_new (GskRenderNode *child,
- clip_radius,
- clip_radius);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -5759,7 +5763,7 @@ gsk_mask_node_new (GskRenderNode *source,
self->render_node.bounds = source->bounds;
self->render_node.prefers_high_depth = gsk_render_node_prefers_high_depth (source);
self->render_node.preferred_depth = gsk_render_node_get_preferred_depth (source);
return &self->render_node;
}
@@ -5925,7 +5929,7 @@ gsk_debug_node_new (GskRenderNode *child,
graphene_rect_init_from_rect (&node->bounds, &child->bounds);
node->prefers_high_depth = gsk_render_node_prefers_high_depth (child);
node->preferred_depth = gsk_render_node_get_preferred_depth (child);
return node;
}
@@ -6108,7 +6112,8 @@ gsk_gl_shader_node_new (GskGLShader *shader,
for (guint i = 0; i < n_children; i++)
{
self->children[i] = gsk_render_node_ref (children[i]);
node->prefers_high_depth = node->prefers_high_depth || gsk_render_node_prefers_high_depth (children[i]);
node->preferred_depth = gdk_memory_depth_merge (node->preferred_depth,
gsk_render_node_get_preferred_depth (children[i]));
}
}

View File

@@ -3,6 +3,8 @@
#include "gskrendernode.h"
#include <cairo.h>
#include "gdk/gdkmemoryformatprivate.h"
G_BEGIN_DECLS
typedef struct _GskRenderNodeClass GskRenderNodeClass;
@@ -27,7 +29,7 @@ struct _GskRenderNode
graphene_rect_t bounds;
guint prefers_high_depth : 1;
guint preferred_depth : 2;
guint offscreen_for_opacity : 1;
};
@@ -73,17 +75,17 @@ bool gsk_border_node_get_uniform_color (const GskRenderNode
void gsk_text_node_serialize_glyphs (GskRenderNode *self,
GString *str);
GskRenderNode ** gsk_container_node_get_children (const GskRenderNode *node,
guint *n_children);
GskRenderNode ** gsk_container_node_get_children (const GskRenderNode *node,
guint *n_children);
void gsk_transform_node_get_translate (const GskRenderNode *node,
float *dx,
float *dy);
gboolean gsk_render_node_prefers_high_depth (const GskRenderNode *node);
void gsk_transform_node_get_translate (const GskRenderNode *node,
float *dx,
float *dy);
GdkMemoryDepth gsk_render_node_get_preferred_depth (const GskRenderNode *node);
gboolean gsk_container_node_is_disjoint (const GskRenderNode *node);
gboolean gsk_container_node_is_disjoint (const GskRenderNode *node);
gboolean gsk_render_node_use_offscreen_for_opacity (const GskRenderNode *node);
gboolean gsk_render_node_use_offscreen_for_opacity (const GskRenderNode *node);
G_END_DECLS