xref: /aosp_15_r20/external/mesa3d/src/glx/apple/apple_glx.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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