summaryrefslogtreecommitdiffstats
path: root/src/glx
diff options
context:
space:
mode:
Diffstat (limited to 'src/glx')
-rw-r--r--src/glx/x11/pixelstore.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/src/glx/x11/pixelstore.c b/src/glx/x11/pixelstore.c
index 0727865f09e..3bf1b35ba3c 100644
--- a/src/glx/x11/pixelstore.c
+++ b/src/glx/x11/pixelstore.c
@@ -37,6 +37,31 @@
#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;
}