Send GL_PACK_INVERT_MESA state to the server. This fixes bug #2538.
authorIan Romanick <idr@us.ibm.com>
Mon, 18 Apr 2005 16:40:36 +0000 (16:40 +0000)
committerIan Romanick <idr@us.ibm.com>
Mon, 18 Apr 2005 16:40:36 +0000 (16:40 +0000)
src/glx/x11/pixelstore.c

index 0727865..3bf1b35 100644 (file)
 #include "glxclient.h"
 #include "indirect.h"
 
+/**
+ * Send glPixelStore command to the server
+ * 
+ * \param gc     Current GLX context
+ * \param sop    Either \c X_GLsop_PixelStoref or \c X_GLsop_PixelStorei
+ * \param pname  Selector of which pixel parameter is to be set.
+ * \param param  Value that \c pname is set to.
+ *
+ * \sa __indirect_glPixelStorei,  __indirect_glPixelStoref
+ */
+static void
+send_PixelStore( __GLXcontext * gc, unsigned sop, GLenum pname, 
+                const void * param )
+{
+    Display * const dpy = gc->currentDpy;
+    const GLuint cmdlen = 8;
+    if (__builtin_expect(dpy != NULL, 1)) {
+        GLubyte const * pc = __glXSetupSingleRequest(gc, sop, cmdlen);
+        (void) memcpy((void *)(pc + 0), (void *)(&pname), 4);
+        (void) memcpy((void *)(pc + 4), param, 4);
+        UnlockDisplay(dpy); SyncHandle();
+    }
+    return;
+}
+
 /*
 ** Specify parameters that control the storage format of pixel arrays.
 */
@@ -165,12 +190,18 @@ void __indirect_glPixelStoref(GLenum pname, GLfloat param)
       case GL_UNPACK_LSB_FIRST:
        state->storeUnpack.lsbFirst = (param != 0);
        break;
+
+      /* Group all of the pixel store modes that need to be sent to the
+       * server here.  Care must be used to only send modes to the server that
+       * won't affect the size of the data sent to or received from the
+       * server.  GL_PACK_INVERT_MESA is safe in this respect, but other,
+       * future modes may not be.
+       */
+      case GL_PACK_INVERT_MESA:
+       send_PixelStore( gc, X_GLsop_PixelStoref, pname, & param );
+       break;
+
       default:
-       /*
-       ** NOTE: there are currently no pixel storage commands that need to
-       ** be sent to the server.  This may change in future versions
-       ** of the API, however.
-       */
        __glXSetError(gc, GL_INVALID_ENUM);
        break;
     }
@@ -288,12 +319,18 @@ void __indirect_glPixelStorei(GLenum pname, GLint param)
       case GL_UNPACK_LSB_FIRST:
        state->storeUnpack.lsbFirst = (param != 0);
        break;
+
+      /* Group all of the pixel store modes that need to be sent to the
+       * server here.  Care must be used to only send modes to the server that
+       * won't affect the size of the data sent to or received from the
+       * server.  GL_PACK_INVERT_MESA is safe in this respect, but other,
+       * future modes may not be.
+       */
+      case GL_PACK_INVERT_MESA:
+       send_PixelStore( gc, X_GLsop_PixelStorei, pname, & param );
+       break;
+
       default:
-       /*
-       ** NOTE: there are currently no pixel storage commands that need to
-       ** be sent to the server.  This may change in future versions
-       ** of the API, however.
-       */
        __glXSetError(gc, GL_INVALID_ENUM);
        break;
     }