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

Reply via email to