On Tue, Dec 17, 2002 at 01:02:45AM +0000, Keith Whitwell wrote:
>David Dawes wrote:
>> On Mon, Dec 16, 2002 at 12:44:15PM -0500, David Dawes wrote:
>>
>>>On Sat, Dec 14, 2002 at 07:02:50PM +0100, Michel D�nzer wrote:
>>>
>>>>On Sam, 2002-12-14 at 18:42, Michel Daenzer wrote:
>>>>
>>>>>CVSROOT: /cvsroot/dri
>>>>>Module name: xc
>>>>>Repository: xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/
>>>>>Changes by: mdaenzer@sc8-pr-cvs1. 02/12/14 09:42:48
>>>>>
>>>>>Log message:
>>>>> merge changes from trunk since Mesa 5.0 merge
>>>>
>>>>Okay, I think that should fix the most pressing issues people think were
>>>>fixed by the Mesa 5.0 merge.
>>>
>>>Thanks for doing that!
>>>
>>>I've taken that and merged it into the XFree86 trunk. I've also merged
>>>the XFree86 trunk back into mesa-4-0-4-branch, but I'm not having much
>>>success in committing it. My first commit attempt aborted, then I
>>>couldn't connect to the CVS repository for a while, then trying again
>>>just now it's failing because there are various locks in the repository
>>
>>>from the first aborted attempt.
>>
>>>Anyway, the pre-merge tag is "mesa-4-0-4-20021214" and when I can finally
>>>finish committing the merge, the post-merge tag will be
>>>"mesa-4-0-4-20021215".
>>
>>
>> The SourceForge admins cleared the locks, and I've finshed committing
>> the merge. The part of this merge that I'm least sure of is the 2D
>> radeon driver.
>>
>> It'd be a big help if someone could take a look at the merged code and
>> let me know of any problems. I've put a diff between those before and
>> after tags at <http://www.xfree86.org/~dawes/mesa404-20021214-15.diff.gz>.
>
>First thing I notice is somebody's disabled dri on radeon 9000's (rv250's).
>Added a comment indicating that they didn't know if they were doing the right
>thing or not, which is kindof dump -- if you don't know, don't make the
>change. Or ask here, I guess.
That looks like a bad merge on my part. There are lots of conflicts
between the two versions, and the XFree86 version of this check got
through when it shouldn't have. I'll fix it.
>Also the option to turn off the depth buffer (introduced in the twc work) has
>been either knobbled or removed. This may not have been deliberate, hard to
>tell. This seems to be the second round of removing this -- or alternatly
>maybe it was only half merged to xfree in the first place. In any case it
>seems to be gone now.
I don't see an option like that on the DRI trunk either. There's a
"NoBackBuffer" option though.
>I don't know the story behind the removal of RADEONSaveFBDevRegisters() --
>seems to be related to keeping pageflipping working over an fbdev call. Can
>anyone comment on whether or not this is still necessary?
I expect that got accidentally removed. I'm also not sure if the handling
of gen_int_cntl is correct everywhere.
The attached patch should put back most of what got inadvertently removed.
David
--
David Dawes
Release Engineer/Architect The XFree86 Project
www.XFree86.org/~dawes
Index: radeon.h
===================================================================
RCS file: /home/x-cvs/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h,v
retrieving revision 1.33
diff -u -r1.33 radeon.h
--- radeon.h 2002/12/16 16:19:12 1.33
+++ radeon.h 2002/12/17 01:50:28
@@ -518,7 +518,6 @@
int perctx_sarea_size;
#endif
#endif
- CARD32 gen_int_cntl;
/* XVideo */
XF86VideoAdaptorPtr adaptor;
Index: radeon_dri.c
===================================================================
RCS file: /home/x-cvs/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c,v
retrieving revision 1.23
diff -u -r1.23 radeon_dri.c
--- radeon_dri.c 2002/12/16 16:19:12 1.23
+++ radeon_dri.c 2002/12/17 01:50:28
@@ -1017,7 +1017,9 @@
memset(&drmInfo, 0, sizeof(drmRadeonInit));
- if (info->ChipFamily == CHIP_FAMILY_R200)
+ if ( (info->ChipFamily == CHIP_FAMILY_R200) ||
+ (info->ChipFamily == CHIP_FAMILY_RV250) ||
+ (info->ChipFamily == CHIP_FAMILY_M9) )
drmInfo.func = DRM_RADEON_INIT_R200_CP;
else
drmInfo.func = DRM_RADEON_INIT_CP;
@@ -1148,7 +1150,7 @@
info->irq = 0;
} else {
unsigned char *RADEONMMIO = info->MMIO;
- info->gen_int_cntl = INREG( RADEON_GEN_INT_CNTL );
+ info->ModeReg.gen_int_cntl = INREG( RADEON_GEN_INT_CNTL );
}
}
@@ -1239,6 +1241,9 @@
if (info->ChipFamily == CHIP_FAMILY_R200)
pDRIInfo->clientDriverName = R200_DRIVER_NAME;
+ else if ((info->ChipFamily == CHIP_FAMILY_RV250) ||
+ (info->ChipFamily == CHIP_FAMILY_M9))
+ pDRIInfo->clientDriverName = RV250_DRIVER_NAME;
else
pDRIInfo->clientDriverName = RADEON_DRIVER_NAME;
@@ -1362,7 +1367,9 @@
if (version) {
int req_minor, req_patch;
- if (info->ChipFamily == CHIP_FAMILY_R200) {
+ if ((info->ChipFamily == CHIP_FAMILY_R200) ||
+ (info->ChipFamily == CHIP_FAMILY_RV250) ||
+ (info->ChipFamily == CHIP_FAMILY_M9)) {
req_minor = 5;
req_patch = 0;
} else {
Index: radeon_driver.c
===================================================================
RCS file: /home/x-cvs/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c,v
retrieving revision 1.75
diff -u -r1.75 radeon_driver.c
--- radeon_driver.c 2002/12/16 16:19:13 1.75
+++ radeon_driver.c 2002/12/17 01:50:28
@@ -3510,12 +3510,11 @@
(pScrn->displayWidth * pScrn->virtualY *
info->CurrentLayout.pixel_bytes * 3 + 1023) / 1024);
info->directRenderingEnabled = FALSE;
- } else if (info->ChipFamily >= CHIP_FAMILY_RV250) {
- /* Is this correct or do RV250's and M9's work? */
+ } else if (info->ChipFamily >= CHIP_FAMILY_R300) {
info->directRenderingEnabled = FALSE;
xf86DrvMsg(scrnIndex, X_WARNING,
"Direct rendering not yet supported on "
- "Radeon 9000 and newer cards\n");
+ "Radeon 9700 and newer cards\n");
} else {
if (info->IsSecondary)
info->directRenderingEnabled = FALSE;
@@ -3614,6 +3613,9 @@
int bufferSize = ((pScrn->virtualY * width_bytes
+ RADEON_BUFFER_ALIGN)
& ~RADEON_BUFFER_ALIGN);
+ int depthSize = ((((pScrn->virtualY+15) & ~15) * width_bytes
+ + RADEON_BUFFER_ALIGN)
+ & ~RADEON_BUFFER_ALIGN);
int l;
int scanlines;
@@ -3645,7 +3647,7 @@
* pixmap cache. Should be enough for a fullscreen background
* image plus some leftovers.
*/
- info->textureSize = info->FbMapSize - 6 * bufferSize;
+ info->textureSize = info->FbMapSize - 5 * bufferSize - depthSize;
/* If that gives us less than half the available memory, let's
* be greedy and grab some more. Sorry, I care more about 3D
@@ -3653,22 +3655,23 @@
* framebuffer's worth of pixmap cache anyway.
*/
if (info->textureSize < (int)info->FbMapSize / 2) {
- info->textureSize = info->FbMapSize - 5 * bufferSize;
+ info->textureSize = info->FbMapSize - 4 * bufferSize - depthSize;
}
if (info->textureSize < (int)info->FbMapSize / 2) {
- info->textureSize = info->FbMapSize - 4 * bufferSize;
+ info->textureSize = info->FbMapSize - 3 * bufferSize - depthSize;
}
/* If there's still no space for textures, try without pixmap cache */
if (info->textureSize < 0) {
- info->textureSize = info->FbMapSize - 3 * bufferSize - 64/4*64;
+ info->textureSize = info->FbMapSize - 2 * bufferSize - depthSize
+ - 64/4*64;
}
/* Check to see if there is more room available after the 8192nd
scanline for textures */
- if ((int)info->FbMapSize - 8192*width_bytes - bufferSize*2
+ if ((int)info->FbMapSize - 8192*width_bytes - bufferSize - depthSize
> info->textureSize) {
info->textureSize =
- info->FbMapSize - 8192*width_bytes - bufferSize*2;
+ info->FbMapSize - 8192*width_bytes - bufferSize - depthSize;
}
/* If backbuffer is disabled, don't allocate memory for it */
@@ -3706,7 +3709,7 @@
/* Reserve space for the shared depth
* buffer.
*/
- info->depthOffset = ((info->textureOffset - bufferSize +
+ info->depthOffset = ((info->textureOffset - depthSize +
RADEON_BUFFER_ALIGN) &
~(CARD32)RADEON_BUFFER_ALIGN);
info->depthPitch = pScrn->displayWidth;
@@ -3995,6 +3998,31 @@
}
}
+/* Write miscellaneous registers which might have been destroyed by an fbdevHW
+ * call
+ */
+static void RADEONRestoreFBDevRegisters(ScrnInfoPtr pScrn,
+ RADEONSavePtr restore)
+{
+#ifdef XF86DRI
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ unsigned char *RADEONMMIO = info->MMIO;
+
+ /* Restore register for vertical blank interrupts */
+ if (info->irq) {
+ OUTREG(RADEON_GEN_INT_CNTL, restore->gen_int_cntl);
+ }
+
+ /* Restore registers for page flipping */
+ if (info->allowPageFlip) {
+ OUTREG(RADEON_CRTC_OFFSET_CNTL, restore->crtc_offset_cntl);
+ if (info->HasCRTC2) {
+ OUTREG(RADEON_CRTC2_OFFSET_CNTL, restore->crtc2_offset_cntl);
+ }
+ }
+#endif
+}
+
/* Write CRTC registers */
static void RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn,
RADEONSavePtr restore)
@@ -4420,6 +4448,28 @@
save->surface_cntl = INREG(RADEON_SURFACE_CNTL);
}
+/* Read miscellaneous registers which might be destroyed by an fbdevHW call */
+static void RADEONSaveFBDevRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
+{
+#ifdef XF86DRI
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ unsigned char *RADEONMMIO = info->MMIO;
+
+ /* Save register for vertical blank interrupts */
+ if (info->irq) {
+ save->gen_int_cntl = INREG(RADEON_GEN_INT_CNTL);
+ }
+
+ /* Save registers for page flipping */
+ if (info->allowPageFlip) {
+ save->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL);
+ if (info->HasCRTC2) {
+ save->crtc2_offset_cntl = INREG(RADEON_CRTC2_OFFSET_CNTL);
+ }
+ }
+#endif
+}
+
/* Read CRTC registers */
static void RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
{
@@ -4697,7 +4747,6 @@
save->cap0_trig_cntl = 0;
save->cap1_trig_cntl = 0;
save->bus_cntl = info->BusCntl;
- save->gen_int_cntl = info->gen_int_cntl;
/*
* If bursts are enabled, turn on discards
* Radeon doesn't have write bursts
@@ -5397,7 +5446,11 @@
if (info->accelOn) info->accel->Sync(pScrn);
if (info->FBDev) {
+ RADEONSaveFBDevRegisters(pScrn, &info->ModeReg);
+
ret = fbdevHWSwitchMode(scrnIndex, mode, flags);
+
+ RADEONRestoreFBDevRegisters(pScrn, &info->ModeReg);
} else {
info->IsSwitching = TRUE;
if (info->Clone && info->CloneModes) {
@@ -5571,6 +5624,8 @@
if (!fbdevHWEnterVT(scrnIndex,flags)) return FALSE;
info->PaletteSavedOnVT = FALSE;
info->ModeReg.surface_cntl = INREG(RADEON_SURFACE_CNTL);
+
+ RADEONRestoreFBDevRegisters(pScrn, &info->ModeReg);
} else
if (!RADEONModeInit(pScrn, pScrn->currentMode)) return FALSE;
@@ -5579,12 +5634,6 @@
#ifdef XF86DRI
if (info->directRenderingEnabled) {
- if (info->irq) {
- /* Need to make sure interrupts are enabled */
- unsigned char *RADEONMMIO = info->MMIO;
- OUTREG(RADEON_GEN_INT_CNTL, info->gen_int_cntl);
- }
-
RADEONCP_START(pScrn, info);
DRIUnlock(pScrn->pScreen);
}
@@ -5618,6 +5667,9 @@
if (info->FBDev) {
RADEONSavePalette(pScrn, save);
info->PaletteSavedOnVT = TRUE;
+
+ RADEONSaveFBDevRegisters(pScrn, &info->ModeReg);
+
fbdevHWLeaveVT(scrnIndex,flags);
}