applegl_glx.c revision 5d35343d12ab462100c9eec50a579b73463e465a
14b6829f0d28990dd645e16386eb226d0f10c8731shiqian/* 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Copyright © 2010 Intel Corporation 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Copyright © 2011 Apple Inc. 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian * 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Permission is hereby granted, free of charge, to any person obtaining a 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian * copy of this software and associated documentation files (the "Soft- 74b6829f0d28990dd645e16386eb226d0f10c8731shiqian * ware"), to deal in the Software without restriction, including without 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian * limitation the rights to use, copy, modify, merge, publish, distribute, 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian * and/or sell copies of the Software, and to permit persons to whom the 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Software is furnished to do so, provided that the above copyright 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian * notice(s) and this permission notice appear in all copies of the Soft- 124b6829f0d28990dd645e16386eb226d0f10c8731shiqian * ware and that both the above copyright notice(s) and this permission 134b6829f0d28990dd645e16386eb226d0f10c8731shiqian * notice appear in supporting documentation. 144b6829f0d28990dd645e16386eb226d0f10c8731shiqian * 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 164b6829f0d28990dd645e16386eb226d0f10c8731shiqian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE- 204b6829f0d28990dd645e16386eb226d0f10c8731shiqian * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR- 234b6829f0d28990dd645e16386eb226d0f10c8731shiqian * MANCE OF THIS SOFTWARE. 244b6829f0d28990dd645e16386eb226d0f10c8731shiqian * 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Except as contained in this notice, the name of a copyright holder shall 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian * not be used in advertising or otherwise to promote the sale, use or 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian * other dealings in this Software without prior written authorization of 284b6829f0d28990dd645e16386eb226d0f10c8731shiqian * the copyright holder. 294b6829f0d28990dd645e16386eb226d0f10c8731shiqian * 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Authors: 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian * Kristian Høgsberg (krh@bitplanet.net) 324b6829f0d28990dd645e16386eb226d0f10c8731shiqian */ 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 344b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if defined(GLX_USE_APPLEGL) 354b6829f0d28990dd645e16386eb226d0f10c8731shiqian 364b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <stdbool.h> 374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 384b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "glxclient.h" 394b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "apple_glx_context.h" 404b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "apple_glx.h" 414b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "glx_error.h" 424b6829f0d28990dd645e16386eb226d0f10c8731shiqian 434b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic void 444b6829f0d28990dd645e16386eb226d0f10c8731shiqianapplegl_destroy_context(struct glx_context *gc) 454b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 464b6829f0d28990dd645e16386eb226d0f10c8731shiqian apple_glx_destroy_context(&gc->driContext, gc->currentDpy); 474b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 494b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic int 504b6829f0d28990dd645e16386eb226d0f10c8731shiqianapplegl_bind_context(struct glx_context *gc, struct glx_context *old, 514b6829f0d28990dd645e16386eb226d0f10c8731shiqian GLXDrawable draw, GLXDrawable read) 524b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 534b6829f0d28990dd645e16386eb226d0f10c8731shiqian Display *dpy = gc->psc->dpy; 54efa2fc7fd8a71afd54841b780829ce57cc487938zhanyong.wan bool error = apple_glx_make_current_context(dpy, 554b6829f0d28990dd645e16386eb226d0f10c8731shiqian (oldGC && oldGC != &dummyContext) ? oldGC->driContext : NULL 564b6829f0d28990dd645e16386eb226d0f10c8731shiqian gc ? gc->driContext : NULL, draw); 57e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 584b6829f0d28990dd645e16386eb226d0f10c8731shiqian apple_glx_diagnostic("%s: error %s\n", __func__, error ? "YES" : "NO"); 594b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (error) 604b6829f0d28990dd645e16386eb226d0f10c8731shiqian return 1; /* GLXBadContext is the same as Success (0) */ 614b6829f0d28990dd645e16386eb226d0f10c8731shiqian 62f904a612d9444ab36c07a8e619c113432e046f49vladlosev return Success; 634b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 64e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 65e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianstatic void 664b6829f0d28990dd645e16386eb226d0f10c8731shiqianapplegl_unbind_context(struct glx_context *gc, struct glx_context *new) 674b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 684b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 704b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic void 714b6829f0d28990dd645e16386eb226d0f10c8731shiqianapplegl_wait_gl(struct glx_context *gc) 724b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 734b6829f0d28990dd645e16386eb226d0f10c8731shiqian glFinish(); 744b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 754b6829f0d28990dd645e16386eb226d0f10c8731shiqian 764b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic void 774b6829f0d28990dd645e16386eb226d0f10c8731shiqianapplegl_wait_x(struct glx_context *gc) 784b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 794b6829f0d28990dd645e16386eb226d0f10c8731shiqian Display *dpy = gc->psc->dpy; 804b6829f0d28990dd645e16386eb226d0f10c8731shiqian apple_glx_waitx(dpy, gc->driContext); 814b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 834b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic const struct glx_context_vtable applegl_context_vtable = { 844b6829f0d28990dd645e16386eb226d0f10c8731shiqian applegl_destroy_context, 854b6829f0d28990dd645e16386eb226d0f10c8731shiqian applegl_bind_context, 864b6829f0d28990dd645e16386eb226d0f10c8731shiqian applegl_unbind_context, 874b6829f0d28990dd645e16386eb226d0f10c8731shiqian applegl_wait_gl, 884b6829f0d28990dd645e16386eb226d0f10c8731shiqian applegl_wait_x, 890ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan DRI_glXUseXFont, 904b6829f0d28990dd645e16386eb226d0f10c8731shiqian NULL, /* bind_tex_image, */ 910ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan NULL, /* release_tex_image, */ 920ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan}; 930ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 940ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wanstruct glx_context * 950ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wanapplegl_create_context(struct glx_screen *psc, 960ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan struct glx_config *mode, 97b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan struct glx_context *shareList, int renderType) 98b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan{ 990ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan struct glx_context *gc; 1000ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan int errorcode; 101b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan bool x11error; 102b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan Display *dpy; 1030ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 1040ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan /* TODO: Integrate this with apple_glx_create_context and make 1050ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan * struct apple_glx_context inherit from struct glx_context. */ 106b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan 1070ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan gc = Xcalloc(1, sizeof (*gc)); 1080ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan if (gc == NULL) 1090ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan return NULL; 110b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan 1110ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan if (!glx_context_init(gc, psc, mode)) { 1120ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan Xfree(gc); 1130ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan return NULL; 1140ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan } 1150ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 1160ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan dpy = gc->psc->dpy; 1170ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 118b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan gc->vtable = &applegl_context_vtable; 1190ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan gc->driContext = NULL; 1200ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan gc->do_destroy = False; 1210ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 122b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan /* TODO: darwin: Integrate with above to do indirect */ 1230ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan if(apple_glx_create_context(&gc->driContext, dpy, screen, fbconfig, 1240ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan shareList ? shareList->driContext : NULL, 1254b6829f0d28990dd645e16386eb226d0f10c8731shiqian &errorcode, &x11error)) { 1264b6829f0d28990dd645e16386eb226d0f10c8731shiqian __glXSendError(dpy, errorcode, 0, X_GLXCreateContext, x11error); 1274b6829f0d28990dd645e16386eb226d0f10c8731shiqian gc->vtable->destroy(gc); 128e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian return NULL; 1294b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1300ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 1310ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan gc->currentContextTag = -1; 1320ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan gc->mode = fbconfig; 1330ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan gc->isDirect = 1; 134b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan gc->xid = 1; /* Just something not None, so we know when to destroy 135b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan * it in MakeContextCurrent. */ 136b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan 137b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan return gc; 138b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan} 1390ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan 1400ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wanstruct glx_screen_vtable applegl_screen_vtable = { 1410ebc16a68eea644a9f8a718fbdef95112a4a0ff2zhanyong.wan applegl_create_context 1424b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 1434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1444b6829f0d28990dd645e16386eb226d0f10c8731shiqian_X_HIDDEN struct glx_screen * 145b9a1628577f7ab2eb30a656aeff763909770c9c1zhanyong.wanapplegl_create_screen(int screen, struct glx_display * priv) 1464b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian struct glx_screen *psc; 1484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1494b6829f0d28990dd645e16386eb226d0f10c8731shiqian psc = Xmalloc(sizeof *psc); 1504b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (psc == NULL) 1514b6829f0d28990dd645e16386eb226d0f10c8731shiqian return NULL; 1524b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1534b6829f0d28990dd645e16386eb226d0f10c8731shiqian memset(psc, 0, sizeof *psc); 1544b6829f0d28990dd645e16386eb226d0f10c8731shiqian glx_screen_init(psc, screen, priv); 1554b6829f0d28990dd645e16386eb226d0f10c8731shiqian psc->vtable = &applegl_screen_vtable; 1564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1574b6829f0d28990dd645e16386eb226d0f10c8731shiqian return psc; 1584b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1604b6829f0d28990dd645e16386eb226d0f10c8731shiqian_X_HIDDEN int 1614b6829f0d28990dd645e16386eb226d0f10c8731shiqianapplegl_create_display(struct glx_display *glx_dpy) 1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian{ 1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian if(!apple_init_glx(glx_dpy->dpy)) 1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian return 1; 1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian return GLXBadContext; 1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 1684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif 1704b6829f0d28990dd645e16386eb226d0f10c8731shiqian