diff options
author | Marek Olšák <[email protected]> | 2017-03-12 14:19:31 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-05-15 13:01:33 +0200 |
commit | 7166773f90d541103b85e35227d59d82b416aa45 (patch) | |
tree | 183b863ca216e09c9bd078d087065264c04430ca /src/gallium/drivers/radeon | |
parent | 04299f7e5dc1139f2e49da17a99455d830f3362b (diff) |
radeonsi: implement replace_buffer_storage for the threaded context
Reviewed-by: Nicolai Hähnle <[email protected]>
Tested-by: Dieter Nützel <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeon')
-rw-r--r-- | src/gallium/drivers/radeon/r600_buffer_common.c | 23 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.h | 11 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c index 8ded99e90ca..fb74b45d2fa 100644 --- a/src/gallium/drivers/radeon/r600_buffer_common.c +++ b/src/gallium/drivers/radeon/r600_buffer_common.c @@ -273,6 +273,29 @@ r600_invalidate_buffer(struct r600_common_context *rctx, return true; } +/* Replace the storage of dst with src. */ +void r600_replace_buffer_storage(struct pipe_context *ctx, + struct pipe_resource *dst, + struct pipe_resource *src) +{ + struct r600_common_context *rctx = (struct r600_common_context *)ctx; + struct r600_resource *rdst = r600_resource(dst); + struct r600_resource *rsrc = r600_resource(src); + uint64_t old_gpu_address = rdst->gpu_address; + + pb_reference(&rdst->buf, rsrc->buf); + rdst->gpu_address = rsrc->gpu_address; + + 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); +} + void r600_invalidate_resource(struct pipe_context *ctx, struct pipe_resource *resource) { diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index a694b974adf..f9c9f115b88 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -666,6 +666,12 @@ struct r600_common_context { * the buffer is bound, including all resource descriptors. */ void (*invalidate_buffer)(struct pipe_context *ctx, struct pipe_resource *buf); + /* Update all resource bindings where the buffer is bound, including + * all resource descriptors. This is invalidate_buffer without + * the invalidation. */ + void (*rebind_buffer)(struct pipe_context *ctx, struct pipe_resource *buf, + uint64_t old_gpu_address); + /* Enable or disable occlusion queries. */ void (*set_occlusion_query_state)(struct pipe_context *ctx, bool enable); @@ -683,7 +689,7 @@ struct r600_common_context { enum ring_type ring); }; -/* r600_buffer.c */ +/* r600_buffer_common.c */ bool r600_rings_is_buffer_referenced(struct r600_common_context *ctx, struct pb_buffer *buf, enum radeon_bo_usage usage); @@ -714,6 +720,9 @@ r600_buffer_from_user_memory(struct pipe_screen *screen, void r600_invalidate_resource(struct pipe_context *ctx, struct pipe_resource *resource); +void r600_replace_buffer_storage(struct pipe_context *ctx, + struct pipe_resource *dst, + struct pipe_resource *src); /* r600_common_pipe.c */ void r600_gfx_write_event_eop(struct r600_common_context *ctx, |