summaryrefslogtreecommitdiff
path: root/src/gallium/winsys
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_bo.c19
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_bo.h3
2 files changed, 13 insertions, 9 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
index a0e1d4d8074..8cb785be064 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
@@ -177,11 +177,11 @@ void amdgpu_bo_destroy(struct pb_buffer *_buf)
assert(bo->bo && "must not be called for slab entries");
- if (!bo->is_user_ptr && bo->u.real.cpu_ptr) {
+ if (!bo->u.real.is_user_ptr && bo->u.real.cpu_ptr) {
bo->u.real.cpu_ptr = NULL;
amdgpu_bo_unmap(&bo->base);
}
- assert(bo->is_user_ptr || bo->u.real.map_count == 0);
+ assert(bo->u.real.is_user_ptr || bo->u.real.map_count == 0);
#if DEBUG
if (ws->debug_all_bos) {
@@ -256,7 +256,7 @@ static void amdgpu_clean_up_buffer_managers(struct amdgpu_winsys *ws)
static bool amdgpu_bo_do_map(struct amdgpu_winsys_bo *bo, void **cpu)
{
- assert(!(bo->base.usage & RADEON_FLAG_SPARSE) && bo->bo && !bo->is_user_ptr);
+ assert(!(bo->base.usage & RADEON_FLAG_SPARSE) && bo->bo && !bo->u.real.is_user_ptr);
int r = amdgpu_bo_cpu_map(bo->bo, cpu);
if (r) {
/* Clean up buffer managers and try again. */
@@ -380,7 +380,7 @@ void *amdgpu_bo_map(struct pb_buffer *buf,
}
if (usage & RADEON_MAP_TEMPORARY) {
- if (real->is_user_ptr) {
+ if (real->u.real.is_user_ptr) {
cpu = real->u.real.cpu_ptr;
} else {
if (!amdgpu_bo_do_map(real, &cpu))
@@ -414,10 +414,11 @@ void amdgpu_bo_unmap(struct pb_buffer *buf)
assert(!(bo->base.usage & RADEON_FLAG_SPARSE));
- if (bo->is_user_ptr)
+ real = bo->bo ? bo : bo->u.slab.real;
+
+ if (real->u.real.is_user_ptr)
return;
- real = bo->bo ? bo : bo->u.slab.real;
assert(real->u.real.map_count != 0 && "too many unmaps");
if (p_atomic_dec_zero(&real->u.real.map_count)) {
assert(!real->u.real.cpu_ptr &&
@@ -1724,7 +1725,7 @@ static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws,
goto error_va_map;
/* Initialize it. */
- bo->is_user_ptr = true;
+ bo->u.real.is_user_ptr = true;
pipe_reference_init(&bo->base.reference, 1);
simple_mtx_init(&bo->lock, mtx_plain);
bo->bo = buf_handle;
@@ -1759,7 +1760,9 @@ error:
static bool amdgpu_bo_is_user_ptr(struct pb_buffer *buf)
{
- return ((struct amdgpu_winsys_bo*)buf)->is_user_ptr;
+ struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
+
+ return bo->bo ? bo->u.real.is_user_ptr : false;
}
static bool amdgpu_bo_is_suballocated(struct pb_buffer *buf)
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
index 98fb609153c..176d2e1583b 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
@@ -67,6 +67,8 @@ struct amdgpu_winsys_bo {
uint32_t kms_handle;
int map_count;
+ bool is_user_ptr;
+
/* Whether buffer_get_handle or buffer_from_handle has been called,
* it can only transition from false to true. Protected by lock.
*/
@@ -92,7 +94,6 @@ struct amdgpu_winsys_bo {
struct amdgpu_winsys *ws;
amdgpu_bo_handle bo; /* NULL for slab entries and sparse buffers */
- bool is_user_ptr;
bool use_reusable_pool;
uint32_t unique_id;