1ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/*
2ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Copyright (c) 2009 Apple Inc.
3ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
4ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Permission is hereby granted, free of charge, to any person
5ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston obtaining a copy of this software and associated documentation files
6ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston (the "Software"), to deal in the Software without restriction,
7ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston including without limitation the rights to use, copy, modify, merge,
8ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston publish, distribute, sublicense, and/or sell copies of the Software,
9ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston and to permit persons to whom the Software is furnished to do so,
10ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston subject to the following conditions:
11ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
12ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston The above copyright notice and this permission notice shall be
13ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston included in all copies or substantial portions of the Software.
14ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
15ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
19ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston DEALINGS IN THE SOFTWARE.
23ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
24ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Except as contained in this notice, the name(s) of the above
25ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston copyright holders shall not be used in advertising or otherwise to
26ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston promote the sale, use or other dealings in this Software without
27ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston prior written authorization.
28ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston*/
29ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
30a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston/* Must be before OpenGL.framework is included.  Remove once fixed:
31a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston * <rdar://problem/7872773>
32a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston */
33a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include <GL/gl.h>
34a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include <GL/glext.h>
35a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#define __gltypes_h_ 1
36a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
37a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston/* Must be first for:
38a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston * <rdar://problem/6953344>
39a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston */
40a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include "apple_glx_context.h"
41a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#include "apple_glx_drawable.h"
42a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
43ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdlib.h>
44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <pthread.h>
45ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <assert.h>
46ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.h"
474c9bab78a118953baf307e31cd53e731299f0151Jeremy Huddleston#include "glxconfig.h"
48ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_cgl.h"
49ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
50a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston/* mesa defines in glew.h, Apple in glext.h.
51a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston * Due to namespace nightmares, just do it here.
52a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston */
53a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#ifndef GL_TEXTURE_RECTANGLE_EXT
54a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
55a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#endif
56a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
57ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic bool pbuffer_make_current(struct apple_glx_context *ac,
58ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                 struct apple_glx_drawable *d);
59ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
60ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic void pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d);
61ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
62ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic struct apple_glx_drawable_callbacks callbacks = {
63ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   .type = APPLE_GLX_DRAWABLE_PBUFFER,
64ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   .make_current = pbuffer_make_current,
65ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   .destroy = pbuffer_destroy
66ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston};
67ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
68ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
69ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* Return true if an error occurred. */
70ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonbool
71ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonpbuffer_make_current(struct apple_glx_context *ac,
72ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                     struct apple_glx_drawable *d)
73ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
74ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
75ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   CGLError cglerr;
76ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
77ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
78ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
79ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   cglerr = apple_cgl.set_pbuffer(ac->context_obj, pbuf->buffer_obj, 0, 0, 0);
80ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
81ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (kCGLNoError != cglerr) {
82ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      fprintf(stderr, "set_pbuffer: %s\n", apple_cgl.error_string(cglerr));
83ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return true;
84ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
85ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
86ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (!ac->made_current) {
879f2abbee6215d89e48b7fe042f8a905997f5c232Jeremy Huddleston      apple_glapi_oglfw_viewport_scissor(0, 0, pbuf->width, pbuf->height);
88ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      ac->made_current = true;
89ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
91ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   apple_glx_diagnostic("made pbuffer drawable 0x%lx current\n", d->drawable);
92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
93ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return false;
94ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
95ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
96ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonvoid
97ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonpbuffer_destroy(Display * dpy, struct apple_glx_drawable *d)
98ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
99ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
100ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
101ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
102ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
103ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   apple_glx_diagnostic("destroying pbuffer for drawable 0x%lx\n",
104ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                        d->drawable);
105ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
106ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   apple_cgl.destroy_pbuffer(pbuf->buffer_obj);
107ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   XFreePixmap(dpy, pbuf->xid);
108ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
109ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
110ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* Return true if an error occurred. */
111ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonbool
112ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonapple_glx_pbuffer_destroy(Display * dpy, GLXPbuffer pbuf)
113ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
114ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return !apple_glx_drawable_destroy_by_type(dpy, pbuf,
115ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                              APPLE_GLX_DRAWABLE_PBUFFER);
116ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
117ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
118ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* Return true if an error occurred. */
119ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonbool
120ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonapple_glx_pbuffer_create(Display * dpy, GLXFBConfig config,
121ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                         int width, int height, int *errorcode,
122ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                         GLXPbuffer * result)
123ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
124ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_drawable *d;
125ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_pbuffer *pbuf = NULL;
126ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   CGLError err;
127ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   Window root;
128ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int screen;
129ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   Pixmap xid;
130bb621cb61e0c6d7fcd06df5a77c75efe5c76926dJeremy Huddleston   struct glx_config *modes = (struct glx_config *) config;
131ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
132ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   root = DefaultRootWindow(dpy);
133ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   screen = DefaultScreen(dpy);
134ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
135ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   /*
136ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    * This pixmap is only used for a persistent XID.
137ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    * The XC-MISC extension cleans up XIDs and reuses them transparently,
138ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    * so we need to retain a server-side reference.
139ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    */
140ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   xid = XCreatePixmap(dpy, root, (unsigned int) 1,
141ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                       (unsigned int) 1, DefaultDepth(dpy, screen));
142ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
143ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (None == xid) {
144ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *errorcode = BadAlloc;
145ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return true;
146ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
147ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
148ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (apple_glx_drawable_create(dpy, screen, xid, &d, &callbacks)) {
149ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *errorcode = BadAlloc;
150ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return true;
151ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
152ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
153ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   /* The lock is held in d from create onward. */
154ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   pbuf = &d->types.pbuffer;
155ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
156ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   pbuf->xid = xid;
157ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   pbuf->width = width;
158ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   pbuf->height = height;
159ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
160ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   err = apple_cgl.create_pbuffer(width, height, GL_TEXTURE_RECTANGLE_EXT,
161ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                  (modes->alphaBits > 0) ? GL_RGBA : GL_RGB,
162ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                  0, &pbuf->buffer_obj);
163ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
164ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (kCGLNoError != err) {
165ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      d->unlock(d);
166ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      d->destroy(d);
167ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *errorcode = BadMatch;
168ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return true;
169ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
170ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
171ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   pbuf->fbconfigID = modes->fbconfigID;
172ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
173ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   pbuf->event_mask = 0;
174ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
175ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   *result = pbuf->xid;
176ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
177ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   d->unlock(d);
178ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
179ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return false;
180ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
181ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
182ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
183ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
184ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* Return true if an error occurred. */
185ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic bool
186ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonget_max_size(int *widthresult, int *heightresult)
187ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
188ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   CGLContextObj oldcontext;
189ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   GLint ar[2];
190ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
191ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   oldcontext = apple_cgl.get_current_context();
192ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
193ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (!oldcontext) {
194ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      /*
195ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston       * There is no current context, so we need to make one in order
196ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston       * to call glGetInteger.
197ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston       */
198ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      CGLPixelFormatObj pfobj;
199ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      CGLError err;
200ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      CGLPixelFormatAttribute attr[10];
201ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      int c = 0;
202ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      GLint vsref = 0;
203ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      CGLContextObj newcontext;
204ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
205ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[c++] = kCGLPFAColorSize;
206ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[c++] = 32;
207ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[c++] = 0;
208ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
209ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      err = apple_cgl.choose_pixel_format(attr, &pfobj, &vsref);
210ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      if (kCGLNoError != err) {
211ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         if (getenv("LIBGL_DIAGNOSTIC")) {
212ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            printf("choose_pixel_format error in %s: %s\n", __func__,
213ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                   apple_cgl.error_string(err));
214ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         }
215ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
216ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         return true;
217ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
218ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
219ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
220ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      err = apple_cgl.create_context(pfobj, NULL, &newcontext);
221ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
222ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      if (kCGLNoError != err) {
223ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         if (getenv("LIBGL_DIAGNOSTIC")) {
224ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            printf("create_context error in %s: %s\n", __func__,
225ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                   apple_cgl.error_string(err));
226ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         }
227ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
228ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         apple_cgl.destroy_pixel_format(pfobj);
229ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
230ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         return true;
231ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
232ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
233ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      err = apple_cgl.set_current_context(newcontext);
234ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
235ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      if (kCGLNoError != err) {
236ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         printf("set_current_context error in %s: %s\n", __func__,
237ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                apple_cgl.error_string(err));
238ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         return true;
239ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
240ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
241ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
242ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
243ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
244ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      apple_cgl.set_current_context(oldcontext);
245ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      apple_cgl.destroy_context(newcontext);
246ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      apple_cgl.destroy_pixel_format(pfobj);
247ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
248ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else {
249ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      /* We have a valid context. */
250ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
251ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
252ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
253ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
254ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   *widthresult = ar[0];
255ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   *heightresult = ar[1];
256ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
257ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return false;
258ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
259ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
260ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonbool
261ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonapple_glx_pbuffer_query(GLXPbuffer p, int attr, unsigned int *value)
262ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
263ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   bool result = false;
264ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_drawable *d;
265ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_pbuffer *pbuf;
266ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
267ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   d = apple_glx_drawable_find_by_type(p, APPLE_GLX_DRAWABLE_PBUFFER,
268ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                       APPLE_GLX_DRAWABLE_LOCK);
269ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
270ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (d) {
271ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      pbuf = &d->types.pbuffer;
272ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
273ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      switch (attr) {
274ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_WIDTH:
275ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         *value = pbuf->width;
276ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         result = true;
277ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
278ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
279ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_HEIGHT:
280ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         *value = pbuf->height;
281ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         result = true;
282ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
283ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
284ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_PRESERVED_CONTENTS:
285ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         *value = true;
286ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         result = true;
287ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
288ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
289ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_LARGEST_PBUFFER:{
290ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            int width, height;
291ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            if (get_max_size(&width, &height)) {
292ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston               fprintf(stderr, "internal error: "
293ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                       "unable to find the largest pbuffer!\n");
294ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            }
295ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            else {
296ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston               *value = width;
297ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston               result = true;
298ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston            }
299ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         }
300ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
301ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
302ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_FBCONFIG_ID:
303ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         *value = pbuf->fbconfigID;
304ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         result = true;
305ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         break;
306ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      }
307ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
308ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      d->unlock(d);
309ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
310ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
311ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return result;
312ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
313ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
314ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonbool
315ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonapple_glx_pbuffer_set_event_mask(GLXDrawable drawable, unsigned long mask)
316ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
317ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_drawable *d;
318ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   bool result = false;
319ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
320ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
321ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                       APPLE_GLX_DRAWABLE_LOCK);
322ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
323ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (d) {
324ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      d->types.pbuffer.event_mask = mask;
325ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      result = true;
326ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      d->unlock(d);
327ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
328ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
329ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return result;
330ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
331ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
332ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonbool
333ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonapple_glx_pbuffer_get_event_mask(GLXDrawable drawable, unsigned long *mask)
334ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
335ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   struct apple_glx_drawable *d;
336ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   bool result = false;
337ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
338ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
339ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                                       APPLE_GLX_DRAWABLE_LOCK);
340ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (d) {
341ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *mask = d->types.pbuffer.event_mask;
342ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      result = true;
343ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      d->unlock(d);
344ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
345ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
346ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return result;
347ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
348