nv50: RCP and RSQ cannot load from VP inputs
[mesa.git] / src / gallium / drivers / nv50 / nv50_miptree.c
index 22465e0227426cdb785591990fb72e15b128b44a..93479a0314a2c2279ead0ea25183d44166fad27b 100644 (file)
@@ -31,20 +31,25 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
 {
        struct nouveau_device *dev = nouveau_screen(pscreen)->device;
        struct nv50_miptree *mt = CALLOC_STRUCT(nv50_miptree);
-       struct pipe_texture *pt = &mt->base;
+       struct pipe_texture *pt = &mt->base.base;
        unsigned width = tmp->width[0], height = tmp->height[0];
        unsigned depth = tmp->depth[0];
        uint32_t tile_mode, tile_flags, tile_h;
        int ret, i, l;
 
-       mt->base = *tmp;
-       pipe_reference_init(&mt->base.reference, 1);
-       mt->base.screen = pscreen;
+       *pt = *tmp;
+       pipe_reference_init(&pt->reference, 1);
+       pt->screen = pscreen;
 
        switch (pt->format) {
-       case PIPE_FORMAT_Z24X8_UNORM:
+       case PIPE_FORMAT_Z32_FLOAT:
+               tile_flags = 0x4800;
+               break;
        case PIPE_FORMAT_Z24S8_UNORM:
-       case PIPE_FORMAT_Z16_UNORM:
+               tile_flags = 0x1800;
+               break;
+       case PIPE_FORMAT_X8Z24_UNORM:
+       case PIPE_FORMAT_S8Z24_UNORM:
                tile_flags = 0x2800;
                break;
        default:
@@ -82,20 +87,27 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
 
                lvl->image_offset = CALLOC(mt->image_nr, sizeof(int));
                lvl->pitch = align(pt->width[l] * pt->block.size, 64);
+               lvl->tile_mode = tile_mode;
 
                width = MAX2(1, width >> 1);
                height = MAX2(1, height >> 1);
                depth = MAX2(1, depth >> 1);
+
+               if (tile_mode && height <= (tile_h >> 1)) {
+                       tile_mode--;
+                       tile_h >>= 1;
+               }
        }
 
        for (i = 0; i < mt->image_nr; i++) {
                for (l = 0; l <= pt->last_level; l++) {
                        struct nv50_miptree_level *lvl = &mt->level[l];
                        int size;
+                       tile_h = 1 << (lvl->tile_mode + 2);
 
                        size  = align(pt->width[l], 8) * pt->block.size;
                        size  = align(size, 64);
-                       size *= align(pt->height[l], tile_h) * pt->block.size;
+                       size *= align(pt->height[l], tile_h);
 
                        lvl->image_offset[i] = mt->total_size;
 
@@ -104,13 +116,14 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
        }
 
        ret = nouveau_bo_new_tile(dev, NOUVEAU_BO_VRAM, 256, mt->total_size,
-                                 tile_mode, tile_flags, &mt->bo);
+                                 mt->level[0].tile_mode, tile_flags,
+                                 &mt->base.bo);
        if (ret) {
                FREE(mt);
                return NULL;
        }
-                            
-       return &mt->base;
+
+       return pt;
 }
 
 static struct pipe_texture *
@@ -129,15 +142,16 @@ nv50_miptree_blanket(struct pipe_screen *pscreen, const struct pipe_texture *pt,
        if (!mt)
                return NULL;
 
-       mt->base = *pt;
-       pipe_reference_init(&mt->base.reference, 1);
-       mt->base.screen = pscreen;
+       mt->base.base = *pt;
+       pipe_reference_init(&mt->base.base.reference, 1);
+       mt->base.base.screen = pscreen;
        mt->image_nr = 1;
        mt->level[0].pitch = *stride;
        mt->level[0].image_offset = CALLOC(1, sizeof(unsigned));
+       mt->level[0].tile_mode = bo->tile_mode;
 
-       nouveau_bo_ref(bo, &mt->bo);
-       return &mt->base;
+       nouveau_bo_ref(bo, &mt->base.bo);
+       return &mt->base.base;
 }
 
 static void
@@ -145,8 +159,8 @@ nv50_miptree_destroy(struct pipe_texture *pt)
 {
        struct nv50_miptree *mt = nv50_miptree(pt);
 
-       nouveau_bo_ref(NULL, &mt->bo);
-        FREE(mt);
+       nouveau_bo_ref(NULL, &mt->base.bo);
+       FREE(mt);
 }
 
 static struct pipe_surface *
@@ -189,8 +203,8 @@ nv50_miptree_surface_del(struct pipe_surface *ps)
 {
        struct nv50_surface *s = nv50_surface(ps);
 
-        pipe_texture_reference(&ps->texture, NULL);
-        FREE(s);
+       pipe_texture_reference(&ps->texture, NULL);
+       FREE(s);
 }
 
 void