diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-02-07 17:03:59 +0100 |
---|---|---|
committer | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-04-05 10:37:18 +0200 |
commit | e3482486473a471b4da80b2db2c7c3f3b6445d02 (patch) | |
tree | 1911c2f8fd33c2aed111b47f5d79458c170a19d9 | |
parent | f3e514361c817037e5c26edaf4200a20a3442382 (diff) |
winsys/amdgpu: add sparse buffer data structures
v2:
- remove pipe_mutex_*
- use a simple page commitment array
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 9 | ||||
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_bo.h | 38 |
2 files changed, 46 insertions, 1 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c index c805da8a18..122f47c3cb 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c @@ -38,6 +38,11 @@ #include <stdio.h> #include <inttypes.h> + +struct amdgpu_sparse_backing_chunk { + uint32_t begin, end; +}; + static struct pb_buffer * amdgpu_bo_create(struct radeon_winsys *rws, uint64_t size, @@ -210,6 +215,8 @@ static void *amdgpu_bo_map(struct pb_buffer *buf, void *cpu = NULL; uint64_t offset = 0; + assert(!bo->sparse); + /* If it's not unsynchronized bo_map, flush CS if needed and then wait. */ if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { /* DONTBLOCK doesn't make sense with UNSYNCHRONIZED. */ @@ -322,6 +329,8 @@ static void amdgpu_bo_unmap(struct pb_buffer *buf) struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf; struct amdgpu_winsys_bo *real; + assert(!bo->sparse); + if (bo->user_ptr) return; diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h index 1e25897b6c..1311344b81 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h @@ -37,6 +37,28 @@ #include "pipebuffer/pb_slab.h" +struct amdgpu_sparse_backing_chunk; + +/* + * Sub-allocation information for a real buffer used as backing memory of a + * sparse buffer. + */ +struct amdgpu_sparse_backing { + struct list_head list; + + struct amdgpu_winsys_bo *bo; + + /* Sorted list of free chunks. */ + struct amdgpu_sparse_backing_chunk *chunks; + uint32_t max_chunks; + uint32_t num_chunks; +}; + +struct amdgpu_sparse_commitment { + struct amdgpu_sparse_backing *backing; + uint32_t page; +}; + struct amdgpu_winsys_bo { struct pb_buffer base; union { @@ -53,12 +75,26 @@ struct amdgpu_winsys_bo { struct pb_slab_entry entry; struct amdgpu_winsys_bo *real; } slab; + struct { + mtx_t commit_lock; + amdgpu_va_handle va_handle; + enum radeon_bo_flag flags; + + uint32_t num_va_pages; + uint32_t num_backing_pages; + + struct list_head backing; + + /* Commitment information for each page of the virtual memory area. */ + struct amdgpu_sparse_commitment *commitments; + } sparse; } u; struct amdgpu_winsys *ws; void *user_ptr; /* from buffer_from_ptr */ - amdgpu_bo_handle bo; /* NULL for slab entries */ + amdgpu_bo_handle bo; /* NULL for slab entries and sparse buffers */ + bool sparse; uint32_t unique_id; uint64_t va; enum radeon_bo_domain initial_domain; |