Make compositing colorstate settable

This helps for debugging.
This commit is contained in:
Matthias Clasen
2024-06-14 21:14:47 -04:00
parent 6b76c13bcc
commit e979595280

View File

@@ -246,6 +246,44 @@ gsk_gpu_renderer_unrealize (GskRenderer *renderer)
g_clear_object (&priv->device);
}
static GdkColorState *
find_compositing_color_state (GdkSurface *surface)
{
GdkColorState *ccs = NULL;
const char *env = g_getenv ("GSK_COMPOSITING_COLORSTATE");
if (env)
{
if (strcmp (env, "srgb") == 0)
ccs = gdk_color_state_get_srgb ();
else if (strcmp (env, "srgb-linear") == 0)
ccs = gdk_color_state_get_srgb_linear ();
else if (strcmp (env, "xyz") == 0)
ccs = gdk_color_state_get_xyz ();
else if (strcmp (env, "rec2100-linear") == 0)
ccs = gdk_color_state_get_rec2100_linear ();
else
g_warning ("Not a supported compositing color state: %s", env);
}
if (ccs == NULL)
{
if (surface)
{
if (GDK_DISPLAY_DEBUG_CHECK (gdk_surface_get_display (surface), SRGB))
ccs = gdk_color_state_get_srgb ();
else if (gdk_color_state_is_linear (gdk_surface_get_color_state (surface)))
ccs = gdk_surface_get_color_state (surface);
else
ccs = gdk_color_state_get_srgb_linear ();
}
else
ccs = gdk_color_state_get_srgb_linear ();
}
return ccs;
}
static GdkTexture *
gsk_gpu_renderer_fallback_render_texture (GskGpuRenderer *self,
GskRenderNode *root,
@@ -263,9 +301,25 @@ gsk_gpu_renderer_fallback_render_texture (GskGpuRenderer *self,
GdkTextureDownloader downloader;
GskGpuFrame *frame;
GdkColorState *color_state;
GdkColorState *ccs;
GskRenderNode *node;
max_size = gsk_gpu_device_get_max_image_size (priv->device);
depth = gsk_render_node_get_preferred_depth (root);
color_state = GDK_COLOR_STATE_SRGB;
ccs = find_compositing_color_state (NULL);
depth = gdk_memory_depth_merge (depth, gdk_color_state_get_min_depth (color_state));
depth = gdk_memory_depth_merge (depth, gdk_color_state_get_min_depth (ccs));
g_debug ("Compositing color state: %s", gdk_color_state_get_name (ccs));
g_debug ("Display color state: %s", gdk_color_state_get_name (color_state));
if (!gdk_color_state_equal (ccs, color_state))
node = gsk_color_state_node_new (root, ccs);
else
node = gsk_render_node_ref (root);
do
{
image = gsk_gpu_device_create_download_image (priv->device,
@@ -304,7 +358,7 @@ gsk_gpu_renderer_fallback_render_texture (GskGpuRenderer *self,
image,
color_state,
NULL,
root,
node,
&GRAPHENE_RECT_INIT (rounded_viewport->origin.x + x,
rounded_viewport->origin.y + y,
image_width,
@@ -325,6 +379,8 @@ gsk_gpu_renderer_fallback_render_texture (GskGpuRenderer *self,
}
}
gsk_render_node_unref (node);
bytes = g_bytes_new_take (data, size);
texture = gdk_memory_texture_new (width, height, GDK_MEMORY_DEFAULT, bytes, stride);
g_bytes_unref (bytes);
@@ -342,21 +398,39 @@ gsk_gpu_renderer_render_texture (GskRenderer *renderer,
GskGpuImage *image;
GdkTexture *texture;
graphene_rect_t rounded_viewport;
GdkMemoryDepth depth;
GdkColorState *color_state;
GdkColorState *ccs;
GskRenderNode *node;
gsk_gpu_device_maybe_gc (priv->device);
gsk_gpu_renderer_make_current (self);
color_state = GDK_COLOR_STATE_SRGB;
ccs = find_compositing_color_state (NULL);
depth = gsk_render_node_get_preferred_depth (root);
depth = gdk_memory_depth_merge (depth, gdk_color_state_get_min_depth (color_state));
depth = gdk_memory_depth_merge (depth, gdk_color_state_get_min_depth (ccs));
g_debug ("Compositing color state: %s", gdk_color_state_get_name (ccs));
g_debug ("Display color state: %s", gdk_color_state_get_name (color_state));
if (!gdk_color_state_equal (ccs, color_state))
node = gsk_color_state_node_new (root, ccs);
else
node = gsk_render_node_ref (root);
rounded_viewport = GRAPHENE_RECT_INIT (viewport->origin.x,
viewport->origin.y,
ceil (viewport->size.width),
ceil (viewport->size.height));
image = gsk_gpu_device_create_download_image (priv->device,
gsk_render_node_get_preferred_depth (root),
depth,
rounded_viewport.size.width,
rounded_viewport.size.height);
color_state = gdk_color_state_get_srgb ();
if (image == NULL)
return gsk_gpu_renderer_fallback_render_texture (self, root, &rounded_viewport);
@@ -369,13 +443,15 @@ gsk_gpu_renderer_render_texture (GskRenderer *renderer,
image,
color_state,
NULL,
root,
node,
&rounded_viewport,
&texture);
g_object_unref (frame);
g_object_unref (image);
gsk_render_node_unref (node);
gsk_gpu_device_queue_gc (priv->device);
/* check that callback setting texture was actually called, as its technically async */
@@ -397,6 +473,7 @@ gsk_gpu_renderer_render (GskRenderer *renderer,
double scale;
GdkSurface *surface;
GdkColorState *color_state;
GdkColorState *ccs = NULL;
GskRenderNode *node;
GdkMemoryDepth depth;
@@ -410,7 +487,17 @@ gsk_gpu_renderer_render (GskRenderer *renderer,
depth = gsk_render_node_get_preferred_depth (root);
color_state = gdk_surface_get_color_state (surface);
ccs = find_compositing_color_state (surface);
depth = gdk_memory_depth_merge (depth, gdk_color_state_get_min_depth (color_state));
depth = gdk_memory_depth_merge (depth, gdk_color_state_get_min_depth (ccs));
g_debug ("Compositing color state: %s", gdk_color_state_get_name (ccs));
g_debug ("Display color state: %s", gdk_color_state_get_name (color_state));
if (!gdk_color_state_equal (ccs, color_state))
node = gsk_color_state_node_new (root, ccs);
else
node = gsk_render_node_ref (root);
gdk_draw_context_begin_frame_full (priv->context, depth, region);
@@ -424,11 +511,6 @@ gsk_gpu_renderer_render (GskRenderer *renderer,
render_region = get_render_region (self);
scale = gsk_gpu_renderer_get_scale (self);
if (!gdk_color_state_is_linear (color_state))
node = gsk_color_state_node_new (root, gdk_color_state_get_srgb_linear ());
else
node = gsk_render_node_ref (root);
gsk_gpu_frame_render (frame,
g_get_monotonic_time (),
backbuffer,