16849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg/* 26849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Copyright © 2010 Intel Corporation 36849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * 46849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a 56849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * copy of this software and associated documentation files (the "Soft- 66849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * ware"), to deal in the Software without restriction, including without 76849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * limitation the rights to use, copy, modify, merge, publish, distribute, 86849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the 96849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Software is furnished to do so, provided that the above copyright 106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * notice(s) and this permission notice appear in all copies of the Soft- 116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * ware and that both the above copyright notice(s) and this permission 126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * notice appear in supporting documentation. 136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * 146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY 176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN 186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE- 196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR- 226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * MANCE OF THIS SOFTWARE. 236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * 246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Except as contained in this notice, the name of a copyright holder shall 256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * not be used in advertising or otherwise to promote the sale, use or 266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * other dealings in this Software without prior written authorization of 276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * the copyright holder. 286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * 296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Authors: 306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Kristian Høgsberg (krh@bitplanet.net) 316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#include "glapi.h" 346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#include "glxclient.h" 356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 365a459a036e33683410bab4df431ed553bd0eeb66Jon Turney#ifndef GLX_USE_APPLEGL 375a459a036e33683410bab4df431ed553bd0eeb66Jon Turney 386849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergextern struct _glapi_table *__glXNewIndirectAPI(void); 396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg/* 416849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg** All indirect rendering contexts will share the same indirect dispatch table. 426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg*/ 436849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic struct _glapi_table *IndirectAPI = NULL; 446849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 456849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 466849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_destroy_context(struct glx_context *gc) 476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFreeVertexArrayState(gc); 496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 505067506ea6ada5eeae33b1acf1c916e00121c12aMatt Turner free((char *) gc->vendor); 515067506ea6ada5eeae33b1acf1c916e00121c12aMatt Turner free((char *) gc->renderer); 525067506ea6ada5eeae33b1acf1c916e00121c12aMatt Turner free((char *) gc->version); 535067506ea6ada5eeae33b1acf1c916e00121c12aMatt Turner free((char *) gc->extensions); 546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glFreeAttributeState(gc); 557c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner free((char *) gc->buf); 567c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner free((char *) gc->client_state_private); 577c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner free((char *) gc); 586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 606849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic Bool 616849916170c0275c13510251a7b217c20f2b993eKristian HøgsbergSendMakeCurrentRequest(Display * dpy, CARD8 opcode, 626849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXContextID gc_id, GLXContextTag gc_tag, 636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXDrawable draw, GLXDrawable read, 6468412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson GLXContextTag *out_tag) 656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 6668412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson xGLXMakeCurrentReply reply; 676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Bool ret; 686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (draw == read) { 726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReq *req; 736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXMakeCurrent, req); 756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXMakeCurrent; 776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->drawable = draw; 786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->context = gc_id; 796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->oldContextTag = gc_tag; 806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg else { 826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_display *priv = __glXInitialize(dpy); 836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* If the server can support the GLX 1.3 version, we should 856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * perfer that. Not only that, some servers support GLX 1.3 but 866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * not the SGI extension. 876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeContextCurrentReq *req; 916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXMakeContextCurrent, req); 936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXMakeContextCurrent; 956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->drawable = draw; 966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->readdrawable = read; 976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->context = gc_id; 986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->oldContextTag = gc_tag; 996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg else { 1016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXVendorPrivateWithReplyReq *vpreq; 1026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReadSGIReq *req; 1036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReqExtra(GLXVendorPrivateWithReply, 1056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg sz_xGLXMakeCurrentReadSGIReq - 1066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg sz_xGLXVendorPrivateWithReplyReq, vpreq); 1076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req = (xGLXMakeCurrentReadSGIReq *) vpreq; 1086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 1096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXVendorPrivateWithReply; 1106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->vendorCode = X_GLXvop_MakeCurrentReadSGI; 1116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->drawable = draw; 1126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->readable = read; 1136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->context = gc_id; 1146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->oldContextTag = gc_tag; 1156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 11868412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson ret = _XReply(dpy, (xReply *) &reply, 0, False); 11968412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson 12068412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson if (out_tag) 12168412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson *out_tag = reply.contextTag; 1226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 1246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 1256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return ret; 1276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1296849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic int 1306849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_bind_context(struct glx_context *gc, struct glx_context *old, 1316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXDrawable draw, GLXDrawable read) 1326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXContextTag tag; 1346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->psc->dpy; 1356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int opcode = __glXSetupForCommand(dpy); 1361090eb57552aed1f4e36ac97b5859ff4b2cc80a5Adam Jackson Bool sent; 1376849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 13823e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney if (old != &dummyContext && !old->isDirect && old->psc->dpy == dpy) { 1396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg tag = old->currentContextTag; 14023e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney old->currentContextTag = 0; 14123e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney } else { 14223e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney tag = 0; 14323e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney } 1446849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1451090eb57552aed1f4e36ac97b5859ff4b2cc80a5Adam Jackson sent = SendMakeCurrentRequest(dpy, opcode, gc->xid, tag, draw, read, 1461090eb57552aed1f4e36ac97b5859ff4b2cc80a5Adam Jackson &gc->currentContextTag); 1476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!IndirectAPI) 1496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg IndirectAPI = __glXNewIndirectAPI(); 1506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg _glapi_set_dispatch(IndirectAPI); 1516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1521090eb57552aed1f4e36ac97b5859ff4b2cc80a5Adam Jackson return !sent; 1536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1556849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 1566849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_unbind_context(struct glx_context *gc, struct glx_context *new) 1576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->psc->dpy; 1596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int opcode = __glXSetupForCommand(dpy); 1606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 16116887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg if (gc == new) 16216887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg return; 16316887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg 16460a27ad122128145d28be37e9c0b0bc86a8e5181Giuseppe Bilotta /* We are either switching to no context, away from an indirect 1656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * context to a direct context or from one dpy to another and have 1666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * to send a request to the dpy to unbind the previous context. 1676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 16823e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney if (!new || new->isDirect || new->psc->dpy != dpy) { 1696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SendMakeCurrentRequest(dpy, opcode, None, 17068412d5006586f8b5814d85f76985b9d632f36dfAdam Jackson gc->currentContextTag, None, None, NULL); 17123e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney gc->currentContextTag = 0; 17223e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon Turney } 1736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1756849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 1766849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_wait_gl(struct glx_context *gc) 1776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXWaitGLReq *req; 1796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->currentDpy; 1806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Flush any pending commands out */ 1826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFlushRenderBuffer(gc, gc->pc); 1836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Send the glXWaitGL request */ 1856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 1866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXWaitGL, req); 1876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = gc->majorOpcode; 1886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXWaitGL; 1896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 1906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 1916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 1926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1946849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 1956849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_wait_x(struct glx_context *gc) 1966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXWaitXReq *req; 1986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->currentDpy; 1996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Flush any pending commands out */ 2016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFlushRenderBuffer(gc, gc->pc); 2026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 2046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXWaitX, req); 2056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = gc->majorOpcode; 2066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXWaitX; 2076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 2086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 2096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 2106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2126849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2136849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_use_x_font(struct glx_context *gc, 2146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Font font, int first, int count, int listBase) 2156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXUseXFontReq *req; 2176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->currentDpy; 2186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Flush any pending commands out */ 2206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFlushRenderBuffer(gc, gc->pc); 2216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Send the glXUseFont request */ 2236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 2246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXUseXFont, req); 2256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = gc->majorOpcode; 2266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXUseXFont; 2276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 2286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->font = font; 2296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->first = first; 2306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->count = count; 2316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->listBase = listBase; 2326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 2336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 2346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2366849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2376849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_bind_tex_image(Display * dpy, 2386849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXDrawable drawable, 2396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int buffer, const int *attrib_list) 2406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2416849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXVendorPrivateReq *req; 2426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 2436849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *drawable_ptr; 2446849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg INT32 *buffer_ptr; 2456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *num_attrib_ptr; 2466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *attrib_ptr; 2476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD8 opcode; 2486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg unsigned int i; 2496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i = 0; 2516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (attrib_list) { 2526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg while (attrib_list[i * 2] != None) 2536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i++; 2546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 2556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg opcode = __glXSetupForCommand(dpy); 2576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!opcode) 2586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return; 2596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 2616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReqExtra(GLXVendorPrivate, 12 + 8 * i, req); 2626849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 2636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXVendorPrivate; 2646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->vendorCode = X_GLXvop_BindTexImageEXT; 2656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 2666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg drawable_ptr = (CARD32 *) (req + 1); 2686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg buffer_ptr = (INT32 *) (drawable_ptr + 1); 2696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg num_attrib_ptr = (CARD32 *) (buffer_ptr + 1); 2706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg attrib_ptr = (CARD32 *) (num_attrib_ptr + 1); 2716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *drawable_ptr = drawable; 2736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *buffer_ptr = buffer; 2746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *num_attrib_ptr = (CARD32) i; 2756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i = 0; 2776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (attrib_list) { 2786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg while (attrib_list[i * 2] != None) { 2796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 0]; 2806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 1]; 2816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i++; 2826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 2836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 2846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 2866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 2876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2896849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2906849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 2916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXVendorPrivateReq *req; 2936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 2946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *drawable_ptr; 2956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg INT32 *buffer_ptr; 2966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD8 opcode; 2976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg opcode = __glXSetupForCommand(dpy); 2996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!opcode) 3006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return; 3016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 3036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32), req); 3046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 3056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXVendorPrivate; 3066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->vendorCode = X_GLXvop_ReleaseTexImageEXT; 3076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 3086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg drawable_ptr = (CARD32 *) (req + 1); 3106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg buffer_ptr = (INT32 *) (drawable_ptr + 1); 3116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *drawable_ptr = drawable; 3136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *buffer_ptr = buffer; 3146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 3166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 3176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 3186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3196849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic const struct glx_context_vtable indirect_context_vtable = { 3202f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .destroy = indirect_destroy_context, 3212f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .bind = indirect_bind_context, 3222f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .unbind = indirect_unbind_context, 3232f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .wait_gl = indirect_wait_gl, 3242f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .wait_x = indirect_wait_x, 3252f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .use_x_font = indirect_use_x_font, 3262f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .bind_tex_image = indirect_bind_tex_image, 3272f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .release_tex_image = indirect_release_tex_image, 3282f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .get_proc_address = NULL, 3296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}; 3306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg/** 3326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * \todo Eliminate \c __glXInitVertexArrayState. Replace it with a new 3336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * function called \c __glXAllocateClientState that allocates the memory and 3346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * does all the initialization (including the pixel pack / unpack). 3352eed9ff2fb5b218b7b274d2989b0dbbe5fcfedefTomasz Lis * 3362eed9ff2fb5b218b7b274d2989b0dbbe5fcfedefTomasz Lis * \note 3372eed9ff2fb5b218b7b274d2989b0dbbe5fcfedefTomasz Lis * This function is \b not the place to validate the context creation 3382eed9ff2fb5b218b7b274d2989b0dbbe5fcfedefTomasz Lis * parameters. It is just the allocator for the \c glx_context. 3396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 3406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg_X_HIDDEN struct glx_context * 3416849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_create_context(struct glx_screen *psc, 3426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_config *mode, 3436849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *shareList, int renderType) 3446849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 3456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *gc; 3466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int bufSize; 3476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD8 opcode; 3486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __GLXattribute *state; 3496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg opcode = __glXSetupForCommand(psc->dpy); 3516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!opcode) { 3526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Allocate our context record */ 3566bda027e01c15df24d36de5bf3838ea8ed7e9e56Matt Turner gc = calloc(1, sizeof *gc); 3576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!gc) { 3586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Out of memory */ 3596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3626849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg glx_context_init(gc, psc, mode); 3636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->isDirect = GL_FALSE; 3646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->vtable = &indirect_context_vtable; 365da3282b6e2f374b88daf09f7f3ba5b05af45f51aMatt Turner state = calloc(1, sizeof(struct __GLXattributeRec)); 36627c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis gc->renderType = renderType; 36727c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis 3686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (state == NULL) { 3696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Out of memory */ 3707c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner free(gc); 3716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->client_state_private = state; 3746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state->NoDrawArraysProtocol = (getenv("LIBGL_NO_DRAWARRAYS") != NULL); 3756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 3776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** Create a temporary buffer to hold GLX rendering commands. The size 3786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** of the buffer is selected so that the maximum number of GLX rendering 3796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** commands can fit in a single X packet and still have room in the X 3806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** packet for the GLXRenderReq header. 3816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 3826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg bufSize = (XMaxRequestSize(psc->dpy) * 4) - sz_xGLXRenderReq; 3842b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner gc->buf = malloc(bufSize); 3856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!gc->buf) { 3867c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner free(gc->client_state_private); 3877c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner free(gc); 3886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->bufSize = bufSize; 3916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Fill in the new context */ 3936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->renderMode = GL_RENDER; 3946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state->storePack.alignment = 4; 3966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state->storeUnpack.alignment = 4; 3976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->attributes.stackPointer = &gc->attributes.stack[0]; 3996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 4016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** PERFORMANCE NOTE: A mode dependent fill image can speed things up. 4026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 4036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->fillImage = __glFillImage; 4046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->pc = gc->buf; 4056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->bufEnd = gc->buf + bufSize; 4066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->isDirect = GL_FALSE; 4076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (__glXDebug) { 4086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 4096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** Set limit register so that there will be one command per packet 4106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 4116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->limit = gc->buf; 4126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg else { 4146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->limit = gc->buf + bufSize - __GLX_BUFFER_LIMIT_SIZE; 4156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->majorOpcode = opcode; 4176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 4196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** Constrain the maximum drawing command size allowed to be 4206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** transfered using the X_GLXRender protocol request. First 4216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** constrain by a software limit, then constrain by the protocl 4226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** limit. 4236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 4246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (bufSize > __GLX_RENDER_CMD_SIZE_LIMIT) { 4256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg bufSize = __GLX_RENDER_CMD_SIZE_LIMIT; 4266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (bufSize > __GLX_MAX_RENDER_CMD_SIZE) { 4286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg bufSize = __GLX_MAX_RENDER_CMD_SIZE; 4296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->maxSmallRenderCommandSize = bufSize; 4316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return gc; 4346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 4356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 43627c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis_X_HIDDEN struct glx_context * 4376a0640971f5e12d329e91f92996382a7227d7b08Ian Romanickindirect_create_context_attribs(struct glx_screen *base, 4386a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick struct glx_config *config_base, 4396a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick struct glx_context *shareList, 4406a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick unsigned num_attribs, 4416a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick const uint32_t *attribs, 4426a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick unsigned *error) 4436a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick{ 44427c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis int renderType = GLX_RGBA_TYPE; 44527c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis unsigned i; 4466a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick 4476a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick /* The error parameter is only used on the server so that correct GLX 4486a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick * protocol errors can be generated. On the client, it can be ignored. 4496a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick */ 4506a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick (void) error; 4516a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick 45227c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis /* All of the attribute validation for indirect contexts is handled on the 45327c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis * server, so there's not much to do here. Still, we need to parse the 45427c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis * attributes to correctly set renderType. 45527c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis */ 45627c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis for (i = 0; i < num_attribs; i++) { 45727c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis if (attribs[i * 2] == GLX_RENDER_TYPE) 45827c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis renderType = attribs[i * 2 + 1]; 45927c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis } 46027c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis 46127c8aa5cfbcf6f2ad21564dfcdabbe747c277cabTomasz Lis return indirect_create_context(base, config_base, shareList, renderType); 4626a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick} 4636a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick 4642f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikovstatic const struct glx_screen_vtable indirect_screen_vtable = { 4652f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .create_context = indirect_create_context, 4662f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .create_context_attribs = indirect_create_context_attribs, 4672f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .query_renderer_integer = NULL, 4682f519e463512ee6cad92a7c6bc0ae26077c4cdc9Emil Velikov .query_renderer_string = NULL, 4696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}; 4706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg_X_HIDDEN struct glx_screen * 4726849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_create_screen(int screen, struct glx_display * priv) 4736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 4746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_screen *psc; 4756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4766bda027e01c15df24d36de5bf3838ea8ed7e9e56Matt Turner psc = calloc(1, sizeof *psc); 4776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (psc == NULL) 4786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 4796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg glx_screen_init(psc, screen, priv); 4816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg psc->vtable = &indirect_screen_vtable; 4826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return psc; 4846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 4855a459a036e33683410bab4df431ed553bd0eeb66Jon Turney 4865a459a036e33683410bab4df431ed553bd0eeb66Jon Turney#endif 487