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