nouveau: Calc pitch for swizzled textures appropriately.
authorYounes Manton <younes.m@gmail.com>
Tue, 2 Dec 2008 21:12:49 +0000 (16:12 -0500)
committerYounes Manton <younes.m@gmail.com>
Tue, 2 Dec 2008 21:15:13 +0000 (16:15 -0500)
src/gallium/drivers/nv40/nv40_miptree.c
src/gallium/winsys/drm/nouveau/nv04_surface.c

index 6516bff4b815c12f5c18edf24ca7047eb77cfdbd..b68967c07fdf4017f06dd7e7bd0177d47e92171d 100644 (file)
@@ -8,7 +8,6 @@ static void
 nv40_miptree_layout(struct nv40_miptree *mt)
 {
        struct pipe_texture *pt = &mt->base;
-       boolean swizzled = FALSE;
        uint width = pt->width[0], height = pt->height[0], depth = pt->depth[0];
        uint offset = 0;
        int nr_faces, l, f, pitch;
@@ -30,7 +29,7 @@ nv40_miptree_layout(struct nv40_miptree *mt)
                pt->nblocksx[l] = pf_get_nblocksx(&pt->block, width);
                pt->nblocksy[l] = pf_get_nblocksy(&pt->block, height);
 
-               if (swizzled)
+               if (!(pt->tex_usage & NOUVEAU_TEXTURE_USAGE_LINEAR))
                        pitch = pt->nblocksx[l];
                pitch = align(pitch, 64);
 
@@ -68,8 +67,6 @@ nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
        mt->shadow_tex = NULL;
        mt->shadow_surface = NULL;
 
-       nv40_miptree_layout(mt);
-
        /* Swizzled textures must be POT */
        if (pt->width[0] & (pt->width[0] - 1) ||
            pt->height[0] & (pt->height[0] - 1))
@@ -91,6 +88,8 @@ nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
                }
        }
 
+       nv40_miptree_layout(mt);
+
        mt->buffer = ws->buffer_create(ws, 256,
                                       PIPE_BUFFER_USAGE_PIXEL |
                                       NOUVEAU_BUFFER_USAGE_TEXTURE,
index 11786202400a5606296c584b08a536f42164a89e..68338eb814a8f2cc22b4cdfa4fa5ec04b172fbb5 100644 (file)
@@ -84,12 +84,15 @@ nv04_scaled_image_format(enum pipe_format format)
 
 static void
 nv04_surface_copy_swizzle(struct nouveau_context *nv, unsigned dx, unsigned dy,
-                      unsigned sx, unsigned sy, unsigned w, unsigned h)
+                          unsigned sx, unsigned sy, unsigned w, unsigned h)
 {
        struct nouveau_channel *chan = nv->nvc->channel;
        struct pipe_surface *dst = nv->surf_dst;
        struct pipe_surface *src = nv->surf_src;
 
+       /* POT or GTFO */
+       assert(!(w & (w - 1)) && !(h & (h - 1)));
+
        BEGIN_RING(chan, nv->nvc->NvSwzSurf, NV04_SWIZZLED_SURFACE_DMA_IMAGE, 1);
        OUT_RELOCo(chan, nouveau_buffer(dst->buffer)->bo,
                         NOUVEAU_BO_GART | NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);