diff options
author | Marek Olšák <[email protected]> | 2017-07-04 17:29:46 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-07-17 10:50:39 -0400 |
commit | d308460586d012f3d716bcee1c6c2dc10b0ac668 (patch) | |
tree | 2615ace076239e4665436b0e858631590d42d23b /src/gallium | |
parent | 5b555854cc2c36e16e1ce3e5e81c09c869ec3531 (diff) |
gallium/radeon: reallocate suballocated buffers when exported
This should fix exports of suballocated buffers.
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/radeon/r600_buffer_common.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/r600_texture.c | 26 |
2 files changed, 28 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c index 40d763bd9f5..dd1c2090fdf 100644 --- a/src/gallium/drivers/radeon/r600_buffer_common.c +++ b/src/gallium/drivers/radeon/r600_buffer_common.c @@ -288,13 +288,14 @@ void r600_replace_buffer_storage(struct pipe_context *ctx, pb_reference(&rdst->buf, rsrc->buf); rdst->gpu_address = rsrc->gpu_address; + rdst->b.b.bind = rsrc->b.b.bind; + rdst->flags = rsrc->flags; assert(rdst->vram_usage == rsrc->vram_usage); assert(rdst->gart_usage == rsrc->gart_usage); assert(rdst->bo_size == rsrc->bo_size); assert(rdst->bo_alignment == rsrc->bo_alignment); assert(rdst->domains == rsrc->domains); - assert(rdst->flags == rsrc->flags); rctx->rebind_buffer(ctx, dst, old_gpu_address); } diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index f5f7d1030c8..3aac3c78a98 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -618,6 +618,32 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen, slice_size = rtex->surface.u.legacy.level[0].slice_size; } } else { + /* Move a suballocated buffer into a non-suballocated allocation. */ + if (rscreen->ws->buffer_is_suballocated(res->buf)) { + assert(!res->b.is_shared); + + /* Allocate a new buffer with PIPE_BIND_SHARED. */ + struct pipe_resource templ = res->b.b; + templ.bind |= PIPE_BIND_SHARED; + + struct pipe_resource *newb = + screen->resource_create(screen, &templ); + if (!newb) + return false; + + /* Copy the old buffer contents to the new one. */ + struct pipe_box box; + u_box_1d(0, newb->width0, &box); + rctx->b.resource_copy_region(&rctx->b, newb, 0, 0, 0, 0, + &res->b.b, 0, &box); + /* Move the new buffer storage to the old pipe_resource. */ + r600_replace_buffer_storage(&rctx->b, &res->b.b, newb); + pipe_resource_reference(&newb, NULL); + + assert(res->b.b.bind & PIPE_BIND_SHARED); + assert(res->flags & RADEON_FLAG_NO_SUBALLOC); + } + /* Buffers */ offset = 0; stride = 0; |