rendernode: Change to gsk_render_node_get_preferred_depth()
authorBenjamin Otte <otte@redhat.com>
Thu, 15 Jun 2023 18:27:13 +0000 (20:27 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 18 Jun 2023 12:26:18 +0000 (14:26 +0200)
Instead of just tracking preferred_high_depth(), track the actual depth
we'd like to have.

gdk/gdkmemoryformat.c
gdk/gdkmemoryformatprivate.h
gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderjob.c
gsk/gskrendernode.c
gsk/gskrendernodeimpl.c
gsk/gskrendernodeprivate.h

index 58b42f01c4806e8234c967f9ecdf6f33a67d9d50..893624efcb09dd79e46add95fc5ca981fdeaf894 100644 (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,
index df1fa6033a85b60e6777be17612eb4639ad45254..07286d9a6ccd141c21b54621f95b1ee32f5f3b86 100644 (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,
index 007dae1f872fdad1cb06a8318e0c281bfa06b394..ab3f93cf6418edb36bfd876a833cec810128cc3e 100644 (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 
index 962b3d56f05a7f016f2954dbdcdb6ed5dcf07c38..677e9e88ce115215e8bc3100011eacd4b80320e1 100644 (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;
index 26a8ea50315c25feb714a00d671b1fdb579f28ac..bd640c6179cecda052575728cc4712a95a8b1f65 100644 (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.
index 8d2e498419b691f954e740ddcef490e694b89daa..3326a3086cda8c36f4fe38d8c2d32ca2714b63ab 100644 (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]));
         }
     }
 
index 04135ec971059cb5f6c6abc7779ecab7ff73b2fa..4ad79bd5936c030b3ca412203a5210e8d1655844 100644 (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