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;
     }

Reply via email to