[Mesa-dev] [PATCH 04/13] u_blitter: add texture array support

Dave Airlie airlied at gmail.com
Mon Sep 5 23:22:21 PDT 2011


On Mon, Sep 5, 2011 at 10:44 PM, Marek Olšák <maraeo at gmail.com> wrote:

I nearly wrote this once, and this looks like the correct version of it,
http://cgit.freedesktop.org/~airlied/mesa/commit/?h=r600g-texture-array&id=949278f48bea4aa4da0ec70d2ebf03b2884908a9

Reviewed-by: Dave Airlie <airlied at redhat.com>

> ---
>  src/gallium/auxiliary/util/u_blitter.c |   52 +++++++++++++++++++++++++-------
>  1 files changed, 41 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
> index d8e46f0..d69fb1a 100644
> --- a/src/gallium/auxiliary/util/u_blitter.c
> +++ b/src/gallium/auxiliary/util/u_blitter.c
> @@ -480,10 +480,11 @@ static void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
>                                      unsigned level,
>                                      unsigned zslice,
>                                      unsigned x1, unsigned y1,
> -                                     unsigned x2, unsigned y2)
> +                                     unsigned x2, unsigned y2,
> +                                    boolean normalized)
>  {
>    int i;
> -   float r = zslice / (float)u_minify(src->depth0, level);
> +   float r = normalized ? zslice / (float)u_minify(src->depth0, level) : zslice;
>
>    blitter_set_texcoords_2d(ctx, src, level, x1, y1, x2, y2);
>
> @@ -491,6 +492,21 @@ static void blitter_set_texcoords_3d(struct blitter_context_priv *ctx,
>       ctx->vertices[i][1][2] = r; /*r*/
>  }
>
> +static void blitter_set_texcoords_1d_array(struct blitter_context_priv *ctx,
> +                                           struct pipe_resource *src,
> +                                           unsigned level,
> +                                           unsigned zslice,
> +                                           unsigned x1, unsigned x2)
> +{
> +   int i;
> +   float r = zslice;
> +
> +   blitter_set_texcoords_2d(ctx, src, level, x1, 0, x2, 0);
> +
> +   for (i = 0; i < 4; i++)
> +      ctx->vertices[i][1][1] = r; /*r*/
> +}
> +
>  static void blitter_set_texcoords_cube(struct blitter_context_priv *ctx,
>                                        struct pipe_resource *src,
>                                        unsigned level, unsigned face,
> @@ -576,6 +592,10 @@ pipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target)
>       return TGSI_TEXTURE_3D;
>    case PIPE_TEXTURE_CUBE:
>       return TGSI_TEXTURE_CUBE;
> +   case PIPE_TEXTURE_1D_ARRAY:
> +      return TGSI_TEXTURE_1D_ARRAY;
> +   case PIPE_TEXTURE_2D_ARRAY:
> +      return TGSI_TEXTURE_2D_ARRAY;
>    default:
>       assert(0 && "unexpected texture target");
>       return TGSI_TEXTURE_UNKNOWN;
> @@ -861,17 +881,31 @@ void util_blitter_copy_texture(struct blitter_context *blitter,
>          break;
>
>       /* Draw the quad with the generic codepath. */
> -      case PIPE_TEXTURE_3D:
> -      case PIPE_TEXTURE_CUBE:
> +      default:
>          /* Set texture coordinates. */
> -         if (src->target == PIPE_TEXTURE_3D)
> +         switch (src->target) {
> +         case PIPE_TEXTURE_1D_ARRAY:
> +            blitter_set_texcoords_1d_array(ctx, src, srclevel, srcbox->y,
> +                                           srcbox->x, srcbox->x + width);
> +            break;
> +
> +         case PIPE_TEXTURE_2D_ARRAY:
> +         case PIPE_TEXTURE_3D:
>             blitter_set_texcoords_3d(ctx, src, srclevel, srcbox->z,
>                                      srcbox->x, srcbox->y,
> -                                     srcbox->x + width, srcbox->y + height);
> -         else
> +                                     srcbox->x + width, srcbox->y + height,
> +                                     src->target == PIPE_TEXTURE_3D);
> +            break;
> +
> +         case PIPE_TEXTURE_CUBE:
>             blitter_set_texcoords_cube(ctx, src, srclevel, srcbox->z,
>                                        srcbox->x, srcbox->y,
>                                        srcbox->x + width, srcbox->y + height);
> +            break;
> +
> +         default:
> +            assert(0);
> +         }
>
>          /* Draw. */
>          blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
> @@ -880,10 +914,6 @@ void util_blitter_copy_texture(struct blitter_context *blitter,
>          util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
>                                  PIPE_PRIM_TRIANGLE_FAN, 4, 2);
>          break;
> -
> -      default:
> -         assert(0);
> -         return;
>    }
>
>    blitter_restore_CSOs(ctx);
> --
> 1.7.4.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list