diff options
author | Zhenyu Wang <zhenyu.z.wang@intel.com> | 2008-12-31 22:56:57 +0800 |
---|---|---|
committer | Zhenyu Wang <zhenyu.z.wang@intel.com> | 2008-12-31 22:56:57 +0800 |
commit | 1f61e97904dfe5f8c08bb9f284cfdfe878f7e541 (patch) | |
tree | c9756d09b996a0ed994aebc8df8d580e4741a3c3 /src | |
parent | 830bf916724afd21b7947f797c22a8c8aab7a0a4 (diff) |
UXA: Fallback to dri_bo_map() if pin failed
This fixes VT switch issue with UXA after Eric's
aae4008096399a0e84abc7c016b35092caf9db25 on 2D side.
Diffstat (limited to 'src')
-rw-r--r-- | src/i830_exa.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/i830_exa.c b/src/i830_exa.c index 636aa0af..aeffedd8 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -785,11 +785,15 @@ i830_uxa_prepare_access (PixmapPtr pixmap, uxa_access_t access) i830->need_sync = FALSE; } - if (drm_intel_bo_pin(bo, 4096) != 0) - return FALSE; - - drm_intel_gem_bo_start_gtt_access(bo, access == UXA_ACCESS_RW); - pixmap->devPrivate.ptr = pI830->FbBase + bo->offset; + if (drm_intel_bo_pin(bo, 4096) != 0) { + /* happen in vt switched */ + if (dri_bo_map(bo, access == UXA_ACCESS_RW) != 0) + return FALSE; + pixmap->devPrivate.ptr = bo->virtual; + } else { + drm_intel_gem_bo_start_gtt_access(bo, access == UXA_ACCESS_RW); + pixmap->devPrivate.ptr = pI830->FbBase + bo->offset; + } } return TRUE; } @@ -804,7 +808,10 @@ i830_uxa_finish_access (PixmapPtr pixmap) ScrnInfoPtr scrn = xf86Screens[screen->myNum]; I830Ptr i830 = I830PTR(scrn); - drm_intel_bo_unpin(bo); + if (bo->virtual) + dri_bo_unmap(bo); + else + drm_intel_bo_unpin(bo); pixmap->devPrivate.ptr = NULL; if (bo == i830->front_buffer->bo) |