2 * Copyright © 2010 Intel Corporation
3 * Copyright © 2011 Apple Inc.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Soft-
7 * ware"), to deal in the Software without restriction, including without
8 * limitation the rights to use, copy, modify, merge, publish, distribute,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, provided that the above copyright
11 * notice(s) and this permission notice appear in all copies of the Soft-
12 * ware and that both the above copyright notice(s) and this permission
13 * notice appear in supporting documentation.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17 * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
18 * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
19 * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
20 * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
22 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
23 * MANCE OF THIS SOFTWARE.
25 * Except as contained in this notice, the name of a copyright holder shall
26 * not be used in advertising or otherwise to promote the sale, use or
27 * other dealings in this Software without prior written authorization of
28 * the copyright holder.
31 * Kristian Høgsberg (krh@bitplanet.net)
34 #if defined(GLX_USE_APPLEGL)
39 #include "glxclient.h"
40 #include "apple/apple_glx_context.h"
41 #include "apple/apple_glx.h"
42 #include "apple/apple_cgl.h"
43 #include "glx_error.h"
46 applegl_destroy_context(struct glx_context
*gc
)
48 apple_glx_destroy_context(&gc
->driContext
, gc
->psc
->dpy
);
52 applegl_bind_context(struct glx_context
*gc
, struct glx_context
*old
,
53 GLXDrawable draw
, GLXDrawable read
)
55 Display
*dpy
= gc
->psc
->dpy
;
56 bool error
= apple_glx_make_current_context(dpy
,
57 (old
&& old
!= &dummyContext
) ? old
->driContext
: NULL
,
58 gc
? gc
->driContext
: NULL
, draw
);
60 apple_glx_diagnostic("%s: error %s\n", __func__
, error
? "YES" : "NO");
62 return 1; /* GLXBadContext is the same as Success (0) */
64 apple_glapi_set_dispatch();
70 applegl_unbind_context(struct glx_context
*gc
, struct glx_context
*new)
75 /* If we don't have a context, then we have nothing to unbind */
79 /* If we have a new context, keep this one around and remove it during bind. */
85 error
= apple_glx_make_current_context(dpy
,
86 (gc
!= &dummyContext
) ? gc
->driContext
: NULL
,
89 apple_glx_diagnostic("%s: error %s\n", __func__
, error
? "YES" : "NO");
93 applegl_wait_gl(struct glx_context
*gc
)
99 applegl_wait_x(struct glx_context
*gc
)
101 Display
*dpy
= gc
->psc
->dpy
;
102 apple_glx_waitx(dpy
, gc
->driContext
);
106 applegl_get_proc_address(const char *symbol
)
108 return dlsym(apple_cgl_get_dl_handle(), symbol
);
111 static const struct glx_context_vtable applegl_context_vtable
= {
112 .destroy
= applegl_destroy_context
,
113 .bind
= applegl_bind_context
,
114 .unbind
= applegl_unbind_context
,
115 .wait_gl
= applegl_wait_gl
,
116 .wait_x
= applegl_wait_x
,
117 .use_x_font
= DRI_glXUseXFont
,
118 .bind_tex_image
= NULL
,
119 .release_tex_image
= NULL
,
120 .get_proc_address
= applegl_get_proc_address
,
124 applegl_create_context(struct glx_screen
*psc
,
125 struct glx_config
*config
,
126 struct glx_context
*shareList
, int renderType
)
128 struct glx_context
*gc
;
131 Display
*dpy
= psc
->dpy
;
132 int screen
= psc
->scr
;
134 /* TODO: Integrate this with apple_glx_create_context and make
135 * struct apple_glx_context inherit from struct glx_context. */
137 gc
= calloc(1, sizeof(*gc
));
141 if (!glx_context_init(gc
, psc
, config
)) {
146 gc
->vtable
= &applegl_context_vtable
;
147 gc
->driContext
= NULL
;
149 /* TODO: darwin: Integrate with above to do indirect */
150 if(apple_glx_create_context(&gc
->driContext
, dpy
, screen
, config
,
151 shareList
? shareList
->driContext
: NULL
,
152 &errorcode
, &x11error
)) {
153 __glXSendError(dpy
, errorcode
, 0, X_GLXCreateContext
, x11error
);
154 gc
->vtable
->destroy(gc
);
158 gc
->currentContextTag
= -1;
160 gc
->isDirect
= GL_TRUE
;
161 gc
->xid
= 1; /* Just something not None, so we know when to destroy
162 * it in MakeContextCurrent. */
167 static const struct glx_screen_vtable applegl_screen_vtable
= {
168 .create_context
= applegl_create_context
,
169 .create_context_attribs
= NULL
,
170 .query_renderer_integer
= NULL
,
171 .query_renderer_string
= NULL
,
174 _X_HIDDEN
struct glx_screen
*
175 applegl_create_screen(int screen
, struct glx_display
* priv
)
177 struct glx_screen
*psc
;
179 psc
= calloc(1, sizeof *psc
);
183 glx_screen_init(psc
, screen
, priv
);
184 psc
->vtable
= &applegl_screen_vtable
;
190 applegl_create_display(struct glx_display
*glx_dpy
)
192 if(!apple_init_glx(glx_dpy
->dpy
))
195 return GLXBadContext
;