Dieter NÃtzel wrote:
Looking a bit at this, this seems to be caused because the number of
pixels to read can be less than zero after CLIPSPAN (don't know if
that's a bug in itself or not).


That was my first thought, too (moving the window out to the left...) ;-)


This is no problem for the generic read (since the for loop will just
terminate instantly), but the mmx/sse/sse2 optimized routines only test
if it's 0 pixels to read, and don't bail out if it's less than zero. I
haven't looked closely what exactly will happen (i.e. the loops may
never terminate at all), but this certainly seems like a bad thing...

Here's a one-liner fix, which will cause CLIPSPAN hopefully never return a negative n1. Seems to work here.
Ian, what do you think? Would it be better to have the optimized read/write functions deal with negative values instead?


Roland
Index: r200_span.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r200/r200_span.c,v
retrieving revision 1.7
diff -u -r1.7 r200_span.c
--- r200_span.c 26 Jan 2005 18:05:03 -0000      1.7
+++ r200_span.c 1 Mar 2005 18:42:02 -0000
@@ -83,7 +83,7 @@
 
 
 #define CLIPSPAN( _x, _y, _n, _x1, _n1, _i )                           \
-   if ( _y < miny || _y >= maxy ) {                                    \
+   if ( _y < miny || _y >= maxy || _x + n < minx || _x >=maxx ) {              
                        \
       _n1 = 0, _x1 = x;                                                        
\
    } else {                                                            \
       _n1 = _n;                                                                
\
@@ -323,6 +323,7 @@
    R200_FIREVERTICES( rmesa );
    LOCK_HARDWARE( rmesa );
    r200WaitForIdleLocked( rmesa );
+   UNLOCK_HARDWARE( rmesa );
 
    /* Read & rewrite the first pixel in the frame buffer.  This should
     * be a noop, right?  In fact without this conform fails as reading
@@ -346,7 +347,7 @@
 {
    r200ContextPtr rmesa = R200_CONTEXT( ctx );
    _swrast_flush( ctx );
-   UNLOCK_HARDWARE( rmesa );
+/*   UNLOCK_HARDWARE( rmesa );*/
 }
 
 void r200InitSpanFuncs( GLcontext *ctx )

Reply via email to