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