u_blitter: add texture array support
authorMarek Olšák <maraeo@gmail.com>
Mon, 5 Sep 2011 01:30:02 +0000 (03:30 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 10 Sep 2011 06:53:29 +0000 (08:53 +0200)
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/util/u_blitter.c

index d8e46f07c88ff57af173fba8d360a7f171700492..d69fb1a11abf43c7a3c99ffab6b61721a546362d 100644 (file)
@@ -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);