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