[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