diff --git a/src/radeon_bufmgr_gem.c b/src/radeon_bufmgr_gem.c
index 6005e51..51a27f8 100644
--- a/src/radeon_bufmgr_gem.c
+++ b/src/radeon_bufmgr_gem.c
@@ -75,6 +75,7 @@ typedef struct _dri_bo_gem {
int force_gtt;
int pinned;
int touched;
+ void *priv_map;
uint32_t space_accounted;
} dri_bo_gem;
@@ -146,8 +147,8 @@ static void dri_gem_bo_free(dri_bo *bo)
dri_bo_gem *gem_bo = (dri_bo_gem *)bo, *trav, *prev;
struct drm_gem_close args;
- if (gem_bo->map_count)
- munmap(gem_bo->bo.virtual, gem_bo->bo.size);
+ if (gem_bo->priv_map)
+ munmap(gem_bo->priv_map, gem_bo->bo.size);
/* close object */
args.handle = gem_bo->gem_handle;
@@ -200,18 +201,21 @@ dri_gem_bo_map(dri_bo *bo, int write_enable)
if (gem_bo->map_count++ != 0)
return 0;
- args.handle = gem_bo->gem_handle;
- args.offset = 0;
- args.size = gem_bo->bo.size;
+ if (!gem_bo->priv_map) {
+ args.handle = gem_bo->gem_handle;
+ args.offset = 0;
+ args.size = gem_bo->bo.size;
- ret = drmCommandWriteRead(bufmgr_gem->fd, DRM_RADEON_GEM_MMAP, &args, sizeof(args));
- if (ret)
- return ret;
+ ret = drmCommandWriteRead(bufmgr_gem->fd, DRM_RADEON_GEM_MMAP, &args, sizeof(args));
+ if (ret)
+ return ret;
- ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, bufmgr_gem->fd, args.addr_ptr);
- if (ptr == MAP_FAILED)
- return -errno;
- gem_bo->bo.virtual = ptr;
+ ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, bufmgr_gem->fd, args.addr_ptr);
+ if (ptr == MAP_FAILED)
+ return -errno;
+ gem_bo->priv_map = ptr;
+ }
+ gem_bo->bo.virtual = gem_bo->priv_map;
return ret;
}
@@ -224,8 +228,7 @@ dri_gem_bo_unmap(dri_bo *buf)
if (--gem_bo->map_count > 0)
return 0;
- munmap(gem_bo->bo.virtual, gem_bo->bo.size);
- gem_bo->bo.virtual = 0;
+ gem_bo->bo.virtual = NULL;
return 0;
}
diff --git a/src/radeon_dri.c b/src/radeon_dri.c
index 64b5937..347ab44 100644
--- a/src/radeon_dri.c
+++ b/src/radeon_dri.c
@@ -471,7 +471,6 @@ Bool radeon_update_dri_buffers(ScreenPtr pScreen)
if (!success)
return FALSE;
- radeon_update_sarea(pScrn, sarea);
radeon_update_screen_private(pScrn, sarea);
return TRUE;
}
@@ -1707,8 +1706,6 @@ Bool RADEONDRIDoMappings(ScreenPtr pScreen)
return FALSE;
}
- radeon_update_sarea(pScrn, pSAREAPriv);
-
/* DRIScreenInit adds the frame buffer
map, but we need it as well */
{
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
index 1c9d5d9..3808c34 100644
--- a/src/radeon_driver.c
+++ b/src/radeon_driver.c
@@ -3622,9 +3622,6 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen,
info->accelDFS = xf86ReturnOptValBool(info->Options, OPTION_ACCEL_DFS,
info->cardType != CARD_AGP);
- if (info->drm_mm)
- info->accelDFS = FALSE;
-
/* Reserve approx. half of offscreen memory for local textures by
* default, can be overridden with Option "FBTexPercent".
* Round down to a whole number of texture regions.