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