r600/sb: add tess/compute initial state registers.
[mesa.git] / src / glx / apple / apple_visual.c
index 7a9525e81704ca2061442050335e6c4be703e2bc..d482bfc4e712d665feae228701e873930a4cf5d4 100644 (file)
 #include <OpenGL/OpenGL.h>
 #include <OpenGL/CGLContext.h>
 #include <OpenGL/CGLRenderers.h>
+#include <OpenGL/CGLTypes.h>
 #undef glTexImage1D
 #undef glTexImage2D
 #undef glTexImage3D
 
+#ifndef kCGLPFAOpenGLProfile
+#define kCGLPFAOpenGLProfile 99
+#endif
+
+#ifndef kCGLOGLPVersion_3_2_Core
+#define kCGLOGLPVersion_3_2_Core 0x3200
+#endif
+
 #include "apple_cgl.h"
 #include "apple_visual.h"
 #include "apple_glx.h"
-#include "glcontextmodes.h"
+#include "glxconfig.h"
 
 enum
 {
    MAX_ATTR = 60
 };
 
-/*mode is a __GlcontextModes*/
+static char __crashreporter_info_buff__[4096] = { 0 };
+static const char *__crashreporter_info__ __attribute__((__used__)) =
+    &__crashreporter_info_buff__[0];
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
+// This is actually a toolchain requirement, but I'm not sure the correct check,
+// but it should be fine to just only include it for Leopard and later.  This line
+// just tells the linker to never strip this symbol (such as for space optimization)
+__asm__ (".desc ___crashreporter_info__, 0x10");
+#endif
+
 void
-apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
+apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const struct glx_config * mode,
                           bool * double_buffered, bool * uses_stereo,
                           bool offscreen)
 {
    CGLPixelFormatAttribute attr[MAX_ATTR];
-   const struct glx_config *c = mode;
    int numattr = 0;
    GLint vsref = 0;
    CGLError error = 0;
+   bool use_core_profile = env_var_as_boolean("LIBGL_PROFILE_CORE", false);
 
    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) {
+   else if (env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false)) {
       apple_glx_diagnostic
          ("Software rendering requested.  Using kCGLRendererGenericFloatID.\n");
       attr[numattr++] = kCGLPFARendererID;
       attr[numattr++] = kCGLRendererGenericFloatID;
    }
-   else if (getenv("LIBGL_ALLOW_SOFTWARE") != NULL) {
+   else if (env_var_as_boolean("LIBGL_ALLOW_SOFTWARE", false)) {
       apple_glx_diagnostic
          ("Software rendering is not being excluded.  Not using kCGLPFAAccelerated.\n");
    }
@@ -95,7 +111,7 @@ apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
     */
    attr[numattr++] = kCGLPFAClosestPolicy;
 
-   if (c->stereoMode) {
+   if (mode->stereoMode) {
       attr[numattr++] = kCGLPFAStereo;
       *uses_stereo = true;
    }
@@ -103,7 +119,7 @@ apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
       *uses_stereo = false;
    }
 
-   if (c->doubleBufferMode) {
+   if (!offscreen && mode->doubleBufferMode) {
       attr[numattr++] = kCGLPFADoubleBuffer;
       *double_buffered = true;
    }
@@ -112,32 +128,38 @@ apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
    }
 
    attr[numattr++] = kCGLPFAColorSize;
-   attr[numattr++] = c->redBits + c->greenBits + c->blueBits;
+   attr[numattr++] = mode->redBits + mode->greenBits + mode->blueBits;
    attr[numattr++] = kCGLPFAAlphaSize;
-   attr[numattr++] = c->alphaBits;
+   attr[numattr++] = mode->alphaBits;
 
-   if ((c->accumRedBits + c->accumGreenBits + c->accumBlueBits) > 0) {
+   if ((mode->accumRedBits + mode->accumGreenBits + mode->accumBlueBits) > 0) {
       attr[numattr++] = kCGLPFAAccumSize;
-      attr[numattr++] = c->accumRedBits + c->accumGreenBits +
-         c->accumBlueBits + c->accumAlphaBits;
+      attr[numattr++] = mode->accumRedBits + mode->accumGreenBits +
+         mode->accumBlueBits + mode->accumAlphaBits;
    }
 
-   if (c->depthBits > 0) {
+   if (mode->depthBits > 0) {
       attr[numattr++] = kCGLPFADepthSize;
-      attr[numattr++] = c->depthBits;
+      attr[numattr++] = mode->depthBits;
    }
 
-   if (c->stencilBits > 0) {
+   if (mode->stencilBits > 0) {
       attr[numattr++] = kCGLPFAStencilSize;
-      attr[numattr++] = c->stencilBits;
+      attr[numattr++] = mode->stencilBits;
    }
 
-   if (c->sampleBuffers > 0) {
+   if (mode->sampleBuffers > 0) {
       attr[numattr++] = kCGLPFAMultisample;
       attr[numattr++] = kCGLPFASampleBuffers;
-      attr[numattr++] = c->sampleBuffers;
+      attr[numattr++] = mode->sampleBuffers;
       attr[numattr++] = kCGLPFASamples;
-      attr[numattr++] = c->samples;
+      attr[numattr++] = mode->samples;
+   }
+
+   /* Debugging support for Core profiles to support newer versions of OpenGL */
+   if (use_core_profile) {
+      attr[numattr++] = kCGLPFAOpenGLProfile;
+      attr[numattr++] = kCGLOGLPVersion_3_2_Core;
    }
 
    attr[numattr++] = 0;
@@ -146,8 +168,30 @@ apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
 
    error = apple_cgl.choose_pixel_format(attr, pfobj, &vsref);
 
+   if ((error == kCGLBadAttribute || vsref == 0) && use_core_profile) {
+      apple_glx_diagnostic
+         ("Trying again without CoreProfile: error=%s, vsref=%d\n", apple_cgl.error_string(error), vsref);
+
+      if (!error)
+         apple_cgl.destroy_pixel_format(*pfobj);
+
+      numattr -= 3;
+      attr[numattr++] = 0;
+
+      error = apple_cgl.choose_pixel_format(attr, pfobj, &vsref);
+   }
+
    if (error) {
-      fprintf(stderr, "error: %s\n", apple_cgl.error_string(error));
+      snprintf(__crashreporter_info_buff__, sizeof(__crashreporter_info_buff__),
+               "CGLChoosePixelFormat error: %s\n", apple_cgl.error_string(error));
+      fprintf(stderr, "%s", __crashreporter_info_buff__);
+      abort();
+   }
+
+   if (!*pfobj) {
+      snprintf(__crashreporter_info_buff__, sizeof(__crashreporter_info_buff__),
+               "No matching pixelformats found, perhaps try setting LIBGL_ALLOW_SOFTWARE=true\n");
+      fprintf(stderr, "%s", __crashreporter_info_buff__);
       abort();
    }
 }