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