Re: [PATCH 3/3] gl/msaa: Scissor simple rectangular clips

Chris Wilson <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On Thu, 15 Dec 2011 11:54:59 -0800, Martin Robinson <[email protected]> wrote:
> Instead of using the stencil buffer to perform simple
> rectangular clips, just scissor the clip rectangle.

Heh, I applied the last of patches too quick as this no longer applies.
One comment inline before you rebase.

> ---
>  src/cairo-gl-msaa-compositor.c |   68
> ++++++++++++++++++++++++++++++---------
>  1 files changed, 52 insertions(+), 16 deletions(-)
> 
> diff --git a/src/cairo-gl-msaa-compositor.c b/src/cairo-gl-msaa-compositor.c
> index 1f3c006..ceceb15 100644
> --- a/src/cairo-gl-msaa-compositor.c
> +++ b/src/cairo-gl-msaa-compositor.c
> @@ -199,6 +199,49 @@ _draw_clip_to_stencil_buffer (cairo_gl_context_t	*ctx,
>      return status;;
>  }
> 
> +static void
> +_scissor_to_box (cairo_gl_surface_t	*surface,
> +		 const cairo_box_t	*box)
> +{
> +    double x = _cairo_fixed_to_double (box->p1.x);
> +    double y = _cairo_fixed_to_double (box->p1.y);
> +    double width = _cairo_fixed_to_double (box->p2.x) - x;
> +    double height = _cairo_fixed_to_double (box->p2.y) - y;
> +
> +    if (_cairo_gl_surface_is_texture (surface) == FALSE)
> +	y = surface->height - (y + height);
> +    glScissor (x, y, width, height);
> +    glEnable (GL_SCISSOR_TEST);
> +}
> +
> +static cairo_int_status_t
> +_scissor_and_clip (cairo_gl_context_t		*ctx,
> +		   cairo_gl_composite_t		*setup,
> +		   cairo_composite_rectangles_t	*composite,
> +		   cairo_bool_t			*used_stencil_buffer)
> +{
> +    cairo_rectangle_int_t *bounds = &composite->unbounded;
> +    cairo_clip_t *clip = composite->clip;
> +
> +    cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface;
> +    *used_stencil_buffer = FALSE;
> +
> +    if (_cairo_composite_rectangles_can_reduce_clip (composite, clip)) {
> +	_scissor_to_rectangle (dst, bounds);
> +	return CAIRO_INT_STATUS_SUCCESS;
> +    }
> +
> +    /* If we cannot reduce the clip to a rectangular region,
> +       we scissor and clip using the stencil buffer */
> +    if (clip->num_boxes > 1 || clip->path != NULL || clip->region !=
> NULL) {

The clip->region part is redundant and could even cause you to miss this
fast-path.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
--
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.