color: add from sRGB to blending color transformation
This is needed when the compositor produces any content internally: - the lines in triangle fan debug - the censoring color fill (unmet HDCP requirements) Solid color surfaces do not need this special-casing because weston_surface is supposed to carry color space information, which will get used in gl_shader_config_init_for_view(). This makes sure the internally produced graphics fit in, e.g on a monitor in HDR mode. For now, just ensure there is an identity transformation. Actual implementations in GL-renderer will follow later. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This commit is contained in:
committed by
Pekka Paalanen
parent
cda3951a9a
commit
8fb23ed110
@@ -375,6 +375,7 @@ struct weston_output {
|
|||||||
|
|
||||||
bool use_renderer_shadow_buffer;
|
bool use_renderer_shadow_buffer;
|
||||||
struct weston_color_transform *from_sRGB_to_output;
|
struct weston_color_transform *from_sRGB_to_output;
|
||||||
|
struct weston_color_transform *from_sRGB_to_blend;
|
||||||
struct weston_color_transform *from_blend_to_output;
|
struct weston_color_transform *from_blend_to_output;
|
||||||
bool from_blend_to_output_by_backend;
|
bool from_blend_to_output_by_backend;
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,19 @@ cmnoop_get_sRGB_to_output_color_transform(struct weston_color_manager *cm_base,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
cmnoop_get_sRGB_to_blend_color_transform(struct weston_color_manager *cm_base,
|
||||||
|
struct weston_output *output,
|
||||||
|
struct weston_color_transform **xform_out)
|
||||||
|
{
|
||||||
|
/* TODO: Assert output has no colorspace set */
|
||||||
|
|
||||||
|
/* Identity transform */
|
||||||
|
*xform_out = NULL;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
cmnoop_init(struct weston_color_manager *cm_base)
|
cmnoop_init(struct weston_color_manager *cm_base)
|
||||||
{
|
{
|
||||||
@@ -124,6 +137,8 @@ weston_color_manager_noop_create(struct weston_compositor *compositor)
|
|||||||
cm->base.get_output_color_transform = cmnoop_get_output_color_transform;
|
cm->base.get_output_color_transform = cmnoop_get_output_color_transform;
|
||||||
cm->base.get_sRGB_to_output_color_transform =
|
cm->base.get_sRGB_to_output_color_transform =
|
||||||
cmnoop_get_sRGB_to_output_color_transform;
|
cmnoop_get_sRGB_to_output_color_transform;
|
||||||
|
cm->base.get_sRGB_to_blend_color_transform =
|
||||||
|
cmnoop_get_sRGB_to_blend_color_transform;
|
||||||
|
|
||||||
return &cm->base;
|
return &cm->base;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,6 +192,22 @@ struct weston_color_manager {
|
|||||||
(*get_sRGB_to_output_color_transform)(struct weston_color_manager *cm,
|
(*get_sRGB_to_output_color_transform)(struct weston_color_manager *cm,
|
||||||
struct weston_output *output,
|
struct weston_output *output,
|
||||||
struct weston_color_transform **xform_out);
|
struct weston_color_transform **xform_out);
|
||||||
|
|
||||||
|
/** Get sRGB to output's blending space transformation
|
||||||
|
*
|
||||||
|
* \param cm The color manager.
|
||||||
|
* \param output The output for the destination blending color space.
|
||||||
|
* \param xform_out Pointer for storing the weston_color_transform.
|
||||||
|
* \return True on success, false on failure.
|
||||||
|
*
|
||||||
|
* The callee is responsible for increasing the reference count on the
|
||||||
|
* weston_color_transform it stores via xform_out. On failure, xform_out
|
||||||
|
* is untouched.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
(*get_sRGB_to_blend_color_transform)(struct weston_color_manager *cm,
|
||||||
|
struct weston_output *output,
|
||||||
|
struct weston_color_transform **xform_out);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct weston_color_transform *
|
struct weston_color_transform *
|
||||||
|
|||||||
@@ -6274,6 +6274,8 @@ weston_output_reset_color_transforms(struct weston_output *output)
|
|||||||
{
|
{
|
||||||
weston_color_transform_unref(output->from_sRGB_to_output);
|
weston_color_transform_unref(output->from_sRGB_to_output);
|
||||||
output->from_sRGB_to_output = NULL;
|
output->from_sRGB_to_output = NULL;
|
||||||
|
weston_color_transform_unref(output->from_sRGB_to_blend);
|
||||||
|
output->from_sRGB_to_blend = NULL;
|
||||||
weston_color_transform_unref(output->from_blend_to_output);
|
weston_color_transform_unref(output->from_blend_to_output);
|
||||||
output->from_blend_to_output = NULL;
|
output->from_blend_to_output = NULL;
|
||||||
}
|
}
|
||||||
@@ -6691,6 +6693,8 @@ weston_output_enable(struct weston_output *output)
|
|||||||
&output->from_blend_to_output);
|
&output->from_blend_to_output);
|
||||||
ok = ok && cm->get_sRGB_to_output_color_transform(cm, output,
|
ok = ok && cm->get_sRGB_to_output_color_transform(cm, output,
|
||||||
&output->from_sRGB_to_output);
|
&output->from_sRGB_to_output);
|
||||||
|
ok = ok && cm->get_sRGB_to_blend_color_transform(cm, output,
|
||||||
|
&output->from_sRGB_to_blend);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
weston_log("Creating color transformation for output \"%s\" failed.\n",
|
weston_log("Creating color transformation for output \"%s\" failed.\n",
|
||||||
output->name);
|
output->name);
|
||||||
|
|||||||
@@ -1034,6 +1034,9 @@ draw_paint_node(struct weston_paint_node *pnode,
|
|||||||
else
|
else
|
||||||
filter = GL_NEAREST;
|
filter = GL_NEAREST;
|
||||||
|
|
||||||
|
/* for triangle_fan_debug(), maybe_censor_override() */
|
||||||
|
assert(pnode->output->from_sRGB_to_blend == NULL);
|
||||||
|
|
||||||
if (!gl_shader_config_init_for_paint_node(&sconf, pnode, filter))
|
if (!gl_shader_config_init_for_paint_node(&sconf, pnode, filter))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user