apple_visual.c revision 4c9bab78a118953baf307e31cd53e731299f0151
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>
43a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#undef glTexImage1D
44a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#undef glTexImage2D
45a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston#undef glTexImage3D
46a1cb3babbef2af222b839a058694acc82a7074f1Jeremy Huddleston
47ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_cgl.h"
48ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_visual.h"
49ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.h"
504c9bab78a118953baf307e31cd53e731299f0151Jeremy Huddleston#include "glxconfig.h"
51ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
52ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonenum
53ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
54ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   MAX_ATTR = 60
55ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston};
56ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
57ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/*mode is a __GlcontextModes*/
58ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonvoid
59ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonapple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
60ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                          bool * double_buffered, bool * uses_stereo,
61ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                          bool offscreen)
62ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{
63ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   CGLPixelFormatAttribute attr[MAX_ATTR];
646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   const struct glx_config *c = mode;
65ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int numattr = 0;
66ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   GLint vsref = 0;
67ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   CGLError error = 0;
68ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
69ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (offscreen) {
70ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      apple_glx_diagnostic
71ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         ("offscreen rendering enabled.  Using kCGLPFAOffScreen\n");
72ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
73ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAOffScreen;
74ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAColorSize;
75ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = 32;
76ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
77ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else if (getenv("LIBGL_ALWAYS_SOFTWARE") != NULL) {
78ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      apple_glx_diagnostic
79ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         ("Software rendering requested.  Using kCGLRendererGenericFloatID.\n");
80ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFARendererID;
81ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLRendererGenericFloatID;
82ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
83ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else if (getenv("LIBGL_ALLOW_SOFTWARE") != NULL) {
84ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      apple_glx_diagnostic
85ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         ("Software rendering is not being excluded.  Not using kCGLPFAAccelerated.\n");
86ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
87ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else {
88ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAAccelerated;
89ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
91ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   /*
92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    * The program chose a config based on the fbconfigs or visuals.
93ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    * Those are based on the attributes from CGL, so we probably
94ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    * do want the closest match for the color, depth, and accum.
95ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston    */
96ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   attr[numattr++] = kCGLPFAClosestPolicy;
97ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
98ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (c->stereoMode) {
99ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAStereo;
100ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *uses_stereo = true;
101ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
102ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else {
103ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *uses_stereo = false;
104ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
105ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
106ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (c->doubleBufferMode) {
107ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFADoubleBuffer;
108ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *double_buffered = true;
109ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
110ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   else {
111ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      *double_buffered = false;
112ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
113ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
114ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   attr[numattr++] = kCGLPFAColorSize;
115ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   attr[numattr++] = c->redBits + c->greenBits + c->blueBits;
116ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   attr[numattr++] = kCGLPFAAlphaSize;
117ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   attr[numattr++] = c->alphaBits;
118ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
119ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if ((c->accumRedBits + c->accumGreenBits + c->accumBlueBits) > 0) {
120ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAAccumSize;
121ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = c->accumRedBits + c->accumGreenBits +
122ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston         c->accumBlueBits + c->accumAlphaBits;
123ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
124ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
125ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (c->depthBits > 0) {
126ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFADepthSize;
127ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = c->depthBits;
128ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
129ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
130ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (c->stencilBits > 0) {
131ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAStencilSize;
132ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = c->stencilBits;
133ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
134ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
135ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (c->sampleBuffers > 0) {
136ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFAMultisample;
137ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFASampleBuffers;
138ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = c->sampleBuffers;
139ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = kCGLPFASamples;
140ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      attr[numattr++] = c->samples;
141ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
142ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
143ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   attr[numattr++] = 0;
144ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
145ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   assert(numattr < MAX_ATTR);
146ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
147ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   error = apple_cgl.choose_pixel_format(attr, pfobj, &vsref);
148ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
149ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if (error) {
150ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      fprintf(stderr, "error: %s\n", apple_cgl.error_string(error));
151ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      abort();
152ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
153ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}
154