16849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg/*
26849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Copyright © 2010 Intel Corporation
35d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston * Copyright © 2011 Apple Inc.
46849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *
56849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a
66849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * copy of this software and associated documentation files (the "Soft-
76849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * ware"), to deal in the Software without restriction, including without
86849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * limitation the rights to use, copy, modify, merge, publish, distribute,
96849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the
106849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Software is furnished to do so, provided that the above copyright
116849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * notice(s) and this permission notice appear in all copies of the Soft-
126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * ware and that both the above copyright notice(s) and this permission
136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * notice appear in supporting documentation.
146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *
156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
206849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
236849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * MANCE OF THIS SOFTWARE.
246849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *
256849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Except as contained in this notice, the name of a copyright holder shall
266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * not be used in advertising or otherwise to promote the sale, use or
276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * other dealings in this Software without prior written authorization of
286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * the copyright holder.
296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *
306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg * Authors:
316849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg *   Kristian Høgsberg (krh@bitplanet.net)
326849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg */
336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#if defined(GLX_USE_APPLEGL)
356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
365d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston#include <stdbool.h>
37559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston#include <dlfcn.h>
385d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston
395d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston#include "glxclient.h"
405d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston#include "apple_glx_context.h"
415d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston#include "apple_glx.h"
42559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston#include "apple_cgl.h"
435d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston#include "glx_error.h"
445d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston
456849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void
466849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_destroy_context(struct glx_context *gc)
476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
48c6cf82fb553405bee241170f6e51cafd751d46eaJeremy Huddleston   apple_glx_destroy_context(&gc->driContext, gc->psc->dpy);
496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
506849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
516849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic int
526849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_bind_context(struct glx_context *gc, struct glx_context *old,
536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg		     GLXDrawable draw, GLXDrawable read)
546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
555d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   Display *dpy = gc->psc->dpy;
566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   bool error = apple_glx_make_current_context(dpy,
577c5f37c032231ad144a8a5c5a0b18f3e26c0aea7Jeremy Huddleston					       (old && old != &dummyContext) ? old->driContext : NULL,
586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg					       gc ? gc->driContext : NULL, draw);
596849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
606849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   apple_glx_diagnostic("%s: error %s\n", __func__, error ? "YES" : "NO");
616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   if (error)
625d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston      return 1; /* GLXBadContext is the same as Success (0) */
636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
64a128355ecb5b782a69461a04991e4cffb32249dbJeremy Huddleston   apple_glapi_set_dispatch();
65a128355ecb5b782a69461a04991e4cffb32249dbJeremy Huddleston
666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   return Success;
676849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
696849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void
706849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_unbind_context(struct glx_context *gc, struct glx_context *new)
716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
725c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   Display *dpy;
735c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   bool error;
745c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston
755c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   /* If we don't have a context, then we have nothing to unbind */
765c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   if (!gc)
775c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston      return;
785c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston
795c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   /* If we have a new context, keep this one around and remove it during bind. */
805c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   if (new)
815c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston      return;
825c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston
835c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   dpy = gc->psc->dpy;
845c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston
855c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   error = apple_glx_make_current_context(dpy,
865c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston					  (gc != &dummyContext) ? gc->driContext : NULL,
875c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston					  NULL, None);
885c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston
895c44c1348ea13f51a1616968daa7034bb48e42b1Jeremy Huddleston   apple_glx_diagnostic("%s: error %s\n", __func__, error ? "YES" : "NO");
906849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
916849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
926849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void
936849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_wait_gl(struct glx_context *gc)
946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   glFinish();
966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
976849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
986849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic void
996849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_wait_x(struct glx_context *gc)
1006849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
1015d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   Display *dpy = gc->psc->dpy;
1025d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   apple_glx_waitx(dpy, gc->driContext);
1036849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
1046849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
105559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddlestonstatic void *
106559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddlestonapplegl_get_proc_address(const char *symbol)
107559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston{
108559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston   return dlsym(apple_cgl_get_dl_handle(), symbol);
109559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston}
110559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston
1116849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergstatic const struct glx_context_vtable applegl_context_vtable = {
1126849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   applegl_destroy_context,
1136849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   applegl_bind_context,
1146849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   applegl_unbind_context,
1156849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   applegl_wait_gl,
1166849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   applegl_wait_x,
1176849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   DRI_glXUseXFont,
1186849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   NULL, /* bind_tex_image, */
1196849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   NULL, /* release_tex_image, */
120559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston   applegl_get_proc_address,
1216849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg};
1226849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1235d35343d12ab462100c9eec50a579b73463e465aJeremy Huddlestonstruct glx_context *
1246849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_create_context(struct glx_screen *psc,
1257c5f37c032231ad144a8a5c5a0b18f3e26c0aea7Jeremy Huddleston		       struct glx_config *config,
1266849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg		       struct glx_context *shareList, int renderType)
1276849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
1286849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   struct glx_context *gc;
1296849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   int errorcode;
1306849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   bool x11error;
1312ee5272e1671aff8c8d9e0c12bf37ed006717283Jeremy Huddleston   Display *dpy = psc->dpy;
1322ee5272e1671aff8c8d9e0c12bf37ed006717283Jeremy Huddleston   int screen = psc->scr;
1336849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1346849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   /* TODO: Integrate this with apple_glx_create_context and make
1356849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg    * struct apple_glx_context inherit from struct glx_context. */
1366849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1375d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   gc = Xcalloc(1, sizeof (*gc));
1385d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   if (gc == NULL)
1396849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      return NULL;
1406849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1417c5f37c032231ad144a8a5c5a0b18f3e26c0aea7Jeremy Huddleston   if (!glx_context_init(gc, psc, config)) {
1426849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      Xfree(gc);
1436849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      return NULL;
1446849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   }
1456849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1466849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   gc->vtable = &applegl_context_vtable;
1476849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   gc->driContext = NULL;
1486849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1496849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   /* TODO: darwin: Integrate with above to do indirect */
1507c5f37c032231ad144a8a5c5a0b18f3e26c0aea7Jeremy Huddleston   if(apple_glx_create_context(&gc->driContext, dpy, screen, config,
1516849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg			       shareList ? shareList->driContext : NULL,
1526849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg			       &errorcode, &x11error)) {
1536849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      __glXSendError(dpy, errorcode, 0, X_GLXCreateContext, x11error);
1546849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      gc->vtable->destroy(gc);
1556849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      return NULL;
1566849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   }
1576849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1586849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   gc->currentContextTag = -1;
1597c5f37c032231ad144a8a5c5a0b18f3e26c0aea7Jeremy Huddleston   gc->config = config;
1607c5f37c032231ad144a8a5c5a0b18f3e26c0aea7Jeremy Huddleston   gc->isDirect = GL_TRUE;
1616849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   gc->xid = 1; /* Just something not None, so we know when to destroy
1626849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg		 * it in MakeContextCurrent. */
1636849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   return gc;
1656849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
1666849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1675d35343d12ab462100c9eec50a579b73463e465aJeremy Huddlestonstruct glx_screen_vtable applegl_screen_vtable = {
1686849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   applegl_create_context
1696849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg};
1706849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1716849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg_X_HIDDEN struct glx_screen *
1726849916170c0275c13510251a7b217c20f2b993eKristian Høgsbergapplegl_create_screen(int screen, struct glx_display * priv)
1736849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
1746849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   struct glx_screen *psc;
1756849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   psc = Xmalloc(sizeof *psc);
1776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   if (psc == NULL)
1786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg      return NULL;
1796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1806849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   memset(psc, 0, sizeof *psc);
1816849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   glx_screen_init(psc, screen, priv);
1826849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   psc->vtable = &applegl_screen_vtable;
1836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1846849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg   return psc;
1856849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
1866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1876849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg_X_HIDDEN int
1885d35343d12ab462100c9eec50a579b73463e465aJeremy Huddlestonapplegl_create_display(struct glx_display *glx_dpy)
1896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg{
1905d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   if(!apple_init_glx(glx_dpy->dpy))
1915d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston      return 1;
1925d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston
1935d35343d12ab462100c9eec50a579b73463e465aJeremy Huddleston   return GLXBadContext;
1946849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg}
1956849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg
1966849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#endif
197