X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fx11%2Fglx_query.c;h=efad13d376e817e1f77b63954337561bdaedd200;hb=538539d8791e5b3b1ea2e95473b589934d94497e;hp=56f34951863c66018e5918f1c5539377b0381617;hpb=57d78067bde1b23351380700352e71ed977ebcfe;p=mesa.git diff --git a/src/glx/x11/glx_query.c b/src/glx/x11/glx_query.c index 56f34951863..efad13d376e 100644 --- a/src/glx/x11/glx_query.c +++ b/src/glx/x11/glx_query.c @@ -25,15 +25,73 @@ /** * \file glx_query.c * Generic utility functions to query internal data from the server. - * + * * \author Ian Romanick */ #include "glxclient.h" +#if defined(USE_XCB) +# include +# include +# include +#endif + +#ifdef USE_XCB + +/** + * Exchange a protocol request for glXQueryServerString. + */ +char * +__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name) +{ + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_glx_query_server_string_reply_t *reply = + xcb_glx_query_server_string_reply(c, + xcb_glx_query_server_string(c, + screen, + name), + NULL); + + /* The spec doesn't mention this, but the Xorg server replies with + * a string already terminated with '\0'. */ + uint32_t len = xcb_glx_query_server_string_string_length(reply); + char *buf = Xmalloc(len); + memcpy(buf, xcb_glx_query_server_string_string(reply), len); + free(reply); + + return buf; +} + +/** + * Exchange a protocol request for glGetString. + */ +char * +__glXGetString(Display * dpy, int opcode, CARD32 contextTag, CARD32 name) +{ + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_glx_get_string_reply_t *reply = xcb_glx_get_string_reply(c, + xcb_glx_get_string + (c, + contextTag, + name), + NULL); + + /* The spec doesn't mention this, but the Xorg server replies with + * a string already terminated with '\0'. */ + uint32_t len = xcb_glx_get_string_string_length(reply); + char *buf = Xmalloc(len); + memcpy(buf, xcb_glx_get_string_string(reply), len); + free(reply); + + return buf; +} + +#else + /** * GLX protocol structure for the ficticious "GXLGenericGetString" request. - * + * * This is a non-existant protocol packet. It just so happens that all of * the real protocol packets used to request a string from the server have * an identical binary layout. The only difference between them is the @@ -57,7 +115,7 @@ typedef struct GLXGenericGetString * Query the Server GLX string. * This routine will allocate the necessay space for the string. */ -char * +static char * __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode, CARD32 for_whom, CARD32 name) { @@ -101,3 +159,19 @@ __glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode, return buf; } + +char * +__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name) +{ + return __glXGetStringFromServer(dpy, opcode, + X_GLXQueryServerString, screen, name); +} + +char * +__glXGetString(Display * dpy, int opcode, CARD32 contextTag, CARD32 name) +{ + return __glXGetStringFromServer(dpy, opcode, X_GLsop_GetString, + contextTag, name); +} + +#endif /* USE_XCB */