summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2011-02-11 07:52:10 +0100
committerMarek Olšák <maraeo@gmail.com>2011-02-12 03:08:39 +0100
commitdf54b53b7d12a3bca5867b6649cb308feb36f0da (patch)
tree62a94f5682308e8dba045d7cb123c46fef30d420 /src/gallium/winsys/radeon/drm/radeon_drm_bo.c
parent20a78b68a3271d7a66fdf1e55c5882b8c12dfb8d (diff)
r300g: improve function radeon_bo_is_referenced_by_cs
This should prevent calling into radeon_get_reloc when there's only one context.
Diffstat (limited to 'src/gallium/winsys/radeon/drm/radeon_drm_bo.c')
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_bo.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
index a9e913e762..47d4f4d784 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
@@ -91,7 +91,7 @@ void radeon_bo_unref(struct radeon_bo *bo)
{
struct drm_gem_close args = {};
- if (!p_atomic_dec_zero(&bo->cref))
+ if (!p_atomic_dec_zero(&bo->ref_count))
return;
if (bo->name) {
@@ -106,7 +106,7 @@ void radeon_bo_unref(struct radeon_bo *bo)
/* Close object. */
args.handle = bo->handle;
- drmIoctl(bo->mgr->rws->fd, DRM_IOCTL_GEM_CLOSE, &args);
+ drmIoctl(bo->rws->fd, DRM_IOCTL_GEM_CLOSE, &args);
FREE(bo);
}
@@ -116,7 +116,7 @@ static void radeon_bo_wait(struct r300_winsys_bo *_buf)
struct drm_radeon_gem_wait_idle args = {};
args.handle = bo->handle;
- while (drmCommandWriteRead(bo->mgr->rws->fd, DRM_RADEON_GEM_WAIT_IDLE,
+ while (drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_WAIT_IDLE,
&args, sizeof(args)) == -EBUSY);
}
@@ -126,7 +126,7 @@ static boolean radeon_bo_is_busy(struct r300_winsys_bo *_buf)
struct drm_radeon_gem_busy args = {};
args.handle = bo->handle;
- return drmCommandWriteRead(bo->mgr->rws->fd, DRM_RADEON_GEM_BUSY,
+ return drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_BUSY,
&args, sizeof(args)) != 0;
}
@@ -202,7 +202,7 @@ static void *radeon_bo_map_internal(struct pb_buffer *_buf,
args.handle = bo->handle;
args.offset = 0;
args.size = (uint64_t)bo->size;
- if (drmCommandWriteRead(bo->mgr->rws->fd,
+ if (drmCommandWriteRead(bo->rws->fd,
DRM_RADEON_GEM_MMAP,
&args,
sizeof(args))) {
@@ -211,7 +211,7 @@ static void *radeon_bo_map_internal(struct pb_buffer *_buf,
return NULL;
}
ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED,
- bo->mgr->rws->fd, args.addr_ptr);
+ bo->rws->fd, args.addr_ptr);
if (ptr == MAP_FAILED) {
fprintf(stderr, "radeon: mmap failed, errno: %i\n", errno);
return NULL;
@@ -293,6 +293,7 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr,
bo->base.base.size = size;
bo->base.vtbl = &radeon_bo_vtbl;
bo->mgr = mgr;
+ bo->rws = mgr->rws;
bo->handle = args.handle;
bo->size = size;
@@ -359,7 +360,7 @@ static void radeon_bo_get_tiling(struct r300_winsys_bo *_buf,
args.handle = bo->handle;
- drmCommandWriteRead(bo->mgr->rws->fd,
+ drmCommandWriteRead(bo->rws->fd,
DRM_RADEON_GEM_GET_TILING,
&args,
sizeof(args));
@@ -392,7 +393,7 @@ static void radeon_bo_set_tiling(struct r300_winsys_bo *_buf,
args.handle = bo->handle;
args.pitch = pitch;
- drmCommandWriteRead(bo->mgr->rws->fd,
+ drmCommandWriteRead(bo->rws->fd,
DRM_RADEON_GEM_SET_TILING,
&args,
sizeof(args));
@@ -504,6 +505,7 @@ static struct r300_winsys_bo *radeon_winsys_bo_from_handle(struct r300_winsys_sc
bo->base.base.size = bo->size;
bo->base.vtbl = &radeon_bo_vtbl;
bo->mgr = mgr;
+ bo->rws = mgr->rws;
util_hash_table_set(mgr->bo_handles, (void*)(uintptr_t)whandle->handle, bo);
@@ -528,14 +530,12 @@ static boolean radeon_winsys_bo_get_handle(struct r300_winsys_bo *buffer,
{
struct drm_gem_flink flink = {};
struct radeon_bo *bo = get_radeon_bo(pb_buffer(buffer));
- whandle->stride = stride;
-
if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
if (!bo->flinked) {
flink.handle = bo->handle;
- if (ioctl(bo->mgr->rws->fd, DRM_IOCTL_GEM_FLINK, &flink)) {
+ if (ioctl(bo->rws->fd, DRM_IOCTL_GEM_FLINK, &flink)) {
return FALSE;
}
@@ -546,6 +546,8 @@ static boolean radeon_winsys_bo_get_handle(struct r300_winsys_bo *buffer,
} else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
whandle->handle = bo->handle;
}
+
+ whandle->stride = stride;
return TRUE;
}