On Sat, 1 Sep 2012 21:58:45 -0600
Scott Moreau <[email protected]> wrote:
> Re-add the opaque_rect hack back to shaders so xwayland surfaces are not
> broken. xwm
> is the only one that uses weston_surface::opaque_rect, specifically for this
> reason.
> It was removed by 0e5a2d02191 - "compositor: simplify shaders", which
> simplified them
> a bit too much.
> ---
> src/compositor.c | 6 ++++++
> src/compositor.h | 1 +
> 2 files changed, 7 insertions(+)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 9ce44d4..b19cbaf 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1365,6 +1365,7 @@ weston_surface_draw(struct weston_surface *es, struct
> weston_output *output,
> 1, GL_FALSE, output->matrix.d);
> glUniform4fv(es->shader->color_uniform, 1, es->color);
> glUniform1f(es->shader->alpha_uniform, es->alpha);
> + glUniform4fv(es->shader->opaque_uniform, 1, es->opaque_rect);
>
> if (es->transform.enabled || output->zoom.active)
> filter = GL_LINEAR;
> @@ -3247,9 +3248,13 @@ static const char texture_fragment_shader_rgba[] =
> "varying vec2 v_texcoord;\n"
> "uniform sampler2D tex;\n"
> "uniform float alpha;\n"
> + "uniform vec4 opaque;\n"
> "void main()\n"
> "{\n"
> " gl_FragColor = alpha * texture2D(tex, v_texcoord)\n;"
> + " if (opaque.x <= v_texcoord.x && v_texcoord.x < opaque.y &&\n"
> + " opaque.z <= v_texcoord.y && v_texcoord.y < opaque.w)\n"
> + " gl_FragColor.a = alpha;\n"
> "}\n";
>
> static const char texture_fragment_shader_rgbx[] =
> @@ -3375,6 +3380,7 @@ weston_shader_init(struct weston_shader *shader,
> shader->tex_uniforms[2] = glGetUniformLocation(shader->program, "tex2");
> shader->alpha_uniform = glGetUniformLocation(shader->program, "alpha");
> shader->color_uniform = glGetUniformLocation(shader->program, "color");
> + shader->opaque_uniform = glGetUniformLocation(shader->program,
> "opaque");
>
> return 0;
> }
> diff --git a/src/compositor.h b/src/compositor.h
> index 96a0477..13ee804 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -248,6 +248,7 @@ struct weston_shader {
> GLint tex_uniforms[3];
> GLint alpha_uniform;
> GLint color_uniform;
> + GLint opaque_uniform;
> };
>
> enum {
NAK, I'm developing a proper fix, that removes
weston_surface::opaque_rect completely.
Now that we can paint opaque regions independently from non-opaques, we
can set the shader for opaque regions to the RGBX shader, which forces
the sampled alpha to 1.0. That way we can keep the shaders simple.
Thanks,
pq
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel