apple_glx_pbuffer.c revision bb621cb61e0c6d7fcd06df5a77c75efe5c76926d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (c) 2009 Apple Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Permission is hereby granted, free of charge, to any person
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) obtaining a copy of this software and associated documentation files
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (the "Software"), to deal in the Software without restriction,
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) including without limitation the rights to use, copy, modify, merge,
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) publish, distribute, sublicense, and/or sell copies of the Software,
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) and to permit persons to whom the Software is furnished to do so,
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) subject to the following conditions:
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) The above copyright notice and this permission notice shall be
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) included in all copies or substantial portions of the Software.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DEALINGS IN THE SOFTWARE.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Except as contained in this notice, the name(s) of the above
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copyright holders shall not be used in advertising or otherwise to
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) promote the sale, use or other dealings in this Software without
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prior written authorization.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Must be before OpenGL.framework is included.  Remove once fixed:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * <rdar://problem/7872773>
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GL/gl.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GL/glext.h>
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define __gltypes_h_ 1
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Must be first for:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * <rdar://problem/6953344>
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "apple_glx_context.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "apple_glx_drawable.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdlib.h>
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <pthread.h>
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <assert.h>
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "apple_glx.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "glxconfig.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "apple_cgl.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* mesa defines in glew.h, Apple in glext.h.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Due to namespace nightmares, just do it here.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GL_TEXTURE_RECTANGLE_EXT
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool pbuffer_make_current(struct apple_glx_context *ac,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 struct apple_glx_drawable *d);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static struct apple_glx_drawable_callbacks callbacks = {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   .type = APPLE_GLX_DRAWABLE_PBUFFER,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   .make_current = pbuffer_make_current,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   .destroy = pbuffer_destroy
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Return true if an error occurred. */
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)pbuffer_make_current(struct apple_glx_context *ac,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     struct apple_glx_drawable *d)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   CGLError cglerr;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   cglerr = apple_cgl.set_pbuffer(ac->context_obj, pbuf->buffer_obj, 0, 0, 0);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (kCGLNoError != cglerr) {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fprintf(stderr, "set_pbuffer: %s\n", apple_cgl.error_string(cglerr));
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (!ac->made_current) {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      glViewport(0, 0, pbuf->width, pbuf->height);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      glScissor(0, 0, pbuf->width, pbuf->height);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ac->made_current = true;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   apple_glx_diagnostic("made pbuffer drawable 0x%lx current\n", d->drawable);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return false;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   apple_glx_diagnostic("destroying pbuffer for drawable 0x%lx\n",
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        d->drawable);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   apple_cgl.destroy_pbuffer(pbuf->buffer_obj);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   XFreePixmap(dpy, pbuf->xid);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Return true if an error occurred. */
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)apple_glx_pbuffer_destroy(Display * dpy, GLXPbuffer pbuf)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return !apple_glx_drawable_destroy_by_type(dpy, pbuf,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              APPLE_GLX_DRAWABLE_PBUFFER);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Return true if an error occurred. */
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)apple_glx_pbuffer_create(Display * dpy, GLXFBConfig config,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int width, int height, int *errorcode,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         GLXPbuffer * result)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct apple_glx_drawable *d;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct apple_glx_pbuffer *pbuf = NULL;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   CGLError err;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   Window root;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   int screen;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   Pixmap xid;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct glx_config *modes = (struct glx_config *) config;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   root = DefaultRootWindow(dpy);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   screen = DefaultScreen(dpy);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /*
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * This pixmap is only used for a persistent XID.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * The XC-MISC extension cleans up XIDs and reuses them transparently,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    * so we need to retain a server-side reference.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    */
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   xid = XCreatePixmap(dpy, root, (unsigned int) 1,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       (unsigned int) 1, DefaultDepth(dpy, screen));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (None == xid) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *errorcode = BadAlloc;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (apple_glx_drawable_create(dpy, screen, xid, &d, &callbacks)) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *errorcode = BadAlloc;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* The lock is held in d from create onward. */
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   pbuf = &d->types.pbuffer;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   pbuf->xid = xid;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   pbuf->width = width;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   pbuf->height = height;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   err = apple_cgl.create_pbuffer(width, height, GL_TEXTURE_RECTANGLE_EXT,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  (modes->alphaBits > 0) ? GL_RGBA : GL_RGB,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  0, &pbuf->buffer_obj);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (kCGLNoError != err) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      d->unlock(d);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      d->destroy(d);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *errorcode = BadMatch;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   pbuf->fbconfigID = modes->fbconfigID;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   pbuf->event_mask = 0;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *result = pbuf->xid;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   d->unlock(d);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return false;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Return true if an error occurred. */
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)get_max_size(int *widthresult, int *heightresult)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   CGLContextObj oldcontext;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   GLint ar[2];
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   oldcontext = apple_cgl.get_current_context();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (!oldcontext) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      /*
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       * There is no current context, so we need to make one in order
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       * to call glGetInteger.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       */
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CGLPixelFormatObj pfobj;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CGLError err;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CGLPixelFormatAttribute attr[10];
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int c = 0;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint vsref = 0;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CGLContextObj newcontext;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      attr[c++] = kCGLPFAColorSize;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      attr[c++] = 32;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      attr[c++] = 0;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      err = apple_cgl.choose_pixel_format(attr, &pfobj, &vsref);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (kCGLNoError != err) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         if (getenv("LIBGL_DIAGNOSTIC")) {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            printf("choose_pixel_format error in %s: %s\n", __func__,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   apple_cgl.error_string(err));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217         return true;
218      }
219
220
221      err = apple_cgl.create_context(pfobj, NULL, &newcontext);
222
223      if (kCGLNoError != err) {
224         if (getenv("LIBGL_DIAGNOSTIC")) {
225            printf("create_context error in %s: %s\n", __func__,
226                   apple_cgl.error_string(err));
227         }
228
229         apple_cgl.destroy_pixel_format(pfobj);
230
231         return true;
232      }
233
234      err = apple_cgl.set_current_context(newcontext);
235
236      if (kCGLNoError != err) {
237         printf("set_current_context error in %s: %s\n", __func__,
238                apple_cgl.error_string(err));
239         return true;
240      }
241
242
243      glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
244
245      apple_cgl.set_current_context(oldcontext);
246      apple_cgl.destroy_context(newcontext);
247      apple_cgl.destroy_pixel_format(pfobj);
248   }
249   else {
250      /* We have a valid context. */
251
252      glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
253   }
254
255   *widthresult = ar[0];
256   *heightresult = ar[1];
257
258   return false;
259}
260
261bool
262apple_glx_pbuffer_query(GLXPbuffer p, int attr, unsigned int *value)
263{
264   bool result = false;
265   struct apple_glx_drawable *d;
266   struct apple_glx_pbuffer *pbuf;
267
268   d = apple_glx_drawable_find_by_type(p, APPLE_GLX_DRAWABLE_PBUFFER,
269                                       APPLE_GLX_DRAWABLE_LOCK);
270
271   if (d) {
272      pbuf = &d->types.pbuffer;
273
274      switch (attr) {
275      case GLX_WIDTH:
276         *value = pbuf->width;
277         result = true;
278         break;
279
280      case GLX_HEIGHT:
281         *value = pbuf->height;
282         result = true;
283         break;
284
285      case GLX_PRESERVED_CONTENTS:
286         *value = true;
287         result = true;
288         break;
289
290      case GLX_LARGEST_PBUFFER:{
291            int width, height;
292            if (get_max_size(&width, &height)) {
293               fprintf(stderr, "internal error: "
294                       "unable to find the largest pbuffer!\n");
295            }
296            else {
297               *value = width;
298               result = true;
299            }
300         }
301         break;
302
303      case GLX_FBCONFIG_ID:
304         *value = pbuf->fbconfigID;
305         result = true;
306         break;
307      }
308
309      d->unlock(d);
310   }
311
312   return result;
313}
314
315bool
316apple_glx_pbuffer_set_event_mask(GLXDrawable drawable, unsigned long mask)
317{
318   struct apple_glx_drawable *d;
319   bool result = false;
320
321   d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
322                                       APPLE_GLX_DRAWABLE_LOCK);
323
324   if (d) {
325      d->types.pbuffer.event_mask = mask;
326      result = true;
327      d->unlock(d);
328   }
329
330   return result;
331}
332
333bool
334apple_glx_pbuffer_get_event_mask(GLXDrawable drawable, unsigned long *mask)
335{
336   struct apple_glx_drawable *d;
337   bool result = false;
338
339   d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
340                                       APPLE_GLX_DRAWABLE_LOCK);
341   if (d) {
342      *mask = d->types.pbuffer.event_mask;
343      result = true;
344      d->unlock(d);
345   }
346
347   return result;
348}
349