Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | /* |
2 | * Copyright © 2010 Intel Corporation |
||
3 | * Copyright © 2011 Apple Inc. |
||
4 | * |
||
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. |
||
14 | * |
||
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. |
||
24 | * |
||
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. |
||
29 | * |
||
30 | * Authors: |
||
31 | * Kristian Høgsberg (krh@bitplanet.net) |
||
32 | */ |
||
33 | |||
34 | #if defined(GLX_USE_APPLEGL) |
||
35 | |||
36 | #include |
||
37 | #include |
||
38 | |||
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" |
||
44 | |||
45 | static void |
||
46 | applegl_destroy_context(struct glx_context *gc) |
||
47 | { |
||
48 | apple_glx_destroy_context(&gc->driContext, gc->psc->dpy); |
||
49 | } |
||
50 | |||
51 | static int |
||
52 | applegl_bind_context(struct glx_context *gc, struct glx_context *old, |
||
53 | GLXDrawable draw, GLXDrawable read) |
||
54 | { |
||
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); |
||
59 | |||
60 | apple_glx_diagnostic("%s: error %s\n", __func__, error ? "YES" : "NO"); |
||
61 | if (error) |
||
62 | return 1; /* GLXBadContext is the same as Success (0) */ |
||
63 | |||
64 | apple_glapi_set_dispatch(); |
||
65 | |||
66 | return Success; |
||
67 | } |
||
68 | |||
69 | static void |
||
70 | applegl_unbind_context(struct glx_context *gc, struct glx_context *new) |
||
71 | { |
||
72 | Display *dpy; |
||
73 | bool error; |
||
74 | |||
75 | /* If we don't have a context, then we have nothing to unbind */ |
||
76 | if (!gc) |
||
77 | return; |
||
78 | |||
79 | /* If we have a new context, keep this one around and remove it during bind. */ |
||
80 | if (new) |
||
81 | return; |
||
82 | |||
83 | dpy = gc->psc->dpy; |
||
84 | |||
85 | error = apple_glx_make_current_context(dpy, |
||
86 | (gc != &dummyContext) ? gc->driContext : NULL, |
||
87 | NULL, None); |
||
88 | |||
89 | apple_glx_diagnostic("%s: error %s\n", __func__, error ? "YES" : "NO"); |
||
90 | } |
||
91 | |||
92 | static void |
||
93 | applegl_wait_gl(struct glx_context *gc) |
||
94 | { |
||
95 | glFinish(); |
||
96 | } |
||
97 | |||
98 | static void |
||
99 | applegl_wait_x(struct glx_context *gc) |
||
100 | { |
||
101 | Display *dpy = gc->psc->dpy; |
||
102 | apple_glx_waitx(dpy, gc->driContext); |
||
103 | } |
||
104 | |||
105 | static void * |
||
106 | applegl_get_proc_address(const char *symbol) |
||
107 | { |
||
108 | return dlsym(apple_cgl_get_dl_handle(), symbol); |
||
109 | } |
||
110 | |||
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, |
||
121 | }; |
||
122 | |||
123 | struct glx_context * |
||
124 | applegl_create_context(struct glx_screen *psc, |
||
125 | struct glx_config *config, |
||
126 | struct glx_context *shareList, int renderType) |
||
127 | { |
||
128 | struct glx_context *gc; |
||
129 | int errorcode; |
||
130 | bool x11error; |
||
131 | Display *dpy = psc->dpy; |
||
132 | int screen = psc->scr; |
||
133 | |||
134 | /* TODO: Integrate this with apple_glx_create_context and make |
||
135 | * struct apple_glx_context inherit from struct glx_context. */ |
||
136 | |||
137 | gc = calloc(1, sizeof(*gc)); |
||
138 | if (gc == NULL) |
||
139 | return NULL; |
||
140 | |||
141 | if (!glx_context_init(gc, psc, config)) { |
||
142 | free(gc); |
||
143 | return NULL; |
||
144 | } |
||
145 | |||
146 | gc->vtable = &applegl_context_vtable; |
||
147 | gc->driContext = NULL; |
||
148 | |||
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); |
||
155 | return NULL; |
||
156 | } |
||
157 | |||
158 | gc->currentContextTag = -1; |
||
159 | gc->config = config; |
||
160 | gc->isDirect = GL_TRUE; |
||
161 | gc->xid = 1; /* Just something not None, so we know when to destroy |
||
162 | * it in MakeContextCurrent. */ |
||
163 | |||
164 | return gc; |
||
165 | } |
||
166 | |||
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, |
||
172 | }; |
||
173 | |||
174 | _X_HIDDEN struct glx_screen * |
||
175 | applegl_create_screen(int screen, struct glx_display * priv) |
||
176 | { |
||
177 | struct glx_screen *psc; |
||
178 | |||
179 | psc = calloc(1, sizeof *psc); |
||
180 | if (psc == NULL) |
||
181 | return NULL; |
||
182 | |||
183 | glx_screen_init(psc, screen, priv); |
||
184 | psc->vtable = &applegl_screen_vtable; |
||
185 | |||
186 | return psc; |
||
187 | } |
||
188 | |||
189 | _X_HIDDEN int |
||
190 | applegl_create_display(struct glx_display *glx_dpy) |
||
191 | { |
||
192 | if(!apple_init_glx(glx_dpy->dpy)) |
||
193 | return 1; |
||
194 | |||
195 | return GLXBadContext; |
||
196 | } |
||
197 | |||
198 | #endif |