Ian Romanick wrote:
Ian Romanick wrote:

1. Enable GLX_SGI_make_current_read support in all drivers. The MGA driver already supports this extension. I did a patch once, which I'll have to find, that enabled it for r200, but the patch only worked with pageflipping disabled. People can start working on this now, if they like. :)

Here's my old SGI_make_current_read patch for r200. IIRC, it only works when pageflipping is disabled. I suspect the problem is related to the pointer to the front / back buffer not being tracked correctly as the current page changes. It shouldn't be too tough to get it working, but I'm not going to have a chance to get to it anytime soon.


The last time I worked on it, as evident by the date in the patch, is 23-Nov-2003. This was *before* the drivers moved to the Mesa tree, so it may be a little painful to apply the patch. Sorry.

No, really. Here's the patch. :)


Index: lib/GL/mesa/src/drv/r200/r200_context.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_context.c,v
retrieving revision 1.35
diff -u -d -r1.35 r200_context.c
--- lib/GL/mesa/src/drv/r200/r200_context.c     25 Oct 2003 16:06:35 -0000      1.35
+++ lib/GL/mesa/src/drv/r200/r200_context.c     23 Nov 2003 03:17:37 -0000
@@ -593,6 +593,8 @@
         r200UpdateViewportOffset( newCtx->glCtx );
       }
 
+      newCtx->dri.readable = driReadPriv;
+
       _mesa_make_current2( newCtx->glCtx,
                           (GLframebuffer *) driDrawPriv->driverPrivate,
                           (GLframebuffer *) driReadPriv->driverPrivate );
Index: lib/GL/mesa/src/drv/r200/r200_context.h
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_context.h,v
retrieving revision 1.27
diff -u -d -r1.27 r200_context.h
--- lib/GL/mesa/src/drv/r200/r200_context.h     25 Oct 2003 16:06:35 -0000      1.27
+++ lib/GL/mesa/src/drv/r200/r200_context.h     23 Nov 2003 03:17:37 -0000
@@ -565,6 +565,14 @@
    __DRIcontextPrivate *context;       /* DRI context */
    __DRIscreenPrivate  *screen;        /* DRI screen */
    __DRIdrawablePrivate        *drawable;      /* DRI drawable bound to this ctx */
+   __DRIdrawablePrivate        *readable;      /* DRI drawable bound to this ctx */
+
+   /**
+    * Drawable currently set for reading via Mesa's \c SetBuffer hook.  This
+    * will either be \c drawable or \c readable.
+    */
+
+   __DRIdrawablePrivate        *read_source;
 
    drmContext hwContext;
    drmLock *hwLock;
Index: lib/GL/mesa/src/drv/r200/r200_screen.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_screen.c,v
retrieving revision 1.20
diff -u -d -r1.20 r200_screen.c
--- lib/GL/mesa/src/drv/r200/r200_screen.c      5 Nov 2003 16:12:51 -0000       1.20
+++ lib/GL/mesa/src/drv/r200/r200_screen.c      23 Nov 2003 03:17:37 -0000
@@ -272,6 +272,7 @@
            (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
         }
 
+        (*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
         (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
 
         if ( driCompareGLXAPIVersion( 20030818 ) >= 0 ) {
Index: lib/GL/mesa/src/drv/r200/r200_span.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_span.c,v
retrieving revision 1.6
diff -u -d -r1.6 r200_span.c
--- lib/GL/mesa/src/drv/r200/r200_span.c        16 Sep 2003 20:45:08 -0000      1.6
+++ lib/GL/mesa/src/drv/r200/r200_span.c        23 Nov 2003 03:17:37 -0000
@@ -47,15 +47,15 @@
 #define DBG 0
 
 #define LOCAL_VARS                                                     \
-   r200ContextPtr rmesa = R200_CONTEXT(ctx);                   \
+   r200ContextPtr rmesa = R200_CONTEXT(ctx);                           \
    r200ScreenPtr r200Screen = rmesa->r200Screen;                       \
    __DRIscreenPrivate *sPriv = rmesa->dri.screen;                      \
-   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;                  \
+   __DRIdrawablePrivate *dPriv = rmesa->dri.read_source;               \
    GLuint pitch = r200Screen->frontPitch * r200Screen->cpp;            \
    GLuint height = dPriv->h;                                           \
    char *buf = (char *)(sPriv->pFB +                                   \
                        rmesa->state.color.drawOffset +                 \
-                       (dPriv->x * r200Screen->cpp) +          \
+                       (dPriv->x * r200Screen->cpp) +                  \
                        (dPriv->y * pitch));                            \
    char *read_buf = (char *)(sPriv->pFB +                              \
                             rmesa->state.pixel.readOffset +            \
@@ -65,14 +65,14 @@
    (void) read_buf; (void) buf; (void) p
 
 #define LOCAL_DEPTH_VARS                                               \
-   r200ContextPtr rmesa = R200_CONTEXT(ctx);                   \
+   r200ContextPtr rmesa = R200_CONTEXT(ctx);                           \
    r200ScreenPtr r200Screen = rmesa->r200Screen;                       \
    __DRIscreenPrivate *sPriv = rmesa->dri.screen;                      \
-   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;                  \
+   __DRIdrawablePrivate *dPriv = rmesa->dri.read_source;               \
    GLuint height = dPriv->h;                                           \
    GLuint xo = dPriv->x;                                               \
    GLuint yo = dPriv->y;                                               \
-   char *buf = (char *)(sPriv->pFB + r200Screen->depthOffset); \
+   char *buf = (char *)(sPriv->pFB + r200Screen->depthOffset);         \
    (void) buf
 
 #define LOCAL_STENCIL_VARS     LOCAL_DEPTH_VARS
@@ -300,6 +300,16 @@
 {
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
 
+
+   fprintf( stderr, "read_source is the drawable (%s)\n",
+           (bufferBit == FRONT_LEFT_BIT) ? "front" : "back" );
+
+   assert( (colorBuffer == rmesa->dri.drawable->driverPrivate)
+          || (colorBuffer == rmesa->dri.readable->driverPrivate) );
+
+   rmesa->dri.read_source = (colorBuffer == rmesa->dri.drawable->driverPrivate)
+       ? rmesa->dri.drawable : rmesa->dri.readable;
+
    switch ( bufferBit ) {
    case FRONT_LEFT_BIT:
       if ( rmesa->doPageFlip && rmesa->sarea->pfCurrentPage == 1 ) {

Reply via email to