Leif Delgass wrote:
> On Fri, 5 Jul 2002, Jens Owen wrote:
>
>
>>Leif Delgass wrote:
>>
>>
>>>On Fri, 5 Jul 2002, Jens Owen wrote:
>>>
>>>[snip]
>>>
>>>
>>>
>>>>However, I think you may be tickling a latent bug in the DRI. It's
>>>>possible that all the other drives have just avoided this bug so far.
>>>>
>>>>I looked at DRICloseScreen and I don't see that the DRIClipNotify
>>>>wrapper is being removed. There are other unwraps missing as well.
>>>>
>>>>Can you send me a back trace from a static debuggable server? Let me
>>>>know if you need help building this.
>>>>
>>>>
>>>Could you tell me how to build a static server or point me to a HOWTO?
>>>
>>
>>The xc/config/cf/host.def in the DRI tree is setup to easily modified to
>>build a debuggable server. Attached is a copy of a modified host.def
>>file I used for debugging an i810 problem. You'll probably need to add
>>the mach64 driver to these options.
>>
>
> OK, I'll try this. I think you're right that we need to add the
> GlxBuiltIn.. option for mach64.
If my memory serves me, that's just for 3D clients, and it doesn't work
anymore...so I wouldn't worry about that option. However, you will want
to add mach64 to the other driver lists in this file.
>
>>>Meanwhile, here's a backtrace from the X server built from the branch. It
>>>looks like the ClipNotify wrapper is being called when pDRIPriv is null,
>>>though I'm not sure why I wouldn't have run into this before...
>>>
>>>Program received signal SIGSEGV, Segmentation fault.
>>>DRIClipNotify (pWin=0x85d3a60, dx=0, dy=0) at dri.c:1732
>>>1732 if(pDRIPriv->wrap.ClipNotify) {
>>>(gdb) bt
>>>#0 DRIClipNotify (pWin=0x85d3a60, dx=0, dy=0) at dri.c:1732
>>>#1 0x080c9009 in MapWindow (pWin=0x85d3a60, client=0x81d56a8) at window.c:2864
>>>#2 0x080c5ee8 in InitRootWindow (pWin=0x85d3a60) at window.c:522
>>>#3 0x080bf39c in main (argc=4, argv=0xbffff9d4, envp=0xbffff9e8) at main.c:439
>>>#4 0x40072647 in __libc_start_main (main=0x80bee9c <main>, argc=4,
>>> ubp_av=0xbffff9d4, init=0x806cc08 <_init>, fini=0x8174c80 <_fini>,
>>> rtld_fini=0x4000dcd4 <_dl_fini>, stack_end=0xbffff9cc)
>>> at ../sysdeps/generic/libc-start.c:129
>>>(gdb) info locals
>>>pWin = 0x85d3a60
>>>pScreen = 0x85d3748
>>>pDRIPriv = 0x0
>>>pDRIDrawablePriv = 0x0
>>>
>>
>>Yes, it looks like the DRI initialization process was started, causing
>>the DRI wrappers to be put in place; then, something caused DRI
>>initialization to fail, but the failure handling code does not remove
>>the wrappers.
>>
>>I believe I need to unwrap the DRI routines in DRICloseScreen. I'd like
>>to fix this case and ask you to test with what you've got since it's
>>hard to test these unusual failure cases when everythings working properly.
>>
>>It's still curious no other drivers have had this problem. Either
>>nobody else has gone done these failure cases, or I'm barking up the
>>wrong tree.
>>
>
> It's pretty easy to test if you just change the return value of the
> driver's drm init function to return non-zero. For example, I tried this
> in the r128 driver in r128_do_init_cce (changed the last line to return
> -1), and it suffers the same problem (the backtrace was the same).
Yes, it's easy for force specific failures; but I don't think developers
and users have been hitting these cases in normal testing scenarios.
Otherwise, we'd have caught this during the 3 years this extensions been
in use.
>>Can you verify that we are indeed calling DRICloseScreen by putting a
>>breakpoint at that routine and sending me a backtrace at that point?
>>
>
> I know it's called because I see the messages in the X log about removing
> the signal handler, kernel context, SAREA, etc. It's called as part of
> the DRI driver specific CloseScreen (ATIDRICloseScreen) when the kernel
> init fails (which is after DRIFinishScreenInit is called). In fact, the
> entire X init seems to work without a hitch (I see all the normal messages
> in the X log after "Direct rendering disabled" up to XINPUT) until the
> root window is initialized.
Okay, try the attached patch. I think I'll do more than this, but it
would be great if you could test just this, first.
--
/\
Jens Owen / \/\ _
[EMAIL PROTECTED] / \ \ \ Steamboat Springs, Colorado
--- xc/programs/Xserver/GL/dri/dri.c.jens Fri Jul 5 13:07:43 2002
+++ xc/programs/Xserver/GL/dri/dri.c Fri Jul 5 16:27:11 2002
@@ -417,11 +417,14 @@
DRICloseScreen(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+ DRIInfoPtr pDRIInfo;
drmContextPtr reserved;
int reserved_count;
if (pDRIPriv && pDRIPriv->directRenderingSupport) {
+ pDRIInfo = pDRIPriv->pDriverInfo;
+
if (pDRIPriv->wrap.AdjustFrame) {
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
@@ -477,6 +480,27 @@
drmClose(pDRIPriv->drmFD);
+ /* Unwrap DRI Functions */
+ if (pDRIInfo->wrap.ValidateTree) {
+ pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
+ }
+ if (pDRIInfo->wrap.PostValidateTree) {
+ pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
+ }
+ if (pDRIInfo->wrap.WindowExposures) {
+ pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
+ }
+ if (pDRIInfo->wrap.CopyWindow) {
+ pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
+ }
+ if (pDRIInfo->wrap.ClipNotify) {
+ pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
+ }
+ if (pDRIInfo->wrap.AdjustFrame) {
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ pScrn->AdjustFrame = pDRIPriv->wrap.AdjustFrame;
+ }
+
xfree(pDRIPriv);
pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
}