[Intel-gfx] [PATCH] intel: Remove the mapped flag, which is adequately covered by bo_gem->virtual.

Keith Packard keithp at keithp.com
Mon Dec 15 01:40:15 CET 2008


On Sun, 2008-12-14 at 15:24 -0800, Eric Anholt wrote:
> ---
>  libdrm/intel/intel_bufmgr_gem.c |  122 +++++++++++++++++----------------------
>  1 files changed, 54 insertions(+), 68 deletions(-)
> 
> diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c
> index e681eee..c29368d 100644
> --- a/libdrm/intel/intel_bufmgr_gem.c
> +++ b/libdrm/intel/intel_bufmgr_gem.c
> @@ -106,7 +106,6 @@ struct _drm_intel_bo_gem {
>  
>      int refcount;
>      /** Boolean whether the mmap ioctl has been called for this buffer yet. */
> -    int mapped;
>      uint32_t gem_handle;
>      const char *name;
>  
> @@ -134,7 +133,7 @@ struct _drm_intel_bo_gem {
>      drm_intel_bo **reloc_target_bo;
>      /** Number of entries in relocs */
>      int reloc_count;
> -    /** Mapped address for the buffer */
> +    /** Mapped address for the buffer, saved across map/unmap cycles */
>      void *virtual;
>  
>      /** free list */
> @@ -441,7 +440,7 @@ drm_intel_gem_bo_free(drm_intel_bo *bo)
>      struct drm_gem_close close;
>      int ret;
>  
> -    if (bo_gem->mapped)
> +    if (bo_gem->virtual)
>  	munmap (bo_gem->virtual, bo_gem->bo.size);
>  
>      /* Close this object */
> @@ -523,32 +522,27 @@ drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
>      /* Allow recursive mapping. Mesa may recursively map buffers with
>       * nested display loops.
>       */
> -    if (!bo_gem->mapped) {
> -    
> -	assert(bo->virtual == NULL);
> -    
> +    if (!bo_gem->virtual) {
> +	struct drm_i915_gem_mmap mmap_arg;
> +
>  	DBG("bo_map: %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
> -    
> -	if (bo_gem->virtual == NULL) {
> -	    struct drm_i915_gem_mmap mmap_arg;
> -    
> -	    memset(&mmap_arg, 0, sizeof(mmap_arg));
> -	    mmap_arg.handle = bo_gem->gem_handle;
> -	    mmap_arg.offset = 0;
> -	    mmap_arg.size = bo->size;
> -	    ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MMAP, &mmap_arg);
> -	    if (ret != 0) {
> -		fprintf(stderr, "%s:%d: Error mapping buffer %d (%s): %s .\n",
> -			__FILE__, __LINE__,
> -			bo_gem->gem_handle, bo_gem->name, strerror(errno));
> -	    }
> -	    bo_gem->virtual = (void *)(uintptr_t)mmap_arg.addr_ptr;
> +
> +	memset(&mmap_arg, 0, sizeof(mmap_arg));
> +	mmap_arg.handle = bo_gem->gem_handle;
> +	mmap_arg.offset = 0;
> +	mmap_arg.size = bo->size;
> +	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MMAP, &mmap_arg);
> +	if (ret != 0) {
> +	    fprintf(stderr, "%s:%d: Error mapping buffer %d (%s): %s .\n",
> +		    __FILE__, __LINE__,
> +		    bo_gem->gem_handle, bo_gem->name, strerror(errno));
>  	}
> -	bo->virtual = bo_gem->virtual;
> +	bo_gem->virtual = (void *)(uintptr_t)mmap_arg.addr_ptr;
>  	bo_gem->swrast = 0;
> -	bo_gem->mapped = 1;
> -	DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name, bo_gem->virtual);
>      }
> +    DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
> +	bo_gem->virtual);
> +    bo->virtual = bo_gem->virtual;
>  
>      if (!bo_gem->swrast) {
>  	set_domain.handle = bo_gem->gem_handle;
> @@ -583,55 +577,47 @@ drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
>  
>      pthread_mutex_lock(&bufmgr_gem->lock);
>  
> -    /* Allow recursive mapping. Mesa may recursively map buffers with
> -     * nested display loops.
> -     */
> -    if (!bo_gem->mapped) {
> -
> -	assert(bo->virtual == NULL);
> +    /* Get a mapping of the buffer if we haven't before. */
> +    if (bo_gem->virtual == NULL) {
> +	struct drm_i915_gem_mmap_gtt mmap_arg;
>  
>  	DBG("bo_map_gtt: %d (%s)\n", bo_gem->gem_handle, bo_gem->name);
>  
> -	if (bo_gem->virtual == NULL) {
> -		struct drm_i915_gem_mmap_gtt mmap_arg;
> -
> -		memset(&mmap_arg, 0, sizeof(mmap_arg));
> -		mmap_arg.handle = bo_gem->gem_handle;
> -
> -		/* Get the fake offset back... */
> -		ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MMAP_GTT,
> -			    &mmap_arg);
> -		if (ret != 0) {
> -			fprintf(stderr,
> -				"%s:%d: Error preparing buffer map %d (%s): %s .\n",
> -				__FILE__, __LINE__,
> -				bo_gem->gem_handle, bo_gem->name,
> -				strerror(errno));
> -			pthread_mutex_unlock(&bufmgr_gem->lock);
> -			return ret;
> -		}
> -
> -		/* and mmap it */
> -		bo_gem->virtual = mmap(0, bo->size, PROT_READ | PROT_WRITE,
> -				       MAP_SHARED, bufmgr_gem->fd,
> -				       mmap_arg.offset);
> -		if (bo_gem->virtual == MAP_FAILED) {
> -			fprintf(stderr,
> -				"%s:%d: Error mapping buffer %d (%s): %s .\n",
> -				__FILE__, __LINE__,
> -				bo_gem->gem_handle, bo_gem->name,
> -				strerror(errno));
> -			pthread_mutex_unlock(&bufmgr_gem->lock);
> -			return errno;
> -		}
> +	memset(&mmap_arg, 0, sizeof(mmap_arg));
> +	mmap_arg.handle = bo_gem->gem_handle;
> +
> +	/* Get the fake offset back... */
> +	ret = ioctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_arg);
> +	if (ret != 0) {
> +	    fprintf(stderr,
> +		    "%s:%d: Error preparing buffer map %d (%s): %s .\n",
> +		    __FILE__, __LINE__,
> +		    bo_gem->gem_handle, bo_gem->name,
> +		    strerror(errno));
> +	    pthread_mutex_unlock(&bufmgr_gem->lock);
> +	    return ret;
>  	}
>  
> -	bo->virtual = bo_gem->virtual;
> -	bo_gem->mapped = 1;
> -	DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
> -	    bo_gem->virtual);
> +	/* and mmap it */
> +	bo_gem->virtual = mmap(0, bo->size, PROT_READ | PROT_WRITE,
> +			       MAP_SHARED, bufmgr_gem->fd,
> +			       mmap_arg.offset);
> +	if (bo_gem->virtual == MAP_FAILED) {
> +	    fprintf(stderr,
> +		    "%s:%d: Error mapping buffer %d (%s): %s .\n",
> +		    __FILE__, __LINE__,
> +		    bo_gem->gem_handle, bo_gem->name,
> +		    strerror(errno));
> +	    pthread_mutex_unlock(&bufmgr_gem->lock);
> +	    return errno;
> +	}
>      }
>  
> +    bo->virtual = bo_gem->virtual;
> +
> +    DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name,
> +	bo_gem->virtual);
> +
>      /* Now move it to the GTT domain so that the CPU caches are flushed */
>      set_domain.handle = bo_gem->gem_handle;
>      set_domain.read_domains = I915_GEM_DOMAIN_GTT;
> @@ -662,7 +648,7 @@ drm_intel_gem_bo_unmap(drm_intel_bo *bo)
>      if (bo == NULL)
>  	return 0;
>  
> -    assert(bo_gem->mapped);
> +    assert(bo_gem->virtual != NULL);
>  
>      pthread_mutex_lock(&bufmgr_gem->lock);
>      if (bo_gem->swrast) {

This change looks good, but raises another issue. We allow apps to map
via gtt or direct, but there's no record here of which kind of mapping
is done. I suggest we'll need to support changing the mapping type so
that we can re-use a buffer mapped GTT for stuff requiring a direct map
and vice-versa.

-- 
keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20081214/cbeecba2/attachment.sig>


More information about the Intel-gfx mailing list