diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2012-07-04 15:21:02 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2012-07-05 11:44:09 -0700 |
commit | 09a8a169d5929665778ae33e58e345fe1192b64c (patch) | |
tree | bdba075531c4d6d7e39a86f73f66a441bccc7691 /glx | |
parent | 167993254a5cbe11a1f44fad1e8ae042089c1619 (diff) |
glx: Implement GLX SetClientInfo2ARB protocol
The protocol is almost identical to SetClientInfoARB. The only
difference is the GL versions include an extra 4 bytes for the supported
profile.
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'glx')
-rw-r--r-- | glx/clientinfo.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/glx/clientinfo.c b/glx/clientinfo.c index b26ac1a72..4aaa4c967 100644 --- a/glx/clientinfo.c +++ b/glx/clientinfo.c @@ -29,10 +29,10 @@ #include "glxbyteorder.h" #include "unpack.h" -int -__glXDisp_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) +static int +set_client_info(__GLXclientState * cl, xGLXSetClientInfoARBReq * req, + unsigned bytes_per_version) { - xGLXSetClientInfoARBReq *req = (xGLXSetClientInfoARBReq *) pc; char *gl_extensions; char *glx_extensions; @@ -40,7 +40,7 @@ __glXDisp_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) * sizes specified for the various fields. */ const unsigned expected_size = sz_xGLXSetClientInfoARBReq - + (req->numVersions * 8) + + (req->numVersions * bytes_per_version) + __GLX_PAD(req->numGLExtensionBytes) + __GLX_PAD(req->numGLXExtensionBytes); @@ -50,7 +50,7 @@ __glXDisp_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) /* Verify that the actual length of the GL extension string matches what's * encoded in protocol packet. */ - gl_extensions = (char *) (req + 1) + (req->numVersions * 8); + gl_extensions = (char *) (req + 1) + (req->numVersions * bytes_per_version); if (req->numGLExtensionBytes != 0 && memchr(gl_extensions, 0, __GLX_PAD(req->numGLExtensionBytes)) == NULL) @@ -72,6 +72,12 @@ __glXDisp_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) } int +__glXDisp_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) +{ + return set_client_info(cl, (xGLXSetClientInfoARBReq *) pc, 8); +} + +int __glXDispSwap_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) { xGLXSetClientInfoARBReq *req = (xGLXSetClientInfoARBReq *) pc; @@ -87,11 +93,18 @@ __glXDispSwap_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) int __glXDisp_SetClientInfo2ARB(__GLXclientState * cl, GLbyte * pc) { - return BadRequest; + return set_client_info(cl, (xGLXSetClientInfoARBReq *) pc, 12); } int __glXDispSwap_SetClientInfo2ARB(__GLXclientState * cl, GLbyte * pc) { - return BadRequest; + xGLXSetClientInfoARBReq *req = (xGLXSetClientInfoARBReq *) pc; + + req->length = bswap_16(req->length); + req->numVersions = bswap_32(req->numVersions); + req->numGLExtensionBytes = bswap_32(req->numGLExtensionBytes); + req->numGLXExtensionBytes = bswap_32(req->numGLXExtensionBytes); + + return __glXDisp_SetClientInfo2ARB(cl, pc); } |