xf86-video-ati: Branch 'master'

Jerome Glisse glisse at kemper.freedesktop.org
Wed Sep 30 14:05:06 PDT 2009


 src/drmmode_display.c |    2 +-
 src/radeon_kms.c      |   45 +++++++++++++++++++++++++++++++++------------
 2 files changed, 34 insertions(+), 13 deletions(-)

New commits:
commit d302481493ff61eb7f8648b7afe7407b6b653cf7
Author: Jerome Glisse <jglisse at redhat.com>
Date:   Wed Sep 16 15:18:40 2009 +0200

    radeon/kms: fallback to shadowfb if kernel report acceleration is off
    
    This will fallback to shadowfb is GPU accel failed somewhere during
    KMS kernel init.

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index e6b948c..c9037b4 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -183,7 +183,7 @@ void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 	int i;
 	int pitch = pScrn->displayWidth * info->CurrentLayout.pixel_bytes;
 
-	if (info->ChipFamily >= CHIP_FAMILY_R600)
+	if (info->accelOn == FALSE)
 		return;
 
 	for (i = 0; i < xf86_config->num_crtc; i++) {
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index e2f716e..fa49392 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -172,6 +172,24 @@ static void RADEONBlockHandler_KMS(int i, pointer blockData,
     radeon_cs_flush_indirect(pScrn);
 }
 
+static Bool RADEONIsAccelWorking(ScrnInfoPtr pScrn)
+{
+    RADEONInfoPtr info = RADEONPTR(pScrn);
+    struct drm_radeon_info ginfo;
+    int r;
+    uint32_t tmp;
+
+    memset(&ginfo, 0, sizeof(ginfo));
+    ginfo.request = 0x3;
+    ginfo.value = (uint64_t)&tmp;
+    r = drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &ginfo, sizeof(ginfo));
+    if (r)
+        return FALSE;
+    if (tmp)
+        return TRUE;
+    return FALSE;
+}
+
 static Bool RADEONPreInitAccel_KMS(ScrnInfoPtr pScrn)
 {
     RADEONInfoPtr  info = RADEONPTR(pScrn);
@@ -180,16 +198,14 @@ static Bool RADEONPreInitAccel_KMS(ScrnInfoPtr pScrn)
 	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to allocate accel_state rec!\n");
 	return FALSE;
     }
-#if 0
-    if (info->ChipFamily >= CHIP_FAMILY_R600) {
+    if (!RADEONIsAccelWorking(pScrn)) {
 	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
-		   "Using shadowfb for KMS on R600+\n");
+		   "GPU accel not working, using shadowfb for KMS\n");
 	info->r600_shadow_fb = TRUE;
 	if (!xf86LoadSubModule(pScrn, "shadow"))
 	    info->r600_shadow_fb = FALSE;
 	return TRUE;
     }
-#endif
 
     if ((info->ChipFamily == CHIP_FAMILY_RS100) ||
 	(info->ChipFamily == CHIP_FAMILY_RS200) ||
@@ -421,12 +437,12 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
 		       mminfo.gart_size, mminfo.vram_size, mminfo.vram_visible);
 	}
     }
-
+#if 0
     if (info->ChipFamily < CHIP_FAMILY_R600) {
 	info->useEXA = TRUE;
 	info->directRenderingEnabled = TRUE;
     }
-
+#endif
     RADEONSetPitch(pScrn);
 
     /* Set display resolution */
@@ -663,6 +679,10 @@ Bool RADEONScreenInit_KMS(int scrnIndex, ScreenPtr pScreen,
 		   "Direct rendering disabled\n");
     }
 
+    if (info->r600_shadow_fb) {
+        xf86DrvMsg(scrnIndex, X_INFO, "Acceleration disabled\n");
+        info->accelOn = FALSE;
+    } else {
     if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE)) {
 	xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
 		       "Initializing Acceleration\n");
@@ -679,6 +699,7 @@ Bool RADEONScreenInit_KMS(int scrnIndex, ScreenPtr pScreen,
 	xf86DrvMsg(scrnIndex, X_INFO, "Acceleration disabled\n");
 	info->accelOn = FALSE;
     }
+    }
 
     /* Init DPMS */
     xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
@@ -706,11 +727,12 @@ Bool RADEONScreenInit_KMS(int scrnIndex, ScreenPtr pScreen,
      */
     /* xf86DiDGAInit(pScreen, info->LinearAddr + pScrn->fbOffset); */
 #endif
-
-    /* Init Xv */
-    xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
-		   "Initializing Xv\n");
-    RADEONInitVideo(pScreen);
+    if (info->r600_shadow_fb == FALSE) {
+        /* Init Xv */
+        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG,
+                       "Initializing Xv\n");
+        RADEONInitVideo(pScreen);
+    }
 
     if (info->r600_shadow_fb == TRUE) {
         if (!shadowSetup(pScreen)) {
@@ -770,7 +792,6 @@ Bool RADEONEnterVT_KMS(int scrnIndex, int flags)
     ret = drmSetMaster(info->dri->drmFD);
     if (ret)
 	ErrorF("Unable to retrieve master\n");
-
     info->accel_state->XInited3D = FALSE;
     info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN;
 


More information about the xorg-commit mailing list