diff options
author | Nicolai Hähnle <[email protected]> | 2016-05-06 21:37:52 -0500 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-06-01 22:52:19 +0200 |
commit | 9e5ed559babc468b94877ecc8e2367b70c43122f (patch) | |
tree | f6776e95afc7d5771f419b5fbeca07da78f138e2 | |
parent | 9db851b5eef5ced801915f42e7b2d54dc3be5d67 (diff) |
winsys/amdgpu: extract IB big buffer allocation for re-use
Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index 2b36ee17710..100b8372c3c 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -336,6 +336,34 @@ static unsigned amdgpu_cs_add_buffer(struct radeon_winsys_cs *rcs, return index; } +static bool amdgpu_ib_new_buffer(struct amdgpu_winsys *ws, struct amdgpu_ib *ib, + unsigned buffer_size) +{ + struct pb_buffer *pb; + uint8_t *mapped; + + pb = ws->base.buffer_create(&ws->base, buffer_size, + ws->info.gart_page_size, + RADEON_DOMAIN_GTT, + RADEON_FLAG_CPU_ACCESS); + if (!pb) + return false; + + mapped = ws->base.buffer_map(pb, NULL, PIPE_TRANSFER_WRITE); + if (!mapped) { + pb_reference(&pb, NULL); + return false; + } + + pb_reference(&ib->big_ib_buffer, pb); + pb_reference(&pb, NULL); + + ib->ib_mapped = mapped; + ib->used_ib_space = 0; + + return true; +} + static bool amdgpu_get_new_ib(struct radeon_winsys *ws, struct amdgpu_cs *cs, enum ib_type ib_type) { @@ -374,24 +402,8 @@ static bool amdgpu_get_new_ib(struct radeon_winsys *ws, struct amdgpu_cs *cs, /* Allocate a new buffer for IBs if the current buffer is all used. */ if (!ib->big_ib_buffer || ib->used_ib_space + ib_size > ib->big_ib_buffer->size) { - - pb_reference(&ib->big_ib_buffer, NULL); - ib->ib_mapped = NULL; - ib->used_ib_space = 0; - - ib->big_ib_buffer = ws->buffer_create(ws, buffer_size, - aws->info.gart_page_size, - RADEON_DOMAIN_GTT, - RADEON_FLAG_CPU_ACCESS); - if (!ib->big_ib_buffer) - return false; - - ib->ib_mapped = ws->buffer_map(ib->big_ib_buffer, NULL, - PIPE_TRANSFER_WRITE); - if (!ib->ib_mapped) { - pb_reference(&ib->big_ib_buffer, NULL); + if (!amdgpu_ib_new_buffer(aws, ib, buffer_size)) return false; - } } info->ib_mc_address = amdgpu_winsys_bo(ib->big_ib_buffer)->va + |