From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / glx / xlock-gl-utils.c
index e3aeff0b5462c43476f767bc10e7a582c3ba35fb..36d724c9e675004f9ffa08d18b7f60953903a3da 100644 (file)
@@ -1,5 +1,5 @@
 /* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules.
- * xscreensaver, Copyright (c) 1997-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2015 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
 
 #include <stdio.h>
 #include "xlockmoreI.h"
-#include "glxfonts.h"
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include <GL/glx.h>
+#include "texfont.h"
 
 #ifndef isupper
 # define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
@@ -56,10 +52,18 @@ init_GL(ModeInfo * mi)
   Window window = mi->window;
   Screen *screen = mi->xgwa.screen;
   Visual *visual = mi->xgwa.visual;
-  GLXContext glx_context = 0;
   XVisualInfo vi_in, *vi_out;
   int out_count;
 
+  if (mi->glx_context) {
+    glXMakeCurrent (dpy, window, mi->glx_context);
+    return &mi->glx_context;
+  }
+
+# ifdef HAVE_JWZGLES
+  jwzgles_make_current(jwzgles_make_state(state));
+# endif
+
   vi_in.screen = screen_number (screen);
   vi_in.visualid = XVisualIDFromVisual (visual);
   vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
@@ -69,23 +73,23 @@ init_GL(ModeInfo * mi)
   {
     XSync (dpy, False);
     orig_ehandler = XSetErrorHandler (BadValue_ehandler);
-    glx_context = glXCreateContext (dpy, vi_out, 0, GL_TRUE);
+    mi->glx_context = glXCreateContext (dpy, vi_out, 0, GL_TRUE);
     XSync (dpy, False);
     XSetErrorHandler (orig_ehandler);
     if (got_error)
-      glx_context = 0;
+      mi->glx_context = 0;
   }
 
   XFree((char *) vi_out);
 
-  if (!glx_context)
+  if (!mi->glx_context)
     {
       fprintf(stderr, "%s: couldn't create GL context for visual 0x%x.\n",
              progname, (unsigned int) XVisualIDFromVisual (visual));
       exit(1);
     }
 
-  glXMakeCurrent (dpy, window, glx_context);
+  glXMakeCurrent (dpy, window, mi->glx_context);
 
   {
     GLboolean rgba_mode = 0;
@@ -134,17 +138,14 @@ init_GL(ModeInfo * mi)
                   1.0);
   }
 
+  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
   /* GLXContext is already a pointer type.
      Why this function returns a pointer to a pointer, I have no idea...
    */
-  {
-    GLXContext *ptr = (GLXContext *) malloc(sizeof(GLXContext));
-    *ptr = glx_context;
-    return ptr;
-  }
+  return &mi->glx_context;
 }
 
-
 \f
 
 /* clear away any lingering error codes */
@@ -170,6 +171,11 @@ check_gl_error (const char *type)
   case GL_STACK_OVERFLOW:        e = "stack overflow";    break;
   case GL_STACK_UNDERFLOW:       e = "stack underflow";   break;
   case GL_OUT_OF_MEMORY:         e = "out of memory";     break;
+#ifdef GL_INVALID_FRAMEBUFFER_OPERATION
+  case GL_INVALID_FRAMEBUFFER_OPERATION:
+    e = "invalid framebuffer operation";
+    break;
+#endif
 #ifdef GL_TABLE_TOO_LARGE_EXT
   case GL_TABLE_TOO_LARGE_EXT:   e = "table too large";   break;
 #endif