gl-renderer: color transform censor fill and triangle fan

Use the sRGB to blending color space transformation for the censoring
color fill and triangle fan debug drawings.

This removes the assert that the output's blending space is (non-linear)
sRGB.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
dev
Pekka Paalanen 4 years ago committed by Pekka Paalanen
parent 92f2367e58
commit d7eca40787
  1. 57
      libweston/renderer-gl/gl-renderer.c

@ -718,6 +718,7 @@ gl_renderer_send_shader_error(struct weston_view *view)
static void static void
triangle_fan_debug(struct gl_renderer *gr, triangle_fan_debug(struct gl_renderer *gr,
const struct gl_shader_config *sconf, const struct gl_shader_config *sconf,
struct weston_output *output,
int first, int count) int first, int count)
{ {
int i; int i;
@ -739,13 +740,19 @@ triangle_fan_debug(struct gl_renderer *gr,
.req = { .req = {
.variant = SHADER_VARIANT_SOLID, .variant = SHADER_VARIANT_SOLID,
.input_is_premult = true, .input_is_premult = true,
.color_pre_curve = SHADER_COLOR_CURVE_IDENTITY,
}, },
.projection = sconf->projection, .projection = sconf->projection,
.view_alpha = 1.0f, .view_alpha = 1.0f,
.unicolor = { col[0], col[1], col[2], col[3] }, .unicolor = { col[0], col[1], col[2], col[3] },
}; };
if (!gl_shader_config_set_color_transform(&alt,
output->from_sRGB_to_blend)) {
weston_log("GL-renderer: %s failed to generate a color transformation.\n",
__func__);
return;
}
gl_renderer_use_program(gr, &alt); gl_renderer_use_program(gr, &alt);
nelems = (count - 1 + count - 2) * 2; nelems = (count - 1 + count - 2) * 2;
@ -773,6 +780,7 @@ triangle_fan_debug(struct gl_renderer *gr,
static void static void
repaint_region(struct gl_renderer *gr, repaint_region(struct gl_renderer *gr,
struct weston_view *ev, struct weston_view *ev,
struct weston_output *output,
pixman_region32_t *region, pixman_region32_t *region,
pixman_region32_t *surf_region, pixman_region32_t *surf_region,
const struct gl_shader_config *sconf) const struct gl_shader_config *sconf)
@ -810,7 +818,7 @@ repaint_region(struct gl_renderer *gr,
for (i = 0, first = 0; i < nfans; i++) { for (i = 0, first = 0; i < nfans; i++) {
glDrawArrays(GL_TRIANGLE_FAN, first, vtxcnt[i]); glDrawArrays(GL_TRIANGLE_FAN, first, vtxcnt[i]);
if (gr->fan_debug) if (gr->fan_debug)
triangle_fan_debug(gr, sconf, first, vtxcnt[i]); triangle_fan_debug(gr, sconf, output, first, vtxcnt[i]);
first += vtxcnt[i]; first += vtxcnt[i];
} }
@ -910,6 +918,28 @@ ensure_surface_buffer_is_ready(struct gl_renderer *gr,
return (wait_ret == EGL_TRUE && destroy_ret == EGL_TRUE) ? 0 : -1; return (wait_ret == EGL_TRUE && destroy_ret == EGL_TRUE) ? 0 : -1;
} }
static void
censor_override(struct gl_shader_config *sconf,
struct weston_output *output)
{
struct gl_shader_config alt = {
.req = {
.variant = SHADER_VARIANT_SOLID,
.input_is_premult = true,
},
.projection = sconf->projection,
.view_alpha = sconf->view_alpha,
.unicolor = { 0.40, 0.0, 0.0, 1.0 },
};
if (!gl_shader_config_set_color_transform(&alt,
output->from_sRGB_to_blend)) {
weston_log("GL-renderer: %s failed to generate a color transformation.\n",
__func__);
}
*sconf = alt;
}
/* Checks if a view needs to be censored on an output /* Checks if a view needs to be censored on an output
* Checks for 2 types of censor requirements * Checks for 2 types of censor requirements
@ -924,16 +954,6 @@ maybe_censor_override(struct gl_shader_config *sconf,
struct weston_output *output, struct weston_output *output,
struct weston_view *ev) struct weston_view *ev)
{ {
const struct gl_shader_config alt = {
.req = {
.variant = SHADER_VARIANT_SOLID,
.input_is_premult = true,
.color_pre_curve = SHADER_COLOR_CURVE_IDENTITY,
},
.projection = sconf->projection,
.view_alpha = sconf->view_alpha,
.unicolor = { 0.40, 0.0, 0.0, 1.0 },
};
struct gl_surface_state *gs = get_surface_state(ev->surface); struct gl_surface_state *gs = get_surface_state(ev->surface);
bool recording_censor = bool recording_censor =
(output->disable_planes > 0) && (output->disable_planes > 0) &&
@ -943,7 +963,7 @@ maybe_censor_override(struct gl_shader_config *sconf,
(ev->surface->desired_protection > output->current_protection); (ev->surface->desired_protection > output->current_protection);
if (gs->direct_display) { if (gs->direct_display) {
*sconf = alt; censor_override(sconf, output);
return; return;
} }
@ -954,7 +974,7 @@ maybe_censor_override(struct gl_shader_config *sconf,
return; return;
if (recording_censor || unprotected_censor) if (recording_censor || unprotected_censor)
*sconf = alt; censor_override(sconf, output);
} }
static void static void
@ -1044,9 +1064,6 @@ 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;
@ -1087,13 +1104,15 @@ draw_paint_node(struct weston_paint_node *pnode,
else else
glDisable(GL_BLEND); glDisable(GL_BLEND);
repaint_region(gr, pnode->view, &repaint, &surface_opaque, &alt); repaint_region(gr, pnode->view, pnode->output,
&repaint, &surface_opaque, &alt);
gs->used_in_output_repaint = true; gs->used_in_output_repaint = true;
} }
if (pixman_region32_not_empty(&surface_blend)) { if (pixman_region32_not_empty(&surface_blend)) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
repaint_region(gr, pnode->view, &repaint, &surface_blend, &sconf); repaint_region(gr, pnode->view, pnode->output,
&repaint, &surface_blend, &sconf);
gs->used_in_output_repaint = true; gs->used_in_output_repaint = true;
} }

Loading…
Cancel
Save