On Don, 2002-01-31 at 19:50, Vladimir Dergachev wrote:
> 
> On 31 Jan 2002, Michel [ISO-8859-1] Dänzer wrote:
> 
> > On Mit, 2002-01-30 at 15:56, Vladimir Dergachev wrote:
> > >
> > > On Wed, 30 Jan 2002, Vladimir Dergachev wrote:
> > >
> > > > http://gatos.sf.net/ - they were there last time I submitted a patch.. but
> > > > it did not get in. Just to make sure I am not pulling your leg.. Yep, they
> > > > are there: search for  R128WaitForIdle(pScrn) function.
> > >
> > > I've implemented this (easier than software CCE) scheme. If you want to
> > > please try the latest ati.2 CVS code at http://gatos.sf.net - or just take
> > > a look at it.
> >
> > I will.
> >
> > > Basically I put in info->accel->Sync(pScrn) at entrance points into Xv
> > > driver. SetupImageVideo, StopVideo, SetPortAttribute, GetPortAttribute and
> > > PutVideo are all "control" calls, perfomance is not critical. PutImage
> > > should, arguably, take more time during image trasfer.. And if you are
> > > playing Quake and watching DVD at the same you are making problems for
> > > yourself anyway ;) (And the faster the card the less noticable any
> > > slowdown from extra Sync calls will be)
> >
> > How does this interact with the CCE being used for the image transfer in
> > PutImage (if at all)?
> 
> Not much. We are waiting for the card to finish doing whatever it was
> doing and only then we start the transfer. The only difference is that we
> wait for quiescence the right way.

Okay, I've looked at the GATOS CVS and tried the same Sync() calls. Has
been working fine on this PowerBook, but then I rarely ever experienced
crashes with it. Unfortunately, it doesn't seem to help the Rage128 Pro
card at work at all. I wonder if Xv is broken for Rage128 Pro?

Davor, does this patch fix the crashes? Peter, does the change in
r128_dri.c really fix the corruption (you said 'mostly' in a post)?


-- 
Earthling Michel Dänzer (MrCooper)/ Debian GNU/Linux (powerpc) developer
XFree86 and DRI project member   /  CS student, Free Software enthusiast
Index: r128_accel.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_accel.c,v
retrieving revision 1.17
diff -u -r1.17 r128_accel.c
--- r128_accel.c        2002/01/27 20:05:30     1.17
+++ r128_accel.c        2002/02/03 01:58:17
@@ -231,6 +231,11 @@
     R128InfoPtr info = R128PTR(pScrn);
     int         ret;
 
+    if(!info->CCEInUse){
+        R128WaitForIdle(pScrn);
+        return;
+    }
+
     FLUSH_RING();
 
     for (;;) {
Index: r128_video.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_video.c,v
retrieving revision 1.11
diff -u -r1.11 r128_video.c
--- r128_video.c        2002/01/27 20:05:31     1.11
+++ r128_video.c        2002/02/03 01:58:21
@@ -208,6 +208,8 @@
     R128PortPrivPtr pPriv;
     XF86VideoAdaptorPtr adapt;
 
+    info->accel->Sync(pScrn);
+
     if(!(adapt = R128AllocAdaptor(pScrn)))
        return NULL;
 
@@ -372,6 +374,8 @@
   unsigned char *R128MMIO = info->MMIO;
   R128PortPrivPtr pPriv = (R128PortPrivPtr)data;
 
+  info->accel->Sync(pScrn);
+
   REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
 
   if(cleanup) {
@@ -402,6 +406,8 @@
   unsigned char *R128MMIO = info->MMIO;
   R128PortPrivPtr pPriv = (R128PortPrivPtr)data;
 
+  info->accel->Sync(pScrn);
+
   if(attribute == xvBrightness) {
        if((value < -64) || (value > 63))
           return BadValue;
@@ -443,6 +449,9 @@
   pointer data
 ){
   R128PortPrivPtr pPriv = (R128PortPrivPtr)data;
+  R128InfoPtr info = R128PTR(pScrn);
+
+  info->accel->Sync(pScrn);
 
   if(attribute == xvBrightness) {
        *value = pPriv->brightness;
@@ -746,6 +755,8 @@
 
     left = (left >> 16) & 7;
 
+    info->accel->Sync(pScrn);
+
     OUTREG(R128_OV0_REG_LOAD_CNTL, 1);
     while(!(INREG(R128_OV0_REG_LOAD_CNTL) & (1 << 3)));
 
@@ -823,6 +834,8 @@
     leftUV = (left >> 17) & 15;
     left = (left >> 16) & 15;
 
+    info->accel->Sync(pScrn);
+
     OUTREG(R128_OV0_REG_LOAD_CNTL, 1);
     while(!(INREG(R128_OV0_REG_LOAD_CNTL) & (1 << 3)));
 
@@ -876,6 +889,8 @@
    BoxRec dstBox;
    CARD32 tmp;
 
+   info->accel->Sync(pScrn);
+
    /*
     * s1offset, s2offset, s3offset - byte offsets to the Y, U and V planes
     *                                of the source.
@@ -1106,6 +1121,7 @@
        if(pPriv->videoStatus & OFF_TIMER) {
            if(pPriv->offTime < now) {
                unsigned char *R128MMIO = info->MMIO;
+               info->accel->Sync(pScrn);
                OUTREG(R128_OV0_SCALE_CNTL, 0);
                pPriv->videoStatus = FREE_TIMER;
                pPriv->freeTime = now + FREE_DELAY;
Index: r128_dri.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/r128_dri.c,v
retrieving revision 1.28
diff -u -r1.28 r128_dri.c
--- r128_dri.c  2002/01/27 20:05:30     1.28
+++ r128_dri.c  2002/02/03 02:44:22
@@ -300,14 +300,16 @@
     unsigned char *R128MMIO = info->MMIO;
 
     if (!info->directRenderingEnabled) {
-       if (!info->CCEInUse) {
-           /* Save all hardware scissors */
-           info->sc_left     = INREG(R128_SC_LEFT);
-           info->sc_right    = INREG(R128_SC_RIGHT);
-           info->sc_top      = INREG(R128_SC_TOP);
-           info->sc_bottom   = INREG(R128_SC_BOTTOM);
-           info->aux_sc_cntl = INREG(R128_SC_BOTTOM);
-       }
+        /* Save all hardware scissors */
+        info->sc_left     = INREG(R128_SC_LEFT);
+       info->sc_right    = INREG(R128_SC_RIGHT);
+       info->sc_top      = INREG(R128_SC_TOP);
+       info->sc_bottom   = INREG(R128_SC_BOTTOM);
+       info->aux_sc_cntl = INREG(R128_SC_BOTTOM);
+    } else if (info->CCEInUse) {
+       R128CCEReleaseIndirect(pScrn);
+
+       info->CCEInUse = FALSE;
     }
 }
 

Reply via email to