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