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