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