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 366849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergextern struct _glapi_table *__glXNewIndirectAPI(void); 376849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 386849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg/* 396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg** All indirect rendering contexts will share the same indirect dispatch table. 406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg*/ 416849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic struct _glapi_table *IndirectAPI = NULL; 426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 436849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 446849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_destroy_context(struct glx_context *gc) 456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFreeVertexArrayState(gc); 476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (gc->vendor) 496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg XFree((char *) gc->vendor); 506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (gc->renderer) 516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg XFree((char *) gc->renderer); 526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (gc->version) 536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg XFree((char *) gc->version); 546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (gc->extensions) 556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg XFree((char *) gc->extensions); 566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glFreeAttributeState(gc); 576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg XFree((char *) gc->buf); 586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Xfree((char *) gc->client_state_private); 596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg XFree((char *) gc); 606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 626849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic Bool 636849916170c0275c13510251a7b217c20f2b993eKristian HøgsbergSendMakeCurrentRequest(Display * dpy, CARD8 opcode, 646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXContextID gc_id, GLXContextTag gc_tag, 656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXDrawable draw, GLXDrawable read, 666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReply * reply) 676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Bool ret; 696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (draw == read) { 736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReq *req; 746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXMakeCurrent, req); 766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXMakeCurrent; 786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->drawable = draw; 796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->context = gc_id; 806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->oldContextTag = gc_tag; 816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg else { 836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_display *priv = __glXInitialize(dpy); 846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* If the server can support the GLX 1.3 version, we should 866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * perfer that. Not only that, some servers support GLX 1.3 but 876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * not the SGI extension. 886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { 916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeContextCurrentReq *req; 926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXMakeContextCurrent, req); 946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXMakeContextCurrent; 966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->drawable = draw; 976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->readdrawable = read; 986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->context = gc_id; 996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->oldContextTag = gc_tag; 1006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg else { 1026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXVendorPrivateWithReplyReq *vpreq; 1036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReadSGIReq *req; 1046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReqExtra(GLXVendorPrivateWithReply, 1066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg sz_xGLXMakeCurrentReadSGIReq - 1076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg sz_xGLXVendorPrivateWithReplyReq, vpreq); 1086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req = (xGLXMakeCurrentReadSGIReq *) vpreq; 1096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 1106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXVendorPrivateWithReply; 1116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->vendorCode = X_GLXvop_MakeCurrentReadSGI; 1126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->drawable = draw; 1136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->readable = read; 1146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->context = gc_id; 1156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->oldContextTag = gc_tag; 1166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ret = _XReply(dpy, (xReply *) reply, 0, False); 1206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 1226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 1236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return ret; 1256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1276849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic int 1286849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_bind_context(struct glx_context *gc, struct glx_context *old, 1296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXDrawable draw, GLXDrawable read) 1306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReply reply; 1326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXContextTag tag; 1336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __GLXattribute *state; 1346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->psc->dpy; 1356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int opcode = __glXSetupForCommand(dpy); 1366849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 13723e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY if (old != &dummyContext && !old->isDirect && old->psc->dpy == dpy) { 1386849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg tag = old->currentContextTag; 13923e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY old->currentContextTag = 0; 14023e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY } else { 14123e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY tag = 0; 14223e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY } 1436849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1446849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SendMakeCurrentRequest(dpy, opcode, gc->xid, tag, draw, read, &reply); 1456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!IndirectAPI) 1476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg IndirectAPI = __glXNewIndirectAPI(); 1486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg _glapi_set_dispatch(IndirectAPI); 1496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->currentContextTag = reply.contextTag; 1516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state = gc->client_state_private; 1526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (state->array_state == NULL) { 1536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg glGetString(GL_EXTENSIONS); 1546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg glGetString(GL_VERSION); 1556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXInitVertexArrayState(gc); 1566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 1576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return Success; 1596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1616849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 1626849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_unbind_context(struct glx_context *gc, struct glx_context *new) 1636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->psc->dpy; 1656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int opcode = __glXSetupForCommand(dpy); 1666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXMakeCurrentReply reply; 1676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 16816887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg if (gc == new) 16916887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg return; 17016887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg 1716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* We are either switching to no context, away from a indirect 1726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * context to a direct context or from one dpy to another and have 1736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * to send a request to the dpy to unbind the previous context. 1746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 17523e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY if (!new || new->isDirect || new->psc->dpy != dpy) { 1766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SendMakeCurrentRequest(dpy, opcode, None, 1776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->currentContextTag, None, None, &reply); 17823e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY gc->currentContextTag = 0; 17923e2dec1a1cae26430a988e0c74b1f2b13eb0f6fJon TURNEY } 1806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 1816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1826849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 1836849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_wait_gl(struct glx_context *gc) 1846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 1856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXWaitGLReq *req; 1866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->currentDpy; 1876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Flush any pending commands out */ 1896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFlushRenderBuffer(gc, gc->pc); 1906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 1916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Send the glXWaitGL request */ 1926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 1936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXWaitGL, req); 1946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = gc->majorOpcode; 1956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXWaitGL; 1966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 1976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 1986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 1996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2016849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2026849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_wait_x(struct glx_context *gc) 2036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXWaitXReq *req; 2056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->currentDpy; 2066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Flush any pending commands out */ 2086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFlushRenderBuffer(gc, gc->pc); 2096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 2116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXWaitX, req); 2126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = gc->majorOpcode; 2136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXWaitX; 2146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 2156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 2166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 2176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2196849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2206849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_use_x_font(struct glx_context *gc, 2216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Font font, int first, int count, int listBase) 2226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXUseXFontReq *req; 2246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Display *dpy = gc->currentDpy; 2256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Flush any pending commands out */ 2276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __glXFlushRenderBuffer(gc, gc->pc); 2286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Send the glXUseFont request */ 2306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 2316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReq(GLXUseXFont, req); 2326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = gc->majorOpcode; 2336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXUseXFont; 2346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 2356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->font = font; 2366849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->first = first; 2376849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->count = count; 2386849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->listBase = listBase; 2396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 2406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 2416849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2436849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2446849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_bind_tex_image(Display * dpy, 2456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GLXDrawable drawable, 2466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int buffer, const int *attrib_list) 2476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXVendorPrivateReq *req; 2496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 2506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *drawable_ptr; 2516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg INT32 *buffer_ptr; 2526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *num_attrib_ptr; 2536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *attrib_ptr; 2546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD8 opcode; 2556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg unsigned int i; 2566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i = 0; 2586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (attrib_list) { 2596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg while (attrib_list[i * 2] != None) 2606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i++; 2616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 2626849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg opcode = __glXSetupForCommand(dpy); 2646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!opcode) 2656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return; 2666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 2686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReqExtra(GLXVendorPrivate, 12 + 8 * i, req); 2696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 2706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXVendorPrivate; 2716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->vendorCode = X_GLXvop_BindTexImageEXT; 2726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 2736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg drawable_ptr = (CARD32 *) (req + 1); 2756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg buffer_ptr = (INT32 *) (drawable_ptr + 1); 2766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg num_attrib_ptr = (CARD32 *) (buffer_ptr + 1); 2776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg attrib_ptr = (CARD32 *) (num_attrib_ptr + 1); 2786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *drawable_ptr = drawable; 2806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *buffer_ptr = buffer; 2816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *num_attrib_ptr = (CARD32) i; 2826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i = 0; 2846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (attrib_list) { 2856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg while (attrib_list[i * 2] != None) { 2866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 0]; 2876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 1]; 2886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg i++; 2896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 2906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 2916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 2936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 2946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 2956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 2966849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void 2976849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) 2986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 2996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg xGLXVendorPrivateReq *req; 3006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *gc = __glXGetCurrentContext(); 3016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD32 *drawable_ptr; 3026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg INT32 *buffer_ptr; 3036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD8 opcode; 3046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg opcode = __glXSetupForCommand(dpy); 3066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!opcode) 3076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return; 3086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg LockDisplay(dpy); 3106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32), req); 3116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->reqType = opcode; 3126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->glxCode = X_GLXVendorPrivate; 3136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->vendorCode = X_GLXvop_ReleaseTexImageEXT; 3146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg req->contextTag = gc->currentContextTag; 3156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg drawable_ptr = (CARD32 *) (req + 1); 3176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg buffer_ptr = (INT32 *) (drawable_ptr + 1); 3186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *drawable_ptr = drawable; 3206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *buffer_ptr = buffer; 3216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg UnlockDisplay(dpy); 3236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg SyncHandle(); 3246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 3256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3266849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic const struct glx_context_vtable indirect_context_vtable = { 3276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_destroy_context, 3286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_bind_context, 3296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_unbind_context, 3306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_wait_gl, 3316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_wait_x, 3326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_use_x_font, 3336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_bind_tex_image, 3346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg indirect_release_tex_image, 335559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston NULL, /* get_proc_address */ 3366849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}; 3376849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3386849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg/** 3396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * \todo Eliminate \c __glXInitVertexArrayState. Replace it with a new 3406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * function called \c __glXAllocateClientState that allocates the memory and 3416849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * does all the initialization (including the pixel pack / unpack). 3426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 3436849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg_X_HIDDEN struct glx_context * 3446849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_create_context(struct glx_screen *psc, 3456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_config *mode, 3466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *shareList, int renderType) 3476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 3486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_context *gc; 3496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg int bufSize; 3506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg CARD8 opcode; 3516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg __GLXattribute *state; 3526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg opcode = __glXSetupForCommand(psc->dpy); 3546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!opcode) { 3556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Allocate our context record */ 3596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc = Xmalloc(sizeof *gc); 3606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!gc) { 3616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Out of memory */ 3626849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg memset(gc, 0, sizeof *gc); 3656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg glx_context_init(gc, psc, mode); 3676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->isDirect = GL_FALSE; 3686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->vtable = &indirect_context_vtable; 3696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state = Xmalloc(sizeof(struct __GLXattributeRec)); 3706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (state == NULL) { 3716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Out of memory */ 3726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Xfree(gc); 3736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->client_state_private = state; 3766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg memset(gc->client_state_private, 0, sizeof(struct __GLXattributeRec)); 3776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state->NoDrawArraysProtocol = (getenv("LIBGL_NO_DRAWARRAYS") != NULL); 3786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 3806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** Create a temporary buffer to hold GLX rendering commands. The size 3816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** of the buffer is selected so that the maximum number of GLX rendering 3826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** commands can fit in a single X packet and still have room in the X 3836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** packet for the GLXRenderReq header. 3846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 3856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg bufSize = (XMaxRequestSize(psc->dpy) * 4) - sz_xGLXRenderReq; 3876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->buf = (GLubyte *) Xmalloc(bufSize); 3886849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!gc->buf) { 3896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Xfree(gc->client_state_private); 3906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg Xfree(gc); 3916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 3926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 3936849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->bufSize = bufSize; 3946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* Fill in the new context */ 3966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->renderMode = GL_RENDER; 3976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 3986849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state->storePack.alignment = 4; 3996849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg state->storeUnpack.alignment = 4; 4006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4016849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->attributes.stackPointer = &gc->attributes.stack[0]; 4026849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 4046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** PERFORMANCE NOTE: A mode dependent fill image can speed things up. 4056849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 4066849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->fillImage = __glFillImage; 4076849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->pc = gc->buf; 4086849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->bufEnd = gc->buf + bufSize; 4096849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->isDirect = GL_FALSE; 4106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (__glXDebug) { 4116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 4126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** Set limit register so that there will be one command per packet 4136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 4146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->limit = gc->buf; 4156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg else { 4176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->limit = gc->buf + bufSize - __GLX_BUFFER_LIMIT_SIZE; 4186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->majorOpcode = opcode; 4206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg /* 4226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** Constrain the maximum drawing command size allowed to be 4236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** transfered using the X_GLXRender protocol request. First 4246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** constrain by a software limit, then constrain by the protocl 4256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg ** limit. 4266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */ 4276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (bufSize > __GLX_RENDER_CMD_SIZE_LIMIT) { 4286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg bufSize = __GLX_RENDER_CMD_SIZE_LIMIT; 4296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (bufSize > __GLX_MAX_RENDER_CMD_SIZE) { 4316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg bufSize = __GLX_MAX_RENDER_CMD_SIZE; 4326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg } 4336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg gc->maxSmallRenderCommandSize = bufSize; 4346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4366849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return gc; 4376849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 4386849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4396a0640971f5e12d329e91f92996382a7227d7b08Ian Romanickstatic struct glx_context * 4406a0640971f5e12d329e91f92996382a7227d7b08Ian Romanickindirect_create_context_attribs(struct glx_screen *base, 4416a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick struct glx_config *config_base, 4426a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick struct glx_context *shareList, 4436a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick unsigned num_attribs, 4446a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick const uint32_t *attribs, 4456a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick unsigned *error) 4466a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick{ 4476a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick /* All of the attribute validation for indirect contexts is handled on the 4486a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick * server, so there's not much to do here. 4496a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick */ 4506a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick (void) num_attribs; 4516a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick (void) attribs; 4526a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick 4536a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick /* The error parameter is only used on the server so that correct GLX 4546a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick * protocol errors can be generated. On the client, it can be ignored. 4556a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick */ 4566a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick (void) error; 4576a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick 4586a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick return indirect_create_context(base, config_base, shareList, 0); 4596a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick} 4606a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick 4616849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstruct glx_screen_vtable indirect_screen_vtable = { 46243409fa7b0e64f6d73c3d33bc9a39ba26dd4caebIan Romanick indirect_create_context, 4636a0640971f5e12d329e91f92996382a7227d7b08Ian Romanick indirect_create_context_attribs 4646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}; 4656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg_X_HIDDEN struct glx_screen * 4676849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergindirect_create_screen(int screen, struct glx_display * priv) 4686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{ 4696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg struct glx_screen *psc; 4706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg psc = Xmalloc(sizeof *psc); 4726849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (psc == NULL) 4736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return NULL; 4746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg memset(psc, 0, sizeof *psc); 4766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg glx_screen_init(psc, screen, priv); 4776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg psc->vtable = &indirect_screen_vtable; 4786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg 4796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg return psc; 4806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg} 481