[PATCH 36/54] drm: generalized bo unmap

"Enrico Weigelt, metux IT consult" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
We have separate implementations of unmapping the bo's from
process address space, which are essentially doing the same.

Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]>
---
 src/drm/cairo-drm-bo.c             | 16 ++++++++++++++++
 src/drm/cairo-drm-i915-surface.c   |  6 ++----
 src/drm/cairo-drm-i965-surface.c   |  5 ++---
 src/drm/cairo-drm-intel-private.h  |  4 ----
 src/drm/cairo-drm-intel.c          | 30 +++++++++++-------------------
 src/drm/cairo-drm-private.h        |  6 ++++++
 src/drm/cairo-drm-radeon-private.h |  5 -----
 src/drm/cairo-drm-radeon-surface.c |  4 ++--
 src/drm/cairo-drm-radeon.c         | 23 +++++++----------------
 9 files changed, 46 insertions(+), 53 deletions(-)

diff --git a/src/drm/cairo-drm-bo.c b/src/drm/cairo-drm-bo.c
index e792236..fa8a5cf 100644
--- a/src/drm/cairo-drm-bo.c
+++ b/src/drm/cairo-drm-bo.c
@@ -34,6 +34,7 @@
 #include <sys/ioctl.h>
 #include <errno.h>
 #include <drm/drm.h>
+#include <sys/mman.h>  /* munmap() */
 
 #define ERR_DEBUG(x) x
 
@@ -92,8 +93,23 @@ _cairo_drm_bo_close (const cairo_drm_device_t *dev,
     struct drm_gem_close close;
     int ret;
 
+    _cairo_drm_bo_unmap (bo);
+
     close.handle = bo->handle;
     do {
 	ret = ioctl (dev->fd, DRM_IOCTL_GEM_CLOSE, &close);
     } while (ret == -1 && errno == EINTR);
 }
+
+void
+_cairo_drm_bo_unmap (cairo_drm_bo_t *bo)
+{
+    if (unlikely(bo == NULL))
+	return;
+
+    if (unlikely(bo->mapped == NULL))
+	return;
+
+    munmap (bo->mapped, bo->size);
+    bo->mapped = NULL;
+}
diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c
index 7c91825..c24bb47 100644
--- a/src/drm/cairo-drm-i915-surface.c
+++ b/src/drm/cairo-drm-i915-surface.c
@@ -256,10 +256,10 @@ i915_bo_exec (i915_device_t *device, intel_bo_t *bo, uint32_t offset)
 
     bo->offset = device->batch.exec[i].offset;
     bo->busy = TRUE;
-    if (bo->virtual)
-	intel_bo_unmap (bo);
     bo->cpu = FALSE;
 
+    _cairo_drm_bo_unmap (&(bo->base));
+
     while (cnt--) {
 	intel_bo_t *bo = device->batch.target_bo[cnt];
 
@@ -270,8 +270,6 @@ i915_bo_exec (i915_device_t *device, intel_bo_t *bo, uint32_t offset)
 	bo->batch_write_domain = 0;
 	cairo_list_del (&bo->cache_list);
 
-	if (bo->virtual)
-	    intel_bo_unmap (bo);
 	bo->cpu = FALSE;
 
 	intel_bo_destroy (&device->intel, bo);
diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c
index 29a21cc..215d413 100644
--- a/src/drm/cairo-drm-i965-surface.c
+++ b/src/drm/cairo-drm-i965-surface.c
@@ -382,11 +382,10 @@ i965_exec (i965_device_t *device, uint32_t offset)
 	bo->exec = NULL;
 	bo->batch_read_domains = 0;
 	bo->batch_write_domain = 0;
-
-	if (bo->virtual)
-	    intel_bo_unmap (bo);
 	bo->cpu = FALSE;
 
+	_cairo_drm_bo_unmap (&(bo->base));
+
 	if (bo->purgeable)
 	    ret = intel_bo_madvise (&device->intel, bo, I915_MADV_DONTNEED);
 	    /* ignore immediate notification of purging */
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index 25f739c..c5cb9a7 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -75,7 +75,6 @@ typedef struct _intel_bo {
     uint32_t cpu :1;
 
     struct drm_i915_gem_exec_object2 *exec;
-    void *virtual;
 } intel_bo_t;
 
 #define INTEL_BATCH_SIZE (64*1024)
@@ -350,9 +349,6 @@ intel_bo_read (const intel_device_t *dev,
 cairo_private void *
 intel_bo_map (const intel_device_t *dev, intel_bo_t *bo);
 
-cairo_private void
-intel_bo_unmap (intel_bo_t *bo);
-
 cairo_private cairo_status_t
 intel_bo_init (const intel_device_t *dev,
 	       intel_bo_t *bo,
diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c
index b5704f5..b656df2 100644
--- a/src/drm/cairo-drm-intel.c
+++ b/src/drm/cairo-drm-intel.c
@@ -163,8 +163,8 @@ intel_bo_map (const intel_device_t *device, intel_bo_t *bo)
 
     intel_bo_set_tiling (device, bo);
 
-    if (bo->virtual != NULL)
-	return bo->virtual;
+    if (bo->base.mapped != NULL)
+	return bo->base.mapped;
 
     if (bo->cpu && bo->tiling == I915_TILING_NONE) {
 	struct drm_i915_gem_mmap mmap_arg;
@@ -182,7 +182,7 @@ intel_bo_map (const intel_device_t *device, intel_bo_t *bo)
 	    return NULL;
 	}
 
-	bo->virtual = (void *) (uintptr_t) mmap_arg.addr_ptr;
+	bo->base.mapped = (void *) (uintptr_t) mmap_arg.addr_ptr;
 	domain = I915_GEM_DOMAIN_CPU;
     } else {
 	struct drm_i915_gem_mmap_gtt mmap_arg;
@@ -208,11 +208,11 @@ intel_bo_map (const intel_device_t *device, intel_bo_t *bo)
 	    return NULL;
 	}
 
-	bo->virtual = ptr;
+	bo->base.mapped = ptr;
 	domain = I915_GEM_DOMAIN_GTT;
     }
 
-    VG (VALGRIND_MAKE_MEM_DEFINED (bo->virtual, bo->base.size));
+    VG (VALGRIND_MAKE_MEM_DEFINED (bo->base.mapped, bo->base.size));
 
     set_domain.handle = bo->base.handle;
     set_domain.read_domains = domain;
@@ -225,20 +225,13 @@ intel_bo_map (const intel_device_t *device, intel_bo_t *bo)
     } while (ret == -1 && errno == EINTR);
 
     if (ret != 0) {
-	intel_bo_unmap (bo);
+	_cairo_drm_bo_unmap (&(bo->base));
 	_cairo_error_throw (CAIRO_STATUS_DEVICE_ERROR);
 	return NULL;
     }
 
     bo->busy = FALSE;
-    return bo->virtual;
-}
-
-void
-intel_bo_unmap (intel_bo_t *bo)
-{
-    munmap (bo->virtual, bo->base.size);
-    bo->virtual = NULL;
+    return bo->base.mapped;
 }
 
 cairo_bool_t
@@ -398,7 +391,7 @@ intel_bo_create (intel_device_t *device,
     bo->base.name = 0;
 
     bo->offset = 0;
-    bo->virtual = NULL;
+    bo->base.mapped = NULL;
     bo->cpu = TRUE;
 
     bo->_tiling = I915_TILING_NONE;
@@ -457,7 +450,7 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
 
     bo->full_size = bo->base.size;
     bo->offset = 0;
-    bo->virtual = NULL;
+    bo->base.mapped = NULL;
     bo->purgeable = 0;
     bo->busy = TRUE;
     bo->cpu = FALSE;
@@ -496,8 +489,7 @@ intel_bo_release (void *_dev, void *_bo)
     intel_device_t *device = _dev;
     intel_bo_t *bo = _bo;
 
-    if (bo->virtual != NULL)
-	intel_bo_unmap (bo);
+    _cairo_drm_bo_unmap (&(bo->base));
 
     assert (bo->exec == NULL);
     assert (cairo_list_is_empty (&bo->cache_list));
@@ -874,7 +866,7 @@ intel_glyph_cache_add_glyph (intel_device_t *device,
 
     height = glyph_surface->height;
     src = glyph_surface->data;
-    dst = cache->buffer.bo->virtual;
+    dst = cache->buffer.bo->base.mapped;
     if (dst == NULL) {
 	dst = intel_bo_map (device, cache->buffer.bo);
 	if (unlikely (dst == NULL))
diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h
index f890be3..c0e40e4 100644
--- a/src/drm/cairo-drm-private.h
+++ b/src/drm/cairo-drm-private.h
@@ -109,6 +109,7 @@ typedef struct _cairo_drm_bo {
     uint32_t name;
     uint32_t handle;
     uint32_t size;
+    void*    mapped;
 } cairo_drm_bo_t;
 
 struct _cairo_drm_device {
@@ -180,6 +181,9 @@ _cairo_device_cast_drm_const(const cairo_device_t *device)
     return cairo_container_of (device, const cairo_drm_device_t, base);
 }
 
+void
+_cairo_drm_bo_unmap (cairo_drm_bo_t *bo);
+
 static inline cairo_drm_bo_t *
 cairo_drm_bo_reference (cairo_drm_bo_t *bo)
 {
@@ -191,6 +195,8 @@ static cairo_always_inline void
 cairo_drm_bo_destroy (cairo_device_t *abstract_device,
 		      cairo_drm_bo_t *bo)
 {
+    _cairo_drm_bo_unmap (bo);
+
     if (_cairo_reference_count_dec_and_test (&bo->ref_count)) {
 	cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device;
 	device->bo.release (device, bo);
diff --git a/src/drm/cairo-drm-radeon-private.h b/src/drm/cairo-drm-radeon-private.h
index 1513379..eeba424 100644
--- a/src/drm/cairo-drm-radeon-private.h
+++ b/src/drm/cairo-drm-radeon-private.h
@@ -42,8 +42,6 @@
 typedef struct _radeon_bo {
     cairo_drm_bo_t base;
 
-    void *virtual;
-
     cairo_bool_t in_batch;
     uint32_t read_domains;
     uint32_t write_domain;
@@ -184,9 +182,6 @@ radeon_bo_wait (const radeon_device_t *dev, radeon_bo_t *bo);
 cairo_private void *
 radeon_bo_map (const radeon_device_t *dev, radeon_bo_t *bo);
 
-cairo_private void
-radeon_bo_unmap (radeon_bo_t *bo);
-
 cairo_private cairo_drm_bo_t *
 radeon_bo_create (radeon_device_t *dev,
 		  uint32_t size,
diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c
index 5a954e0..6d0169d 100644
--- a/src/drm/cairo-drm-radeon-surface.c
+++ b/src/drm/cairo-drm-radeon-surface.c
@@ -134,7 +134,7 @@ radeon_surface_map_to_image (radeon_surface_t *surface)
 						     surface->base.height,
 						     surface->base.stride);
 	if (unlikely (image->status)) {
-	    radeon_bo_unmap (to_radeon_bo (surface->base.bo));
+	    _cairo_drm_bo_unmap (surface->base.bo);
 	    return image;
 	}
 
@@ -164,7 +164,7 @@ radeon_surface_flush (void *abstract_surface,
     cairo_surface_destroy (surface->base.fallback);
     surface->base.fallback = NULL;
 
-    radeon_bo_unmap (to_radeon_bo (surface->base.bo));
+    _cairo_drm_bo_unmap (surface->base.bo);
 
     return status;
 }
diff --git a/src/drm/cairo-drm-radeon.c b/src/drm/cairo-drm-radeon.c
index 8bc91bf..6927ac8 100644
--- a/src/drm/cairo-drm-radeon.c
+++ b/src/drm/cairo-drm-radeon.c
@@ -87,7 +87,7 @@ radeon_bo_write (const radeon_device_t *device,
 	ptr = radeon_bo_map (device, bo);
 	if (ptr != NULL) {
 	    memcpy (ptr + offset, data, size);
-	    radeon_bo_unmap (bo);
+	    _cairo_drm_bo_unmap (&(bo->base));
 	}
     }
 }
@@ -118,7 +118,7 @@ radeon_bo_read (const radeon_device_t *device,
 	ptr = radeon_bo_map (device, bo);
 	if (ptr != NULL) {
 	    memcpy (data, ptr + offset, size);
-	    radeon_bo_unmap (bo);
+	    _cairo_drm_bo_unmap (&(bo->base));
 	}
     }
 
@@ -144,7 +144,7 @@ radeon_bo_map (const radeon_device_t *device, radeon_bo_t *bo)
     void *ptr;
     int ret;
 
-    assert (bo->virtual == NULL);
+    assert (bo->base.mapped == NULL);
 
     memset (&mmap_arg, 0, sizeof (mmap_arg));
     mmap_arg.handle = bo->base.handle;
@@ -170,19 +170,10 @@ radeon_bo_map (const radeon_device_t *device, radeon_bo_t *bo)
 	return NULL;
     }
 
-    bo->virtual = ptr;
+    bo->base.mapped = ptr;
 
     /* XXX set_domain? */
-    return bo->virtual;
-}
-
-void
-radeon_bo_unmap (radeon_bo_t *bo)
-{
-    assert (bo->virtual != NULL);
-
-    munmap (bo->virtual, bo->base.size);
-    bo->virtual = NULL;
+    return bo->base.mapped;
 }
 
 cairo_drm_bo_t *
@@ -215,7 +206,7 @@ radeon_bo_create (radeon_device_t *device,
     bo->base.handle = create.handle;
     bo->base.size = size;
 
-    bo->virtual = NULL;
+    bo->base.mapped = NULL;
 
     bo->in_batch = FALSE;
     bo->read_domains = 0;
@@ -242,7 +233,7 @@ radeon_bo_create_for_name (radeon_device_t *device,
 	return NULL;
     }
 
-    bo->virtual = NULL;
+    bo->base.mapped = NULL;
 
     bo->in_batch = FALSE;
     bo->read_domains = 0;
-- 
2.6.4.442.g545299f

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.