13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * (C) Copyright IBM Corporation 2004 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"), 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the Software is furnished to do so, subject to the following conditions: 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the next 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * paragraph) shall be included in all copies or substantial portions of the 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software. 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * DEALINGS IN THE SOFTWARE. 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \file glx_query.c 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Generic utility functions to query internal data from the server. 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \author Ian Romanick <idr@us.ibm.com> 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "glxclient.h" 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if defined(USE_XCB) 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# include <X11/Xlib-xcb.h> 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# include <xcb/xcb.h> 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org# include <xcb/glx.h> 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#ifdef USE_XCB 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Exchange a protocol request for glXQueryServerString. 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgchar * 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name) 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_connection_t *c = XGetXCBConnection(dpy); 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_glx_query_server_string_reply_t *reply = 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_glx_query_server_string_reply(c, 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_glx_query_server_string(c, 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org screen, 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org name), 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org NULL); 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* The spec doesn't mention this, but the Xorg server replies with 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * a string already terminated with '\0'. */ 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org uint32_t len = xcb_glx_query_server_string_string_length(reply); 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org char *buf = Xmalloc(len); 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org memcpy(buf, xcb_glx_query_server_string_string(reply), len); 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org free(reply); 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return buf; 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Exchange a protocol request for glGetString. 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgchar * 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__glXGetString(Display * dpy, int opcode, CARD32 contextTag, CARD32 name) 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_connection_t *c = XGetXCBConnection(dpy); 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_glx_get_string_reply_t *reply = xcb_glx_get_string_reply(c, 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xcb_glx_get_string 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org (c, 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org contextTag, 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org name), 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org NULL); 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* The spec doesn't mention this, but the Xorg server replies with 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * a string already terminated with '\0'. */ 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org uint32_t len = xcb_glx_get_string_string_length(reply); 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org char *buf = Xmalloc(len); 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org memcpy(buf, xcb_glx_get_string_string(reply), len); 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org free(reply); 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return buf; 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#else 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * GLX protocol structure for the ficticious "GXLGenericGetString" request. 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This is a non-existant protocol packet. It just so happens that all of 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the real protocol packets used to request a string from the server have 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * an identical binary layout. The only difference between them is the 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * meaning of the \c for_whom field and the value of the \c glxCode. 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgtypedef struct GLXGenericGetString 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org CARD8 reqType; 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org CARD8 glxCode; 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org CARD16 length B16; 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org CARD32 for_whom B32; 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org CARD32 name B32; 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} xGLXGenericGetStringReq; 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* These defines are only needed to make the GetReq macro happy. 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define sz_xGLXGenericGetStringReq 12 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define X_GLXGenericGetString 0 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Query the Server GLX string. 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This routine will allocate the necessay space for the string. 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic char * 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__glXGetStringFromServer(Display * dpy, int opcode, CARD32 glxCode, 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org CARD32 for_whom, CARD32 name) 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xGLXGenericGetStringReq *req; 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org xGLXSingleReply reply; 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int length; 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int numbytes; 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org char *buf; 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org LockDisplay(dpy); 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* All of the GLX protocol requests for getting a string from the server 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * look the same. The exact meaning of the for_whom field is usually 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * either the screen number (for glXQueryServerString) or the context tag 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * (for GLXSingle). 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org GetReq(GLXGenericGetString, req); 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org req->reqType = opcode; 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org req->glxCode = glxCode; 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org req->for_whom = for_whom; 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org req->name = name; 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org _XReply(dpy, (xReply *) & reply, 0, False); 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org length = reply.length * 4; 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org numbytes = reply.size; 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org buf = (char *) Xmalloc(numbytes); 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (buf != NULL) { 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org _XRead(dpy, buf, numbytes); 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org length -= numbytes; 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org _XEatData(dpy, length); 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org UnlockDisplay(dpy); 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org SyncHandle(); 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return buf; 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgchar * 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__glXQueryServerString(Display * dpy, int opcode, CARD32 screen, CARD32 name) 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return __glXGetStringFromServer(dpy, opcode, 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org X_GLXQueryServerString, screen, name); 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgchar * 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org__glXGetString(Display * dpy, int opcode, CARD32 contextTag, CARD32 name) 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return __glXGetStringFromServer(dpy, opcode, X_GLsop_GetString, 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org contextTag, name); 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif /* USE_XCB */ 178