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:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user