1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker Copyright (c) 2008, 2009 Apple Inc.
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person
5*61046927SAndroid Build Coastguard Worker obtaining a copy of this software and associated documentation files
6*61046927SAndroid Build Coastguard Worker (the "Software"), to deal in the Software without restriction,
7*61046927SAndroid Build Coastguard Worker including without limitation the rights to use, copy, modify, merge,
8*61046927SAndroid Build Coastguard Worker publish, distribute, sublicense, and/or sell copies of the Software,
9*61046927SAndroid Build Coastguard Worker and to permit persons to whom the Software is furnished to do so,
10*61046927SAndroid Build Coastguard Worker subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be
13*61046927SAndroid Build Coastguard Worker included in all copies or substantial portions of the Software.
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*61046927SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*61046927SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*61046927SAndroid Build Coastguard Worker NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
19*61046927SAndroid Build Coastguard Worker HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20*61046927SAndroid Build Coastguard Worker WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*61046927SAndroid Build Coastguard Worker OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22*61046927SAndroid Build Coastguard Worker DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker Except as contained in this notice, the name(s) of the above
25*61046927SAndroid Build Coastguard Worker copyright holders shall not be used in advertising or otherwise to
26*61046927SAndroid Build Coastguard Worker promote the sale, use or other dealings in this Software without
27*61046927SAndroid Build Coastguard Worker prior written authorization.
28*61046927SAndroid Build Coastguard Worker */
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #include <stdio.h>
31*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
32*61046927SAndroid Build Coastguard Worker #include <string.h>
33*61046927SAndroid Build Coastguard Worker #include <assert.h>
34*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
35*61046927SAndroid Build Coastguard Worker #include <dlfcn.h>
36*61046927SAndroid Build Coastguard Worker #include <pthread.h>
37*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
38*61046927SAndroid Build Coastguard Worker #include "appledri.h"
39*61046927SAndroid Build Coastguard Worker #include "apple_glx.h"
40*61046927SAndroid Build Coastguard Worker #include "apple_glx_context.h"
41*61046927SAndroid Build Coastguard Worker #include "apple_cgl.h"
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker static bool initialized = false;
44*61046927SAndroid Build Coastguard Worker static int dri_event_base = 0;
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker int
apple_get_dri_event_base(void)47*61046927SAndroid Build Coastguard Worker apple_get_dri_event_base(void)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker if (!initialized) {
50*61046927SAndroid Build Coastguard Worker fprintf(stderr,
51*61046927SAndroid Build Coastguard Worker "error: dri_event_base called before apple_init_glx!\n");
52*61046927SAndroid Build Coastguard Worker abort();
53*61046927SAndroid Build Coastguard Worker }
54*61046927SAndroid Build Coastguard Worker return dri_event_base;
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker static void
surface_notify_handler(Display * dpy,unsigned int uid,int kind)58*61046927SAndroid Build Coastguard Worker surface_notify_handler(Display * dpy, unsigned int uid, int kind)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker switch (kind) {
62*61046927SAndroid Build Coastguard Worker case AppleDRISurfaceNotifyDestroyed:
63*61046927SAndroid Build Coastguard Worker apple_glx_diagnostic("%s: surface destroyed %u\n", __func__, uid);
64*61046927SAndroid Build Coastguard Worker apple_glx_surface_destroy(uid);
65*61046927SAndroid Build Coastguard Worker break;
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker case AppleDRISurfaceNotifyChanged:{
68*61046927SAndroid Build Coastguard Worker int updated;
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker updated = apple_glx_context_surface_changed(uid, pthread_self());
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker apple_glx_diagnostic("surface notify updated %d\n", updated);
73*61046927SAndroid Build Coastguard Worker }
74*61046927SAndroid Build Coastguard Worker break;
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker default:
77*61046927SAndroid Build Coastguard Worker fprintf(stderr, "unhandled kind of event: %d in %s\n", kind, __func__);
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker xp_client_id
apple_glx_get_client_id(void)82*61046927SAndroid Build Coastguard Worker apple_glx_get_client_id(void)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker static xp_client_id id;
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker if (0 == id) {
87*61046927SAndroid Build Coastguard Worker if ((XP_Success != xp_init(XP_IN_BACKGROUND)) ||
88*61046927SAndroid Build Coastguard Worker (Success != xp_get_client_id(&id))) {
89*61046927SAndroid Build Coastguard Worker return 0;
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker return id;
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker /* Return true if an error occurred. */
97*61046927SAndroid Build Coastguard Worker bool
apple_init_glx(Display * dpy)98*61046927SAndroid Build Coastguard Worker apple_init_glx(Display * dpy)
99*61046927SAndroid Build Coastguard Worker {
100*61046927SAndroid Build Coastguard Worker int eventBase, errorBase;
101*61046927SAndroid Build Coastguard Worker int major, minor, patch;
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker if (!XAppleDRIQueryExtension(dpy, &eventBase, &errorBase))
104*61046927SAndroid Build Coastguard Worker return true;
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker if (!XAppleDRIQueryVersion(dpy, &major, &minor, &patch))
107*61046927SAndroid Build Coastguard Worker return true;
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker if (initialized)
110*61046927SAndroid Build Coastguard Worker return false;
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker apple_glx_log_init();
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker apple_glx_log(ASL_LEVEL_INFO, "Initializing libGL.");
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker apple_cgl_init();
117*61046927SAndroid Build Coastguard Worker (void) apple_glx_get_client_id();
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker XAppleDRISetSurfaceNotifyHandler(surface_notify_handler);
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker /* This should really be per display. */
122*61046927SAndroid Build Coastguard Worker dri_event_base = eventBase;
123*61046927SAndroid Build Coastguard Worker initialized = true;
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker return false;
126*61046927SAndroid Build Coastguard Worker }
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker void
apple_glx_swap_buffers(void * ptr)129*61046927SAndroid Build Coastguard Worker apple_glx_swap_buffers(void *ptr)
130*61046927SAndroid Build Coastguard Worker {
131*61046927SAndroid Build Coastguard Worker struct apple_glx_context *ac = ptr;
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker apple_cgl.flush_drawable(ac->context_obj);
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker void
apple_glx_waitx(Display * dpy,void * ptr)137*61046927SAndroid Build Coastguard Worker apple_glx_waitx(Display * dpy, void *ptr)
138*61046927SAndroid Build Coastguard Worker {
139*61046927SAndroid Build Coastguard Worker struct apple_private_context *ac = ptr;
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker (void) ac;
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker glFlush();
144*61046927SAndroid Build Coastguard Worker glFinish();
145*61046927SAndroid Build Coastguard Worker XSync(dpy, False);
146*61046927SAndroid Build Coastguard Worker }
147