#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 "glcontextmodes.h"
#include "apple_cgl.h"
#include "apple_visual.h"
#include "apple_glx.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();
}
}