summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-02-07 17:03:59 +0100
committerNicolai Hähnle <nicolai.haehnle@amd.com>2017-04-05 10:37:18 +0200
commite3482486473a471b4da80b2db2c7c3f3b6445d02 (patch)
tree1911c2f8fd33c2aed111b47f5d79458c170a19d9
parentf3e514361c817037e5c26edaf4200a20a3442382 (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.c9
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_bo.h38
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;