#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <GL/gl.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/CGLContext.h>
#include <OpenGL/CGLRenderers.h>
#include "apple_cgl.h"
#include "apple_visual.h"
#include "apple_glx.h"
#include "glcontextmodes.h"
enum
{
MAX_ATTR = 60
};
void
apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
bool * double_buffered, bool * uses_stereo,
bool offscreen)
{
CGLPixelFormatAttribute attr[MAX_ATTR];
const __GLcontextModes *c = mode;
int numattr = 0;
GLint vsref = 0;
CGLError error = 0;
if (offscreen) {
apple_glx_diagnostic
("offscreen rendering enabled. Using kCGLPFAOffScreen\n");
attr[numattr++] = kCGLPFAOffScreen;
attr[numattr++] = kCGLPFAColorSize;
attr[numattr++] = 32;
}
else if (getenv("LIBGL_ALWAYS_SOFTWARE") != NULL) {
apple_glx_diagnostic
("Software rendering requested. Using kCGLRendererGenericFloatID.\n");
attr[numattr++] = kCGLPFARendererID;
attr[numattr++] = kCGLRendererGenericFloatID;
}
else if (getenv("LIBGL_ALLOW_SOFTWARE") != NULL) {
apple_glx_diagnostic
("Software rendering is not being excluded. Not using kCGLPFAAccelerated.\n");
}
else {
attr[numattr++] = kCGLPFAAccelerated;
}
attr[numattr++] = kCGLPFAClosestPolicy;
if (c->stereoMode) {
attr[numattr++] = kCGLPFAStereo;
*uses_stereo = true;
}
else {
*uses_stereo = false;
}
if (c->doubleBufferMode) {
attr[numattr++] = kCGLPFADoubleBuffer;
*double_buffered = true;
}
else {
*double_buffered = false;
}
attr[numattr++] = kCGLPFAColorSize;
attr[numattr++] = c->redBits + c->greenBits + c->blueBits;
attr[numattr++] = kCGLPFAAlphaSize;
attr[numattr++] = c->alphaBits;
if ((c->accumRedBits + c->accumGreenBits + c->accumBlueBits) > 0) {
attr[numattr++] = kCGLPFAAccumSize;
attr[numattr++] = c->accumRedBits + c->accumGreenBits +
c->accumBlueBits + c->accumAlphaBits;
}
if (c->depthBits > 0) {
attr[numattr++] = kCGLPFADepthSize;
attr[numattr++] = c->depthBits;
}
if (c->stencilBits > 0) {
attr[numattr++] = kCGLPFAStencilSize;
attr[numattr++] = c->stencilBits;
}
if (c->sampleBuffers > 0) {
attr[numattr++] = kCGLPFAMultisample;
attr[numattr++] = kCGLPFASampleBuffers;
attr[numattr++] = c->sampleBuffers;
attr[numattr++] = kCGLPFASamples;
attr[numattr++] = c->samples;
}
attr[numattr++] = 0;
assert(numattr < MAX_ATTR);
error = apple_cgl.choose_pixel_format(attr, pfobj, &vsref);
if (error) {
fprintf(stderr, "error: %s\n", apple_cgl.error_string(error));
abort();
}
}