gallium: Unify reference counting.
authorMichel Dänzer <daenzer@vmware.com>
Wed, 4 Mar 2009 10:58:48 +0000 (11:58 +0100)
committerMichel Dänzer <daenzer@vmware.com>
Wed, 4 Mar 2009 10:58:48 +0000 (11:58 +0100)
The core reference counting code is centralized in p_refcnt.h.

This has some consequences related to struct pipe_buffer:

* The screen member of struct pipe_buffer must be initialized, or
  pipe_buffer_reference() will crash trying to destroy a buffer with reference
  count 0. u_simple_screen takes care of this, but I may have missed some of
  the drivers not using it.
* Except for rare exceptions deep in winsys code, buffers must always be
  allocated via pipe_buffer_create() or via screen->*buffer_create() rather
  than via winsys->*buffer_create().

102 files changed:
src/gallium/auxiliary/draw/draw_pipe_aaline.c
src/gallium/auxiliary/draw/draw_pipe_pstipple.c
src/gallium/auxiliary/pipebuffer/pb_buffer.h
src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
src/gallium/auxiliary/pipebuffer/pb_buffer_malloc.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_debug.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_mm.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_ondemand.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_pool.c
src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c
src/gallium/auxiliary/sct/sct.c
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_debug.c
src/gallium/auxiliary/util/u_draw_quad.c
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/auxiliary/util/u_rect.c
src/gallium/auxiliary/util/u_simple_screen.c
src/gallium/auxiliary/util/u_timed_winsys.c
src/gallium/drivers/cell/ppu/cell_fence.c
src/gallium/drivers/cell/ppu/cell_texture.c
src/gallium/drivers/failover/fo_context.c
src/gallium/drivers/i915simple/i915_prim_vbuf.c
src/gallium/drivers/i915simple/i915_screen.c
src/gallium/drivers/i915simple/i915_texture.c
src/gallium/drivers/i965simple/brw_tex_layout.c
src/gallium/drivers/i965simple/brw_wm_surface_state.c
src/gallium/drivers/nouveau/nouveau_stateobj.h
src/gallium/drivers/nv04/nv04_miptree.c
src/gallium/drivers/nv04/nv04_transfer.c
src/gallium/drivers/nv10/nv10_miptree.c
src/gallium/drivers/nv10/nv10_prim_vbuf.c
src/gallium/drivers/nv10/nv10_transfer.c
src/gallium/drivers/nv20/nv20_miptree.c
src/gallium/drivers/nv20/nv20_prim_vbuf.c
src/gallium/drivers/nv20/nv20_transfer.c
src/gallium/drivers/nv30/nv30_fragprog.c
src/gallium/drivers/nv30/nv30_miptree.c
src/gallium/drivers/nv30/nv30_transfer.c
src/gallium/drivers/nv40/nv40_fragprog.c
src/gallium/drivers/nv40/nv40_miptree.c
src/gallium/drivers/nv40/nv40_transfer.c
src/gallium/drivers/nv50/nv50_miptree.c
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_query.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nv50/nv50_transfer.c
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r300/r300_swtcl_emit.c
src/gallium/drivers/r300/r300_texture.c
src/gallium/drivers/softpipe/sp_context.c
src/gallium/drivers/softpipe/sp_state_fs.c
src/gallium/drivers/softpipe/sp_texture.c
src/gallium/drivers/softpipe/sp_tile_cache.c
src/gallium/drivers/trace/tr_screen.c
src/gallium/drivers/trace/tr_state.c
src/gallium/drivers/trace/tr_texture.c
src/gallium/drivers/trace/tr_winsys.c
src/gallium/include/pipe/internal/p_winsys_screen.h
src/gallium/include/pipe/p_inlines.h
src/gallium/include/pipe/p_refcnt.h [new file with mode: 0644]
src/gallium/include/pipe/p_screen.h
src/gallium/include/pipe/p_state.h
src/gallium/state_trackers/dri2/dri_drawable.c
src/gallium/state_trackers/egl/egl_surface.c
src/gallium/state_trackers/g3dvl/vl_basic_csc.c
src/gallium/state_trackers/g3dvl/vl_r16snorm_mc_buf.c
src/gallium/state_trackers/python/st_device.c
src/gallium/state_trackers/python/st_device.h
src/gallium/state_trackers/python/st_softpipe_winsys.c
src/gallium/state_trackers/xorg/xorg_crtc.c
src/gallium/state_trackers/xorg/xorg_dri2.c
src/gallium/state_trackers/xorg/xorg_exa.c
src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c
src/gallium/winsys/drm/intel/gem/intel_be_device.c
src/gallium/winsys/drm/intel/gem/intel_be_fence.h
src/gallium/winsys/drm/nouveau/common/nouveau_context.c
src/gallium/winsys/drm/nouveau/common/nouveau_context.h
src/gallium/winsys/drm/nouveau/common/nouveau_winsys_pipe.c
src/gallium/winsys/drm/radeon/radeon_buffer.c
src/gallium/winsys/drm/radeon/radeon_drm.c
src/gallium/winsys/egl_xlib/sw_winsys.c
src/gallium/winsys/g3dvl/xsp_winsys.c
src/gallium/winsys/gdi/gdi_softpipe_winsys.c
src/gallium/winsys/xlib/xlib_brw_screen.c
src/gallium/winsys/xlib/xlib_cell.c
src/gallium/winsys/xlib/xlib_softpipe.c
src/mesa/state_tracker/st_atom_constbuf.c
src/mesa/state_tracker/st_atom_pixeltransfer.c
src/mesa/state_tracker/st_cb_accum.c
src/mesa/state_tracker/st_cb_bitmap.c
src/mesa/state_tracker/st_cb_bufferobjects.c
src/mesa/state_tracker/st_cb_clear.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_cb_readpixels.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_draw_feedback.c
src/mesa/state_tracker/st_gen_mipmap.c
src/mesa/state_tracker/st_texture.c

index 80c9c918a992b03db43d645683e8022d6b2989cb..e83a07579430cb10ecef7bcfae05b024e4589e04 100644 (file)
@@ -446,7 +446,7 @@ aaline_create_texture(struct aaline_stage *aaline)
 
       /* unmap */
       screen->transfer_unmap(screen, transfer);
-      screen->tex_transfer_release(screen, &transfer);
+      screen->tex_transfer_destroy(transfer);
    }
    return TRUE;
 }
@@ -728,7 +728,7 @@ aaline_destroy(struct draw_stage *stage)
       aaline->pipe->delete_sampler_state(aaline->pipe, aaline->sampler_cso);
 
    if (aaline->texture)
-      pipe_texture_release(&aaline->texture);
+      pipe_texture_reference(&aaline->texture, NULL);
 
    draw_free_temp_verts( stage );
 
index e68c824c86203a4c4f8865b040f7a9797d4a929d..fa7bc674762902690595190290824c5966accc59 100644 (file)
@@ -406,7 +406,7 @@ pstip_update_texture(struct pstip_stage *pstip)
 
    /* unmap */
    screen->transfer_unmap(screen, transfer);
-   screen->tex_transfer_release(screen, &transfer);
+   screen->tex_transfer_destroy(transfer);
 }
 
 
@@ -572,7 +572,7 @@ pstip_destroy(struct draw_stage *stage)
 
    pstip->pipe->delete_sampler_state(pstip->pipe, pstip->sampler_cso);
 
-   pipe_texture_release(&pstip->texture);
+   pipe_texture_reference(&pstip->texture, NULL);
 
    draw_free_temp_verts( stage );
    FREE( stage );
index e6b0b30ff44e378f2a0addebb9675de6438fe65e..be1654c654a30821a27d44609fa8497e91f7cc5f 100644 (file)
@@ -159,7 +159,7 @@ pb_map(struct pb_buffer *buf,
    assert(buf);
    if(!buf)
       return NULL;
-   assert(buf->base.refcount > 0);
+   assert(buf->base.reference.count > 0);
    return buf->vtbl->map(buf, flags);
 }
 
@@ -170,7 +170,7 @@ pb_unmap(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.refcount > 0);
+   assert(buf->base.reference.count > 0);
    buf->vtbl->unmap(buf);
 }
 
@@ -186,7 +186,7 @@ pb_get_base_buffer( struct pb_buffer *buf,
       offset = 0;
       return;
    }
-   assert(buf->base.refcount > 0);
+   assert(buf->base.reference.count > 0);
    assert(buf->vtbl->get_base_buffer);
    buf->vtbl->get_base_buffer(buf, base_buf, offset);
    assert(*base_buf);
@@ -222,29 +222,18 @@ pb_destroy(struct pb_buffer *buf)
    assert(buf);
    if(!buf)
       return;
-   assert(buf->base.refcount == 0);
+   assert(buf->base.reference.count == 0);
    buf->vtbl->destroy(buf);
 }
 
-
-/* XXX: thread safety issues!
- */
 static INLINE void
 pb_reference(struct pb_buffer **dst,
              struct pb_buffer *src)
 {
-   if (src) {
-      assert(src->base.refcount);
-      src->base.refcount++;
-   }
-
-   if (*dst) {
-      assert((*dst)->base.refcount);
-      if(--(*dst)->base.refcount == 0)
-         pb_destroy( *dst );
-   }
+   struct pb_buffer *old = *dst;
 
-   *dst = src;
+   if (pipe_reference((struct pipe_reference**)dst, &src->base.reference))
+      pb_destroy( old );
 }
 
 
index 17ff61b675cb62e526652bea2bf5fc5e724c668a..e4adf8aad7cdb24f42c34c621f13af311476bf55 100644 (file)
@@ -115,7 +115,7 @@ _fenced_buffer_add(struct fenced_buffer *fenced_buf)
 {
    struct fenced_buffer_list *fenced_list = fenced_buf->list;
 
-   assert(fenced_buf->base.base.refcount);
+   assert(fenced_buf->base.base.reference.count);
    assert(fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE);
    assert(fenced_buf->fence);
 
@@ -137,7 +137,7 @@ _fenced_buffer_destroy(struct fenced_buffer *fenced_buf)
 {
    struct fenced_buffer_list *fenced_list = fenced_buf->list;
    
-   assert(!fenced_buf->base.base.refcount);
+   assert(!fenced_buf->base.base.reference.count);
    assert(!fenced_buf->fence);
 #ifdef DEBUG
    assert(fenced_buf->head.prev);
@@ -177,7 +177,7 @@ _fenced_buffer_remove(struct fenced_buffer_list *fenced_list,
    ++fenced_list->numUnfenced;
 #endif
    
-   if(!fenced_buf->base.base.refcount)
+   if(!fenced_buf->base.base.reference.count)
       _fenced_buffer_destroy(fenced_buf);
 }
 
@@ -253,7 +253,7 @@ fenced_buffer_destroy(struct pb_buffer *buf)
    struct fenced_buffer_list *fenced_list = fenced_buf->list;
 
    pipe_mutex_lock(fenced_list->mutex);
-   assert(fenced_buf->base.base.refcount == 0);
+   assert(fenced_buf->base.base.reference.count == 0);
    if (fenced_buf->fence) {
       struct pb_fence_ops *ops = fenced_list->ops;
       if(ops->fence_signalled(ops, fenced_buf->fence, 0) == 0) {
@@ -461,7 +461,7 @@ fenced_buffer_create(struct fenced_buffer_list *fenced_list,
       return NULL;
    }
    
-   buf->base.base.refcount = 1;
+   pipe_reference_init(&buf->base.base.reference, 1);
    buf->base.base.alignment = buffer->base.alignment;
    buf->base.base.usage = buffer->base.usage;
    buf->base.base.size = buffer->base.size;
@@ -527,7 +527,7 @@ fenced_buffer_list_dump(struct fenced_buffer_list *fenced_list)
    pipe_mutex_lock(fenced_list->mutex);
 
    debug_printf("%10s %7s %10s %s\n",
-                "buffer", "refcount", "fence", "signalled");
+                "buffer", "reference.count", "fence", "signalled");
    
    curr = fenced_list->unfenced.next;
    next = curr->next;
@@ -536,7 +536,7 @@ fenced_buffer_list_dump(struct fenced_buffer_list *fenced_list)
       assert(!fenced_buf->fence);
       debug_printf("%10p %7u\n",
                    fenced_buf,
-                   fenced_buf->base.base.refcount);
+                   fenced_buf->base.base.reference.count);
       curr = next; 
       next = curr->next;
    }
@@ -549,7 +549,7 @@ fenced_buffer_list_dump(struct fenced_buffer_list *fenced_list)
       signaled = ops->fence_signalled(ops, fenced_buf->fence, 0);
       debug_printf("%10p %7u %10p %s\n",
                    fenced_buf,
-                   fenced_buf->base.base.refcount,
+                   fenced_buf->base.base.reference.count,
                    fenced_buf->fence,
                    signaled == 0 ? "y" : "n");
       curr = next; 
index 282802b1717067466104aee25c086315269a1a41..689fd74771fcfa5072d3e6b43773470dcb17d40f 100644 (file)
@@ -132,7 +132,7 @@ pb_malloc_buffer_create(size_t size,
    if(!buf)
       return NULL;
 
-   buf->base.base.refcount = 1;
+   pipe_reference_init(&buf->base.base.reference, 1);
    buf->base.base.alignment = desc->alignment;
    buf->base.base.usage = desc->usage;
    buf->base.base.size = size;
index 29117efe9bd3433cacd6e4148059e2abe2899d90..06ed0002ca8a42909202f8cec6c22f076ce04739 100644 (file)
@@ -112,7 +112,7 @@ _pb_cache_buffer_destroy(struct pb_cache_buffer *buf)
    LIST_DEL(&buf->head);
    assert(mgr->numDelayed);
    --mgr->numDelayed;
-   assert(!buf->base.base.refcount);
+   assert(!buf->base.base.reference.count);
    pb_reference(&buf->buffer, NULL);
    FREE(buf);
 }
@@ -153,7 +153,7 @@ pb_cache_buffer_destroy(struct pb_buffer *_buf)
    struct pb_cache_manager *mgr = buf->mgr;
 
    pipe_mutex_lock(mgr->mutex);
-   assert(buf->base.base.refcount == 0);
+   assert(buf->base.base.reference.count == 0);
    
    _pb_cache_buffer_list_check_free(mgr);
    
@@ -293,7 +293,8 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
    if(buf) {
       LIST_DEL(&buf->head);
       pipe_mutex_unlock(mgr->mutex);
-      ++buf->base.base.refcount;
+      /* Increase refcount */
+      pb_reference((struct pb_buffer**)&buf, &buf->base);
       return &buf->base;
    }
    
@@ -309,12 +310,12 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
       return NULL;
    }
    
-   assert(buf->buffer->base.refcount >= 1);
+   assert(buf->buffer->base.reference.count >= 1);
    assert(pb_check_alignment(desc->alignment, buf->buffer->base.alignment));
    assert(pb_check_usage(desc->usage, buf->buffer->base.usage));
    assert(buf->buffer->base.size >= size);
    
-   buf->base.base.refcount = 1;
+   pipe_reference_init(&buf->base.base.reference, 1);
    buf->base.base.alignment = buf->buffer->base.alignment;
    buf->base.base.usage = buf->buffer->base.usage;
    buf->base.base.size = buf->buffer->base.size;
index 21079b8bfd71669de72163611a0e66220d8380f6..37ed64b84f6994ba22d6293eadfb1222b94ace53 100644 (file)
@@ -206,9 +206,9 @@ pb_debug_buffer_check(struct pb_debug_buffer *buf)
 static void
 pb_debug_buffer_destroy(struct pb_buffer *_buf)
 {
-   struct pb_debug_buffer *buf = pb_debug_buffer(_buf);  
+   struct pb_debug_buffer *buf = pb_debug_buffer(_buf);
    
-   assert(!buf->base.base.refcount);
+   assert(!buf->base.base.reference.count);
    
    pb_debug_buffer_check(buf);
 
@@ -315,12 +315,12 @@ pb_debug_manager_create_buffer(struct pb_manager *_mgr,
       return NULL;
    }
    
-   assert(buf->buffer->base.refcount >= 1);
+   assert(buf->buffer->base.reference.count >= 1);
    assert(pb_check_alignment(real_desc.alignment, buf->buffer->base.alignment));
    assert(pb_check_usage(real_desc.usage, buf->buffer->base.usage));
    assert(buf->buffer->base.size >= real_size);
    
-   buf->base.base.refcount = 1;
+   pipe_reference_init(&buf->base.base.reference, 1);
    buf->base.base.alignment = desc->alignment;
    buf->base.base.usage = desc->usage;
    buf->base.base.size = size;
index 85ff3a09de47db16d6c6f4f72c97d7eb7e0fb016..9b0f77bedb439c06d7de4886d8e3ba0736b5b4d2 100644 (file)
@@ -97,11 +97,11 @@ mm_buffer_destroy(struct pb_buffer *buf)
    struct mm_buffer *mm_buf = mm_buffer(buf);
    struct mm_pb_manager *mm = mm_buf->mgr;
    
-   assert(buf->base.refcount == 0);
+   assert(mm_buf->base.base.reference.count == 0);
    
    pipe_mutex_lock(mm->mutex);
    u_mmFreeMem(mm_buf->block);
-   FREE(buf);
+   FREE(mm_buf);
    pipe_mutex_unlock(mm->mutex);
 }
 
@@ -189,7 +189,7 @@ mm_bufmgr_create_buffer(struct pb_manager *mgr,
       return NULL;
    }
 
-   mm_buf->base.base.refcount = 1;
+   pipe_reference_init(&mm_buf->base.base.reference, 1);
    mm_buf->base.base.alignment = desc->alignment;
    mm_buf->base.base.usage = desc->usage;
    mm_buf->base.base.size = size;
index 3d9c7bba0ba0cf945051504d4feab5e44c78484b..4f7e6b1c4df6d0f5777cf17b585c5649aa13ba39 100644 (file)
@@ -242,7 +242,7 @@ pb_ondemand_manager_create_buffer(struct pb_manager *_mgr,
    if(!buf)
       return NULL;
 
-   buf->base.base.refcount = 1;
+   pipe_reference_init(&buf->base.base.reference, 1);
    buf->base.base.alignment = desc->alignment;
    buf->base.base.usage = desc->usage;
    buf->base.base.size = size;
index 12447acfd9325890e25ed64a749f76c7d67a017d..ca6c14a627e8df597b5ea37b27479f90f683a6c5 100644 (file)
@@ -108,7 +108,7 @@ pool_buffer_destroy(struct pb_buffer *buf)
    struct pool_buffer *pool_buf = pool_buffer(buf);
    struct pool_pb_manager *pool = pool_buf->mgr;
    
-   assert(pool_buf->base.base.refcount == 0);
+   assert(pool_buf->base.base.reference.count == 0);
 
    pipe_mutex_lock(pool->mutex);
    LIST_ADD(&pool_buf->head, &pool->free);
@@ -216,8 +216,8 @@ pool_bufmgr_create_buffer(struct pb_manager *mgr,
    pipe_mutex_unlock(pool->mutex);
    
    pool_buf = LIST_ENTRY(struct pool_buffer, item, head);
-   assert(pool_buf->base.base.refcount == 0);
-   pool_buf->base.base.refcount = 1;
+   assert(pool_buf->base.base.reference.count == 0);
+   pipe_reference_init(&pool_buf->base.base.reference, 1);
    pool_buf->base.base.alignment = desc->alignment;
    pool_buf->base.base.usage = desc->usage;
    
@@ -295,7 +295,7 @@ pool_bufmgr_create(struct pb_manager *provider,
 
    pool_buf = pool->bufs;
    for (i = 0; i < numBufs; ++i) {
-      pool_buf->base.base.refcount = 0;
+      pipe_reference_init(&pool_buf->base.base.reference, 0);
       pool_buf->base.base.alignment = 0;
       pool_buf->base.base.usage = 0;
       pool_buf->base.base.size = bufSize;
index a3259351b92eb5bdae8548df0ce7d0075a8a902f..2cdb5a5e29d7266cc8254b166ea8df5f0663da78 100644 (file)
@@ -202,7 +202,7 @@ pb_slab_buffer_destroy(struct pb_buffer *_buf)
 
    pipe_mutex_lock(mgr->mutex);
    
-   assert(buf->base.base.refcount == 0);
+   assert(buf->base.base.reference.count == 0);
    
    buf->mapCount = 0;
 
@@ -340,7 +340,7 @@ pb_slab_create(struct pb_slab_manager *mgr)
 
    buf = slab->buffers;
    for (i=0; i < numBuffers; ++i) {
-      buf->base.base.refcount = 0;
+      pipe_reference_init(&buf->base.base.reference, 0);
       buf->base.base.size = mgr->bufSize;
       buf->base.base.alignment = 0;
       buf->base.base.usage = 0;
@@ -419,7 +419,7 @@ pb_slab_manager_create_buffer(struct pb_manager *_mgr,
    pipe_mutex_unlock(mgr->mutex);
    buf = LIST_ENTRY(struct pb_slab_buffer, list, head);
    
-   ++buf->base.base.refcount;
+   pipe_reference_init(&buf->base.base.reference, 1);
    buf->base.base.alignment = desc->alignment;
    buf->base.base.usage = desc->usage;
    
index 49bb7ea92e2611cc849617c162417f2827fc0908..fcfa04ef7d5cea962efe6109ec5ffff8d044d7f4 100644 (file)
@@ -372,7 +372,7 @@ sct_flush_textures(struct surface_context_tracker *sct,
 
    for (tl = ci->textures_used; tl; tl = next) {
       next = tl->next;
-      pipe_texture_release(&tl->texture);
+      pipe_texture_reference(&tl->texture, NULL);
       FREE(tl);
    }
    ci->textures_used = NULL;
index 4cc720269dd072a687256151e1de6a488c0daae4..813e41f1b11c6e7e36027239abd13c3accdb7f0f 100644 (file)
@@ -38,6 +38,7 @@
 #include "pipe/p_defines.h"
 #include "pipe/p_inlines.h"
 #include "pipe/p_shader_tokens.h"
+#include "pipe/p_state.h"
 
 #include "util/u_blit.h"
 #include "util/u_draw_quad.h"
@@ -166,7 +167,7 @@ util_destroy_blit(struct blit_state *ctx)
    FREE((void*) ctx->vert_shader.tokens);
    FREE((void*) ctx->frag_shader.tokens);
 
-   pipe_buffer_reference(pipe->screen, &ctx->vbuf, NULL);
+   pipe_buffer_reference(&ctx->vbuf, NULL);
 
    FREE(ctx);
 }
@@ -368,7 +369,7 @@ util_blit_pixels(struct blit_state *ctx,
 
    /* free the surface, update the texture if necessary.
     */
-   screen->tex_surface_release(screen, &texSurf);
+   pipe_surface_reference(&texSurf, NULL);
 
    /* save state (restored below) */
    cso_save_blend(ctx->cso);
@@ -429,7 +430,7 @@ util_blit_pixels(struct blit_state *ctx,
    cso_restore_vertex_shader(ctx->cso);
    cso_restore_viewport(ctx->cso);
 
-   screen->texture_release(screen, &tex);
+   pipe_texture_reference(&tex, NULL);
 }
 
 
@@ -438,7 +439,7 @@ util_blit_pixels(struct blit_state *ctx,
  */
 void util_blit_flush( struct blit_state *ctx )
 {
-   pipe_buffer_reference(ctx->pipe->screen, &ctx->vbuf, NULL);
+   pipe_buffer_reference(&ctx->vbuf, NULL);
    ctx->vbuf_slot = 0;
 } 
 
@@ -461,8 +462,6 @@ util_blit_pixels_tex(struct blit_state *ctx,
                  int dstX1, int dstY1,
                  float z, uint filter)
 {
-   struct pipe_context *pipe = ctx->pipe;
-   struct pipe_screen *screen = pipe->screen;
    struct pipe_framebuffer_state fb;
    float s0, t0, s1, t1;
    unsigned offset;
@@ -478,8 +477,10 @@ util_blit_pixels_tex(struct blit_state *ctx,
    t0 = srcY0 / (float)tex->height[0];
    t1 = srcY1 / (float)tex->height[0];
 
-   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
-                                      PIPE_TEXTURE_USAGE_RENDER_TARGET, 0));
+   assert(ctx->pipe->screen->is_format_supported(ctx->pipe->screen, dst->format,
+                                                 PIPE_TEXTURE_2D,
+                                                 PIPE_TEXTURE_USAGE_RENDER_TARGET,
+                                                 0));
 
    /* save state (restored below) */
    cso_save_blend(ctx->cso);
index e05c419b2f3b7099791b7eddf6118f6aa3533c3e..f96e27e09fd130e1399fb35aa9135fd6a367ff08 100644 (file)
@@ -680,7 +680,7 @@ void debug_dump_surface(const char *prefix,
    
    screen->transfer_unmap(screen, transfer);
 error:
-   screen->tex_transfer_release(screen, &transfer);
+   screen->tex_transfer_destroy(transfer);
 }
 
 
@@ -785,7 +785,7 @@ debug_dump_surface_bmp(const char *filename,
       }  
    }
 
-   screen->tex_transfer_release(screen, &transfer);
+   screen->tex_transfer_destroy(transfer);
    
    util_stream_close(stream);
 error2:
index f0bcd758999911dc0a9cc74f760aa54e54a99ed7..4110485fb19e0e685b9e7112824c6ec20b79220a 100644 (file)
@@ -129,6 +129,6 @@ util_draw_texquad(struct pipe_context *pipe,
          util_draw_vertex_buffer(pipe, vbuf, 0, PIPE_PRIM_TRIANGLE_FAN, 4, 2);
       }
 
-      pipe_buffer_reference(pipe->screen, &vbuf, NULL);
+      pipe_buffer_reference(&vbuf, NULL);
    }
 }
index 1857a71dd82b0746f153c6f51de8b2e88bf3d619..2b675e71b2305ea39cb0b18dbeb3a14d53dbfe46 100644 (file)
@@ -39,6 +39,7 @@
 #include "pipe/p_defines.h"
 #include "pipe/p_inlines.h"
 #include "pipe/p_shader_tokens.h"
+#include "pipe/p_state.h"
 
 #include "util/u_memory.h"
 #include "util/u_draw_quad.h"
@@ -1138,8 +1139,8 @@ make_1d_mipmap(struct gen_mipmap_state *ctx,
       screen->transfer_unmap(screen, srcTrans);
       screen->transfer_unmap(screen, dstTrans);
 
-      screen->tex_transfer_release(screen, &srcTrans);
-      screen->tex_transfer_release(screen, &dstTrans);
+      screen->tex_transfer_destroy(srcTrans);
+      screen->tex_transfer_destroy(dstTrans);
    }
 }
 
@@ -1183,8 +1184,8 @@ make_2d_mipmap(struct gen_mipmap_state *ctx,
       screen->transfer_unmap(screen, srcTrans);
       screen->transfer_unmap(screen, dstTrans);
 
-      screen->tex_transfer_release(screen, &srcTrans);
-      screen->tex_transfer_release(screen, &dstTrans);
+      screen->tex_transfer_destroy(srcTrans);
+      screen->tex_transfer_destroy(dstTrans);
    }
 }
 
@@ -1228,8 +1229,8 @@ make_3d_mipmap(struct gen_mipmap_state *ctx,
       screen->transfer_unmap(screen, srcTrans);
       screen->transfer_unmap(screen, dstTrans);
 
-      screen->tex_transfer_release(screen, &srcTrans);
-      screen->tex_transfer_release(screen, &dstTrans);
+      screen->tex_transfer_destroy(srcTrans);
+      screen->tex_transfer_destroy(dstTrans);
    }
 #else
    (void) reduce_3d;
@@ -1414,7 +1415,7 @@ util_destroy_gen_mipmap(struct gen_mipmap_state *ctx)
    FREE((void*) ctx->vert_shader.tokens);
    FREE((void*) ctx->frag_shader.tokens);
 
-   pipe_buffer_reference(pipe->screen, &ctx->vbuf, NULL);
+   pipe_buffer_reference(&ctx->vbuf, NULL);
 
    FREE(ctx);
 }
@@ -1426,7 +1427,7 @@ util_destroy_gen_mipmap(struct gen_mipmap_state *ctx)
  */
 void util_gen_mipmap_flush( struct gen_mipmap_state *ctx )
 {
-   pipe_buffer_reference(ctx->pipe->screen, &ctx->vbuf, NULL);
+   pipe_buffer_reference(&ctx->vbuf, NULL);
    ctx->vbuf_slot = 0;
 } 
 
index 6e24e594e4631ee46402c1027f6d0f978e8caf89..74259d453b119c22ca8b2adae8594e23a60dae93 100644 (file)
@@ -218,8 +218,8 @@ util_surface_copy(struct pipe_context *pipe,
    pipe->screen->transfer_unmap(pipe->screen, src_trans);
    pipe->screen->transfer_unmap(pipe->screen, dst_trans);
 
-   screen->tex_transfer_release(screen, &src_trans);
-   screen->tex_transfer_release(screen, &dst_trans);
+   screen->tex_transfer_destroy(src_trans);
+   screen->tex_transfer_destroy(dst_trans);
 }
 
 
@@ -297,5 +297,5 @@ util_surface_fill(struct pipe_context *pipe,
    }
 
    pipe->screen->transfer_unmap(pipe->screen, dst_trans);
-   screen->tex_transfer_release(screen, &dst_trans);
+   screen->tex_transfer_destroy(dst_trans);
 }
index 089bbbc48a812014be20e3fca2f3114e233fb248..8114b53cd0d3992976fa1a64f13851132e278a4f 100644 (file)
@@ -28,6 +28,7 @@
 #include "u_simple_screen.h"
 
 #include "pipe/p_screen.h"
+#include "pipe/p_state.h"
 #include "pipe/internal/p_winsys_screen.h"
 
 
@@ -37,8 +38,12 @@ pass_buffer_create(struct pipe_screen *screen,
                    unsigned usage,
                    unsigned size)
 {
-   return screen->winsys->buffer_create(screen->winsys,
-                                        alignment, usage, size);
+   struct pipe_buffer *buffer =
+      screen->winsys->buffer_create(screen->winsys, alignment, usage, size);
+
+   buffer->screen = screen;
+
+   return buffer;
 }
 
 static struct pipe_buffer *
@@ -46,8 +51,13 @@ pass_user_buffer_create(struct pipe_screen *screen,
                         void *ptr,
                         unsigned bytes)
 {
-   return screen->winsys->user_buffer_create(screen->winsys,
+   struct pipe_buffer *buffer =
+      screen->winsys->user_buffer_create(screen->winsys,
                                              ptr, bytes);
+
+   buffer->screen = screen;
+
+   return buffer;
 }
 
 static struct pipe_buffer *
@@ -57,9 +67,14 @@ pass_surface_buffer_create(struct pipe_screen *screen,
                            unsigned usage,
                            unsigned *stride)
 {
-   return screen->winsys->surface_buffer_create(screen->winsys,
+   struct pipe_buffer *buffer =
+      screen->winsys->surface_buffer_create(screen->winsys,
                                                 width, height,
                                                 format, usage, stride);
+
+   buffer->screen = screen;
+
+   return buffer;
 }
 
 static void *
@@ -79,10 +94,9 @@ pass_buffer_unmap(struct pipe_screen *screen,
 }
 
 static void
-pass_buffer_destroy(struct pipe_screen *screen,
-                    struct pipe_buffer *buf)
+pass_buffer_destroy(struct pipe_buffer *buf)
 {
-   screen->winsys->buffer_destroy(screen->winsys, buf);
+   buf->screen->winsys->buffer_destroy(buf);
 }
 
 
index f237e12d73502894c26a6c8b4fe8fa7ff9736ce6..77b2a3a1c875d54d42e100781a8ce9cb5a0ee837 100644 (file)
@@ -29,6 +29,7 @@
  * Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
  */
 
+#include "pipe/p_state.h"
 #include "pipe/internal/p_winsys_screen.h"
 #include "u_timed_winsys.h"
 #include "util/u_memory.h"
@@ -178,13 +179,13 @@ timed_buffer_unmap(struct pipe_winsys *winsys,
 
 
 static void
-timed_buffer_destroy(struct pipe_winsys *winsys,
-                         struct pipe_buffer *buf)
+timed_buffer_destroy(struct pipe_buffer *buf)
 {
+   struct pipe_winsys *winsys = buf->screen->winsys;
    struct pipe_winsys *backend = timed_winsys(winsys)->backend;
    uint64_t start = time_start();
 
-   backend->buffer_destroy( backend, buf );
+   backend->buffer_destroy( buf );
 
    time_finish(winsys, start, 4, __FUNCTION__);
 }
index 32dbf5706c756b5835d94efb9060e5e0128cd015..13125a9fa303b0b3b114b0627c86fd857fe9be55 100644 (file)
@@ -96,7 +96,7 @@ cell_add_buffer_to_list(struct cell_context *cell,
    struct cell_buffer_node *node = CALLOC_STRUCT(cell_buffer_node);
    /* create new list node which references the buffer, insert at head */
    if (node) {
-      pipe_buffer_reference(ps, &node->buffer, buffer);
+      pipe_buffer_reference(&node->buffer, buffer);
       node->next = list->head;
       list->head = node;
    }
@@ -127,10 +127,10 @@ cell_free_fenced_buffers(struct cell_context *cell,
          pipe_buffer_unmap(ps, node->buffer);
 #if 0
          printf("Unref buffer %p\n", node->buffer);
-         if (node->buffer->refcount == 1)
+         if (node->buffer->reference.count == 1)
             printf("   Delete!\n");
 #endif
-         pipe_buffer_reference(ps, &node->buffer, NULL);
+         pipe_buffer_reference(&node->buffer, NULL);
          FREE(node);
          node = next;
       }
index 74724393f7892ef24c22cf2d042b4cda38c27553..bc6afa94a8bb4c49e772511b803feb58f94ab8ef 100644 (file)
@@ -101,18 +101,17 @@ static struct pipe_texture *
 cell_texture_create(struct pipe_screen *screen,
                     const struct pipe_texture *templat)
 {
-   struct pipe_winsys *ws = screen->winsys;
    struct cell_texture *ct = CALLOC_STRUCT(cell_texture);
    if (!ct)
       return NULL;
 
    ct->base = *templat;
-   ct->base.refcount = 1;
+   pipe_reference_init(&ct->base.reference, 1);
    ct->base.screen = screen;
 
    cell_texture_layout(ct);
 
-   ct->buffer = ws->buffer_create(ws, 32, PIPE_BUFFER_USAGE_PIXEL,
+   ct->buffer = screen->buffer_create(screen, 32, PIPE_BUFFER_USAGE_PIXEL,
                                    ct->buffer_size);
 
    if (!ct->buffer) {
@@ -125,28 +124,18 @@ cell_texture_create(struct pipe_screen *screen,
 
 
 static void
-cell_texture_release(struct pipe_screen *screen,
-                     struct pipe_texture **pt)
+cell_texture_destroy(struct pipe_texture *pt)
 {
-   if (!*pt)
-      return;
-
-   if (--(*pt)->refcount <= 0) {
-      /* Delete this texture now.
-       * But note that the underlying pipe_buffer may linger...
-       */
-      struct cell_texture *ct = cell_texture(*pt);
+   struct cell_texture *ct = cell_texture(pt);
 
-      if (ct->mapped) {
-         pipe_buffer_unmap(screen, ct->buffer);
-         ct->mapped = NULL;
-      }
+   if (ct->mapped) {
+      pipe_buffer_unmap(screen, ct->buffer);
+      ct->mapped = NULL;
+   }
 
-      pipe_buffer_reference(screen, &ct->buffer, NULL);
+   pipe_buffer_reference(&ct->buffer, NULL);
 
-      FREE(ct);
-   }
-   *pt = NULL;
+   FREE(ct);
 }
 
 
@@ -291,7 +280,7 @@ cell_get_tex_surface(struct pipe_screen *screen,
 
    ps = CALLOC_STRUCT(pipe_surface);
    if (ps) {
-      ps->refcount = 1;
+      pipe_reference_init(&ps->reference, 1);
       pipe_texture_reference(&ps->texture, pt);
       ps->format = pt->format;
       ps->width = pt->width[level];
@@ -319,16 +308,10 @@ cell_get_tex_surface(struct pipe_screen *screen,
 
 
 static void 
-cell_tex_surface_release(struct pipe_screen *screen, 
-                         struct pipe_surface **s)
+cell_tex_surface_destroy(struct pipe_surface *s)
 {
-   struct pipe_surface *surf = *s;
-
-   if (--surf->refcount == 0) {
-      pipe_texture_reference(&surf->texture, NULL);
-      FREE(surf);
-   }
-   *s = NULL;
+   pipe_texture_reference(&surf->texture, NULL);
+   FREE(surf);
 }
 
 
@@ -353,7 +336,7 @@ cell_get_tex_transfer(struct pipe_screen *screen,
    ctrans = CALLOC_STRUCT(cell_transfer);
    if (ctrans) {
       struct pipe_transfer *pt = &ctrans->base;
-      pt->refcount = 1;
+      pipe_reference_init(&pt->reference, 1);
       pipe_texture_reference(&pt->texture, texture);
       pt->format = texture->format;
       pt->block = texture->block;
@@ -388,20 +371,16 @@ cell_get_tex_transfer(struct pipe_screen *screen,
 
 
 static void 
-cell_tex_transfer_release(struct pipe_screen *screen, 
-                          struct pipe_transfer **t)
+cell_tex_transfer_destroy(struct pipe_transfer *t)
 {
-   struct cell_transfer *transfer = cell_transfer(*t);
+   struct cell_transfer *transfer = cell_transfer(t);
    /* Effectively do the texture_update work here - if texture images
     * needed post-processing to put them into hardware layout, this is
     * where it would happen.  For cell, nothing to do.
     */
    assert (transfer->base.texture);
-   if (--transfer->base.refcount == 0) {
-      pipe_texture_reference(&transfer->base.texture, NULL);
-      FREE(transfer);
-   }
-   *t = NULL;
+   pipe_texture_reference(&transfer->base.texture, NULL);
+   FREE(transfer);
 }
 
 
@@ -511,13 +490,13 @@ void
 cell_init_screen_texture_funcs(struct pipe_screen *screen)
 {
    screen->texture_create = cell_texture_create;
-   screen->texture_release = cell_texture_release;
+   screen->texture_destroy = cell_texture_destroy;
 
    screen->get_tex_surface = cell_get_tex_surface;
-   screen->tex_surface_release = cell_tex_surface_release;
+   screen->tex_surface_destroy = cell_tex_surface_destroy;
 
    screen->get_tex_transfer = cell_get_tex_transfer;
-   screen->tex_transfer_release = cell_tex_transfer_release;
+   screen->tex_transfer_destroy = cell_tex_transfer_destroy;
 
    screen->transfer_map = cell_transfer_map;
    screen->transfer_unmap = cell_transfer_unmap;
index 0742b27b8fd829b60c3c5a8a7a50381a30ac3d6d..fcad717cf8349b16c0e154ae9cbd3e933b2ae38e 100644 (file)
@@ -145,7 +145,7 @@ struct pipe_context *failover_create( struct pipe_context *hw,
 
 #if 0
    failover->pipe.texture_create = hw->texture_create;
-   failover->pipe.texture_release = hw->texture_release;
+   failover->pipe.texture_destroy = hw->texture_destroy;
    failover->pipe.get_tex_surface = hw->get_tex_surface;
    failover->pipe.texture_update = hw->texture_update;
 #endif
index 58c41840e1fcb682674a1bf2c1055102330ddfbc..9bdd91f288171704b4a3c2edaafc42bf5eaa2352 100644 (file)
@@ -126,7 +126,7 @@ i915_vbuf_render_allocate_vertices( struct vbuf_render *render,
    } else {
       i915->vbo_flushed = 0;
       if (i915_render->vbo)
-         pipe_buffer_reference(screen, &i915_render->vbo, NULL);
+         pipe_buffer_reference(&i915_render->vbo, NULL);
    }
 
    if (!i915_render->vbo) {
index 49471287a2e193447a9a247e51052b2c74dbc21c..f4aa8e60d81bfc48f1c2c0d894cae8412a02f861 100644 (file)
@@ -230,7 +230,6 @@ i915_get_tex_transfer(struct pipe_screen *screen,
 
    trans = CALLOC_STRUCT(i915_transfer);
    if (trans) {
-      trans->base.refcount = 1;
       pipe_texture_reference(&trans->base.texture, texture);
       trans->base.format = trans->base.format;
       trans->base.width = w;
@@ -246,17 +245,10 @@ i915_get_tex_transfer(struct pipe_screen *screen,
 }
 
 static void
-i915_tex_transfer_release(struct pipe_screen *screen,
-                          struct pipe_transfer **transfer)
+i915_tex_transfer_destroy(struct pipe_transfer *trans)
 {
-   struct pipe_transfer *trans = *transfer;
-
-   if (--trans->refcount == 0) {
-      pipe_texture_reference(&trans->texture, NULL);
-      FREE(trans);
-   }
-
-   *transfer = NULL;
+   pipe_texture_reference(&trans->texture, NULL);
+   FREE(trans);
 }
 
 static void *
@@ -344,7 +336,7 @@ i915_create_screen(struct pipe_winsys *winsys, uint pci_id)
    i915screen->screen.get_paramf = i915_get_paramf;
    i915screen->screen.is_format_supported = i915_is_format_supported;
    i915screen->screen.get_tex_transfer = i915_get_tex_transfer;
-   i915screen->screen.tex_transfer_release = i915_tex_transfer_release;
+   i915screen->screen.tex_transfer_destroy = i915_tex_transfer_destroy;
    i915screen->screen.transfer_map = i915_transfer_map;
    i915screen->screen.transfer_unmap = i915_transfer_unmap;
 
index 6aead3e75e99ef0d9e96e1d3e96b43f6d321ca99..39aca9f8173f8e4d457908247f114f6c67ccdcab 100644 (file)
@@ -582,7 +582,6 @@ i915_texture_create(struct pipe_screen *screen,
                     const struct pipe_texture *templat)
 {
    struct i915_screen *i915screen = i915_screen(screen);
-   struct pipe_winsys *ws = screen->winsys;
    struct i915_texture *tex = CALLOC_STRUCT(i915_texture);
    size_t tex_size;
 
@@ -590,7 +589,7 @@ i915_texture_create(struct pipe_screen *screen,
       return NULL;
 
    tex->base = *templat;
-   tex->base.refcount = 1;
+   pipe_reference_init(&tex->base.reference, 1);
    tex->base.screen = screen;
 
    tex->base.nblocksx[0] = pf_get_nblocksx(&tex->base.block, tex->base.width[0]);
@@ -606,7 +605,7 @@ i915_texture_create(struct pipe_screen *screen,
 
    tex_size = tex->stride * tex->total_nblocksy;
 
-   tex->buffer = ws->buffer_create(ws, 64,
+   tex->buffer = screen->buffer_create(screen, 64,
                                     PIPE_BUFFER_USAGE_PIXEL,
                                     tex_size);
 
@@ -629,33 +628,22 @@ fail:
 
 
 static void
-i915_texture_release(struct pipe_screen *screen,
-                     struct pipe_texture **pt)
+i915_texture_destroy(struct pipe_texture *pt)
 {
-   if (!*pt)
-      return;
+   struct i915_texture *tex = (struct i915_texture *)pt;
+   uint i;
 
    /*
-   DBG("%s %p refcount will be %d\n",
-       __FUNCTION__, (void *) *pt, (*pt)->refcount - 1);
+     DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
    */
-   if (--(*pt)->refcount <= 0) {
-      struct i915_texture *tex = (struct i915_texture *)*pt;
-      uint i;
-
-      /*
-      DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
-      */
 
-      pipe_buffer_reference(screen, &tex->buffer, NULL);
+   pipe_buffer_reference(&tex->buffer, NULL);
 
-      for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
-         if (tex->image_offset[i])
-            FREE(tex->image_offset[i]);
+   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
+      if (tex->image_offset[i])
+         FREE(tex->image_offset[i]);
 
-      FREE(tex);
-   }
-   *pt = NULL;
+   FREE(tex);
 }
 
 static struct pipe_surface *
@@ -682,7 +670,7 @@ i915_get_tex_surface(struct pipe_screen *screen,
 
    ps = CALLOC_STRUCT(pipe_surface);
    if (ps) {
-      ps->refcount = 1;
+      pipe_reference_init(&ps->reference, 1);
       pipe_texture_reference(&ps->texture, pt);
       ps->format = pt->format;
       ps->width = pt->width[level];
@@ -715,7 +703,7 @@ i915_texture_blanket(struct pipe_screen * screen,
       return NULL;
 
    tex->base = *base;
-   tex->base.refcount = 1;
+   pipe_reference_init(&tex->base.reference, 1);
    tex->base.screen = screen;
 
    tex->stride = stride[0];
@@ -723,7 +711,7 @@ i915_texture_blanket(struct pipe_screen * screen,
    i915_miptree_set_level_info(tex, 0, 1, base->width[0], base->height[0], 1);
    i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
 
-   pipe_buffer_reference(screen, &tex->buffer, buffer);
+   pipe_buffer_reference(&tex->buffer, buffer);
 
    return &tex->base;
 }
@@ -735,36 +723,28 @@ i915_init_texture_functions(struct i915_context *i915)
 }
 
 static void
-i915_tex_surface_release(struct pipe_screen *screen,
-                         struct pipe_surface **surface)
+i915_tex_surface_destroy(struct pipe_surface *surf)
 {
-   struct pipe_surface *surf = *surface;
-
-   if (--surf->refcount == 0) {
-
-      /* This really should not be possible, but it's actually
-       * happening quite a bit...  Will fix.
-       */
-      if (surf->status == PIPE_SURFACE_STATUS_CLEAR) {
-         debug_printf("XXX destroying a surface with pending clears...\n");
-         assert(0);
-      }
-
-      pipe_texture_reference(&surf->texture, NULL);
-      FREE(surf);
+   /* This really should not be possible, but it's actually
+    * happening quite a bit...  Will fix.
+    */
+   if (surf->status == PIPE_SURFACE_STATUS_CLEAR) {
+      debug_printf("XXX destroying a surface with pending clears...\n");
+      assert(0);
    }
 
-   *surface = NULL;
+   pipe_texture_reference(&surf->texture, NULL);
+   FREE(surf);
 }
 
 void
 i915_init_screen_texture_functions(struct pipe_screen *screen)
 {
    screen->texture_create = i915_texture_create;
-   screen->texture_release = i915_texture_release;
+   screen->texture_destroy = i915_texture_destroy;
    screen->get_tex_surface = i915_get_tex_surface;
    screen->texture_blanket = i915_texture_blanket;
-   screen->tex_surface_release = i915_tex_surface_release;
+   screen->tex_surface_destroy = i915_tex_surface_destroy;
 }
 
 boolean i915_get_texture_buffer( struct pipe_texture *texture,
@@ -776,7 +756,7 @@ boolean i915_get_texture_buffer( struct pipe_texture *texture,
    if (!tex)
       return FALSE;
 
-   pipe_buffer_reference(texture->screen, buf, tex->buffer);
+   pipe_buffer_reference(buf, tex->buffer);
 
    if (stride)
       *stride = tex->stride;
index 448229ed4ee329719a0b59f1c32fff247c664cf6..c921c0d38bedac1beaa6c3752f649a2b01d4c5cb 100644 (file)
@@ -284,18 +284,17 @@ static struct pipe_texture *
 brw_texture_create_screen(struct pipe_screen *screen,
                           const struct pipe_texture *templat)
 {
-   struct pipe_winsys *ws = screen->winsys;
    struct brw_texture *tex = CALLOC_STRUCT(brw_texture);
 
    if (tex) {
       tex->base = *templat;
-      tex->base.refcount = 1;
+      pipe_reference_init(&tex->base.reference, 1);
 
       tex->base.nblocksx[0] = pf_get_nblocksx(&tex->base.block, tex->base.width[0]);
       tex->base.nblocksy[0] = pf_get_nblocksy(&tex->base.block, tex->base.height[0]);
    
       if (brw_miptree_layout(tex))
-        tex->buffer = ws->buffer_create(ws, 64,
+        tex->buffer = screen->buffer_create(screen, 64,
                                           PIPE_BUFFER_USAGE_PIXEL,
                                           tex->stride *
                                           tex->total_nblocksy);
@@ -311,33 +310,22 @@ brw_texture_create_screen(struct pipe_screen *screen,
 
 
 static void
-brw_texture_release_screen(struct pipe_screen *screen,
-                           struct pipe_texture **pt)
+brw_texture_destroy_screen(struct pipe_texture *pt)
 {
-   if (!*pt)
-      return;
+   struct brw_texture *tex = (struct brw_texture *)pt;
+   uint i;
 
    /*
-   DBG("%s %p refcount will be %d\n",
-       __FUNCTION__, (void *) *pt, (*pt)->refcount - 1);
+     DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
    */
-   if (--(*pt)->refcount <= 0) {
-      struct brw_texture *tex = (struct brw_texture *)*pt;
-      uint i;
-
-      /*
-      DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
-      */
 
-      pipe_buffer_reference(screen, &tex->buffer, NULL);
+   pipe_buffer_reference(&tex->buffer, NULL);
 
-      for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
-         if (tex->image_offset[i])
-            free(tex->image_offset[i]);
+   for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
+      if (tex->image_offset[i])
+         free(tex->image_offset[i]);
 
-      free(tex);
-   }
-   *pt = NULL;
+   free(tex);
 }
 
 
@@ -365,7 +353,7 @@ brw_get_tex_surface_screen(struct pipe_screen *screen,
 
    ps = CALLOC_STRUCT(pipe_surface);
    if (ps) {
-      ps->refcount = 1;
+      pipe_reference_init(&ps->reference, 1);
       pipe_texture_reference(&ps->texture, pt);
       ps->format = pt->format;
       ps->width = pt->width[level];
@@ -392,7 +380,7 @@ void
 brw_init_screen_texture_funcs(struct pipe_screen *screen)
 {
    screen->texture_create  = brw_texture_create_screen;
-   screen->texture_release = brw_texture_release_screen;
+   screen->texture_destroy = brw_texture_destroy_screen;
    screen->get_tex_surface = brw_get_tex_surface_screen;
 }
 
index 1bab5bfdb3a9e5f5cf19f5bf6e6e8a3f726c48f0..b5b9e0e7026bc57f9d4ed4b7b34cde8b57a85101 100644 (file)
@@ -242,7 +242,7 @@ static void upload_wm_surfaces(struct brw_context *brw )
       const struct brw_texture *texUnit = brw->attribs.Texture[i];
 
       if (texUnit &&
-         texUnit->base.refcount/*(texUnit->refcount > 0) == really used */) {
+         texUnit->base.reference.count/*(texUnit->reference.count > 0) == really used */) {
 
         brw_update_texture_surface(brw, i);
 
index 029b01e17d519c86312db14d269bb1a0f0fe898d..666e061ac38b07501a532dc5037a5f12974018bb 100644 (file)
@@ -16,7 +16,7 @@ struct nouveau_stateobj_reloc {
 };
 
 struct nouveau_stateobj {
-       int refcount;
+       struct pipe_reference reference;
 
        unsigned *push;
        struct nouveau_stateobj_reloc *reloc;
@@ -32,7 +32,7 @@ so_new(unsigned push, unsigned reloc)
        struct nouveau_stateobj *so;
 
        so = MALLOC(sizeof(struct nouveau_stateobj));
-       so->refcount = 0;
+       pipe_reference_init(&so->reference, 0);
        so->push = MALLOC(sizeof(unsigned) * push);
        so->reloc = MALLOC(sizeof(struct nouveau_stateobj_reloc) * reloc);
 
@@ -47,17 +47,11 @@ so_ref(struct nouveau_stateobj *ref, struct nouveau_stateobj **pso)
 {
        struct nouveau_stateobj *so = *pso;
 
-       if (ref) {
-               ref->refcount++;
-       }
-
-       if (so && --so->refcount <= 0) {
+        if (pipe_reference((struct pipe_reference**)pso, &ref->reference)) {
                free(so->push);
                free(so->reloc);
                free(so);
        }
-
-       *pso = ref;
 }
 
 static INLINE void
index 9acd613e2e401f5181bee44a3b7e5ace5243ed9f..85dc017fbc4260b4aeaf6186811743e002319266 100644 (file)
@@ -41,21 +41,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 +82,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);
@@ -129,7 +123,7 @@ nv04_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        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;
 }
 
index 573b043f5b6c46ca90eb1d7054f66866b661b8bb..e925a44e2980192ce45d3b577f2e2c843603bbda 100644 (file)
@@ -64,7 +64,6 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        if (!tx)
                return NULL;
 
-       tx->base.refcount = 1;
        pipe_texture_reference(&tx->base.texture, pt);
        tx->base.format = pt->format;
        tx->base.x = x;
@@ -138,12 +137,12 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv04_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
+nv04_transfer_del(struct pipe_transfer *ptx)
 {
-       struct pipe_transfer *ptx = *pptx;
        struct nv04_transfer *tx = (struct nv04_transfer *)ptx;
 
        if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+               struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv04_screen *nvscreen = nv04_screen(pscreen);
                struct pipe_surface *dst;
 
@@ -160,10 +159,6 @@ nv04_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
                pipe_surface_reference(&dst, NULL);
        }
 
-       *pptx = NULL;
-       if (--ptx->refcount)
-               return;
-
        pipe_surface_reference(&tx->surface, NULL);
        pipe_texture_reference(&ptx->texture, NULL);
        FREE(ptx);
@@ -195,7 +190,7 @@ void
 nv04_screen_init_transfer_functions(struct pipe_screen *pscreen)
 {
        pscreen->get_tex_transfer = nv04_transfer_new;
-       pscreen->tex_transfer_release = nv04_transfer_del;
+       pscreen->tex_transfer_destroy = nv04_transfer_del;
        pscreen->transfer_map = nv04_transfer_map;
        pscreen->transfer_unmap = nv04_transfer_unmap;
 }
index 4747868a508ca618f16ada03bda924893d77d45a..bb3a1c0f19e83ba74e065813bdd5dc17fcb10f10 100644 (file)
@@ -66,31 +66,30 @@ nv10_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 struct pipe_texture *
 nv10_miptree_create(struct pipe_screen *screen, const struct pipe_texture *pt)
 {
-       struct pipe_winsys *ws = screen->winsys;
        struct nv10_miptree *mt;
 
        mt = MALLOC(sizeof(struct nv10_miptree));
        if (!mt)
                return NULL;
        mt->base = *pt;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = screen;
 
        nv10_miptree_layout(mt);
 
-       mt->buffer = ws->buffer_create(ws, 256, PIPE_BUFFER_USAGE_PIXEL,
+       mt->buffer = screen->buffer_create(screen, 256, PIPE_BUFFER_USAGE_PIXEL,
                                           mt->total_size);
        if (!mt->buffer) {
                FREE(mt);
@@ -101,22 +100,17 @@ nv10_miptree_create(struct pipe_screen *screen, const struct pipe_texture *pt)
 }
 
 static void
-nv10_miptree_release(struct pipe_screen *screen, struct pipe_texture **pt)
+nv10_miptree_destroy(struct pipe_texture *pt)
 {
-       struct pipe_texture *mt = *pt;
-
-       *pt = NULL;
-       if (--mt->refcount <= 0) {
-               struct nv10_miptree *nv10mt = (struct nv10_miptree *)mt;
-               int l;
-
-               pipe_buffer_reference(screen, &nv10mt->buffer, NULL);
-               for (l = 0; l <= mt->last_level; l++) {
-                       if (nv10mt->level[l].image_offset)
-                               FREE(nv10mt->level[l].image_offset);
-               }
-               FREE(nv10mt);
-       }
+       struct nv10_miptree *nv10mt = (struct nv10_miptree *)pt;
+        int l;
+
+        pipe_buffer_reference(&nv10mt->buffer, NULL);
+        for (l = 0; l <= pt->last_level; l++) {
+               if (nv10mt->level[l].image_offset)
+                       FREE(nv10mt->level[l].image_offset);
+        }
+        FREE(nv10mt);
 }
 
 static void
@@ -143,7 +137,7 @@ nv10_miptree_surface_get(struct pipe_screen *screen, struct pipe_texture *pt,
        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;
@@ -159,8 +153,7 @@ nv10_miptree_surface_get(struct pipe_screen *screen, struct pipe_texture *pt,
 }
 
 static void
-nv10_miptree_surface_release(struct pipe_screen *screen,
-                            struct pipe_surface **surface)
+nv10_miptree_surface_destroy(struct pipe_surface *surface)
 {
 }
 
@@ -168,8 +161,8 @@ void nv10_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv10_miptree_create;
        pscreen->texture_blanket = nv10_miptree_blanket;
-       pscreen->texture_release = nv10_miptree_release;
+       pscreen->texture_destroy = nv10_miptree_destroy;
        pscreen->get_tex_surface = nv10_miptree_surface_get;
-       pscreen->tex_surface_release = nv10_miptree_surface_release;
+       pscreen->tex_surface_destroy = nv10_miptree_surface_destroy;
 }
 
index 491a8818068b7fad83660c79d622c32a3138ce6d..089c236302a5c02d637581b823a8132cce028248 100644 (file)
@@ -106,11 +106,11 @@ nv10_vbuf_render_allocate_vertices( struct vbuf_render *render,
 {
        struct nv10_vbuf_render *nv10_render = nv10_vbuf_render(render);
        struct nv10_context *nv10 = nv10_render->nv10;
-       struct pipe_winsys *winsys = nv10->pipe.winsys;
+       struct pipe_screen *screen = nv10->pipe.screen;
        size_t size = (size_t)vertex_size * (size_t)nr_vertices;
 
        assert(!nv10_render->buffer);
-       nv10_render->buffer = winsys->buffer_create(winsys, 64, PIPE_BUFFER_USAGE_VERTEX, size);
+       nv10_render->buffer = screen->buffer_create(screen, 64, PIPE_BUFFER_USAGE_VERTEX, size);
 
        nv10->dirty |= NV10_NEW_VTXARRAYS;
 
@@ -206,7 +206,7 @@ nv10_vbuf_render_release_vertices( struct vbuf_render *render )
        struct pipe_screen *pscreen = &nv10->screen->pipe;
 
        assert(nv10_render->buffer);
-       pipe_buffer_reference(pscreen, &nv10_render->buffer, NULL);
+       pipe_buffer_reference(&nv10_render->buffer, NULL);
 }
 
 
index daec37ab28ef02820a3f8a5ca95455fc5e688cdd..5a99225409c3acc78108e525c5d7e197fdf751a0 100644 (file)
@@ -64,7 +64,6 @@ nv10_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        if (!tx)
                return NULL;
 
-       tx->base.refcount = 1;
        pipe_texture_reference(&tx->base.texture, pt);
        tx->base.format = pt->format;
        tx->base.x = x;
@@ -138,12 +137,12 @@ nv10_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv10_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
+nv10_transfer_del(struct pipe_transfer *ptx)
 {
-       struct pipe_transfer *ptx = *pptx;
        struct nv10_transfer *tx = (struct nv10_transfer *)ptx;
 
        if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+               struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv10_screen *nvscreen = nv10_screen(pscreen);
                struct pipe_surface *dst;
 
@@ -160,10 +159,6 @@ nv10_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
                pipe_surface_reference(&dst, NULL);
        }
 
-       *pptx = NULL;
-       if (--ptx->refcount)
-               return;
-
        pipe_surface_reference(&tx->surface, NULL);
        pipe_texture_reference(&ptx->texture, NULL);
        FREE(ptx);
@@ -195,7 +190,7 @@ void
 nv10_screen_init_transfer_functions(struct pipe_screen *pscreen)
 {
        pscreen->get_tex_transfer = nv10_transfer_new;
-       pscreen->tex_transfer_release = nv10_transfer_del;
+       pscreen->tex_transfer_destroy = nv10_transfer_del;
        pscreen->transfer_map = nv10_transfer_map;
        pscreen->transfer_unmap = nv10_transfer_unmap;
 }
index 29462408970732329f74eb8b9c47992e6120c6ab..b2f29aff8d28a5d54231ec322f87f4d798d3e383 100644 (file)
@@ -76,19 +76,18 @@ nv20_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 struct pipe_texture *
 nv20_miptree_create(struct pipe_screen *screen, const struct pipe_texture *pt)
 {
-       struct pipe_winsys *ws = screen->winsys;
        struct nv20_miptree *mt;
        unsigned buf_usage = PIPE_BUFFER_USAGE_PIXEL |
                             NOUVEAU_BUFFER_USAGE_TEXTURE;
@@ -97,7 +96,7 @@ nv20_miptree_create(struct pipe_screen *screen, const struct pipe_texture *pt)
        if (!mt)
                return NULL;
        mt->base = *pt;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = screen;
 
        /* Swizzled textures must be POT */
@@ -133,7 +132,7 @@ nv20_miptree_create(struct pipe_screen *screen, const struct pipe_texture *pt)
 
        nv20_miptree_layout(mt);
 
-       mt->buffer = ws->buffer_create(ws, 256, buf_usage, mt->total_size);
+       mt->buffer = screen->buffer_create(screen, 256, buf_usage, mt->total_size);
        if (!mt->buffer) {
                FREE(mt);
                return NULL;
@@ -143,22 +142,16 @@ nv20_miptree_create(struct pipe_screen *screen, const struct pipe_texture *pt)
 }
 
 static void
-nv20_miptree_release(struct pipe_screen *screen, struct pipe_texture **pt)
+nv20_miptree_destroy(struct pipe_texture *pt)
 {
-       struct pipe_texture *mt = *pt;
-
-       *pt = NULL;
-       if (--mt->refcount <= 0) {
-               struct nv20_miptree *nv20mt = (struct nv20_miptree *)mt;
-               int l;
+       struct nv20_miptree *nv20mt = (struct nv20_miptree *)pt;
+        int l;
 
-               pipe_buffer_reference(screen, &nv20mt->buffer, NULL);
-               for (l = 0; l <= mt->last_level; l++) {
-                       if (nv20mt->level[l].image_offset)
-                               FREE(nv20mt->level[l].image_offset);
-               }
-               FREE(nv20mt);
-       }
+        pipe_buffer_reference(&nv20mt->buffer, NULL);
+        for (l = 0; l <= pt->last_level; l++) {
+               if (nv20mt->level[l].image_offset)
+                       FREE(nv20mt->level[l].image_offset);
+        }
 }
 
 static struct pipe_surface *
@@ -178,7 +171,7 @@ nv20_miptree_surface_get(struct pipe_screen *screen, struct pipe_texture *pt,
        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;
@@ -197,15 +190,8 @@ nv20_miptree_surface_get(struct pipe_screen *screen, struct pipe_texture *pt,
 }
 
 static void
-nv20_miptree_surface_release(struct pipe_screen *pscreen,
-                            struct pipe_surface **psurface)
+nv20_miptree_surface_destroy(struct pipe_surface *ps)
 {
-       struct pipe_surface *ps = *psurface;
-
-       *psurface = NULL;
-       if (--ps->refcount > 0)
-               return;
-
        pipe_texture_reference(&ps->texture, NULL);
        FREE(ps);
 }
@@ -214,8 +200,8 @@ void nv20_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv20_miptree_create;
        pscreen->texture_blanket = nv20_miptree_blanket;
-       pscreen->texture_release = nv20_miptree_release;
+       pscreen->texture_destroy = nv20_miptree_destroy;
        pscreen->get_tex_surface = nv20_miptree_surface_get;
-       pscreen->tex_surface_release = nv20_miptree_surface_release;
+       pscreen->tex_surface_destroy = nv20_miptree_surface_destroy;
 }
 
index 319e1f65572dece2ca1e02dcb02d854533e5dcfc..8aa342cd2db5a180663d3541f32fe2378a94c1c8 100644 (file)
@@ -112,8 +112,8 @@ nv20__allocate_mbuffer(struct nv20_vbuf_render *nv20_render, size_t size)
 static void
 nv20__allocate_pbuffer(struct nv20_vbuf_render *nv20_render, size_t size)
 {
-       struct pipe_winsys *winsys = nv20_render->nv20->pipe.winsys;
-       nv20_render->pbuffer = winsys->buffer_create(winsys, 64,
+       struct pipe_screen *screen = nv20_render->nv20->pipe.screen;
+       nv20_render->pbuffer = screen->buffer_create(screen, 64,
                                        PIPE_BUFFER_USAGE_VERTEX, size);
 }
 
@@ -361,7 +361,7 @@ nv20_vbuf_render_release_vertices( struct vbuf_render *render )
        struct pipe_screen *pscreen = &nv20->screen->pipe;
 
        if (nv20_render->pbuffer) {
-               pipe_buffer_reference(pscreen, &nv20_render->pbuffer, NULL);
+               pipe_buffer_reference(&nv20_render->pbuffer, NULL);
        } else if (nv20_render->mbuffer) {
                FREE(nv20_render->mbuffer);
                nv20_render->mbuffer = NULL;
index 1631637067dfb256f75a0e4c7fead0448a1fe56f..e5255296aaed2ab0e227af2a61505d7f8829db44 100644 (file)
@@ -64,7 +64,6 @@ nv20_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        if (!tx)
                return NULL;
 
-       tx->base.refcount = 1;
        pipe_texture_reference(&tx->base.texture, pt);
        tx->base.format = pt->format;
        tx->base.x = x;
@@ -138,12 +137,12 @@ nv20_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv20_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
+nv20_transfer_del(struct pipe_transfer *ptx)
 {
-       struct pipe_transfer *ptx = *pptx;
        struct nv20_transfer *tx = (struct nv20_transfer *)ptx;
 
        if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+               struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv20_screen *nvscreen = nv20_screen(pscreen);
                struct pipe_surface *dst;
 
@@ -160,10 +159,6 @@ nv20_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
                pipe_surface_reference(&dst, NULL);
        }
 
-       *pptx = NULL;
-       if (--ptx->refcount)
-               return;
-
        pipe_surface_reference(&tx->surface, NULL);
        pipe_texture_reference(&ptx->texture, NULL);
        FREE(ptx);
@@ -195,7 +190,7 @@ void
 nv20_screen_init_transfer_functions(struct pipe_screen *pscreen)
 {
        pscreen->get_tex_transfer = nv20_transfer_new;
-       pscreen->tex_transfer_release = nv20_transfer_del;
+       pscreen->tex_transfer_destroy = nv20_transfer_del;
        pscreen->transfer_map = nv20_transfer_map;
        pscreen->transfer_unmap = nv20_transfer_unmap;
 }
index 320ba3f4bf42c0ba20b1f5538fbfa6cdd6aadcf9..0da392fed338813fdba38a39aa458cccdc0b1ec1 100644 (file)
@@ -834,6 +834,7 @@ nv30_fragprog_validate(struct nv30_context *nv30)
        struct nv30_fragment_program *fp = nv30->fragprog;
        struct pipe_buffer *constbuf =
                nv30->constbuf[PIPE_SHADER_FRAGMENT];
+       struct pipe_screen *screen = nv30->pipe.screen;
        struct pipe_winsys *ws = nv30->pipe.winsys;
        struct nouveau_stateobj *so;
        boolean new_consts = FALSE;
@@ -849,7 +850,7 @@ nv30_fragprog_validate(struct nv30_context *nv30)
                return FALSE;
        }
 
-       fp->buffer = ws->buffer_create(ws, 0x100, 0, fp->insn_len * 4);
+       fp->buffer = screen->buffer_create(screen, 0x100, 0, fp->insn_len * 4);
        nv30_fragprog_upload(nv30, fp);
 
        so = so_new(8, 1);
index ec0a8b8438cf792be035561c59259d27be5fc053..d6dc621c9eea4972bc6111039d51255065a8c99c 100644 (file)
@@ -67,7 +67,6 @@ nv30_miptree_layout(struct nv30_miptree *nv30mt)
 static struct pipe_texture *
 nv30_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
 {
-       struct pipe_winsys *ws = pscreen->winsys;
        struct nv30_miptree *mt;
        unsigned buf_usage = PIPE_BUFFER_USAGE_PIXEL |
                             NOUVEAU_BUFFER_USAGE_TEXTURE;
@@ -76,7 +75,7 @@ nv30_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
        if (!mt)
                return NULL;
        mt->base = *pt;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = pscreen;
 
        /* Swizzled textures must be POT */
@@ -112,7 +111,7 @@ nv30_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
 
        nv30_miptree_layout(mt);
 
-       mt->buffer = ws->buffer_create(ws, 256, buf_usage,
+       mt->buffer = pscreen->buffer_create(pscreen, 256, buf_usage,
                                       mt->total_size);
        if (!mt->buffer) {
                FREE(mt);
@@ -138,27 +137,22 @@ nv30_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
-nv30_miptree_release(struct pipe_screen *pscreen, struct pipe_texture **ppt)
+nv30_miptree_destroy(struct pipe_texture *pt)
 {
-       struct pipe_texture *pt = *ppt;
        struct nv30_miptree *mt = (struct nv30_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);
@@ -184,7 +178,7 @@ nv30_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        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;
@@ -203,15 +197,8 @@ nv30_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv30_miptree_surface_del(struct pipe_screen *pscreen,
-                        struct pipe_surface **psurface)
+nv30_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);
 }
@@ -221,7 +208,7 @@ nv30_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv30_miptree_create;
        pscreen->texture_blanket = nv30_miptree_blanket;
-       pscreen->texture_release = nv30_miptree_release;
+       pscreen->texture_destroy = nv30_miptree_destroy;
        pscreen->get_tex_surface = nv30_miptree_surface_new;
-       pscreen->tex_surface_release = nv30_miptree_surface_del;
+       pscreen->tex_surface_destroy = nv30_miptree_surface_del;
 }
index 6367374a61612c2fa54774ed86dd2c052b05cf7e..8b915b35bd4c01ff2b7e8477728db5c4480bd167 100644 (file)
@@ -64,7 +64,6 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        if (!tx)
                return NULL;
 
-       tx->base.refcount = 1;
        pipe_texture_reference(&tx->base.texture, pt);
        tx->base.format = pt->format;
        tx->base.x = x;
@@ -138,12 +137,12 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv30_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
+nv30_transfer_del(struct pipe_transfer *ptx)
 {
-       struct pipe_transfer *ptx = *pptx;
        struct nv30_transfer *tx = (struct nv30_transfer *)ptx;
 
        if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+               struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv30_screen *nvscreen = nv30_screen(pscreen);
                struct pipe_surface *dst;
 
@@ -160,10 +159,6 @@ nv30_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
                pipe_surface_reference(&dst, NULL);
        }
 
-       *pptx = NULL;
-       if (--ptx->refcount)
-               return;
-
        pipe_surface_reference(&tx->surface, NULL);
        pipe_texture_reference(&ptx->texture, NULL);
        FREE(ptx);
@@ -195,7 +190,7 @@ void
 nv30_screen_init_transfer_functions(struct pipe_screen *pscreen)
 {
        pscreen->get_tex_transfer = nv30_transfer_new;
-       pscreen->tex_transfer_release = nv30_transfer_del;
+       pscreen->tex_transfer_destroy = nv30_transfer_del;
        pscreen->transfer_map = nv30_transfer_map;
        pscreen->transfer_unmap = nv30_transfer_unmap;
 }
index 91dcbebda0d03723efbb6a4167b91e9a75452cf1..1031e87e970aa245befe5e4617a0a8ace9796020 100644 (file)
@@ -917,6 +917,7 @@ nv40_fragprog_validate(struct nv40_context *nv40)
        struct nv40_fragment_program *fp = nv40->fragprog;
        struct pipe_buffer *constbuf =
                nv40->constbuf[PIPE_SHADER_FRAGMENT];
+       struct pipe_screen *screen = nv40->pipe.screen;
        struct pipe_winsys *ws = nv40->pipe.winsys;
        struct nouveau_stateobj *so;
        boolean new_consts = FALSE;
@@ -932,7 +933,7 @@ nv40_fragprog_validate(struct nv40_context *nv40)
                return FALSE;
        }
 
-       fp->buffer = ws->buffer_create(ws, 0x100, 0, fp->insn_len * 4);
+       fp->buffer = screen->buffer_create(screen, 0x100, 0, fp->insn_len * 4);
        nv40_fragprog_upload(nv40, fp);
 
        so = so_new(4, 1);
index 638d279aa5a051270262c5b6144f5f3d6fff97c6..abadca8c933d53e0b464e0d84b945d33e0eeb588 100644 (file)
@@ -67,7 +67,6 @@ nv40_miptree_layout(struct nv40_miptree *mt)
 static struct pipe_texture *
 nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
 {
-       struct pipe_winsys *ws = pscreen->winsys;
        struct nv40_miptree *mt;
        unsigned buf_usage = PIPE_BUFFER_USAGE_PIXEL |
                             NOUVEAU_BUFFER_USAGE_TEXTURE;
@@ -76,7 +75,7 @@ nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
        if (!mt)
                return NULL;
        mt->base = *pt;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = pscreen;
 
        /* Swizzled textures must be POT */
@@ -112,7 +111,7 @@ nv40_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *pt)
 
        nv40_miptree_layout(mt);
 
-       mt->buffer = ws->buffer_create(ws, 256, buf_usage, mt->total_size);
+       mt->buffer = pscreen->buffer_create(pscreen, 256, buf_usage, mt->total_size);
        if (!mt->buffer) {
                FREE(mt);
                return NULL;
@@ -137,27 +136,22 @@ nv40_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
-nv40_miptree_release(struct pipe_screen *pscreen, struct pipe_texture **ppt)
+nv40_miptree_destroy(struct pipe_texture *pt)
 {
-       struct pipe_texture *pt = *ppt;
        struct nv40_miptree *mt = (struct nv40_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);
@@ -183,7 +177,7 @@ nv40_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        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;
@@ -202,15 +196,8 @@ nv40_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv40_miptree_surface_del(struct pipe_screen *pscreen,
-                        struct pipe_surface **psurface)
+nv40_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);
 }
@@ -220,8 +207,8 @@ nv40_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv40_miptree_create;
        pscreen->texture_blanket = nv40_miptree_blanket;
-       pscreen->texture_release = nv40_miptree_release;
+       pscreen->texture_destroy = nv40_miptree_destroy;
        pscreen->get_tex_surface = nv40_miptree_surface_new;
-       pscreen->tex_surface_release = nv40_miptree_surface_del;
+       pscreen->tex_surface_destroy = nv40_miptree_surface_del;
 }
 
index f762f32f0c352c4dcb2771e8402c27735f4c2eff..728e8b56745e117e8038572265f400ce1d462cbc 100644 (file)
@@ -64,7 +64,6 @@ nv40_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        if (!tx)
                return NULL;
 
-       tx->base.refcount = 1;
        pipe_texture_reference(&tx->base.texture, pt);
        tx->base.format = pt->format;
        tx->base.x = x;
@@ -138,12 +137,12 @@ nv40_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv40_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
+nv40_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
 {
-       struct pipe_transfer *ptx = *pptx;
        struct nv40_transfer *tx = (struct nv40_transfer *)ptx;
 
        if (!tx->direct && ptx->usage != PIPE_TRANSFER_READ) {
+               struct pipe_screen *pscreen = ptx->texture->screen;
                struct nv40_screen *nvscreen = nv40_screen(pscreen);
                struct pipe_surface *dst;
 
@@ -160,10 +159,6 @@ nv40_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
                pipe_surface_reference(&dst, NULL);
        }
 
-       *pptx = NULL;
-       if (--ptx->refcount)
-               return;
-
        pipe_surface_reference(&tx->surface, NULL);
        pipe_texture_reference(&ptx->texture, NULL);
        FREE(ptx);
@@ -195,7 +190,7 @@ void
 nv40_screen_init_transfer_functions(struct pipe_screen *pscreen)
 {
        pscreen->get_tex_transfer = nv40_transfer_new;
-       pscreen->tex_transfer_release = nv40_transfer_del;
+       pscreen->tex_transfer_destroy = nv40_transfer_del;
        pscreen->transfer_map = nv40_transfer_map;
        pscreen->transfer_unmap = nv40_transfer_unmap;
 }
index 24a68b7235f20ffd04dda79b0da7e386acb880fd..dc4688ccdc46bdc645be0b326bfb6a7a9528fbac 100644 (file)
@@ -29,7 +29,6 @@
 static struct pipe_texture *
 nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
 {
-       struct pipe_winsys *ws = pscreen->winsys;
        struct nv50_miptree *mt = CALLOC_STRUCT(nv50_miptree);
        struct pipe_texture *pt = &mt->base;
        unsigned usage, width = tmp->width[0], height = tmp->height[0];
@@ -37,7 +36,7 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
        int i, l;
 
        mt->base = *tmp;
-       mt->base.refcount = 1;
+       pipe_reference_init(&mt->base.reference, 1);
        mt->base.screen = pscreen;
 
        usage = PIPE_BUFFER_USAGE_PIXEL;
@@ -94,7 +93,7 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_texture *tmp)
                }
        }
 
-       mt->buffer = ws->buffer_create(ws, 256, usage, mt->total_size);
+       mt->buffer = pscreen->buffer_create(pscreen, 256, usage, mt->total_size);
        if (!mt->buffer) {
                FREE(mt);
                return NULL;
@@ -119,29 +118,23 @@ nv50_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->image_nr = 1;
        mt->level[0].pitch = *stride;
        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
-nv50_miptree_release(struct pipe_screen *pscreen, struct pipe_texture **ppt)
+nv50_miptree_destroy(struct pipe_texture *pt)
 {
-       struct pipe_texture *pt = *ppt;
-
-       *ppt = NULL;
-
-       if (--pt->refcount <= 0) {
-               struct nv50_miptree *mt = nv50_miptree(pt);
+       struct nv50_miptree *mt = nv50_miptree(pt);
 
-               pipe_buffer_reference(pscreen, &mt->buffer, NULL);
-               FREE(mt);
-       }
+        pipe_buffer_reference(&mt->buffer, NULL);
+        FREE(mt);
 }
 
 static struct pipe_surface *
@@ -171,7 +164,7 @@ nv50_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        ps->height = pt->height[level];
        ps->usage = flags;
        ps->status = PIPE_SURFACE_STATUS_DEFINED;
-       ps->refcount = 1;
+       pipe_reference_init(&ps->reference, 1);
        ps->face = face;
        ps->level = level;
        ps->zslice = zslice;
@@ -181,18 +174,12 @@ nv50_miptree_surface_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv50_miptree_surface_del(struct pipe_screen *pscreen,
-                        struct pipe_surface **psurface)
+nv50_miptree_surface_del(struct pipe_surface *ps)
 {
-       struct pipe_surface *ps = *psurface;
        struct nv50_surface *s = nv50_surface(ps);
 
-       *psurface = NULL;
-
-       if (--ps->refcount <= 0) {
-               pipe_texture_reference(&ps->texture, NULL);
-               FREE(s);
-       }
+        pipe_texture_reference(&ps->texture, NULL);
+        FREE(s);
 }
 
 void
@@ -200,8 +187,8 @@ nv50_screen_init_miptree_functions(struct pipe_screen *pscreen)
 {
        pscreen->texture_create = nv50_miptree_create;
        pscreen->texture_blanket = nv50_miptree_blanket;
-       pscreen->texture_release = nv50_miptree_release;
+       pscreen->texture_destroy = nv50_miptree_destroy;
        pscreen->get_tex_surface = nv50_miptree_surface_new;
-       pscreen->tex_surface_release = nv50_miptree_surface_del;
+       pscreen->tex_surface_destroy = nv50_miptree_surface_del;
 }
 
index 14c5d47e790d3a90eb62dc0b08262c0f38be1d36..308eb34784c1bcac257974c66ed6e322d28c7b65 100644 (file)
@@ -1603,7 +1603,7 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
 {
        struct nouveau_channel *chan = nv50->screen->nvws->channel;
        struct nouveau_grobj *tesla = nv50->screen->tesla;
-       struct pipe_winsys *ws = nv50->pipe.winsys;
+       struct pipe_screen *screen = nv50->pipe.screen;
        struct nv50_program_exec *e;
        struct nouveau_stateobj *so;
        const unsigned flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR;
@@ -1611,7 +1611,7 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
        boolean upload = FALSE;
 
        if (!p->buffer) {
-               p->buffer = ws->buffer_create(ws, 0x100, 0, p->exec_size * 4);
+               p->buffer = screen->buffer_create(screen, 0x100, 0, p->exec_size * 4);
                upload = TRUE;
        }
 
@@ -1775,7 +1775,7 @@ nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p)
        p->exec_size = 0;
 
        if (p->buffer)
-               pipe_buffer_reference(pscreen, &p->buffer, NULL);
+               pipe_buffer_reference(&p->buffer, NULL);
 
        nv50->screen->nvws->res_free(&p->data);
 
index 7c8831a46dedd32f583e41c1185bf1479b781a85..a2c56f99a89b9da49312317fe3f8043112acfc19 100644 (file)
@@ -41,13 +41,13 @@ nv50_query(struct pipe_query *pipe)
 static struct pipe_query *
 nv50_query_create(struct pipe_context *pipe, unsigned type)
 {
-       struct pipe_winsys *ws = pipe->winsys;
+       struct pipe_screen *screen = pipe->winsys;
        struct nv50_query *q = CALLOC_STRUCT(nv50_query);
 
        assert (q->type == PIPE_QUERY_OCCLUSION_COUNTER);
        q->type = type;
 
-       q->buffer = ws->buffer_create(ws, 256, 0, 16);
+       q->buffer = screen->buffer_create(screen, 256, 0, 16);
        if (!q->buffer) {
                FREE(q);
                return NULL;
@@ -62,7 +62,7 @@ nv50_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
        struct nv50_query *q = nv50_query(pq);
 
        if (q) {
-               pipe_buffer_reference(pipe->screen, &q->buffer, NULL);
+               pipe_buffer_reference(&q->buffer, NULL);
                FREE(q);
        }
 }
index ee24405d36ddbf00bae679070a7eb97a52f3019e..bbfe42e478999a2c5d020e0b1ecac97e2bfb5330 100644 (file)
@@ -285,7 +285,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so_data  (so, 8);
 
        /* Shared constant buffer */
-       screen->constbuf = ws->buffer_create(ws, 0, 0, 128 * 4 * 4);
+       screen->constbuf = screen->pipe.buffer_create(&screen->pipe, 0, 0, 128 * 4 * 4);
        if (nvws->res_init(&screen->vp_data_heap, 0, 128)) {
                NOUVEAU_ERR("Error initialising constant buffer\n");
                nv50_screen_destroy(&screen->pipe);
@@ -304,7 +304,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
         * blocks.  At some point we *may* want to go the NVIDIA way of doing
         * things?
         */
-       screen->tic = ws->buffer_create(ws, 0, 0, 32 * 8 * 4);
+       screen->tic = screen->pipe.buffer_create(&screen->pipe, 0, 0, 32 * 8 * 4);
        so_method(so, screen->tesla, 0x1280, 3);
        so_reloc (so, screen->tic, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
@@ -318,7 +318,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                  NOUVEAU_BO_RD | NOUVEAU_BO_LOW, 0, 0);
        so_data  (so, 0x00000800);
 
-       screen->tsc = ws->buffer_create(ws, 0, 0, 32 * 8 * 4);
+       screen->tsc = screen->pipe.buffer_create(&screen->pipe, 0, 0, 32 * 8 * 4);
        so_method(so, screen->tesla, 0x1280, 3);
        so_reloc (so, screen->tsc, 0, NOUVEAU_BO_VRAM |
                  NOUVEAU_BO_RD | NOUVEAU_BO_HIGH, 0, 0);
index a00c999510d153786ac1a319a610162a42f91156..747195b4f6370555c6cecafee36b8c63e4c5f8f9 100644 (file)
@@ -123,7 +123,6 @@ nv50_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        if (!tx)
                return NULL;
 
-       tx->base.refcount = 1;
        pipe_texture_reference(&tx->base.texture, pt);
        tx->base.format = pt->format;
        tx->base.width = w;
@@ -158,17 +157,13 @@ nv50_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv50_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
+nv50_transfer_del(struct pipe_transfer *ptx)
 {
-       struct pipe_transfer *ptx = *pptx;
        struct nv50_transfer *tx = (struct nv50_transfer *)ptx;
        struct nv50_miptree *mt = nv50_miptree(ptx->texture);
 
-       *pptx = NULL;
-       if (--ptx->refcount)
-               return;
-
        if (ptx->usage != PIPE_TRANSFER_READ) {
+               struct pipe_screen *pscreen = ptx->texture->screen;
                nv50_transfer_rect_m2mf(pscreen, tx->buffer, tx->base.stride,
                                        0, 0, tx->base.width, tx->base.height,
                                        mt->buffer, tx->level_pitch,
@@ -179,7 +174,7 @@ nv50_transfer_del(struct pipe_screen *pscreen, struct pipe_transfer **pptx)
                                        NOUVEAU_BO_VRAM | NOUVEAU_BO_GART);
        }
 
-       pipe_buffer_reference(pscreen, &tx->buffer, NULL);
+       pipe_buffer_reference(&tx->buffer, NULL);
        pipe_texture_reference(&ptx->texture, NULL);
        FREE(ptx);
 }
@@ -210,7 +205,7 @@ void
 nv50_transfer_init_screen_functions(struct pipe_screen *pscreen)
 {
        pscreen->get_tex_transfer = nv50_transfer_new;
-       pscreen->tex_transfer_release = nv50_transfer_del;
+       pscreen->tex_transfer_destroy = nv50_transfer_del;
        pscreen->transfer_map = nv50_transfer_map;
        pscreen->transfer_unmap = nv50_transfer_unmap;
 }
index e97334463a3f366d4851fb9709577fbdd4cf6069..3c91967a72ebf01e6ebdc59b1754e55c9c8c90e4 100644 (file)
@@ -268,7 +268,6 @@ r300_get_tex_transfer(struct pipe_screen *screen,
 
     trans = CALLOC_STRUCT(r300_transfer);
     if (trans) {
-        trans->transfer.refcount = 1;
         pipe_texture_reference(&trans->transfer.texture, texture);
         trans->transfer.format = trans->transfer.format;
         trans->transfer.width = w;
@@ -284,17 +283,10 @@ r300_get_tex_transfer(struct pipe_screen *screen,
 }
 
 static void
-r300_tex_transfer_release(struct pipe_screen *screen,
-                          struct pipe_transfer **transfer)
+r300_tex_transfer_destroy(struct pipe_transfer *trans)
 {
-   struct pipe_transfer *trans = *transfer;
-
-   if (--trans->refcount == 0) {
-      pipe_texture_reference(&trans->texture, NULL);
-      FREE(trans);
-   }
-
-   *transfer = NULL;
+   pipe_texture_reference(&trans->texture, NULL);
+   FREE(trans);
 }
 
 static void* r300_transfer_map(struct pipe_screen* screen,
@@ -359,7 +351,7 @@ struct pipe_screen* r300_create_screen(struct r300_winsys* r300_winsys)
     r300screen->screen.get_paramf = r300_get_paramf;
     r300screen->screen.is_format_supported = r300_is_format_supported;
     r300screen->screen.get_tex_transfer = r300_get_tex_transfer;
-    r300screen->screen.tex_transfer_release = r300_tex_transfer_release;
+    r300screen->screen.tex_transfer_destroy = r300_tex_transfer_destroy;
     r300screen->screen.transfer_map = r300_transfer_map;
     r300screen->screen.transfer_unmap = r300_transfer_unmap;
 
index f9baaade1e3b9c702fa5916bb4ecfa88c4d31505..01235674ac8689e6c5a21a9ff56fcbba829c291a 100644 (file)
@@ -79,7 +79,7 @@ static boolean r300_swtcl_render_allocate_vertices(struct vbuf_render* render,
     size_t size = (size_t)vertex_size * (size_t)count;
 
     if (r300render->vbo) {
-        pipe_buffer_reference(screen, &r300render->vbo, NULL);
+        pipe_buffer_reference(&r300render->vbo, NULL);
     }
 
     r300render->vbo_size = MAX2(size, r300render->vbo_alloc_size);
@@ -125,9 +125,8 @@ static void r300_swtcl_render_unmap_vertices(struct vbuf_render* render,
 static void r300_swtcl_render_release_vertices(struct vbuf_render* render)
 {
     struct r300_swtcl_render* r300render = r300_swtcl_render(render);
-    struct pipe_screen* screen = r300render->r300->context.screen;
 
-    pipe_buffer_reference(screen, &r300render->vbo, NULL);
+    pipe_buffer_reference(&r300render->vbo, NULL);
 }
 
 static boolean r300_swtcl_render_set_primitive(struct vbuf_render* render,
index b3425587e3806fa4ca31a6842e2f03d4a4399449..b7027553b578e6fbdc47861609a835562a2ab049 100644 (file)
@@ -68,7 +68,7 @@ static struct pipe_texture*
     }
 
     tex->tex = *template;
-    tex->tex.refcount = 1;
+    pipe_reference_init(&tex->tex.reference, 1);
     tex->tex.screen = screen;
 
     r300_setup_miptree(tex);
@@ -85,24 +85,13 @@ static struct pipe_texture*
     return (struct pipe_texture*)tex;
 }
 
-static void r300_texture_release(struct pipe_screen* screen,
-                                 struct pipe_texture** texture)
+static void r300_texture_destroy(struct pipe_texture* texture)
 {
-    if (!*texture) {
-        return;
-    }
-
-    (*texture)->refcount--;
-
-    if ((*texture)->refcount <= 0) {
-        struct r300_texture* tex = (struct r300_texture*)*texture;
+    struct r300_texture* tex = (struct r300_texture*)texture;
 
-        pipe_buffer_reference(screen, &tex->buffer, NULL);
+    pipe_buffer_reference(&tex->buffer, NULL);
 
-        FREE(tex);
-    }
-
-    *texture = NULL;
+    FREE(tex);
 }
 
 static struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,
@@ -120,7 +109,7 @@ static struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,
     offset = tex->offset[level];
 
     if (surface) {
-        surface->refcount = 1;
+        pipe_reference_init(&surface->reference, 1);
         pipe_texture_reference(&surface->texture, texture);
         surface->format = texture->format;
         surface->width = texture->width[level];
@@ -133,19 +122,10 @@ static struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,
     return surface;
 }
 
-static void r300_tex_surface_release(struct pipe_screen* screen,
-                                     struct pipe_surface** surface)
+static void r300_tex_surface_destroy(struct pipe_surface* s)
 {
-    struct pipe_surface* s = *surface;
-
-    s->refcount--;
-
-    if (s->refcount <= 0) {
-        pipe_texture_reference(&s->texture, NULL);
-        FREE(s);
-    }
-
-    *surface = NULL;
+    pipe_texture_reference(&s->texture, NULL);
+    FREE(s);
 }
 
 static struct pipe_texture*
@@ -168,12 +148,12 @@ static struct pipe_texture*
     }
 
     tex->tex = *base;
-    tex->tex.refcount = 1;
+    pipe_reference_init(&tex->tex.reference, 1);
     tex->tex.screen = screen;
 
     tex->stride = *stride;
 
-    pipe_buffer_reference(screen, &tex->buffer, buffer);
+    pipe_buffer_reference(&tex->buffer, buffer);
 
     return (struct pipe_texture*)tex;
 }
@@ -181,9 +161,9 @@ static struct pipe_texture*
 void r300_init_screen_texture_functions(struct pipe_screen* screen)
 {
     screen->texture_create = r300_texture_create;
-    screen->texture_release = r300_texture_release;
+    screen->texture_destroy = r300_texture_destroy;
     screen->get_tex_surface = r300_get_tex_surface;
-    screen->tex_surface_release = r300_tex_surface_release;
+    screen->tex_surface_destroy = r300_tex_surface_destroy;
     screen->texture_blanket = r300_texture_blanket;
 }
 
@@ -196,7 +176,7 @@ boolean r300_get_texture_buffer(struct pipe_texture* texture,
         return FALSE;
     }
 
-    pipe_buffer_reference(texture->screen, buffer, tex->buffer);
+    pipe_buffer_reference(buffer, tex->buffer);
 
     if (stride) {
         *stride = tex->stride;
index ff5d1b54a4c793398ca49a18162c2f85f3d2d568..cc552c4915b3145245b08601600a236be356c5f7 100644 (file)
@@ -87,7 +87,6 @@ softpipe_unmap_transfers(struct softpipe_context *sp)
 static void softpipe_destroy( struct pipe_context *pipe )
 {
    struct softpipe_context *softpipe = softpipe_context( pipe );
-   struct pipe_screen *screen = pipe->screen;
    uint i;
 
    if (softpipe->draw)
@@ -116,7 +115,7 @@ static void softpipe_destroy( struct pipe_context *pipe )
 
    for (i = 0; i < Elements(softpipe->constants); i++) {
       if (softpipe->constants[i].buffer) {
-         pipe_buffer_reference(screen, &softpipe->constants[i].buffer, NULL);
+         pipe_buffer_reference(&softpipe->constants[i].buffer, NULL);
       }
    }
 
index 4d01a9dbe15fa7ff66a4cb88c74ac9c8d06e1708..957c8b72e486838987274738a9ae5ddfbf871f72 100644 (file)
@@ -146,14 +146,12 @@ softpipe_set_constant_buffer(struct pipe_context *pipe,
                              const struct pipe_constant_buffer *buf)
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
-   struct pipe_screen *screen = pipe->screen;
 
    assert(shader < PIPE_SHADER_TYPES);
    assert(index == 0);
 
    /* note: reference counting */
-   pipe_buffer_reference(screen,
-                        &softpipe->constants[shader].buffer,
+   pipe_buffer_reference(&softpipe->constants[shader].buffer,
                         buf ? buf->buffer : NULL);
 
    softpipe->dirty |= SP_NEW_CONSTANTS;
index 142ce230fc0e4555681570b15eb9a9139d9b916c..4919ec826e9811901c22c4e8b1465e44bd5a9d72 100644 (file)
@@ -59,7 +59,6 @@ static boolean
 softpipe_texture_layout(struct pipe_screen *screen,
                         struct softpipe_texture * spt)
 {
-   struct pipe_winsys *ws = screen->winsys;
    struct pipe_texture *pt = &spt->base;
    unsigned level;
    unsigned width = pt->width[0];
@@ -87,9 +86,9 @@ softpipe_texture_layout(struct pipe_screen *screen,
       depth = minify(depth);
    }
 
-   spt->buffer = ws->buffer_create(ws, 32,
-                                   PIPE_BUFFER_USAGE_PIXEL,
-                                   buffer_size);
+   spt->buffer = screen->buffer_create(screen, 32,
+                                       PIPE_BUFFER_USAGE_PIXEL,
+                                       buffer_size);
 
    return spt->buffer != NULL;
 }
@@ -98,19 +97,18 @@ static boolean
 softpipe_displaytarget_layout(struct pipe_screen *screen,
                               struct softpipe_texture * spt)
 {
-   struct pipe_winsys *ws = screen->winsys;
    unsigned usage = (PIPE_BUFFER_USAGE_CPU_READ_WRITE |
                      PIPE_BUFFER_USAGE_GPU_READ_WRITE);
 
    spt->base.nblocksx[0] = pf_get_nblocksx(&spt->base.block, spt->base.width[0]);  
    spt->base.nblocksy[0] = pf_get_nblocksy(&spt->base.block, spt->base.height[0]);  
 
-   spt->buffer = ws->surface_buffer_create( ws
-                                            spt->base.width[0], 
-                                            spt->base.height[0],
-                                            spt->base.format,
-                                            usage,
-                                            &spt->stride[0]);
+   spt->buffer = screen->surface_buffer_create( screen
+                                                spt->base.width[0], 
+                                                spt->base.height[0],
+                                                spt->base.format,
+                                                usage,
+                                                &spt->stride[0]);
 
    return spt->buffer != NULL;
 }
@@ -128,7 +126,7 @@ softpipe_texture_create(struct pipe_screen *screen,
       return NULL;
 
    spt->base = *templat;
-   spt->base.refcount = 1;
+   pipe_reference_init(&spt->base.reference, 1);
    spt->base.screen = screen;
 
    if (spt->base.tex_usage & PIPE_TEXTURE_USAGE_DISPLAY_TARGET) {
@@ -140,7 +138,7 @@ softpipe_texture_create(struct pipe_screen *screen,
          goto fail;
    }
     
-   assert(spt->base.refcount == 1);
+   assert(spt->base.reference.count == 1);
    return &spt->base;
 
  fail:
@@ -170,32 +168,25 @@ softpipe_texture_blanket(struct pipe_screen * screen,
       return NULL;
 
    spt->base = *base;
-   spt->base.refcount = 1;
+   pipe_reference_init(&spt->base.reference, 1);
    spt->base.screen = screen;
    spt->base.nblocksx[0] = pf_get_nblocksx(&spt->base.block, spt->base.width[0]);  
    spt->base.nblocksy[0] = pf_get_nblocksy(&spt->base.block, spt->base.height[0]);  
    spt->stride[0] = stride[0];
 
-   pipe_buffer_reference(screen, &spt->buffer, buffer);
+   pipe_buffer_reference(&spt->buffer, buffer);
 
    return &spt->base;
 }
 
 
 static void
-softpipe_texture_release(struct pipe_screen *screen,
-                         struct pipe_texture **pt)
+softpipe_texture_destroy(struct pipe_texture *pt)
 {
-   if (!*pt)
-      return;
-
-   if (--(*pt)->refcount <= 0) {
-      struct softpipe_texture *spt = softpipe_texture(*pt);
+   struct softpipe_texture *spt = softpipe_texture(pt);
 
-      pipe_buffer_reference(screen, &spt->buffer, NULL);
-      FREE(spt);
-   }
-   *pt = NULL;
+   pipe_buffer_reference(&spt->buffer, NULL);
+   FREE(spt);
 }
 
 
@@ -212,7 +203,7 @@ softpipe_get_tex_surface(struct pipe_screen *screen,
 
    ps = CALLOC_STRUCT(pipe_surface);
    if (ps) {
-      ps->refcount = 1;
+      pipe_reference_init(&ps->reference, 1);
       pipe_texture_reference(&ps->texture, pt);
       ps->format = pt->format;
       ps->width = pt->width[level];
@@ -259,20 +250,15 @@ softpipe_get_tex_surface(struct pipe_screen *screen,
 
 
 static void 
-softpipe_tex_surface_release(struct pipe_screen *screen, 
-                             struct pipe_surface **s)
+softpipe_tex_surface_destroy(struct pipe_surface *surf)
 {
-   struct pipe_surface *surf = *s;
    /* Effectively do the texture_update work here - if texture images
     * needed post-processing to put them into hardware layout, this is
     * where it would happen.  For softpipe, nothing to do.
     */
    assert(surf->texture);
-   if (--surf->refcount == 0) {
-      pipe_texture_reference(&surf->texture, NULL);
-      FREE(surf);
-   }
-   *s = NULL;
+   pipe_texture_reference(&surf->texture, NULL);
+   FREE(surf);
 }
 
 
@@ -292,7 +278,6 @@ softpipe_get_tex_transfer(struct pipe_screen *screen,
    spt = CALLOC_STRUCT(softpipe_transfer);
    if (spt) {
       struct pipe_transfer *pt = &spt->base;
-      pt->refcount = 1;
       pipe_texture_reference(&pt->texture, texture);
       pt->format = texture->format;
       pt->block = texture->block;
@@ -327,20 +312,15 @@ softpipe_get_tex_transfer(struct pipe_screen *screen,
 
 
 static void 
-softpipe_tex_transfer_release(struct pipe_screen *screen, 
-                              struct pipe_transfer **t)
+softpipe_tex_transfer_destroy(struct pipe_transfer *transfer)
 {
-   struct softpipe_transfer *transfer = softpipe_transfer(*t);
    /* Effectively do the texture_update work here - if texture images
     * needed post-processing to put them into hardware layout, this is
     * where it would happen.  For softpipe, nothing to do.
     */
-   assert (transfer->base.texture);
-   if (--transfer->base.refcount == 0) {
-      pipe_texture_reference(&transfer->base.texture, NULL);
-      FREE(transfer);
-   }
-   *t = NULL;
+   assert (transfer->texture);
+   pipe_texture_reference(&transfer->texture, NULL);
+   FREE(transfer);
 }
 
 
@@ -408,13 +388,13 @@ softpipe_init_screen_texture_funcs(struct pipe_screen *screen)
 {
    screen->texture_create = softpipe_texture_create;
    screen->texture_blanket = softpipe_texture_blanket;
-   screen->texture_release = softpipe_texture_release;
+   screen->texture_destroy = softpipe_texture_destroy;
 
    screen->get_tex_surface = softpipe_get_tex_surface;
-   screen->tex_surface_release = softpipe_tex_surface_release;
+   screen->tex_surface_destroy = softpipe_tex_surface_destroy;
 
    screen->get_tex_transfer = softpipe_get_tex_transfer;
-   screen->tex_transfer_release = softpipe_tex_transfer_release;
+   screen->tex_transfer_destroy = softpipe_tex_transfer_destroy;
    screen->transfer_map = softpipe_transfer_map;
    screen->transfer_unmap = softpipe_transfer_unmap;
 }
index 593360aab03b4503a9b186270c43b8f3b8dcb64d..51e34d0d621165686f7b8427479a6a09ce579d77 100644 (file)
@@ -140,11 +140,11 @@ sp_destroy_tile_cache(struct softpipe_tile_cache *tc)
    }
    if (tc->transfer) {
       screen = tc->transfer->texture->screen;
-      screen->tex_transfer_release(screen, &tc->transfer);
+      screen->tex_transfer_destroy(tc->transfer);
    }
    if (tc->tex_trans) {
       screen = tc->tex_trans->texture->screen;
-      screen->tex_transfer_release(screen, &tc->tex_trans);
+      screen->tex_transfer_destroy(tc->tex_trans);
    }
 
    FREE( tc );
@@ -167,11 +167,11 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc,
          return;
 
       if (tc->transfer_map) {
-         tc->screen->transfer_unmap(tc->screen, tc->transfer);
+         screen->transfer_unmap(screen, tc->transfer);
          tc->transfer_map = NULL;
       }
 
-      screen->tex_transfer_release(screen, &tc->transfer);
+      screen->tex_transfer_destroy(tc->transfer);
    }
 
    tc->surface = ps;
@@ -249,11 +249,11 @@ sp_tile_cache_set_texture(struct pipe_context *pipe,
       struct pipe_screen *screen = tc->transfer->texture->screen;
 
       if (tc->tex_trans_map) {
-         tc->screen->transfer_unmap(tc->screen, tc->tex_trans);
+         screen->transfer_unmap(screen, tc->tex_trans);
          tc->tex_trans_map = NULL;
       }
 
-      screen->tex_transfer_release(screen, &tc->tex_trans);
+      screen->tex_transfer_destroy(tc->tex_trans);
    }
 
    /* mark as entries as invalid/empty */
@@ -559,7 +559,7 @@ sp_get_cached_tile_tex(struct softpipe_context *sp,
             if (tc->tex_trans_map)
                tc->screen->transfer_unmap(tc->screen, tc->tex_trans);
 
-            screen->tex_transfer_release(screen, &tc->tex_trans);
+            screen->tex_transfer_destroy(tc->tex_trans);
          }
 
          tc->tex_trans = screen->get_tex_transfer(screen, tc->texture, face, level, z, 
index 164c6bbc4d66e6e15863552a925d352333b78a67..1d868eff6bb8182d41f47be0d7fd5c92950d6414 100644 (file)
@@ -207,37 +207,18 @@ trace_screen_texture_blanket(struct pipe_screen *_screen,
 
 
 static void 
-trace_screen_texture_release(struct pipe_screen *_screen,
-                             struct pipe_texture **ptexture)
+trace_screen_texture_destroy(struct pipe_texture *texture)
 {
-   struct trace_screen *tr_scr = trace_screen(_screen);
-   struct pipe_screen *screen = tr_scr->screen;
-   struct trace_texture *tr_tex;
-   struct pipe_texture *texture;
-   
-   assert(ptexture);
-   if(*ptexture) {
-      tr_tex = trace_texture(tr_scr, *ptexture);
-      texture = tr_tex->texture;
-      assert(texture->screen == screen);
-   }
-   else
-      texture = NULL;
-   
-   if (*ptexture) {
-      if (!--(*ptexture)->refcount) {
-         trace_dump_call_begin("pipe_screen", "texture_destroy");
-         
-         trace_dump_arg(ptr, screen);
-         trace_dump_arg(ptr, texture);
-         
-         trace_texture_destroy(tr_scr, *ptexture);
-         
-         trace_dump_call_end();
-      }
+   struct pipe_screen *screen = texture->screen;
    
-      *ptexture = NULL;
-   }
+   trace_dump_call_begin("pipe_screen", "texture_destroy");
+
+   trace_dump_arg(ptr, screen);
+   trace_dump_arg(ptr, texture);
+
+   trace_texture_destroy(trace_screen(screen), texture);
+
+   trace_dump_call_end();
 }
 
 
@@ -280,38 +261,19 @@ trace_screen_get_tex_surface(struct pipe_screen *_screen,
 
 
 static void 
-trace_screen_tex_surface_release(struct pipe_screen *_screen,
-                                 struct pipe_surface **psurface)
+trace_screen_tex_surface_destroy(struct pipe_surface *surface)
 {
-   struct trace_screen *tr_scr = trace_screen(_screen);
-   struct pipe_screen *screen = tr_scr->screen;
-   struct trace_texture *tr_tex;
-   struct trace_surface *tr_surf;
-   struct pipe_surface *surface;
-   
-   assert(psurface);
-   if(*psurface) {
-      tr_tex = trace_texture(tr_scr, (*psurface)->texture);
-      tr_surf = trace_surface(tr_tex, *psurface);
-      surface = tr_surf->surface;
-   }
-   else
-      surface = NULL;
+   struct pipe_screen *screen = surface->texture->screen;
    
-   if (*psurface) {
-      if (!--(*psurface)->refcount) {
-         trace_dump_call_begin("pipe_screen", "tex_surface_destroy");
-         
-         trace_dump_arg(ptr, screen);
-         trace_dump_arg(ptr, surface);
+   trace_dump_call_begin("pipe_screen", "tex_surface_destroy");
 
-         trace_surface_destroy(tr_tex, *psurface);
+   trace_dump_arg(ptr, screen);
+   trace_dump_arg(ptr, surface);
 
-         trace_dump_call_end();
-      }
-   
-      *psurface = NULL;
-   }
+   trace_surface_destroy(trace_texture(trace_screen(screen), surface->texture),
+                         surface);
+
+   trace_dump_call_end();
 }
 
 
@@ -356,38 +318,20 @@ trace_screen_get_tex_transfer(struct pipe_screen *_screen,
 
 
 static void 
-trace_screen_tex_transfer_release(struct pipe_screen *_screen,
-                                 struct pipe_transfer **ptransfer)
+trace_screen_tex_transfer_destroy(struct pipe_transfer *transfer)
 {
-   struct trace_screen *tr_scr = trace_screen(_screen);
-   struct pipe_screen *screen = tr_scr->screen;
-   struct trace_texture *tr_tex;
-   struct trace_transfer *tr_trans;
-   struct pipe_transfer *transfer;
-   
-   assert(ptransfer);
-   if(*ptransfer) {
-      tr_tex = trace_texture(tr_scr, (*ptransfer)->texture);
-      tr_trans = trace_transfer(tr_tex, *ptransfer);
-      transfer = tr_trans->transfer;
-   }
-   else
-      transfer = NULL;
-   
-   if (*ptransfer) {
-      if (!--(*ptransfer)->refcount) {
-         trace_dump_call_begin("pipe_screen", "tex_transfer_destroy");
-         
-         trace_dump_arg(ptr, screen);
-         trace_dump_arg(ptr, transfer);
+   struct pipe_texture *texture = transfer->texture;
+   struct pipe_screen *screen = texture->screen;
 
-         trace_transfer_destroy(tr_tex, *ptransfer);
+   trace_dump_call_begin("pipe_screen", "tex_transfer_destroy");
 
-         trace_dump_call_end();
-      }
-   
-      *ptransfer = NULL;
-   }
+   trace_dump_arg(ptr, screen);
+   trace_dump_arg(ptr, transfer);
+
+   trace_transfer_destroy(trace_texture(trace_screen(screen), texture),
+                          transfer);
+
+   trace_dump_call_end();
 }
 
 
@@ -509,11 +453,11 @@ trace_screen_create(struct pipe_screen *screen)
    tr_scr->base.is_format_supported = trace_screen_is_format_supported;
    tr_scr->base.texture_create = trace_screen_texture_create;
    tr_scr->base.texture_blanket = trace_screen_texture_blanket;
-   tr_scr->base.texture_release = trace_screen_texture_release;
+   tr_scr->base.texture_destroy = trace_screen_texture_destroy;
    tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;
-   tr_scr->base.tex_surface_release = trace_screen_tex_surface_release;
+   tr_scr->base.tex_surface_destroy = trace_screen_tex_surface_destroy;
    tr_scr->base.get_tex_transfer = trace_screen_get_tex_transfer;
-   tr_scr->base.tex_transfer_release = trace_screen_tex_transfer_release;
+   tr_scr->base.tex_transfer_destroy = trace_screen_tex_transfer_destroy;
    tr_scr->base.transfer_map = trace_screen_transfer_map;
    tr_scr->base.transfer_unmap = trace_screen_transfer_unmap;
    
index 81a9e2376e008835d3d50e75701cd19f7c17aa57..0f175cd31ce26a4500b8b1a15712d57a004276cf 100644 (file)
@@ -50,6 +50,14 @@ void trace_dump_block(const struct pipe_format_block *block)
 }
 
 
+static void trace_dump_reference(const struct pipe_reference *reference)
+{
+   trace_dump_struct_begin("pipe_reference");
+   trace_dump_member(uint, reference, count);
+   trace_dump_struct_end();
+}
+
+
 void trace_dump_template(const struct pipe_texture *templat)
 {
    if(!templat) {
@@ -397,6 +405,8 @@ void trace_dump_surface(const struct pipe_surface *state)
 
    trace_dump_struct_begin("pipe_surface");
 
+   trace_dump_reference(&state->reference);
+
    trace_dump_member(format, state, format);
    trace_dump_member(uint, state, status);
    trace_dump_member(uint, state, clear_value);
@@ -405,7 +415,6 @@ void trace_dump_surface(const struct pipe_surface *state)
 
    trace_dump_member(uint, state, layout);
    trace_dump_member(uint, state, offset);
-   trace_dump_member(uint, state, refcount);
    trace_dump_member(uint, state, usage);
 
    trace_dump_member(ptr, state, texture);
@@ -437,7 +446,6 @@ void trace_dump_transfer(const struct pipe_transfer *state)
    trace_dump_member(uint, state, nblocksx);
    trace_dump_member(uint, state, nblocksy);
    trace_dump_member(uint, state, stride);
-   trace_dump_member(uint, state, refcount);
    trace_dump_member(uint, state, usage);
 
    trace_dump_member(ptr, state, texture);
index 120ba0dd3179470dc230d117aab6dc4f782e6cf9..dc45d3dcc1903b6be4a4212572948622fb778ca3 100644 (file)
@@ -134,7 +134,7 @@ trace_transfer_create(struct trace_texture *tr_tex,
    return &tr_trans->base;
    
 error:
-   pipe_transfer_reference(&transfer, NULL);
+   transfer->texture->screen->tex_transfer_destroy(transfer);
    return NULL;
 }
 
@@ -145,7 +145,7 @@ trace_transfer_destroy(struct trace_texture *tr_tex,
 {
    struct trace_transfer *tr_trans = trace_transfer(tr_tex, transfer);
    pipe_texture_reference(&tr_trans->base.texture, NULL);
-   pipe_transfer_reference(&tr_trans->transfer, NULL);
+   transfer->texture->screen->tex_transfer_destroy(tr_trans->transfer);
    FREE(tr_trans);
 }
 
index c4148fe81041d9d793511d60ce081a6e94eec7e3..86420bbf22a675d7db1a57d6bbc01473bbb9ecb2 100644 (file)
@@ -295,18 +295,16 @@ trace_winsys_buffer_unmap(struct pipe_winsys *_winsys,
 
 
 static void
-trace_winsys_buffer_destroy(struct pipe_winsys *_winsys,
-                            struct pipe_buffer *buffer)
+trace_winsys_buffer_destroy(struct pipe_buffer *buffer)
 {
-   struct trace_winsys *tr_ws = trace_winsys(_winsys);
-   struct pipe_winsys *winsys = tr_ws->winsys;
+   struct pipe_winsys *winsys = buffer->screen->winsys;
    
    trace_dump_call_begin("pipe_winsys", "buffer_destroy");
    
    trace_dump_arg(ptr, winsys);
    trace_dump_arg(ptr, buffer);
 
-   winsys->buffer_destroy(winsys, buffer);
+   winsys->buffer_destroy(buffer);
    
    trace_dump_call_end();
 }
index 8d3bab0caa144e4708434dfc4c911b9cddb6476a..f4a29e63c7e89b22b08aa287268c7aed96d7afd5 100644 (file)
@@ -154,8 +154,7 @@ struct pipe_winsys
    void (*buffer_unmap)( struct pipe_winsys *ws, 
                         struct pipe_buffer *buf );
 
-   void (*buffer_destroy)( struct pipe_winsys *ws,
-                          struct pipe_buffer *buf );
+   void (*buffer_destroy)( struct pipe_buffer *buf );
 
 
    /** Set ptr = fence, with reference counting */
index 4eb928d882f53079b521e01782b5a00e11015b4f..a68b52142921934d0b8f94a38dfb1a67373ae1e3 100644 (file)
@@ -38,97 +38,6 @@ extern "C" {
 #endif
 
 
-/**
- * Set 'ptr' to point to 'surf' and update reference counting.
- * The old thing pointed to, if any, will be unreferenced first.
- * 'surf' may be NULL.
- */
-static INLINE void
-pipe_surface_reference(struct pipe_surface **ptr, struct pipe_surface *surf)
-{
-   /* bump the refcount first */
-   if (surf) {
-      assert(surf->refcount);
-      surf->refcount++;
-   }
-
-   if (*ptr) {
-      struct pipe_screen *screen;
-      assert((*ptr)->refcount);
-      assert((*ptr)->texture);
-      screen = (*ptr)->texture->screen;
-      screen->tex_surface_release( screen, ptr );
-      assert(!*ptr);
-   }
-
-   *ptr = surf;
-}
-
-
-/**
- * \sa pipe_surface_reference
- */
-static INLINE void
-pipe_transfer_reference(struct pipe_transfer **ptr, struct pipe_transfer *trans)
-{
-   /* bump the refcount first */
-   if (trans) {
-      assert(trans->refcount);
-      trans->refcount++;
-   }
-
-   if (*ptr) {
-      struct pipe_screen *screen;
-      assert((*ptr)->refcount);
-      assert((*ptr)->texture);
-      screen = (*ptr)->texture->screen;
-      screen->tex_transfer_release( screen, ptr );
-      assert(!*ptr);
-   }
-
-   *ptr = trans;
-}
-
-
-/**
- * \sa pipe_surface_reference
- */
-static INLINE void
-pipe_texture_reference(struct pipe_texture **ptr,
-                      struct pipe_texture *pt)
-{
-   assert(ptr);
-
-   if (pt) { 
-      assert(pt->refcount);
-      pt->refcount++;
-   }
-
-   if (*ptr) {
-      struct pipe_screen *screen = (*ptr)->screen;
-      assert(screen);
-      assert((*ptr)->refcount);
-      screen->texture_release(screen, ptr);
-
-      assert(!*ptr);
-   }
-
-   *ptr = pt;
-}
-
-
-static INLINE void
-pipe_texture_release(struct pipe_texture **ptr)
-{
-   struct pipe_screen *screen;
-   assert(ptr);
-   screen = (*ptr)->screen;
-   assert((*ptr)->refcount);
-   screen->texture_release(screen, ptr);
-   *ptr = NULL;
-}
-
-
 /**
  * Convenience wrappers for screen buffer functions.
  */
@@ -199,28 +108,6 @@ pipe_buffer_read(struct pipe_screen *screen,
    }
 }
 
-/* XXX: thread safety issues!
- */
-static INLINE void
-pipe_buffer_reference(struct pipe_screen *screen,
-                     struct pipe_buffer **ptr,
-                     struct pipe_buffer *buf)
-{
-   if (buf) {
-      assert(buf->refcount);
-      buf->refcount++;
-   }
-
-   if (*ptr) {
-      assert((*ptr)->refcount);
-      if(--(*ptr)->refcount == 0) {
-         screen->buffer_destroy( screen, *ptr );
-      }
-   }
-
-   *ptr = buf;
-}
-
 
 #ifdef __cplusplus
 }
diff --git a/src/gallium/include/pipe/p_refcnt.h b/src/gallium/include/pipe/p_refcnt.h
new file mode 100644 (file)
index 0000000..50b7aa9
--- /dev/null
@@ -0,0 +1,84 @@
+/**************************************************************************
+ * 
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+#ifndef P_REFCNT_H
+#define P_REFCNT_H
+
+
+#include "p_defines.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+struct pipe_reference
+{
+   unsigned count;
+};
+
+
+static INLINE void
+pipe_reference_init(struct pipe_reference *reference, unsigned count)
+{
+   reference->count = count;
+}
+
+
+/**
+ * Set 'ptr' to point to 'reference' and update reference counting.
+ * The old thing pointed to, if any, will be unreferenced first.
+ * 'reference' may be NULL.
+ *
+ * XXX: thread safety issues!
+ */
+static INLINE bool
+pipe_reference(struct pipe_reference **ptr, struct pipe_reference *reference)
+{
+   bool destroy = FALSE;
+
+   /* bump the reference.count first */
+   if (reference) {
+      assert(reference->count);
+      reference->count++;
+   }
+
+   if (*ptr) {
+      assert((*ptr)->count);
+      if (--(*ptr)->count == 0) {
+         destroy = TRUE;
+      }
+   }
+
+   *ptr = reference;
+
+   return destroy;
+}
+
+
+#endif /* P_REFCNT_H */
index 341d1caea0f78b932b23bb1012123d88ccd5ac91..3688d5811861a2d8d1c5639ffebbb8bf2142a377 100644 (file)
@@ -113,8 +113,7 @@ struct pipe_screen {
                                             const unsigned *stride,
                                             struct pipe_buffer *buffer);
 
-   void (*texture_release)(struct pipe_screen *,
-                           struct pipe_texture **pt);
+   void (*texture_destroy)(struct pipe_texture *pt);
 
    /** Get a surface which is a "view" into a texture */
    struct pipe_surface *(*get_tex_surface)(struct pipe_screen *,
@@ -123,10 +122,7 @@ struct pipe_screen {
                                            unsigned zslice,
                                            unsigned usage );
 
-   /* Surfaces allocated by the above must be released here:
-    */
-   void (*tex_surface_release)( struct pipe_screen *,
-                                struct pipe_surface ** );
+   void (*tex_surface_destroy)(struct pipe_surface *);
    
 
    /** Get a transfer object for transferring data to/from a texture */
@@ -138,10 +134,7 @@ struct pipe_screen {
                                              unsigned x, unsigned y,
                                              unsigned w, unsigned h);
 
-   /* Transfer objects allocated by the above must be released here:
-    */
-   void (*tex_transfer_release)( struct pipe_screen *,
-                                 struct pipe_transfer ** );
+   void (*tex_transfer_destroy)(struct pipe_transfer *);
    
    void *(*transfer_map)( struct pipe_screen *,
                           struct pipe_transfer *transfer );
@@ -213,8 +206,7 @@ struct pipe_screen {
    void (*buffer_unmap)( struct pipe_screen *screen,
                         struct pipe_buffer *buf );
 
-   void (*buffer_destroy)( struct pipe_screen *screen,
-                          struct pipe_buffer *buf );
+   void (*buffer_destroy)( struct pipe_buffer *buf );
 
 
    /**
index a2e839da5c6a930daf1aa4938f8467b7f4cdff66..57a7672d6c3430623c411d6e03da54009b4ce4e7 100644 (file)
@@ -43,6 +43,8 @@
 #include "p_compiler.h"
 #include "p_defines.h"
 #include "p_format.h"
+#include "p_refcnt.h"
+#include "p_screen.h"
 
 
 #ifdef __cplusplus
@@ -64,23 +66,20 @@ extern "C" {
 
 
 /* fwd decls */
-struct pipe_screen;
 struct pipe_surface;
 
 
-
 /**
  * The driver will certainly subclass this to include actual memory
  * management information.
  */
 struct pipe_buffer
 {
+   struct pipe_reference reference;
+   struct pipe_screen *screen;
    unsigned alignment;
    unsigned usage;
    unsigned size;
-
-   /** Reference count */
-   unsigned refcount;
 };
 
 
@@ -275,6 +274,7 @@ struct pipe_sampler_state
  */
 struct pipe_surface
 {
+   struct pipe_reference reference;
    enum pipe_format format;      /**< PIPE_FORMAT_x */
    unsigned status;              /**< PIPE_SURFACE_STATUS_x */
    unsigned clear_value;         /**< XXX may be temporary */
@@ -282,7 +282,6 @@ struct pipe_surface
    unsigned height;              /**< logical height in pixels */
    unsigned layout;              /**< PIPE_SURFACE_LAYOUT_x */
    unsigned offset;              /**< offset from start of buffer, in bytes */
-   unsigned refcount;
    unsigned usage;               /**< PIPE_BUFFER_USAGE_*  */
 
    struct pipe_texture *texture; /**< texture into which this is a view  */
@@ -306,7 +305,6 @@ struct pipe_transfer
    unsigned nblocksx;            /**< allocated width in blocks */
    unsigned nblocksy;            /**< allocated height in blocks */
    unsigned stride;              /**< stride in bytes between rows of blocks */
-   unsigned refcount;
    unsigned usage;               /**< PIPE_TRANSFER_*  */
 
    struct pipe_texture *texture; /**< texture to transfer to/from  */
@@ -321,6 +319,8 @@ struct pipe_transfer
  */
 struct pipe_texture
 { 
+   struct pipe_reference reference;
+
    enum pipe_texture_target target; /**< PIPE_TEXTURE_x */
    enum pipe_format format;         /**< PIPE_FORMAT_x */
 
@@ -339,10 +339,6 @@ struct pipe_texture
 
    unsigned tex_usage;       /* PIPE_TEXTURE_USAGE_* */
 
-   /* These are also refcounted:
-    */
-   unsigned refcount;
-
    struct pipe_screen *screen; /**< screen that this texture belongs to */
 };
 
@@ -379,6 +375,35 @@ struct pipe_vertex_element
 };
 
 
+/* Reference counting helper functions */
+static INLINE void
+pipe_buffer_reference(struct pipe_buffer **ptr, struct pipe_buffer *buf)
+{
+   struct pipe_buffer *old_buf = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &buf->reference))
+      old_buf->screen->buffer_destroy(old_buf);
+}
+
+static INLINE void
+pipe_surface_reference(struct pipe_surface **ptr, struct pipe_surface *surf)
+{
+   struct pipe_surface *old_surf = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &surf->reference))
+      old_surf->texture->screen->tex_surface_destroy(old_surf);
+}
+
+static INLINE void
+pipe_texture_reference(struct pipe_texture **ptr, struct pipe_texture *tex)
+{
+   struct pipe_texture *old_tex = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &tex->reference))
+      old_tex->screen->texture_destroy(old_tex);
+}
+
+
 #ifdef __cplusplus
 }
 #endif
index 2f6913ec5cbf095c46acbbe3d7bd73eb96007085..aa86411190df401de1d955cb270d286ee7bd195a 100644 (file)
@@ -86,7 +86,7 @@ dri_surface_from_handle(struct pipe_screen *screen,
                                      buf);
 
    /* we don't need the buffer from this point on */
-   pipe_buffer_reference(screen, &buf, NULL);
+   pipe_buffer_reference(&buf, NULL);
 
    if (!texture)
       return NULL;
index 7ebc34871c776bfccaca76c8d376abce89430e3c..b8d5f4217f9feadd3bebb98209ccf57220b5bfea 100644 (file)
@@ -143,7 +143,7 @@ err_handle:
 err_surf:
        pipe_texture_reference(&texture, NULL);
 err_tex:
-       pipe_buffer_reference(screen, &buf, NULL);
+       pipe_buffer_reference(&buf, NULL);
 err_buf:
        return;
 }
@@ -173,7 +173,7 @@ drm_takedown_shown_screen(_EGLDriver *drv, struct drm_screen *screen)
 
        pipe_surface_reference(&screen->surface, NULL);
        pipe_texture_reference(&screen->tex, NULL);
-       pipe_buffer_reference(dev->screen, &screen->buffer, NULL);
+       pipe_buffer_reference(&screen->buffer, NULL);
 
        screen->shown = 0;
 }
@@ -348,7 +348,7 @@ err_fb:
 err_bo:
        pipe_surface_reference(&scrn->surface, NULL);
        pipe_texture_reference(&scrn->tex, NULL);
-       pipe_buffer_reference(dev->screen, &scrn->buffer, NULL);
+       pipe_buffer_reference(&scrn->buffer, NULL);
 
        return EGL_FALSE;
 }
index 187a13a56052cb3e2a4ff3a9dd4b66bff57f2811..38cfd5d7f1ecda234c07d13b4a706d1a48cd2415 100644 (file)
@@ -237,10 +237,10 @@ static int vlDestroy
        pipe->delete_fs_state(pipe, basic_csc->fragment_shader);
 
        for (i = 0; i < 2; ++i)
-               pipe_buffer_reference(pipe->screen, &basic_csc->vertex_bufs[i].buffer, NULL);
+               pipe_buffer_reference(&basic_csc->vertex_bufs[i].buffer, NULL);
 
-       pipe_buffer_reference(pipe->screen, &basic_csc->vs_const_buf.buffer, NULL);
-       pipe_buffer_reference(pipe->screen, &basic_csc->fs_const_buf.buffer, NULL);
+       pipe_buffer_reference(&basic_csc->vs_const_buf.buffer, NULL);
+       pipe_buffer_reference(&basic_csc->fs_const_buf.buffer, NULL);
 
        FREE(basic_csc);
 
index 7cd753f7363fb953720221d6e63f5d4ca34e78c3..eb8270ecad3fdf44cd006b4c285755d19658f790 100644 (file)
@@ -636,7 +636,7 @@ static int vlFlush
        for (i = 0; i < 3; ++i)
        {
                pipe->screen->transfer_unmap(pipe->screen, mc->tex_transfer[i]);
-               pipe->screen->tex_transfer_release(pipe->screen, &mc->tex_transfer[i]);
+               pipe->screen->tex_transfer_destroy(mc->tex_transfer[i]);
        }
 
        mc->render_target.cbufs[0] = pipe->screen->get_tex_surface
@@ -856,7 +856,7 @@ static int vlDestroy
                pipe->delete_sampler_state(pipe, mc->samplers.all[i]);
 
        for (i = 0; i < 3; ++i)
-               pipe_buffer_reference(pipe->screen, &mc->vertex_bufs.all[i].buffer, NULL);
+               pipe_buffer_reference(&mc->vertex_bufs.all[i].buffer, NULL);
 
        /* Textures 3 & 4 are not created directly, no need to release them here */
        for (i = 0; i < 3; ++i)
@@ -873,8 +873,8 @@ static int vlDestroy
                pipe->delete_fs_state(pipe, mc->b_fs[i]);
        }
 
-       pipe_buffer_reference(pipe->screen, &mc->vs_const_buf.buffer, NULL);
-       pipe_buffer_reference(pipe->screen, &mc->fs_const_buf.buffer, NULL);
+       pipe_buffer_reference(&mc->vs_const_buf.buffer, NULL);
+       pipe_buffer_reference(&mc->fs_const_buf.buffer, NULL);
 
        FREE(mc->macroblocks);
        FREE(mc);
index 20dd8d269d906d731871195b8ae261d4f0156eab..a2cd25067d215122840015befa01a01ce2235356 100644 (file)
@@ -51,11 +51,20 @@ st_device_really_destroy(struct st_device *st_dev)
 }
 
 
+static void
+st_device_reference(struct st_device **ptr, struct st_device *st_dev)
+{
+   struct st_device *old_dev = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &st_dev->reference))
+      st_device_really_destroy(old_dev);
+}
+
+
 void
 st_device_destroy(struct st_device *st_dev) 
 {
-   if(!--st_dev->refcount)
-      st_device_really_destroy(st_dev);
+   st_device_reference(&st_dev, NULL);
 }
 
 
@@ -72,7 +81,7 @@ st_device_create_from_st_winsys(const struct st_winsys *st_ws)
    if(!st_dev)
       return NULL;
    
-   st_dev->refcount = 1;
+   pipe_reference_init(&st_dev->reference, 1);
    st_dev->st_ws = st_ws;
    
    st_dev->real_screen = st_ws->screen_create();
@@ -124,8 +133,7 @@ st_context_destroy(struct st_context *st_ctx)
 
       FREE(st_ctx);
       
-      if(!--st_dev->refcount)
-         st_device_really_destroy(st_dev);
+      st_device_reference(&st_dev, NULL);
    }
 }
 
@@ -139,8 +147,7 @@ st_context_create(struct st_device *st_dev)
    if(!st_ctx)
       return NULL;
    
-   st_ctx->st_dev = st_dev;
-   ++st_dev->refcount;
+   st_device_reference(&st_ctx->st_dev, st_dev);
    
    st_ctx->real_pipe = st_dev->st_ws->context_create(st_dev->real_screen);
    if(!st_ctx->real_pipe) {
@@ -292,8 +299,7 @@ void
 st_buffer_destroy(struct st_buffer *st_buf)
 {
    if(st_buf) {
-      struct pipe_screen *screen = st_buf->st_dev->screen;
-      pipe_buffer_reference(screen, &st_buf->buffer, NULL);
+      pipe_buffer_reference(&st_buf->buffer, NULL);
       FREE(st_buf);
    }
 }
index 7cfe6de9f6a733ab9bc8c065e0ef3478fc5b1cd1..0641aff149fd7b5a002f6ebcb2467486cb8ba62a 100644 (file)
@@ -68,13 +68,13 @@ struct st_context {
 
 
 struct st_device {
+   /* FIXME: we also need to refcount for textures and surfaces... */
+   struct pipe_reference reference;
+
    const struct st_winsys *st_ws; 
 
    struct pipe_screen *real_screen;
    struct pipe_screen *screen;
-   
-   /* FIXME: we also need to refcount for textures and surfaces... */
-   unsigned refcount;
 };
 
 
index 4d798df99bf2221e6bd111edb76bff9afc2c174d..426f347d18977a91fdb2c447cd8dc5c1b0181655 100644 (file)
@@ -124,7 +124,7 @@ st_softpipe_buffer_create(struct pipe_winsys *winsys,
 {
    struct st_softpipe_buffer *buffer = CALLOC_STRUCT(st_softpipe_buffer);
 
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.alignment = alignment;
    buffer->base.usage = usage;
    buffer->base.size = size;
@@ -149,7 +149,7 @@ st_softpipe_user_buffer_create(struct pipe_winsys *winsys,
    if(!buffer)
       return NULL;
    
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.size = bytes;
    buffer->userBuffer = TRUE;
    buffer->data = ptr;
index 0bd69c214fe8296008006a3c0d443096d9978f95..7304113a659b7110af41a3b59b6b464ada862d07 100644 (file)
@@ -175,7 +175,7 @@ crtc_destroy(xf86CrtcPtr crtc)
     struct crtc_private *crtcp = crtc->driver_private;
 
     if (crtcp->cursor_buf)
-       pipe_buffer_reference(ms->screen, &crtcp->cursor_buf, NULL);
+       pipe_buffer_reference(&crtcp->cursor_buf, NULL);
 
     drmModeFreeCrtc(crtcp->drm_crtc);
     xfree(crtcp);
@@ -266,7 +266,7 @@ cursor_destroy(xf86CrtcPtr crtc)
     struct crtc_private *crtcp = crtc->driver_private;
 
     if (crtcp->cursor_buf) {
-       pipe_buffer_reference(ms->screen, &crtcp->cursor_buf, NULL);
+       pipe_buffer_reference(&crtcp->cursor_buf, NULL);
     }
 }
 
index d48b7dd27bd1f6659f68581ff8647340c7fd1670..b9993b1ea1b70c1a75e36968f4e5e1bdb74a6215 100644 (file)
@@ -147,7 +147,7 @@ driDestroyBuffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
            (*pScreen->DestroyPixmap)(private->pPixmap);
 
        pipe_texture_reference(&private->tex, NULL);
-       pipe_buffer_reference(ms->screen, &private->buf, NULL);
+       pipe_buffer_reference(&private->buf, NULL);
     }
 
     if (buffers) {
index c62625c4481294a361cc3525f51660934e72e852..e53b46c3ad25c7e08628b6a66c58b5d16687130b 100644 (file)
@@ -147,7 +147,7 @@ ExaFinishAccess(PixmapPtr pPix, int index)
        return;
 
     exa->scrn->transfer_unmap(exa->scrn, priv->map_transfer);
-    pipe_transfer_reference(&priv->map_transfer, NULL);
+    exa->scrn->tex_transfer_destroy(priv->map_transfer);
 
 }
 
@@ -163,7 +163,7 @@ ExaDone(PixmapPtr pPixmap)
        return;
 
     if (priv->src_surf)
-       exa->scrn->tex_surface_release(exa->scrn, &priv->src_surf);
+       exa->scrn->tex_surface_destroy(priv->src_surf);
     priv->src_surf = NULL;
 }
 
@@ -219,7 +219,7 @@ ExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1)
     exa->ctx->surface_fill(exa->ctx, surf, x0, y0, x1 - x0, y1 - y0,
                           priv->color);
 
-    exa->scrn->tex_surface_release(exa->scrn, &surf);
+    exa->scrn->tex_surface_destroy(surf);
 }
 
 static Bool
@@ -276,7 +276,7 @@ ExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
 
     exa->ctx->surface_copy(exa->ctx, 0, surf, dstX, dstY, priv->src_surf,
                           srcX, srcY, width, height);
-    exa->scrn->tex_surface_release(exa->scrn, &surf);
+    exa->scrn->tex_surface_destroy(surf);
 }
 
 static Bool
@@ -336,7 +336,7 @@ ExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
        return;
 
     if (priv->tex)
-       ms->screen->texture_release(exa->scrn, &priv->tex);
+       ms->screen->texture_destroy(priv->tex);
 
     xfree(priv);
 }
@@ -382,7 +382,7 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap)
 
     drm_api_hooks.buffer_from_texture(priv->tex, &buffer, &stride);
     drm_api_hooks.handle_from_buffer(ms->screen, buffer, &handle);
-    pipe_buffer_reference(ms->screen, &buffer, NULL);
+    pipe_buffer_reference(&buffer, NULL);
     return handle;
 }
 
index 013743378526747ee5746fbe48cfd5b44910083c..d5e63c3bae5cf628cd9499b6a8c008fb2cdedf2c 100644 (file)
@@ -114,10 +114,10 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch,
 
        if (fence) {
                if (*fence)
-                       intel_be_fence_unreference(*fence);
+                       intel_be_fence_reference(fence, NULL);
 
                (*fence) = CALLOC_STRUCT(intel_be_fence);
-               (*fence)->refcount = 1;
+               pipe_reference_init(&(*fence)->reference, 1);
                (*fence)->bo = NULL;
        }
 }
index 2e191a6d126e0a6375cc48225cd24aa733a5f754..de13fb39c7e091373f694514514bd8e9050679d0 100644 (file)
@@ -51,8 +51,7 @@ intel_be_buffer_unmap(struct pipe_winsys *winsys,
 }
 
 static void
-intel_be_buffer_destroy(struct pipe_winsys *winsys,
-                       struct pipe_buffer *buf)
+intel_be_buffer_destroy(struct pipe_buffer *buf)
 {
        drm_intel_bo_unreference(intel_bo(buf));
        free(buf);
@@ -72,7 +71,7 @@ intel_be_buffer_create(struct pipe_winsys *winsys,
        if (!buffer)
                return NULL;
 
-       buffer->base.refcount = 1;
+       pipe_reference_init(&buffer->base.reference, 1);
        buffer->base.alignment = alignment;
        buffer->base.usage = usage;
        buffer->base.size = size;
@@ -115,7 +114,7 @@ intel_be_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned byte
        if (!buffer)
                return NULL;
 
-       buffer->base.refcount = 1;
+       pipe_reference_init(&buffer->base.reference, 1);
        buffer->base.alignment = 0;
        buffer->base.usage = 0;
        buffer->base.size = bytes;
@@ -155,7 +154,7 @@ intel_be_buffer_from_handle(struct pipe_screen *screen,
        if (!buffer->bo)
                goto err;
 
-       buffer->base.refcount = 1;
+       pipe_reference_init(&buffer->base.reference, 1);
        buffer->base.alignment = buffer->bo->align;
        buffer->base.usage = PIPE_BUFFER_USAGE_GPU_READ |
                             PIPE_BUFFER_USAGE_GPU_WRITE |
@@ -215,15 +214,7 @@ intel_be_fence_refunref(struct pipe_winsys *sws,
        struct intel_be_fence **p = (struct intel_be_fence **)ptr;
        struct intel_be_fence *f = (struct intel_be_fence *)fence;
 
-       assert(p);
-
-       if (f)
-               intel_be_fence_reference(f);
-
-       if (*p)
-               intel_be_fence_unreference(*p);
-
-       *p = f;
+        intel_be_fence_reference(p, f);
 }
 
 static int
index 0fe18f66f83da56fbbf6abcfb45d2d8d400c0d3e..a8abb01a9ed82ace71acecb8ff4663094284ca85 100644 (file)
  */
 struct intel_be_fence
 {
-       uint32_t refcount;
+       struct pipe_reference reference;
        drm_intel_bo *bo;
 };
 
 static INLINE void
-intel_be_fence_reference(struct intel_be_fence *f)
+intel_be_fence_reference(struct intel_be_fence **ptr, struct intel_be_fence *f)
 {
-       f->refcount++;
-}
+       struct intel_be_fence *old_fence = *ptr;
 
-static INLINE void
-intel_be_fence_unreference(struct intel_be_fence *f)
-{
-       if (!--f->refcount) {
-               if (f->bo)
-                       drm_intel_bo_unreference(f->bo);
-               free(f);
+        if (pipe_reference((struct pipe_reference**)ptr, &f->reference)) {
+               if (old_fence->bo)
+                       drm_intel_bo_unreference(old_fence->bo);
+               free(old_fence);
        }
 }
 
index d6ae0827cd7a71f6de57bf4c7259c0721add2fab..25c98456ac4cd2a1eb62435652d1717e0263bf8d 100644 (file)
@@ -109,8 +109,7 @@ nouveau_context_init(struct nouveau_screen *nv_screen,
                nv_screen->nvc = nvc;
        }
 
-       nvc->refcount++;
-       nv->nvc = nvc;
+       pipe_reference((struct pipe_reference**)&nv->nvc, &nvc->reference);
 
        /* Find a free slot for a pipe context, allocate a new one if needed */
        nv->pctx_id = -1;
@@ -159,7 +158,7 @@ nouveau_context_init(struct nouveau_screen *nv_screen,
                enum pipe_format format;
 
                fb_buf = calloc(1, sizeof(struct nouveau_pipe_buffer));
-               fb_buf->base.refcount = 1;
+               pipe_reference_init(&fb_buf->base.reference, 1);
                fb_buf->base.usage = PIPE_BUFFER_USAGE_PIXEL;
 
                nouveau_bo_fake(dev, nv_screen->front_offset, NOUVEAU_BO_VRAM,
@@ -195,7 +194,7 @@ nouveau_context_cleanup(struct nouveau_context *nv)
 
        if (nv->pctx_id >= 0) {
                nvc->pctx[nv->pctx_id] = NULL;
-               if (--nvc->refcount <= 0) {
+               if (pipe_reference((struct pipe_reference**)&nv->nvc, NULL)) {
                        nouveau_channel_context_destroy(nvc);
                        nv->nv_screen->nvc = NULL;
                }
index 02d2745680cdaff41b1922ec12ada6a4d88eac16..ba8fc3ad2dfbac683ddfbbc3a4ce7545992ce21e 100644 (file)
@@ -13,8 +13,8 @@
 #include "nouveau_local.h"
 
 struct nouveau_channel_context {
+       struct pipe_reference reference;
        struct pipe_screen *pscreen;
-       int refcount;
 
        unsigned cur_pctx;
        unsigned nr_pctx;
index 54c7dd46b141d9f17ebe9280f6b7680f54710548..24bbd4516f1961f703cc86a7275ad4e89f80126c 100644 (file)
@@ -67,7 +67,7 @@ nouveau_pipe_bo_create(struct pipe_winsys *pws, unsigned alignment,
        nvbuf = CALLOC_STRUCT(nouveau_pipe_buffer);
        if (!nvbuf)
                return NULL;
-       nvbuf->base.refcount = 1;
+       pipe_reference_init(&nvbuf->base.reference, 1);
        nvbuf->base.alignment = alignment;
        nvbuf->base.usage = usage;
        nvbuf->base.size = size;
@@ -92,7 +92,7 @@ nouveau_pipe_bo_user_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
        nvbuf = CALLOC_STRUCT(nouveau_pipe_buffer);
        if (!nvbuf)
                return NULL;
-       nvbuf->base.refcount = 1;
+       pipe_reference_init(&nvbuf->base.reference, 1);
        nvbuf->base.size = bytes;
 
        if (nouveau_bo_user(dev, ptr, bytes, &nvbuf->bo)) {
@@ -104,7 +104,7 @@ nouveau_pipe_bo_user_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
 }
 
 static void
-nouveau_pipe_bo_del(struct pipe_winsys *ws, struct pipe_buffer *buf)
+nouveau_pipe_bo_del(struct pipe_buffer *buf)
 {
        struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf);
 
index 79b8f777ca833ba8d8363b76a630a6718d7c3d68..b3582e3314a5dce2b1f9a242261280fb98aee708 100644 (file)
@@ -63,7 +63,7 @@ static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
         return NULL;
     }
 
-    radeon_buffer->base.refcount = 1;
+    pipe_reference_init(&radeon_buffer->base.reference, 1);
     radeon_buffer->base.alignment = alignment;
     radeon_buffer->base.usage = usage;
     radeon_buffer->base.size = size;
@@ -104,7 +104,7 @@ static struct pipe_buffer *radeon_buffer_user_create(struct pipe_winsys *ws,
     return &radeon_buffer->base;
 }
 
-static void radeon_buffer_del(struct pipe_winsys *ws, struct pipe_buffer *buffer)
+static void radeon_buffer_del(struct pipe_buffer *buffer)
 {
     struct radeon_pipe_buffer *radeon_buffer = (struct radeon_pipe_buffer*)buffer;
 
@@ -207,7 +207,7 @@ static struct pipe_buffer *radeon_buffer_from_handle(struct radeon_screen *radeo
         radeon_bo_unref(bo);
         return NULL;
     }
-    radeon_buffer->base.refcount = 1;
+    pipe_reference_init(&radeon_buffer->base.reference, 1);
     radeon_buffer->base.usage = PIPE_BUFFER_USAGE_PIXEL;
     radeon_buffer->bo = bo;
     return &radeon_buffer->base;
@@ -242,10 +242,10 @@ struct pipe_surface *radeon_surface_from_handle(struct radeon_context *radeon_co
 
     pt = pipe_screen->texture_blanket(pipe_screen, &tmpl, &pitch, pb);
     if (pt == NULL) {
-        pipe_buffer_reference(pipe_screen, &pb, NULL);
+        pipe_buffer_reference(&pb, NULL);
     }
     ps = pipe_screen->get_tex_surface(pipe_screen, pt, 0, 0, 0,
                                       PIPE_BUFFER_USAGE_GPU_WRITE);
     return ps;
 }
-#endif
\ No newline at end of file
+#endif
index 21f2a62e0fe0148450055b6dc39b5a08fa53efb0..016634c8fd3d50408fe6975b8e65a66f3b72a6b6 100644 (file)
@@ -84,7 +84,8 @@ struct pipe_buffer* radeon_buffer_from_handle(struct pipe_screen* screen,
         return NULL;
     }
 
-    radeon_buffer->base.refcount = 1;
+    pipe_reference_init(&radeon_buffer->base.reference, 1);
+    radeon_buffer->base.screen = screen;
     radeon_buffer->base.usage = PIPE_BUFFER_USAGE_PIXEL;
     radeon_buffer->bo = bo;
     return &radeon_buffer->base;
index 739bfa1c1a67b05a8c4c313aadb7252e728eb3f4..aa1bfa8e883a3f1bfd27ba0490f27c32ed98bef2 100644 (file)
@@ -99,7 +99,7 @@ buffer_create(struct pipe_winsys *pws,
    if (!buffer)
       return NULL;
 
-   buffer->Base.refcount = 1;
+   pipe_reference_init(&buffer->Base.reference, 1);
    buffer->Base.alignment = alignment;
    buffer->Base.usage = usage;
    buffer->Base.size = size;
@@ -121,7 +121,7 @@ user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
    if (!buffer)
       return NULL;
 
-   buffer->Base.refcount = 1;
+   pipe_reference_init(&buffer->Base.reference, 1);
    buffer->Base.size = bytes;
    buffer->UserBuffer = TRUE;
    buffer->Data = ptr;
@@ -148,7 +148,7 @@ buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buf)
 
 
 static void
-buffer_destroy(struct pipe_winsys *pws, struct pipe_buffer *buf)
+buffer_destroy(struct pipe_buffer *buf)
 {
    struct sw_pipe_buffer *buffer = sw_pipe_buffer(buf);
 
index c4623e82f90e34b16004053104385f7417607e29..5b9fdb5c1f8a784ee43d01afcf1dc90e9dac6d0d 100644 (file)
@@ -39,7 +39,7 @@ static struct pipe_buffer* xsp_buffer_create(struct pipe_winsys *pws, unsigned a
        assert(pws);
 
        buffer = calloc(1, sizeof(struct xsp_buffer));
-       buffer->base.refcount = 1;
+       pipe_reference_init(&buffer->base.reference, 1);
        buffer->base.alignment = alignment;
        buffer->base.usage = usage;
        buffer->base.size = size;
@@ -55,7 +55,7 @@ static struct pipe_buffer* xsp_user_buffer_create(struct pipe_winsys *pws, void
        assert(pws);
 
        buffer = calloc(1, sizeof(struct xsp_buffer));
-       buffer->base.refcount = 1;
+       pipe_reference_init(&buffer->base.reference, 1);
        buffer->base.size = size;
        buffer->is_user_buffer = TRUE;
        buffer->data = data;
index 2d961f708784d41d12d3a64a6761e7441401e2fd..440666d835e736e6fdc96e1fcac734ff50a6aa4d 100644 (file)
@@ -87,8 +87,7 @@ gdi_softpipe_buffer_unmap(struct pipe_winsys *winsys,
 
 
 static void
-gdi_softpipe_buffer_destroy(struct pipe_winsys *winsys,
-                            struct pipe_buffer *buf)
+gdi_softpipe_buffer_destroy(struct pipe_buffer *buf)
 {
    struct gdi_softpipe_buffer *oldBuf = gdi_softpipe_buffer(buf);
 
@@ -118,7 +117,7 @@ gdi_softpipe_buffer_create(struct pipe_winsys *winsys,
 {
    struct gdi_softpipe_buffer *buffer = CALLOC_STRUCT(gdi_softpipe_buffer);
 
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.alignment = alignment;
    buffer->base.usage = usage;
    buffer->base.size = size;
@@ -143,7 +142,7 @@ gdi_softpipe_user_buffer_create(struct pipe_winsys *winsys,
    if(!buffer)
       return NULL;
 
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.size = bytes;
    buffer->userBuffer = TRUE;
    buffer->data = ptr;
index 8e1bfab2f5607e6c2828a26af8fff622a9021b6d..8329d3bbf7489e2a248027f03494ed43534cf451 100644 (file)
@@ -57,10 +57,10 @@ buffer_from_surface(struct pipe_surface *surface)
 }
 
 struct aub_buffer {
+   struct pipe_reference reference;
    char *data;
    unsigned offset;
    unsigned size;
-   unsigned refcount;
    unsigned map_count;
    boolean dump_on_unmap;
 };
@@ -144,8 +144,7 @@ static void aub_buffer_unmap(struct pipe_winsys *winsys,
 
 
 static void
-aub_buffer_destroy(struct pipe_winsys *winsys,
-                  struct pipe_buffer *buf)
+aub_buffer_destroy(struct pipe_buffer *buf)
 {
    free(buf);
 }
@@ -189,7 +188,7 @@ aub_buffer_create(struct pipe_winsys *winsys,
    struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys);
    struct aub_buffer *sbo = CALLOC_STRUCT(aub_buffer);
 
-   sbo->refcount = 1;
+   pipe_reference_init(&sbo->reference, 1);
 
    /* Could reuse buffers that are not referenced in current
     * batchbuffer.  Can't do that atm, so always reallocate:
index 40bcdfe42a0f31eb4e462c72218b27932322c722..a5dbdf30f6534646fe19710dfd01380cabcc8ca1 100644 (file)
@@ -243,7 +243,7 @@ xm_buffer_create(struct pipe_winsys *pws,
 {
    struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
 
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.alignment = alignment;
    buffer->base.usage = usage;
    buffer->base.size = size;
@@ -267,7 +267,7 @@ static struct pipe_buffer *
 xm_user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
 {
    struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.size = bytes;
    buffer->userBuffer = TRUE;
    buffer->data = ptr;
index 71f12b2b47a003a0bd2f4643881891b6d675caad..762ebd98477b97619c4683b5b496a297ba5605b4 100644 (file)
@@ -207,8 +207,7 @@ xm_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buf)
 }
 
 static void
-xm_buffer_destroy(struct pipe_winsys *pws,
-                  struct pipe_buffer *buf)
+xm_buffer_destroy(struct pipe_buffer *buf)
 {
    struct xm_buffer *oldBuf = xm_buffer(buf);
 
@@ -338,7 +337,7 @@ xm_buffer_create(struct pipe_winsys *pws,
    }
 #endif
 
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.alignment = alignment;
    buffer->base.usage = usage;
    buffer->base.size = size;
@@ -359,7 +358,7 @@ static struct pipe_buffer *
 xm_user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
 {
    struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
-   buffer->base.refcount = 1;
+   pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.size = bytes;
    buffer->userBuffer = TRUE;
    buffer->data = ptr;
index 2df6fef210e0801f19f2c22971751891b41c0cec..fd81ac36d2c2c3219d02e91ee82cd61b1d9f4dde 100644 (file)
@@ -73,7 +73,7 @@ void st_upload_constants( struct st_context *st,
       /* We always need to get a new buffer, to keep the drivers simple and
        * avoid gratuitous rendering synchronization.
        */
-      pipe_buffer_reference(pipe->screen, &cbuf->buffer, NULL );
+      pipe_buffer_reference(&cbuf->buffer, NULL );
       cbuf->buffer = pipe_buffer_create(pipe->screen, 16, PIPE_BUFFER_USAGE_CONSTANT,
                                        paramBytes );
 
index 05b69c9d00a370ac35d10974fea3d422e99386b7..347f2b60c38864e2f330ca3d3f69c5e5c409abc8 100644 (file)
@@ -171,7 +171,7 @@ load_color_map_texture(GLcontext *ctx, struct pipe_texture *pt)
    }
 
    screen->transfer_unmap(screen, transfer);
-   screen->tex_transfer_release(screen, &transfer);
+   screen->tex_transfer_destroy(transfer);
 }
 
 
index 15cc4cd95dc36f228d37e74808cd4d110d4bc6eb..3f9a825a153e938d651cf92ae6d5c5abcdcdc7d0 100644 (file)
@@ -149,7 +149,7 @@ st_clear_accum_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
    }
 
    screen->transfer_unmap(screen, acc_pt);
-   screen->tex_transfer_release(screen, &acc_pt);
+   screen->tex_transfer_destroy(acc_pt);
 }
 
 
@@ -187,7 +187,7 @@ accum_mad(GLcontext *ctx, GLfloat scale, GLfloat bias,
    }
 
    screen->transfer_unmap(screen, acc_pt);
-   screen->tex_transfer_release(screen, &acc_pt);
+   screen->tex_transfer_destroy(acc_pt);
 }
 
 
@@ -220,7 +220,7 @@ accum_accum(struct pipe_context *pipe, GLfloat value,
       accBuf[i] = accBuf[i] + colorBuf[i] * value;
    }
 
-   screen->tex_transfer_release(screen, &acc_trans);
+   screen->tex_transfer_destroy(acc_trans);
    acc_trans = screen->get_tex_transfer(screen, acc_strb->texture, 0, 0, 0,
                                         PIPE_TRANSFER_WRITE, xpos, ypos,
                                         width, height);
@@ -229,8 +229,8 @@ accum_accum(struct pipe_context *pipe, GLfloat value,
 
    _mesa_free(colorBuf);
    _mesa_free(accBuf);
-   screen->tex_transfer_release(screen, &acc_trans);
-   screen->tex_transfer_release(screen, &color_trans);
+   screen->tex_transfer_destroy(acc_trans);
+   screen->tex_transfer_destroy(color_trans);
 }
 
 
@@ -264,8 +264,8 @@ accum_load(struct pipe_context *pipe, GLfloat value,
    acc_put_tile_rgba(pipe, acc_trans, 0, 0, width, height, buf);
 
    _mesa_free(buf);
-   screen->tex_transfer_release(screen, &acc_trans);
-   screen->tex_transfer_release(screen, &color_trans);
+   screen->tex_transfer_destroy(acc_trans);
+   screen->tex_transfer_destroy(color_trans);
 }
 
 
@@ -316,8 +316,8 @@ accum_return(GLcontext *ctx, GLfloat value,
    _mesa_free(abuf);
    if (cbuf)
       _mesa_free(cbuf);
-   screen->tex_transfer_release(screen, &acc_trans);
-   screen->tex_transfer_release(screen, &color_trans);
+   screen->tex_transfer_destroy(acc_trans);
+   screen->tex_transfer_destroy(color_trans);
 }
 
 
index f55a5e713ffee55d89a815b7aa71fde1b8741108..f77ac14762f6e73116efa6466ad1a463a7eb85f3 100644 (file)
@@ -351,7 +351,7 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,
 
    /* Release transfer */
    screen->transfer_unmap(screen, transfer);
-   screen->tex_transfer_release(screen, &transfer);
+   screen->tex_transfer_destroy(transfer);
 
    return pt;
 }
@@ -379,7 +379,7 @@ setup_bitmap_vertex_data(struct st_context *st,
    GLuint i;
 
    if (st->bitmap.vbuf_slot >= max_slots) {
-      pipe_buffer_reference(pipe->screen, &st->bitmap.vbuf, NULL);
+      pipe_buffer_reference(&st->bitmap.vbuf, NULL);
       st->bitmap.vbuf_slot = 0;
    }
 
@@ -571,7 +571,7 @@ reset_cache(struct st_context *st)
    cache->ymax = -1000000;
 
    if (cache->trans)
-      screen->tex_transfer_release(screen, &cache->trans);
+      screen->tex_transfer_destroy(cache->trans);
 
    assert(!cache->texture);
 
@@ -623,7 +623,7 @@ st_flush_bitmap_cache(struct st_context *st)
          screen->transfer_unmap(screen, cache->trans);
          cache->buffer = NULL;
 
-         screen->tex_transfer_release(screen, &cache->trans);
+         screen->tex_transfer_destroy(cache->trans);
 
          draw_bitmap_quad(st->ctx,
                           cache->xpos,
@@ -651,7 +651,7 @@ st_flush_bitmap( struct st_context *st )
    /* Release vertex buffer to avoid synchronous rendering if we were
     * to map it in the next frame.
     */
-   pipe_buffer_reference(st->pipe->screen, &st->bitmap.vbuf, NULL);
+   pipe_buffer_reference(&st->bitmap.vbuf, NULL);
    st->bitmap.vbuf_slot = 0;
 }
 
@@ -819,7 +819,7 @@ st_destroy_bitmap(struct st_context *st)
    struct bitmap_cache *cache = st->bitmap.cache;
 
    screen->transfer_unmap(screen, cache->trans);
-   screen->tex_transfer_release(screen, &cache->trans);
+   screen->tex_transfer_destroy(cache->trans);
 
    if (st->bitmap.vs) {
       cso_delete_vertex_shader(st->cso_context, st->bitmap.vs);
@@ -828,12 +828,12 @@ st_destroy_bitmap(struct st_context *st)
    util_free_shader(&st->bitmap.vert_shader);
 
    if (st->bitmap.vbuf) {
-      pipe_buffer_reference(pipe->screen, &st->bitmap.vbuf, NULL);
+      pipe_buffer_reference(&st->bitmap.vbuf, NULL);
       st->bitmap.vbuf = NULL;
    }
 
    if (st->bitmap.cache) {
-      pipe_texture_release(&st->bitmap.cache->texture);
+      pipe_texture_reference(&st->bitmap.cache->texture, NULL);
       _mesa_free(st->bitmap.cache);
       st->bitmap.cache = NULL;
    }
index 28e387c399db7f2aaac21f8c6bacf261e4664039..52099232adef9b49b079c3df54dfb01c3240089a 100644 (file)
@@ -74,11 +74,10 @@ st_bufferobj_alloc(GLcontext *ctx, GLuint name, GLenum target)
 static void
 st_bufferobj_free(GLcontext *ctx, struct gl_buffer_object *obj)
 {
-   struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
 
    if (st_obj->buffer) 
-      pipe_buffer_reference(pipe->screen, &st_obj->buffer, NULL);
+      pipe_buffer_reference(&st_obj->buffer, NULL);
 
    _mesa_free(st_obj);
 }
@@ -165,7 +164,7 @@ st_bufferobj_data(GLcontext *ctx,
       buffer_usage = 0;
    }
 
-   pipe_buffer_reference( pipe->screen, &st_obj->buffer, NULL );
+   pipe_buffer_reference( &st_obj->buffer, NULL );
 
    st_obj->buffer = pipe_buffer_create( pipe->screen, 32, buffer_usage, size );
 
index c6fc7cec27c87cea16caf8b098f9e041fd810c06..7d4948a64ead3c4b71822b77d5a4d62110fef4b5 100644 (file)
@@ -95,8 +95,6 @@ st_init_clear(struct st_context *st)
 void
 st_destroy_clear(struct st_context *st)
 {
-   struct pipe_context *pipe = st->pipe;
-
    if (st->clear.vert_shader.tokens) {
       util_free_shader(&st->clear.vert_shader);
       st->clear.vert_shader.tokens = NULL;
@@ -116,7 +114,7 @@ st_destroy_clear(struct st_context *st)
       st->clear.vs = NULL;
    }
    if (st->clear.vbuf) {
-      pipe_buffer_reference(pipe->screen, &st->clear.vbuf, NULL);
+      pipe_buffer_reference(&st->clear.vbuf, NULL);
       st->clear.vbuf = NULL;
    }
 }
@@ -152,7 +150,7 @@ draw_quad(GLcontext *ctx,
    GLuint i;
 
    if (st->clear.vbuf_slot >= max_slots) {
-      pipe_buffer_reference(pipe->screen, &st->clear.vbuf, NULL);
+      pipe_buffer_reference(&st->clear.vbuf, NULL);
       st->clear.vbuf_slot = 0;
    }
 
@@ -524,7 +522,7 @@ void st_flush_clear( struct st_context *st )
    /* Release vertex buffer to avoid synchronous rendering if we were
     * to map it in the next frame.
     */
-   pipe_buffer_reference(st->pipe->screen, &st->clear.vbuf, NULL);
+   pipe_buffer_reference(&st->clear.vbuf, NULL);
    st->clear.vbuf_slot = 0;
 }
  
index cc7a9e789070060735432379db3aff0870356c5a..0a09e7e6f19b2d8a93264224046051be800b0f3e 100644 (file)
@@ -392,7 +392,7 @@ make_texture(struct st_context *st,
 
       /* unmap */
       screen->transfer_unmap(screen, transfer);
-      screen->tex_transfer_release(screen, &transfer);
+      screen->tex_transfer_destroy(transfer);
 
       assert(success);
 
@@ -495,7 +495,7 @@ draw_quad(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z,
                               PIPE_PRIM_QUADS,
                               4,  /* verts */
                               3); /* attribs/vert */
-      pipe_buffer_reference(pipe->screen, &buf, NULL);
+      pipe_buffer_reference(&buf, NULL);
    }
 }
 
@@ -808,7 +808,7 @@ draw_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
 
    /* unmap the stencil buffer */
    screen->transfer_unmap(screen, pt);
-   screen->tex_transfer_release(screen, &pt);
+   screen->tex_transfer_destroy(pt);
 }
 
 
@@ -951,7 +951,7 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
 
    /* unmap the stencil buffer */
    screen->transfer_unmap(screen, ptDraw);
-   screen->tex_transfer_release(screen, &ptDraw);
+   screen->tex_transfer_destroy(ptDraw);
 }
 
 
@@ -1070,8 +1070,8 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
          _mesa_free(buf);
       }
 
-      screen->tex_transfer_release(screen, &ptRead);
-      screen->tex_transfer_release(screen, &ptTex);
+      screen->tex_transfer_destroy(ptRead);
+      screen->tex_transfer_destroy(ptTex);
    }
 
    /* draw textured quad */
index 4e669f113bfb8cf5f5e2d7edaaa9dbe2508be64c..121ca8c29a772d648951f77e15b1d4cc0cd24d0c 100644 (file)
@@ -413,7 +413,6 @@ static void
 st_finish_render_texture(GLcontext *ctx,
                          struct gl_renderbuffer_attachment *att)
 {
-   struct pipe_screen *screen = ctx->st->pipe->screen;
    struct st_renderbuffer *strb = st_renderbuffer(att->Renderbuffer);
 
    if (!strb)
@@ -422,7 +421,7 @@ st_finish_render_texture(GLcontext *ctx,
    st_flush( ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL );
 
    if (strb->surface)
-      screen->tex_surface_release( screen, &strb->surface );
+      pipe_surface_reference( &strb->surface, NULL );
 
    strb->rtt = NULL;
 
index 5a4a7f0a616cc8ffbcbc529393d4c175eea7889d..2a4beccd90e3c7c40b9fe91f665df993879d4e4b 100644 (file)
@@ -134,7 +134,7 @@ st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
 
    /* unmap the stencil buffer */
    screen->transfer_unmap(screen, pt);
-   screen->tex_transfer_release(screen, &pt);
+   screen->tex_transfer_destroy(pt);
 }
 
 
@@ -224,7 +224,7 @@ st_fast_readpixels(GLcontext *ctx, struct st_renderbuffer *strb,
 
       map = screen->transfer_map(screen, trans);
       if (!map) {
-         screen->tex_transfer_release(screen, &trans);
+         screen->tex_transfer_destroy(trans);
          return GL_FALSE;
       }
 
@@ -282,7 +282,7 @@ st_fast_readpixels(GLcontext *ctx, struct st_renderbuffer *strb,
       }
 
       screen->transfer_unmap(screen, trans);
-      screen->tex_transfer_release(screen, &trans);
+      screen->tex_transfer_destroy(trans);
    }
 
    return GL_TRUE;
@@ -466,7 +466,7 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
       }
    }
 
-   screen->tex_transfer_release(screen, &trans);
+   screen->tex_transfer_destroy(trans);
 
    _mesa_unmap_readpix_pbo(ctx, &clippedPacking);
 }
index 3039eb2a877a07c5612f39c682ce527fb364c73f..a50445414598882362b40403b6a63e9cbcb82a99 100644 (file)
@@ -938,12 +938,12 @@ fallback_copy_texsubimage(GLcontext *ctx,
       srcY = strb->Base.Height - srcY - height;
    }
 
-   src_trans = pipe->screen->get_tex_transfer( pipe->screen,
-                                               strb->texture,
-                                               0, 0, 0,
-                                               PIPE_TRANSFER_READ,
-                                               srcX, srcY,
-                                               width, height);
+   src_trans = screen->get_tex_transfer( screen,
+                                         strb->texture,
+                                         0, 0, 0,
+                                         PIPE_TRANSFER_READ,
+                                         srcX, srcY,
+                                         width, height);
 
    texDest = st_texture_image_map(ctx->st, stImage, 0, PIPE_TRANSFER_WRITE,
                                   destX, destY, width, height);
@@ -1020,7 +1020,7 @@ fallback_copy_texsubimage(GLcontext *ctx,
    }
 
    st_texture_image_unmap(ctx->st, stImage);
-   screen->tex_transfer_release(screen, &src_trans);
+   screen->tex_transfer_destroy(src_trans);
 }
 
 
@@ -1413,7 +1413,7 @@ st_finalize_texture(GLcontext *ctx,
           stObj->pt->depth[0] != firstImage->base.Depth2 ||
           stObj->pt->block.size/stObj->pt->block.width != cpp || /* Nominal bytes per pixel */
           stObj->pt->compressed != firstImage->base.IsCompressed) {
-         pipe_texture_release(&stObj->pt);
+         pipe_texture_reference(&stObj->pt, NULL);
          ctx->st->dirty.st |= ST_NEW_FRAMEBUFFER;
       }
    }
index 78a7956c90dd9d12b381dd49a962b3ce91a4bbed..f31be690237aac38cf0975baeefb1cf002ce0743 100644 (file)
@@ -209,7 +209,7 @@ static void st_destroy_context_priv( struct st_context *st )
 
    for (i = 0; i < Elements(st->state.constants); i++) {
       if (st->state.constants[i].buffer) {
-         pipe_buffer_reference(st->pipe->screen, &st->state.constants[i].buffer, NULL);
+         pipe_buffer_reference(&st->state.constants[i].buffer, NULL);
       }
    }
 
index b52e488612867110035bef0d8a70561d019136ba..be1d9a86281c83daa9d66a1f4bf1e4558fd0ee02 100644 (file)
@@ -378,7 +378,7 @@ setup_interleaved_attribs(GLcontext *ctx,
          }
          else {
             vbuffer->buffer = NULL;
-            pipe_buffer_reference(pipe->screen, &vbuffer->buffer, stobj->buffer);
+            pipe_buffer_reference(&vbuffer->buffer, stobj->buffer);
             vbuffer->buffer_offset = (unsigned) low;
          }
          vbuffer->stride = stride; /* in bytes */
@@ -433,7 +433,7 @@ setup_non_interleaved_attribs(GLcontext *ctx,
          /*printf("stobj %u = %p\n", attr, (void*) stobj);*/
 
          vbuffer[attr].buffer = NULL;
-         pipe_buffer_reference(pipe->screen, &vbuffer[attr].buffer, stobj->buffer);
+         pipe_buffer_reference(&vbuffer[attr].buffer, stobj->buffer);
          vbuffer[attr].buffer_offset = (unsigned) arrays[mesaAttr]->Ptr;
          velements[attr].src_offset = 0;
       }
@@ -617,7 +617,7 @@ st_draw_vbo(GLcontext *ctx,
       if (bufobj && bufobj->Name) {
          /* elements/indexes are in a real VBO */
          struct st_buffer_object *stobj = st_buffer_object(bufobj);
-         pipe_buffer_reference(pipe->screen, &indexBuf, stobj->buffer);
+         pipe_buffer_reference(&indexBuf, stobj->buffer);
          indexOffset = (unsigned) ib->ptr / indexSize;
       }
       else {
@@ -657,7 +657,7 @@ st_draw_vbo(GLcontext *ctx,
          }
       }
 
-      pipe_buffer_reference(pipe->screen, &indexBuf, NULL);
+      pipe_buffer_reference(&indexBuf, NULL);
    }
    else {
       /* non-indexed */
@@ -673,7 +673,7 @@ st_draw_vbo(GLcontext *ctx,
 
    /* unreference buffers (frees wrapped user-space buffer objects) */
    for (attr = 0; attr < num_vbuffers; attr++) {
-      pipe_buffer_reference(pipe->screen, &vbuffer[attr].buffer, NULL);
+      pipe_buffer_reference(&vbuffer[attr].buffer, NULL);
       assert(!vbuffer[attr].buffer);
    }
 
index 5c9c4506c225615976aaec637ce402d02c07cc72..d63d8cae28e5cde6fb3a9984fbbb130765490d49 100644 (file)
@@ -152,7 +152,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
          assert(stobj->buffer);
 
          vbuffers[attr].buffer = NULL;
-         pipe_buffer_reference(pipe->screen, &vbuffers[attr].buffer, stobj->buffer);
+         pipe_buffer_reference(&vbuffers[attr].buffer, stobj->buffer);
          vbuffers[attr].buffer_offset = (unsigned) arrays[0]->Ptr;/* in bytes */
          velements[attr].src_offset = arrays[mesaAttr]->Ptr - arrays[0]->Ptr;
       }
@@ -248,7 +248,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
    for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
       if (draw->pt.vertex_buffer[i].buffer) {
          pipe_buffer_unmap(pipe->screen, draw->pt.vertex_buffer[i].buffer);
-         pipe_buffer_reference(pipe->screen, &draw->pt.vertex_buffer[i].buffer, NULL);
+         pipe_buffer_reference(&draw->pt.vertex_buffer[i].buffer, NULL);
          draw_set_mapped_vertex_buffer(draw, i, NULL);
       }
    }
index 08e48030681bf71e52a4e9a56313332908c53706..9cc2176d5e47ef04b6003e936952eba1d64f5229 100644 (file)
@@ -147,8 +147,8 @@ fallback_generate_mipmap(GLcontext *ctx, GLenum target,
       screen->transfer_unmap(screen, srcTrans);
       screen->transfer_unmap(screen, dstTrans);
 
-      screen->tex_transfer_release(screen, &srcTrans);
-      screen->tex_transfer_release(screen, &dstTrans);
+      screen->tex_transfer_destroy(srcTrans);
+      screen->tex_transfer_destroy(dstTrans);
    }
 }
 
index fcf76ef82e8991d4aecad5e165e3841500f3474d..79a4bd84d017262c07ca9bd0bd6749430fd9edfc 100644 (file)
@@ -108,7 +108,7 @@ st_texture_create(struct st_context *st,
 
    newtex = screen->texture_create(screen, &pt);
 
-   assert(!newtex || newtex->refcount == 1);
+   assert(!newtex || newtex->reference.count == 1);
 
    return newtex;
 }
@@ -219,7 +219,7 @@ st_texture_image_unmap(struct st_context *st,
 
    screen->transfer_unmap(screen, stImage->transfer);
 
-   screen->tex_transfer_release(screen, &stImage->transfer);
+   screen->tex_transfer_destroy(stImage->transfer);
 }
 
 
@@ -284,7 +284,7 @@ st_texture_image_data(struct pipe_context *pipe,
                      0, 0,                             /* source x, y */
                      dst->width[level], dst->height[level]);       /* width, height */
 
-      screen->tex_transfer_release(screen, &dst_transfer);
+      screen->tex_transfer_destroy(dst_transfer);
 
       srcUB += src_image_stride;
    }
@@ -350,8 +350,8 @@ st_texture_image_copy(struct pipe_context *pipe,
                         0, 0, /* srcX, Y */
                         width, height);
 
-      screen->tex_surface_release(screen, &src_surface);
-      screen->tex_surface_release(screen, &dst_surface);
+      pipe_surface_reference(&src_surface, NULL);
+      pipe_surface_reference(&dst_surface, NULL);
    }
 }