X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fxlock-gl.c;h=0f313e52946f94f4b2229c0061741723133293c3;hb=c28aecf9fc41e3a03494bacf7279745425e2fa18;hp=553a2cdd30242214b7d6163ba715240185f3844a;hpb=3d9140a05b5272fed0883a0af0a71e30ef44d47f;p=xscreensaver diff --git a/hacks/glx/xlock-gl.c b/hacks/glx/xlock-gl.c index 553a2cdd..0f313e52 100644 --- a/hacks/glx/xlock-gl.c +++ b/hacks/glx/xlock-gl.c @@ -1,5 +1,5 @@ /* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules. - * xscreensaver, Copyright (c) 1997, 1998, 1999 Jamie Zawinski + * xscreensaver, Copyright (c) 1997-2002 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -89,6 +89,28 @@ init_GL(ModeInfo * mi) } } + + /* jwz: the doc for glDrawBuffer says "The initial value is GL_FRONT + for single-buffered contexts, and GL_BACK for double-buffered + contexts." However, I find that this is not always the case, + at least with Mesa 3.4.2 -- sometimes the default seems to be + GL_FRONT even when glGet(GL_DOUBLEBUFFER) is true. So, let's + make sure. + + Oh, hmm -- maybe this only happens when we are re-using the + xscreensaver window, and the previous GL hack happened to die with + the other buffer selected? I'm not sure. Anyway, this fixes it. + */ + { + GLboolean d = False; + glGetBooleanv (GL_DOUBLEBUFFER, &d); + if (d) + glDrawBuffer (GL_BACK); + else + glDrawBuffer (GL_FRONT); + } + + /* GLXContext is already a pointer type. Why this function returns a pointer to a pointer, I have no idea... */ @@ -137,162 +159,3 @@ check_gl_error (const char *type) fprintf (stderr, "%s: %s error: %s\n", progname, type, e); exit (1); } - - - - -/* Frames-per-second statistics */ - -static int fps_text_x = 10; -static int fps_text_y = 10; -static int fps_sample_frames = 10; -static GLuint font_dlist; - -static void -fps_init (ModeInfo *mi) -{ - const char *font = get_string_resource ("fpsFont", "Font"); - XFontStruct *f; - Font id; - int first, last; - - if (!font) font = "-*-courier-bold-r-normal-*-180-*"; - f = XLoadQueryFont(mi->dpy, font); - if (!f) f = XLoadQueryFont(mi->dpy, "fixed"); - - id = f->fid; - first = f->min_char_or_byte2; - last = f->max_char_or_byte2; - - clear_gl_error (); - font_dlist = glGenLists ((GLuint) last+1); - check_gl_error ("glGenLists"); - - if (get_boolean_resource ("fpsTop", "FPSTop")) - fps_text_y = - (f->ascent + 10); - - glXUseXFont(id, first, last-first+1, font_dlist + first); - check_gl_error ("glXUseXFont"); -} - - -static void -fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string) -{ - int i; - /* save the current state */ - /* note: could be expensive! */ - - if (y < 0) - y = mi->xgwa.height + y; - - clear_gl_error (); - glPushAttrib(GL_ALL_ATTRIB_BITS); - { - check_gl_error ("glPushAttrib"); - - /* disable lighting and texturing when drawing bitmaps! - (glPopAttrib() restores these, I believe.) - */ - glDisable(GL_TEXTURE_2D); - glDisable(GL_LIGHTING); - glDisable(GL_BLEND); - - /* glPopAttrib() does not restore matrix changes, so we must - push/pop the matrix stacks to be non-intrusive there. - */ - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - { - check_gl_error ("glPushMatrix"); - glLoadIdentity(); - - /* Each matrix mode has its own stack, so we need to push/pop - them separately. */ - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - { - check_gl_error ("glPushMatrix"); - glLoadIdentity(); - - gluOrtho2D(0, mi->xgwa.width, 0, mi->xgwa.height); - check_gl_error ("gluOrtho2D"); - - /* draw the text */ - glColor3f (1, 1, 1); - glRasterPos2f (x, y); - for (i = 0; i < strlen(string); i++) - glCallList (font_dlist + (int)string[i]); - - check_gl_error ("fps_print_string"); - } - glPopMatrix(); - } - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - - } - /* clean up after our state changes */ - glPopAttrib(); - check_gl_error ("glPopAttrib"); -} - - -void -do_fps (ModeInfo *mi) -{ - /* every N frames, get the time and use it to get the frames per second */ - static int frame_counter = -1; - static double oldtime = 0; /* time in usecs, as a double */ - static double newtime = 0; - - static char msg [1024] = { 0, }; - - if (frame_counter == -1) - { - fps_init (mi); - frame_counter = fps_sample_frames; - } - - if (frame_counter++ == fps_sample_frames) - { - double fps; - struct timeval now; -# ifdef GETTIMEOFDAY_TWO_ARGS - struct timezone tzp; - gettimeofday(&now, &tzp); -# else - gettimeofday(&now); -# endif - - oldtime = newtime; - newtime = now.tv_sec + ((double) now.tv_usec * 0.000001); - - fps = fps_sample_frames / (newtime - oldtime); - - if (fps < 0.0001) - { - strcpy(msg, "FPS: (accumulating...)"); - } - else - { - sprintf(msg, "FPS: %.02f", fps); - - if (mi->pause != 0) - { - char buf[40]; - sprintf(buf, "%f", mi->pause / 1000000.0); /* FTSO C */ - while(*buf && buf[strlen(buf)-1] == '0') - buf[strlen(buf)-1] = 0; - if (buf[strlen(buf)-1] == '.') - buf[strlen(buf)-1] = 0; - sprintf(msg + strlen(msg), " (including %s sec/frame delay)", - buf); - } - } - - frame_counter = 0; - } - - fps_print_string (mi, fps_text_x, fps_text_y, msg); -}