From: Benjamin Otte Date: Thu, 15 Jun 2023 18:27:13 +0000 (+0200) Subject: rendernode: Change to gsk_render_node_get_preferred_depth() X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~132^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8b8dfcdfb43aa60dbd2ee36f1e784aa867e3d62b;p=gtk4.git 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. --- diff --git a/gdk/gdkmemoryformat.c b/gdk/gdkmemoryformat.c index 58b42f01c4..893624efcb 100644 --- a/gdk/gdkmemoryformat.c +++ b/gdk/gdkmemoryformat.c @@ -584,6 +584,41 @@ gdk_memory_format_get_depth (GdkMemoryFormat format) return memory_formats[format].depth; } +/* + * 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, diff --git a/gdk/gdkmemoryformatprivate.h b/gdk/gdkmemoryformatprivate.h index df1fa6033a..07286d9a6c 100644 --- a/gdk/gdkmemoryformatprivate.h +++ b/gdk/gdkmemoryformatprivate.h @@ -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, diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 007dae1f87..ab3f93cf64 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -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 diff --git a/gsk/gl/gskglrenderjob.c b/gsk/gl/gskglrenderjob.c index 962b3d56f0..677e9e88ce 100644 --- a/gsk/gl/gskglrenderjob.c +++ b/gsk/gl/gskglrenderjob.c @@ -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; diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index 26a8ea5031..bd640c6179 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -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. diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 8d2e498419..3326a3086c 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -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])); } } diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h index 04135ec971..4ad79bd593 100644 --- a/gsk/gskrendernodeprivate.h +++ b/gsk/gskrendernodeprivate.h @@ -3,6 +3,8 @@ #include "gskrendernode.h" #include +#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