1ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 2ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Copyright (c) 2008, 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 30ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdbool.h> 31ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdio.h> 32ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdlib.h> 33ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <assert.h> 34ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <GL/gl.h> 35a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston 36a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston/* <rdar://problem/6953344> */ 37a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#define glTexImage1D glTexImage1D_OSX 38a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#define glTexImage2D glTexImage2D_OSX 39a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#define glTexImage3D glTexImage3D_OSX 40ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <OpenGL/OpenGL.h> 41ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <OpenGL/CGLContext.h> 42ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <OpenGL/CGLRenderers.h> 439a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#include <OpenGL/CGLTypes.h> 44a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#undef glTexImage1D 45a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#undef glTexImage2D 46a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#undef glTexImage3D 47a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston 489a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#ifndef kCGLPFAOpenGLProfile 499a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#define kCGLPFAOpenGLProfile 99 509a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#endif 519a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston 529a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#ifndef kCGLOGLPVersion_3_2_Core 539a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#define kCGLOGLPVersion_3_2_Core 0x3200 549a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston#endif 559a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston 56ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_cgl.h" 57ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_visual.h" 58ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.h" 594c9bab78a118953baf307e31cd53e731299f0151Jeremy Huddleston#include "glxconfig.h" 60ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 61ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonenum 62ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 63ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston MAX_ATTR = 60 64ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}; 65ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 66ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonvoid 6702b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddlestonapple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const struct glx_config * mode, 68ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston bool * double_buffered, bool * uses_stereo, 69ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston bool offscreen) 70ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 71ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston CGLPixelFormatAttribute attr[MAX_ATTR]; 72ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int numattr = 0; 73ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GLint vsref = 0; 74ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston CGLError error = 0; 75ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 769a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston /* Request an OpenGL 3.2 profile if one is available */ 779a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston if(apple_cgl.version_major > 1 || (apple_cgl.version_major == 1 && apple_cgl.version_minor >= 3)) { 789a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston attr[numattr++] = kCGLPFAOpenGLProfile; 799a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston attr[numattr++] = kCGLOGLPVersion_3_2_Core; 809a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston } 819a00dd974699e369b1eb292103fbde8bc6adfb87Jeremy Huddleston 82ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (offscreen) { 83ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston apple_glx_diagnostic 84ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ("offscreen rendering enabled. Using kCGLPFAOffScreen\n"); 85ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 86ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAOffScreen; 87ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAColorSize; 88ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = 32; 89ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else if (getenv("LIBGL_ALWAYS_SOFTWARE") != NULL) { 91ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston apple_glx_diagnostic 92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ("Software rendering requested. Using kCGLRendererGenericFloatID.\n"); 93ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFARendererID; 94ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLRendererGenericFloatID; 95ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 96ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else if (getenv("LIBGL_ALLOW_SOFTWARE") != NULL) { 97ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston apple_glx_diagnostic 98ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ("Software rendering is not being excluded. Not using kCGLPFAAccelerated.\n"); 99ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 100ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else { 101ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAAccelerated; 102ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 103ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 104ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 105ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The program chose a config based on the fbconfigs or visuals. 106ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * Those are based on the attributes from CGL, so we probably 107ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * do want the closest match for the color, depth, and accum. 108ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 109ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAClosestPolicy; 110ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 11102b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston if (mode->stereoMode) { 112ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAStereo; 113ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *uses_stereo = true; 114ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 115ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else { 116ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *uses_stereo = false; 117ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 118ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 1192fe673fec3d602ba2b686eedbdf2d70a42794a82Jonas Maebe if (!offscreen && mode->doubleBufferMode) { 120ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFADoubleBuffer; 121ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *double_buffered = true; 122ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 123ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else { 124ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *double_buffered = false; 125ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 126ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 127ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAColorSize; 12802b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->redBits + mode->greenBits + mode->blueBits; 129ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAAlphaSize; 13002b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->alphaBits; 131ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 13202b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston if ((mode->accumRedBits + mode->accumGreenBits + mode->accumBlueBits) > 0) { 133ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAAccumSize; 13402b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->accumRedBits + mode->accumGreenBits + 13502b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston mode->accumBlueBits + mode->accumAlphaBits; 136ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 137ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 13802b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston if (mode->depthBits > 0) { 139ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFADepthSize; 14002b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->depthBits; 141ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 142ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 14302b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston if (mode->stencilBits > 0) { 144ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAStencilSize; 14502b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->stencilBits; 146ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 147ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 14802b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston if (mode->sampleBuffers > 0) { 149ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFAMultisample; 150ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFASampleBuffers; 15102b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->sampleBuffers; 152ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = kCGLPFASamples; 15302b6e97c75bf2e013064e789b70704c6376e0628Jeremy Huddleston attr[numattr++] = mode->samples; 154ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 155ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 156ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston attr[numattr++] = 0; 157ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 158ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston assert(numattr < MAX_ATTR); 159ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 160ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston error = apple_cgl.choose_pixel_format(attr, pfobj, &vsref); 161ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 162ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (error) { 163ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston fprintf(stderr, "error: %s\n", apple_cgl.error_string(error)); 164ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston abort(); 165ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 166ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 167