Make compositing colorstate settable
This helps for debugging.
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user