Rob,

A minor nitpick below:

On 04/01/2014 05:04 PM, Rob Clark wrote:
> From: Rob Clark <robcl...@freedesktop.org>
>
> Keep track of the maximal bounds of all the operations and set scissor
> accordingly.  For tiling GPU's this can be a big win by reducing the
> memory bandwidth spent moving pixels from system memory to tile buffer
> and back.
>
> You could imagine being more sophisticated and splitting up disjoint
> operations.  But this simplistic approach is good enough for the common
> cases.
>
> Signed-off-by: Rob Clark <robcl...@freedesktop.org>
> ---
>  src/gallium/state_trackers/xa/xa_composite.c |  2 ++
>  src/gallium/state_trackers/xa/xa_context.c   |  3 +++
>  src/gallium/state_trackers/xa/xa_priv.h      | 29 
> ++++++++++++++++++++++++++++
>  src/gallium/state_trackers/xa/xa_renderer.c  | 14 ++++++++++++++
>  4 files changed, 48 insertions(+)
>
> diff --git a/src/gallium/state_trackers/xa/xa_composite.c 
> b/src/gallium/state_trackers/xa/xa_composite.c
> index 19e7309..861ec29 100644
> --- a/src/gallium/state_trackers/xa/xa_composite.c
> +++ b/src/gallium/state_trackers/xa/xa_composite.c
> @@ -517,6 +517,8 @@ xa_composite_rect(struct xa_context *ctx,
>       const float *src_matrix = NULL;
>       const float *mask_matrix = NULL;
>  
> +     xa_scissor_update(ctx, dstX, dstY, dstX + width, dstY + height);
> +
>       if (comp->src->has_transform)
>           src_matrix = comp->src->transform;
>       if (comp->mask && comp->mask->has_transform)
> diff --git a/src/gallium/state_trackers/xa/xa_context.c 
> b/src/gallium/state_trackers/xa/xa_context.c
> index ee32676..867999a 100644
> --- a/src/gallium/state_trackers/xa/xa_context.c
> +++ b/src/gallium/state_trackers/xa/xa_context.c
> @@ -238,6 +238,8 @@ xa_copy(struct xa_context *ctx,
>  {
>      struct pipe_box src_box;
>  
> +    xa_scissor_update(ctx, dx, dy, dx + width, dy + height);
> +
>      if (ctx->simple_copy) {
>       u_box_2d(sx, sy, width, height, &src_box);
>       ctx->pipe->resource_copy_region(ctx->pipe,
> @@ -324,6 +326,7 @@ xa_solid_prepare(struct xa_context *ctx, struct 
> xa_surface *dst,
>  XA_EXPORT void
>  xa_solid(struct xa_context *ctx, int x, int y, int width, int height)
>  {
> +    xa_scissor_update(ctx, x, y, x + width, y + height);
>      renderer_solid(ctx, x, y, x + width, y + height, ctx->solid_color);
>  }
>  
> diff --git a/src/gallium/state_trackers/xa/xa_priv.h 
> b/src/gallium/state_trackers/xa/xa_priv.h
> index 15aedb5..7a43386 100644
> --- a/src/gallium/state_trackers/xa/xa_priv.h
> +++ b/src/gallium/state_trackers/xa/xa_priv.h
> @@ -38,6 +38,8 @@
>  #include "pipe/p_context.h"
>  #include "pipe/p_state.h"
>  
> +#include "util/u_math.h"
> +
>  #if defined(__GNUC__) && __GNUC__ >= 4
>  #define XA_EXPORT __attribute__ ((visibility("default")))
>  #else
> @@ -105,6 +107,12 @@ struct xa_context {
>      struct xa_surface *dst;
>      struct pipe_surface *srf;
>  
> +    /* destination scissor state.. we scissor out untouched parts
> +     * of the dst for the benefit of tilers:
> +     */
> +    struct pipe_scissor_state scissor;
> +    int scissor_valid;
> +
>      int simple_copy;
>  
>      int has_solid_color;
> @@ -118,6 +126,27 @@ struct xa_context {
>      const struct xa_composite *comp;
>  };
>  
> +static INLINE void
> +xa_scissor_reset(struct xa_context *ctx)
> +{
> +    ctx->scissor.maxx = 0;
> +    ctx->scissor.maxy = 0;
> +    ctx->scissor.minx = ~0;
> +    ctx->scissor.miny = ~0;
> +    ctx->scissor_valid = FALSE;
> +}
> +
> +static INLINE void
> +xa_scissor_update(struct xa_context *ctx, unsigned minx, unsigned miny,
> +             unsigned maxx, unsigned maxy)
> +{
> +     ctx->scissor.maxx = MAX2(ctx->scissor.maxx, maxx);
> +     ctx->scissor.maxy = MAX2(ctx->scissor.maxy, maxy);
> +     ctx->scissor.minx = MIN2(ctx->scissor.minx, minx);
> +     ctx->scissor.miny = MIN2(ctx->scissor.miny, miny);
> +     ctx->scissor_valid = TRUE;
> +}
> +
Indentation.

>  enum xa_vs_traits {
>      VS_COMPOSITE = 1 << 0,
>      VS_MASK = 1 << 1,
> diff --git a/src/gallium/state_trackers/xa/xa_renderer.c 
> b/src/gallium/state_trackers/xa/xa_renderer.c
> index e1da28c..8ebda74 100644
> --- a/src/gallium/state_trackers/xa/xa_renderer.c
> +++ b/src/gallium/state_trackers/xa/xa_renderer.c
> @@ -79,11 +79,22 @@ renderer_draw(struct xa_context *r)
>      if (!r->buffer_size)
>       return;
>  
> +    if (!r->scissor_valid) {
> +     r->scissor.minx = 0;
> +     r->scissor.miny = 0;
> +     r->scissor.maxx = r->dst->tex->width0;
> +     r->scissor.maxy = r->dst->tex->height0;
> +    }
> +
> +    r->pipe->set_scissor_states(r->pipe, 0, 1, &r->scissor);
> +
>      cso_set_vertex_elements(r->cso, r->attrs_per_vertex, r->velems);
>      util_draw_user_vertex_buffer(r->cso, r->buffer, PIPE_PRIM_QUADS,
>                                   num_verts,  /* verts */
>                                   r->attrs_per_vertex);       /* attribs/vert 
> */
>      r->buffer_size = 0;
> +
> +    xa_scissor_reset(r);
>  }
>  
>  static INLINE void
> @@ -111,6 +122,7 @@ renderer_init_state(struct xa_context *r)
>      raster.half_pixel_center = 1;
>      raster.bottom_edge_rule = 1;
>      raster.depth_clip = 1;
> +    raster.scissor = 1;
>      cso_set_rasterizer(r->cso, &raster);
>  
>      /* vertex elements state */
> @@ -359,6 +371,8 @@ renderer_bind_destination(struct xa_context *r,
>      struct pipe_framebuffer_state fb;
>      struct pipe_viewport_state viewport;
>  
> +    xa_scissor_reset(r);
> +
>      /* Framebuffer uses actual surface width/height
>       */
>      memset(&fb, 0, sizeof fb);

Otherwise,
Reviewed-by: Thomas Hellstrom <thellst...@vmware.com>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to