"GL_INDEX_LOGIC_OP": false,
     "GL_COLOR_LOGIC_OP": false,
     // Some implementations return more GL_AUX_BUFFERS than requested
-    "GL_DRAW_BUFFER": "GL_BACK",
-    "GL_READ_BUFFER": "GL_BACK",
+    // GL_DRAW_BUFFER and GL_READ_BUFFER vary with visual
     // GL_SCISSOR_BOX depends on the drawable
     "GL_SCISSOR_TEST": false,
     "GL_INDEX_CLEAR_VALUE": 0,
     "GL_COLOR_WRITEMASK": [true, true, true, true],
     "GL_INDEX_MODE": false,
     "GL_RGBA_MODE": true,
-    "GL_DOUBLEBUFFER": true,
+    // GL_DOUBLEBUFFER varies with visual
     "GL_STEREO": false,
     "GL_RENDER_MODE": "GL_RENDER",
     "GL_PERSPECTIVE_CORRECTION_HINT": "GL_DONT_CARE",
     "GL_STENCIL_BACK_FAIL": "GL_KEEP",
     "GL_STENCIL_BACK_PASS_DEPTH_FAIL": "GL_KEEP",
     "GL_STENCIL_BACK_PASS_DEPTH_PASS": "GL_KEEP",
-    "GL_DRAW_BUFFER0": "GL_BACK",
+    // GL_DRAW_BUFFER0 varies with visual
     "GL_DRAW_BUFFER1": "GL_ZERO",
     "GL_DRAW_BUFFER2": "GL_ZERO",
     "GL_DRAW_BUFFER3": "GL_ZERO",
 
--- /dev/null
+{
+  "parameters": {
+    "GL_DRAW_BUFFER": "GL_BACK",
+    "GL_DRAW_BUFFER0": "GL_BACK",
+    "GL_READ_BUFFER": "GL_BACK",
+    "GL_DOUBLEBUFFER": true
+  }
+}
 
--- /dev/null
+{
+  "parameters": {
+    "GL_DRAW_BUFFER": "GL_FRONT",
+    "GL_DRAW_BUFFER0": "GL_FRONT",
+    "GL_READ_BUFFER": "GL_FRONT",
+    "GL_DOUBLEBUFFER": false
+  }
+}
 
 static GLboolean doubleBuffer = GL_TRUE;
 static int win;
 
+static void parseArgs(int argc, char** argv)
+{
+   int i;
+
+   for (i = 1; i < argc; ++i) {
+      const char *arg = argv[i];
+      if (strcmp(arg, "-sb") == 0) {
+         doubleBuffer = GL_FALSE;
+      } else if (strcmp(arg, "-db") == 0) {
+         doubleBuffer = GL_TRUE;
+      } else {
+         fprintf(stderr, "error: unknown arg %s\n", arg);
+         exit(1);
+      }
+   }
+}
+
 static void Init(void)
 {
    glClearColor(0.3, 0.1, 0.3, 1.0);
 {
    GLenum type;
 
+   parseArgs(argc, argv);
+
    glutInit(&argc, argv);
 
    glutInitWindowSize(250, 250);