Merge branch 'mesa_7_5_branch'
[mesa.git] / src / gallium / drivers / nv04 / nv04_miptree.c
index 9acd613e2e401f5181bee44a3b7e5ace5243ed9f..93f752faec90c135e7b4e38f313b9a2bee4b3197 100644 (file)
@@ -31,7 +31,8 @@ nv04_miptree_layout(struct nv04_miptree *nv04mt)
 
        for (l = 0; l <= pt->last_level; l++) {
 
-               nv04mt->level[l].image_offset = offset;
+               nv04mt->level[l].image_offset = 
+                       CALLOC(nr_faces, sizeof(unsigned));
                offset += nv04mt->level[l].pitch * pt->height[l];
        }
 
@@ -41,21 +42,20 @@ nv04_miptree_layout(struct nv04_miptree *nv04mt)
 static struct pipe_texture *
 nv04_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
 {
-       struct pipe_winsys *ws = pscreen->winsys;
        struct nv04_miptree *mt;
 
        mt = MALLOC(sizeof(struct nv04_miptree));
        if (!mt)
                return NULL;
        mt->base = *pt;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = pscreen;
 
        //mt->base.tex_usage |= NOUVEAU_TEXTURE_USAGE_LINEAR;
 
        nv04_miptree_layout(mt);
 
-       mt->buffer = ws->buffer_create(ws, 256, PIPE_BUFFER_USAGE_PIXEL |
+       mt->buffer = pscreen->buffer_create(pscreen, 256, PIPE_BUFFER_USAGE_PIXEL |
                                                NOUVEAU_BUFFER_USAGE_TEXTURE,
                                                mt->total_size);
        if (!mt->buffer) {
@@ -83,27 +83,22 @@ nv04_miptree_blanket(struct pipe_screen *pscreen, const struct pipe_texture *pt,
                return NULL;
 
        mt->base = *pt;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = pscreen;
        mt->level[0].pitch = stride[0];
        mt->level[0].image_offset = CALLOC(1, sizeof(unsigned));
 
-       pipe_buffer_reference(pscreen, &mt->buffer, pb);
+       pipe_buffer_reference(&mt->buffer, pb);
        return &mt->base;
 }
 
 static void
-nv04_miptree_release(struct pipe_screen *pscreen, struct pipe_texture **ppt)
+nv04_miptree_destroy(struct pipe_texture *pt)
 {
-       struct pipe_texture *pt = *ppt;
        struct nv04_miptree *mt = (struct nv04_miptree *)pt;
        int l;
 
-       *ppt = NULL;
-       if (--pt->refcount)
-               return;
-
-       pipe_buffer_reference(pscreen, &mt->buffer, NULL);
+       pipe_buffer_reference(&mt->buffer, NULL);
        for (l = 0; l <= pt->last_level; l++) {
                if (mt->level[l].image_offset)
                        FREE(mt->level[l].image_offset);
@@ -128,8 +123,7 @@ nv04_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        ns->base.width = pt->width[level];
        ns->base.height = pt->height[level];
        ns->base.usage = flags;
-       ns->base.status = PIPE_SURFACE_STATUS_DEFINED;
-       ns->base.refcount = 1;
+       pipe_reference_init(&ns->base.reference, 1);
        ns->base.face = face;
        ns->base.level = level;
        ns->base.zslice = zslice;
@@ -141,15 +135,8 @@ nv04_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv04_miptree_surface_del(struct pipe_screen *pscreen,
-                        struct pipe_surface **psurface)
+nv04_miptree_surface_del(struct pipe_surface *ps)
 {
-       struct pipe_surface *ps = *psurface;
-
-       *psurface = NULL;
-       if (--ps->refcount > 0)
-               return;
-
        pipe_texture_reference(&ps->texture, NULL);
        FREE(ps);
 }
@@ -159,8 +146,8 @@ nv04_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv04_miptree_create;
        pscreen->texture_blanket = nv04_miptree_blanket;
-       pscreen->texture_release = nv04_miptree_release;
+       pscreen->texture_destroy = nv04_miptree_destroy;
        pscreen->get_tex_surface = nv04_miptree_surface_new;
-       pscreen->tex_surface_release = nv04_miptree_surface_del;
+       pscreen->tex_surface_destroy = nv04_miptree_surface_del;
 }