diff options
-rw-r--r-- | src/glx/x11/pixelstore.c | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/src/glx/x11/pixelstore.c b/src/glx/x11/pixelstore.c index 0727865f09..3bf1b35ba3 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; } |