summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaenzer <daenzer>2003-11-10 22:01:13 +0000
committerdaenzer <daenzer>2003-11-10 22:01:13 +0000
commitff8ddcae4d6be2bbe60594aee78b498e2513f8f1 (patch)
tree44c77cf2aa79d0ea0d234c9cd1783e4fe9c6aed6
parent8d8cdc50f697f8f945fbb9ca13fdd00ca4eceadd (diff)
Try flipping back to the front page if necessary in DRITransitionTo2d()
+ get rid of some extraneous whitespace
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c8
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c60
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c4
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/i810/i830_dri.c4
4 files changed, 59 insertions, 17 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c
index 65be99b7a..fee9fa3f4 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c
@@ -438,6 +438,7 @@ static void R128DRIMoveBuffers(WindowPtr pWin, DDXPointRec ptOldOrg,
initialize the Rage 128 registers to point to that memory. */
static Bool R128DRIAgpInit(R128InfoPtr info, ScreenPtr pScreen)
{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
unsigned char *R128MMIO = info->MMIO;
unsigned long mode;
unsigned int vendor, device;
@@ -635,6 +636,7 @@ static Bool R128DRIAgpInit(R128InfoPtr info, ScreenPtr pScreen)
static Bool R128DRIPciInit(R128InfoPtr info, ScreenPtr pScreen)
{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
unsigned char *R128MMIO = info->MMIO;
CARD32 chunk;
int ret;
@@ -1477,13 +1479,17 @@ static void R128DRITransitionTo2d(ScreenPtr pScreen)
R128InfoPtr info = R128PTR(pScrn);
R128SAREAPrivPtr pSAREAPriv = DRIGetSAREAPrivate(pScreen);
+ /* Try flipping back to the front page if necessary */
+ if (pSAREAPriv->pfCurrentPage == 1)
+ drmCommandNone(info->drmFD, DRM_R128_FLIP);
+
/* Shut down shadowing if we've made it back to the front page */
if (pSAREAPriv->pfCurrentPage == 0) {
R128DisablePageFlip(pScreen);
} else {
xf86DrvMsg(pScreen->myNum, X_WARNING,
"[dri] R128DRITransitionTo2d: "
- "kernel failed to unflip buffers.\n");
+ "kernel failed to unflip buffers.\n");
}
info->have3DWindows = 0;
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c
index d904f3681..b712d7618 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c
@@ -720,23 +720,38 @@ static Bool RADEONSetAgpMode(RADEONInfoPtr info, ScreenPtr pScreen)
unsigned long device = drmAgpDeviceId(info->drmFD);
mode &= ~RADEON_AGP_MODE_MASK;
- switch (info->agpMode) {
- case 4: mode |= RADEON_AGP_4X_MODE;
- case 2: mode |= RADEON_AGP_2X_MODE;
- case 1: default: mode |= RADEON_AGP_1X_MODE;
+ if ((mode & RADEON_AGPv3_MODE) &&
+ (INREG(RADEON_AGP_STATUS) & RADEON_AGPv3_MODE)) {
+ switch (info->agpMode) {
+ case 8: mode |= RADEON_AGPv3_8X_MODE;
+ case 4: default: mode |= RADEON_AGPv3_4X_MODE;
+ }
+ /*TODO: need to take care of other bits valid for v3 mode
+ * currently these bits are not used in all tested cards.
+ */
+ } else {
+ switch (info->agpMode) {
+ case 4: mode |= RADEON_AGP_4X_MODE;
+ case 2: mode |= RADEON_AGP_2X_MODE;
+ case 1: default: mode |= RADEON_AGP_1X_MODE;
+ }
}
- if (info->agpFastWrite) mode |= RADEON_AGP_FW_MODE;
-
- if ((vendor == PCI_VENDOR_AMD) &&
+ if (info->agpFastWrite &&
+ (vendor == PCI_VENDOR_AMD) &&
(device == PCI_CHIP_AMD761)) {
/* Disable fast write for AMD 761 chipset, since they cause
* lockups when enabled.
*/
- mode &= ~0x10; /* FIXME: Magic number */
+ info->agpFastWrite = FALSE;
+ xf86DrvMsg(pScreen->myNum, X_WARNING,
+ "[agp] Not enabling Fast Writes on AMD 761 chipset to avoid "
+ "lockups");
}
+ if (info->agpFastWrite) mode |= RADEON_AGP_FW_MODE;
+
xf86DrvMsg(pScreen->myNum, X_INFO,
"[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x; Card 0x%04x/0x%04x]\n",
mode, vendor, device,
@@ -1025,6 +1040,7 @@ static int RADEONDRIKernelInit(RADEONInfoPtr info, ScreenPtr pScreen)
memset(&drmInfo, 0, sizeof(drmRadeonInit));
if ((info->ChipFamily == CHIP_FAMILY_R200) ||
+ (info->ChipFamily == CHIP_FAMILY_RS300) ||
(info->ChipFamily == CHIP_FAMILY_RV250) ||
(info->ChipFamily == CHIP_FAMILY_RV280) )
drmInfo.func = DRM_RADEON_INIT_R200_CP;
@@ -1236,6 +1252,7 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen)
pDRIInfo->drmDriverName = RADEON_DRIVER_NAME;
if ( (info->ChipFamily == CHIP_FAMILY_R200) ||
+ (info->ChipFamily == CHIP_FAMILY_RS300) ||
(info->ChipFamily == CHIP_FAMILY_RV250) ||
(info->ChipFamily == CHIP_FAMILY_RV280) )
pDRIInfo->clientDriverName = R200_DRIVER_NAME;
@@ -1366,9 +1383,10 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen)
if (version) {
int req_minor, req_patch;
- if ((info->ChipFamily == CHIP_FAMILY_R200) ||
- (info->ChipFamily == CHIP_FAMILY_RV250) ||
- (info->ChipFamily == CHIP_FAMILY_RV280)) {
+ if (info->IsIGP) {
+ req_minor = 10;
+ req_patch = 0;
+ } else if (info->ChipFamily >= CHIP_FAMILY_R200) {
req_minor = 5;
req_patch = 0;
} else {
@@ -1556,8 +1574,13 @@ Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen)
#endif
/* Have shadowfb run only while there is 3d active. */
- if (info->allowPageFlip /* && info->drmMinor >= 3 */) {
- ShadowFBInit( pScreen, RADEONDRIRefreshArea );
+ if (info->allowPageFlip /* && info->drmMinor >= 3 */) {
+#ifdef RADEON_DRI_REINIT
+ if (!info->directRenderingInitialized)
+#endif
+ {
+ ShadowFBInit( pScreen, RADEONDRIRefreshArea );
+ }
} else {
info->allowPageFlip = 0;
}
@@ -1746,7 +1769,8 @@ static void RADEONDRIRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
/* Don't want to do this when no 3d is active and pages are
* right-way-round
*/
- if (!pSAREAPriv->pfAllowPageFlip && pSAREAPriv->pfCurrentPage == 0)
+ if (!info->directRenderingEnabled
+ || (!pSAREAPriv->pfAllowPageFlip && pSAREAPriv->pfCurrentPage == 0))
return;
(*info->accel->SetupForScreenToScreenCopy)(pScrn,
@@ -1890,6 +1914,10 @@ static void RADEONDRITransitionTo2d(ScreenPtr pScreen)
RADEONInfoPtr info = RADEONPTR(pScrn);
RADEONSAREAPrivPtr pSAREAPriv = DRIGetSAREAPrivate(pScreen);
+ /* Try flipping back to the front page if necessary */
+ if (pSAREAPriv->pfCurrentPage == 1)
+ drmCommandNone(info->drmFD, DRM_RADEON_FLIP);
+
/* Shut down shadowing if we've made it back to the front page */
if (pSAREAPriv->pfCurrentPage == 0) {
RADEONDisablePageFlip(pScreen);
@@ -1898,10 +1926,10 @@ static void RADEONDRITransitionTo2d(ScreenPtr pScreen)
} else {
xf86DrvMsg(pScreen->myNum, X_WARNING,
"[dri] RADEONDRITransitionTo2d: "
- "kernel failed to unflip buffers.\n");
+ "kernel failed to unflip buffers.\n");
}
- xf86FreeOffscreenArea(info->depthTexArea);
+ xf86FreeOffscreenArea(info->depthTexArea);
info->have3DWindows = 0;
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c
index faaddf69e..c108813e9 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i810_dri.c
@@ -1421,6 +1421,10 @@ static void I810DRITransitionTo2d(ScreenPtr pScreen)
I810Ptr pI810 = I810PTR(pScrn);
I810SAREAPtr pSAREAPriv = DRIGetSAREAPrivate(pScreen);
+ /* Try flipping back to the front page if necessary */
+ if (pSAREAPriv->pf_current_page == 1)
+ drmCommandNone(pI810->drmSubFD, DRM_I810_FLIP);
+
/* Shut down shadowing if we've made it back to the front page */
if (pSAREAPriv->pf_current_page == 0) {
I810DisablePageFlip(pScreen);
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/i810/i830_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/i810/i830_dri.c
index c8f6d3abc..a1512baa3 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/i810/i830_dri.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/i810/i830_dri.c
@@ -1668,6 +1668,10 @@ I830DRITransitionTo2d(ScreenPtr pScreen)
I830Ptr pI830 = I830PTR(pScrn);
I830SAREARec *sPriv = (I830SAREARec *) DRIGetSAREAPrivate(pScreen);
+ /* Try flipping back to the front page if necessary */
+ if (sPriv->pf_current_page == 1)
+ drmCommandNone(pI830->drmSubFD, DRM_I830_FLIP);
+
/* Shut down shadowing if we've made it back to the front page:
*/
if (sPriv->pf_current_page == 0) {