From: Marek Olšák <marek.ol...@amd.com>

for threaded gallium
---
 src/gallium/drivers/radeon/r600_buffer_common.c | 4 +++-
 src/gallium/drivers/radeon/r600_texture.c       | 3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c 
b/src/gallium/drivers/radeon/r600_buffer_common.c
index cc9d3be..5fde0d6 100644
--- a/src/gallium/drivers/radeon/r600_buffer_common.c
+++ b/src/gallium/drivers/radeon/r600_buffer_common.c
@@ -281,21 +281,22 @@ static void *r600_buffer_get_transfer(struct pipe_context 
*ctx,
                                      struct pipe_resource *resource,
                                       unsigned usage,
                                       const struct pipe_box *box,
                                      struct pipe_transfer **ptransfer,
                                      void *data, struct r600_resource *staging,
                                      unsigned offset)
 {
        struct r600_common_context *rctx = (struct r600_common_context*)ctx;
        struct r600_transfer *transfer = slab_alloc(&rctx->pool_transfers);
 
-       transfer->transfer.resource = resource;
+       transfer->transfer.resource = NULL;
+       pipe_resource_reference(&transfer->transfer.resource, resource);
        transfer->transfer.level = 0;
        transfer->transfer.usage = usage;
        transfer->transfer.box = *box;
        transfer->transfer.stride = 0;
        transfer->transfer.layer_stride = 0;
        transfer->offset = offset;
        transfer->staging = staging;
        *ptransfer = &transfer->transfer;
        return data;
 }
@@ -468,20 +469,21 @@ static void r600_buffer_transfer_unmap(struct 
pipe_context *ctx,
        struct r600_common_context *rctx = (struct r600_common_context*)ctx;
        struct r600_transfer *rtransfer = (struct r600_transfer*)transfer;
 
        if (transfer->usage & PIPE_TRANSFER_WRITE &&
            !(transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT))
                r600_buffer_do_flush_region(ctx, transfer, &transfer->box);
 
        if (rtransfer->staging)
                r600_resource_reference(&rtransfer->staging, NULL);
 
+       pipe_resource_reference(&transfer->resource, NULL);
        slab_free(&rctx->pool_transfers, transfer);
 }
 
 void r600_buffer_subdata(struct pipe_context *ctx,
                         struct pipe_resource *buffer,
                         unsigned usage, unsigned offset,
                         unsigned size, const void *data)
 {
        struct pipe_transfer *transfer = NULL;
        struct pipe_box box;
diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 7ca112c..ec7a325 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -1483,21 +1483,21 @@ static void *r600_texture_transfer_map(struct 
pipe_context *ctx,
                                                        usage, box))
                                r600_texture_invalidate_storage(rctx, rtex);
                        else
                                use_staging_texture = true;
                }
        }
 
        trans = CALLOC_STRUCT(r600_transfer);
        if (!trans)
                return NULL;
-       trans->transfer.resource = texture;
+       pipe_resource_reference(&trans->transfer.resource, texture);
        trans->transfer.level = level;
        trans->transfer.usage = usage;
        trans->transfer.box = *box;
 
        if (rtex->is_depth) {
                struct r600_texture *staging_depth;
 
                if (rtex->resource.b.b.nr_samples > 1) {
                        /* MSAA depth buffers need to be converted to single 
sample buffers.
                         *
@@ -1636,20 +1636,21 @@ static void r600_texture_transfer_unmap(struct 
pipe_context *ctx,
         * usage will be slightly higher than given here because of the buffer
         * cache in the winsys.
         *
         * The result is that the kernel memory manager is never a bottleneck.
         */
        if (rctx->num_alloc_tex_transfer_bytes > rctx->screen->info.gart_size / 
4) {
                rctx->gfx.flush(rctx, RADEON_FLUSH_ASYNC, NULL);
                rctx->num_alloc_tex_transfer_bytes = 0;
        }
 
+       pipe_resource_reference(&transfer->resource, NULL);
        FREE(transfer);
 }
 
 static const struct u_resource_vtbl r600_texture_vtbl =
 {
        NULL,                           /* get_handle */
        r600_texture_destroy,           /* resource_destroy */
        r600_texture_transfer_map,      /* transfer_map */
        u_default_transfer_flush_region, /* transfer_flush_region */
        r600_texture_transfer_unmap,    /* transfer_unmap */
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to