apple_glx_pbuffer.c revision 69ea4e7718efb60b6b0d795a355cebd6712ceac1
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Copyright (c) 2009 Apple Inc.
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Permission is hereby granted, free of charge, to any person
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) obtaining a copy of this software and associated documentation files
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (the "Software"), to deal in the Software without restriction,
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch including without limitation the rights to use, copy, modify, merge,
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch publish, distribute, sublicense, and/or sell copies of the Software,
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) and to permit persons to whom the Software is furnished to do so,
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) subject to the following conditions:
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) The above copyright notice and this permission notice shall be
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) included in all copies or substantial portions of the Software.
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DEALINGS IN THE SOFTWARE.
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Except as contained in this notice, the name(s) of the above
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) copyright holders shall not be used in advertising or otherwise to
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) promote the sale, use or other dealings in this Software without
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) prior written authorization.
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)*/
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <stdlib.h>
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <pthread.h>
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <assert.h>
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <GL/glew.h>
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "apple_glx.h"
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "glcontextmodes.h"
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "apple_glx_context.h"
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "apple_glx_drawable.h"
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "apple_cgl.h"
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static bool pbuffer_make_current(struct apple_glx_context *ac,
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                 struct apple_glx_drawable *d);
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d);
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static struct apple_glx_drawable_callbacks callbacks = {
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   .type = APPLE_GLX_DRAWABLE_PBUFFER,
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   .make_current = pbuffer_make_current,
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   .destroy = pbuffer_destroy
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Return true if an error occurred. */
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)pbuffer_make_current(struct apple_glx_context *ac,
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                     struct apple_glx_drawable *d)
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles){
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)   struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)   CGLError cglerr;
59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   cglerr = apple_cgl.set_pbuffer(ac->context_obj, pbuf->buffer_obj, 0, 0, 0);
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   if (kCGLNoError != cglerr) {
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      fprintf(stderr, "set_pbuffer: %s\n", apple_cgl.error_string(cglerr));
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return true;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   }
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   if (!ac->made_current) {
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      glViewport(0, 0, pbuf->width, pbuf->height);
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      glScissor(0, 0, pbuf->width, pbuf->height);
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ac->made_current = true;
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   }
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   apple_glx_diagnostic("made pbuffer drawable 0x%lx current\n", d->drawable);
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   return false;
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d)
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   apple_glx_diagnostic("destroying pbuffer for drawable 0x%lx\n",
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        d->drawable);
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   apple_cgl.destroy_pbuffer(pbuf->buffer_obj);
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   XFreePixmap(dpy, pbuf->xid);
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Return true if an error occurred. */
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)apple_glx_pbuffer_destroy(Display * dpy, GLXPbuffer pbuf)
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   return !apple_glx_drawable_destroy_by_type(dpy, pbuf,
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                              APPLE_GLX_DRAWABLE_PBUFFER);
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Return true if an error occurred. */
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)apple_glx_pbuffer_create(Display * dpy, GLXFBConfig config,
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         int width, int height, int *errorcode,
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         GLXPbuffer * result)
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch{
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   struct apple_glx_drawable *d;
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   struct apple_glx_pbuffer *pbuf = NULL;
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   CGLError err;
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   Window root;
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   int screen;
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   Pixmap xid;
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   __GLcontextModes *modes = (__GLcontextModes *) config;
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   root = DefaultRootWindow(dpy);
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   screen = DefaultScreen(dpy);
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   /*
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    * This pixmap is only used for a persistent XID.
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    * The XC-MISC extension cleans up XIDs and reuses them transparently,
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    * so we need to retain a server-side reference.
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    */
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   xid = XCreatePixmap(dpy, root, (unsigned int) 1,
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       (unsigned int) 1, DefaultDepth(dpy, screen));
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   if (None == xid) {
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      *errorcode = BadAlloc;
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return true;
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   }
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   if (apple_glx_drawable_create(dpy, screen, xid, &d, &callbacks)) {
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *errorcode = BadAlloc;
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return true;
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   }
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   /* The lock is held in d from create onward. */
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)   pbuf = &d->types.pbuffer;
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)   pbuf->xid = xid;
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   pbuf->width = width;
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   pbuf->height = height;
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)   err = apple_cgl.create_pbuffer(width, height, GL_TEXTURE_RECTANGLE_EXT,
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  (modes->alphaBits > 0) ? GL_RGBA : GL_RGB,
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  0, &pbuf->buffer_obj);
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   if (kCGLNoError != err) {
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      d->unlock(d);
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      d->destroy(d);
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      *errorcode = BadMatch;
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return true;
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   }
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   pbuf->fbconfigID = modes->fbconfigID;
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   pbuf->event_mask = 0;
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   *result = pbuf->xid;
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   d->unlock(d);
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   return false;
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Return true if an error occurred. */
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static bool
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)get_max_size(int *widthresult, int *heightresult)
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch{
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   CGLContextObj oldcontext;
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   GLint ar[2];
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   oldcontext = apple_cgl.get_current_context();
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   if (!oldcontext) {
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      /*
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       * There is no current context, so we need to make one in order
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       * to call glGetInteger.
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       */
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CGLPixelFormatObj pfobj;
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CGLError err;
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CGLPixelFormatAttribute attr[10];
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      int c = 0;
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GLint vsref = 0;
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CGLContextObj newcontext;
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      attr[c++] = kCGLPFAColorSize;
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      attr[c++] = 32;
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      attr[c++] = 0;
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      err = apple_cgl.choose_pixel_format(attr, &pfobj, &vsref);
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (kCGLNoError != err) {
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         if (getenv("LIBGL_DIAGNOSTIC")) {
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            printf("choose_pixel_format error in %s: %s\n", __func__,
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   apple_cgl.error_string(err));
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         }
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         return true;
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      err = apple_cgl.create_context(pfobj, NULL, &newcontext);
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (kCGLNoError != err) {
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         if (getenv("LIBGL_DIAGNOSTIC")) {
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            printf("create_context error in %s: %s\n", __func__,
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   apple_cgl.error_string(err));
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         }
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         apple_cgl.destroy_pixel_format(pfobj);
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)         return true;
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      err = apple_cgl.set_current_context(newcontext);
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (kCGLNoError != err) {
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         printf("set_current_context error in %s: %s\n", __func__,
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                apple_cgl.error_string(err));
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         return true;
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      apple_cgl.set_current_context(oldcontext);
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      apple_cgl.destroy_context(newcontext);
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      apple_cgl.destroy_pixel_format(pfobj);
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   }
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   else {
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      /* We have a valid context. */
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   }
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   *widthresult = ar[0];
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   *heightresult = ar[1];
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   return false;
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)apple_glx_pbuffer_query(GLXPbuffer p, int attr, unsigned int *value)
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   bool result = false;
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   struct apple_glx_drawable *d;
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   struct apple_glx_pbuffer *pbuf;
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)   d = apple_glx_drawable_find_by_type(p, APPLE_GLX_DRAWABLE_PBUFFER,
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       APPLE_GLX_DRAWABLE_LOCK);
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   if (d) {
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      pbuf = &d->types.pbuffer;
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      switch (attr) {
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      case GLX_WIDTH:
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         *value = pbuf->width;
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         result = true;
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         break;
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      case GLX_HEIGHT:
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         *value = pbuf->height;
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         result = true;
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         break;
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      case GLX_PRESERVED_CONTENTS:
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         *value = true;
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         result = true;
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         break;
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      case GLX_LARGEST_PBUFFER:{
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            int width, height;
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            if (get_max_size(&width, &height)) {
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               fprintf(stderr, "internal error: "
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       "unable to find the largest pbuffer!\n");
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            }
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            else {
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               *value = width;
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               result = true;
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            }
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         }
284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         break;
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      case GLX_FBCONFIG_ID:
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         *value = pbuf->fbconfigID;
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         result = true;
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         break;
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      d->unlock(d);
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   }
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch   return result;
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)apple_glx_pbuffer_set_event_mask(GLXDrawable drawable, unsigned long mask)
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   struct apple_glx_drawable *d;
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   bool result = false;
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       APPLE_GLX_DRAWABLE_LOCK);
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   if (d) {
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      d->types.pbuffer.event_mask = mask;
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      result = true;
310      d->unlock(d);
311   }
312
313   return result;
314}
315
316bool
317apple_glx_pbuffer_get_event_mask(GLXDrawable drawable, unsigned long *mask)
318{
319   struct apple_glx_drawable *d;
320   bool result = false;
321
322   d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
323                                       APPLE_GLX_DRAWABLE_LOCK);
324   if (d) {
325      *mask = d->types.pbuffer.event_mask;
326      result = true;
327      d->unlock(d);
328   }
329
330   return result;
331}
332