-/* xscreensaver, Copyright (c) 2006-2009 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2011 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
if (!ctx) {
- NSOpenGLPixelFormatAttribute attrs[] = {
- NSOpenGLPFADoubleBuffer,
- NSOpenGLPFAColorSize, 24,
- NSOpenGLPFAAlphaSize, 8,
- NSOpenGLPFADepthSize, 16,
- 0 };
- NSOpenGLPixelFormat *pixfmt = [[NSOpenGLPixelFormat alloc]
- initWithAttributes:attrs];
+ NSOpenGLPixelFormatAttribute attrs[40];
+ int i = 0;
+ attrs[i++] = NSOpenGLPFAColorSize; attrs[i++] = 24;
+ attrs[i++] = NSOpenGLPFAAlphaSize; attrs[i++] = 8;
+ attrs[i++] = NSOpenGLPFADepthSize; attrs[i++] = 16;
+
+ if (get_boolean_resource (mi->dpy, "doubleBuffer", "DoubleBuffer"))
+ attrs[i++] = NSOpenGLPFADoubleBuffer;
+
+ Bool ms_p = get_boolean_resource (mi->dpy, "multiSample", "MultiSample");
+
+ /* Sometimes, turning on multisampling kills performance. At one point,
+ I thought the answer was, "only run multisampling on one screen, and
+ leave it turned off on other screens". That's what this code does,
+ but it turns out, that solution is insufficient. I can't really tell
+ what causes poor performance with multisampling, but it's not
+ predictable. Without changing the code, some times a given saver will
+ perform fine with multisampling on, and other times it will perform
+ very badly. Without multisampling, they always perform fine.
+ */
+// if (ms_p && [[view window] screen] != [[NSScreen screens] objectAtIndex:0])
+// ms_p = 0;
+
+ if (ms_p) {
+ attrs[i++] = NSOpenGLPFASampleBuffers; attrs[i++] = 1;
+ attrs[i++] = NSOpenGLPFASamples; attrs[i++] = 6;
+ // Don't really understand what this means:
+ // attrs[i++] = NSOpenGLPFANoRecovery;
+ }
+
+ attrs[i] = 0;
+
+ NSOpenGLPixelFormat *pixfmt =
+ [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+
+ if (ms_p && !pixfmt) { // Retry without multisampling.
+ i -= 2;
+ attrs[i] = 0;
+ pixfmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+ }
+
+ if (! pixfmt) {
+ NSLog (@"unable to create NSOpenGLPixelFormat");
+ exit (1);
+ }
ctx = [[NSOpenGLContext alloc]
initWithFormat:pixfmt
shareContext:nil];
+// [pixfmt release]; // #### ???
}
// Sync refreshes to the vertical blanking interval
GLint r = 1;
[ctx setValues:&r forParameter:NSOpenGLCPSwapInterval];
+// check_gl_error ("NSOpenGLCPSwapInterval"); // SEGV sometimes. Too early?
+
+ // #### "Build and Analyze" says that ctx leaks, because it doesn't
+ // seem to realize that makeCurrentContext retains it (right?)
+ // Not sure what to do to make this warning go away.
[ctx makeCurrentContext];
check_gl_error ("makeCurrentContext");
[view setOglContext:ctx];
// Clear frame buffer ASAP, else there are bits left over from other apps.
+ glClearColor (0, 0, 0, 1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// glFinish ();
// glXSwapBuffers (mi->dpy, mi->window);
}
}
+ check_gl_error ("init_GL");
// Caller expects a pointer to an opaque struct... which it dereferences.
// Don't ask me, it's historical...