support more modes, added -f cmd line option
authorBrian <brian.paul@tungstengraphics.com>
Wed, 4 Jul 2007 15:23:12 +0000 (09:23 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Wed, 4 Jul 2007 15:23:12 +0000 (09:23 -0600)
progs/fbdev/glfbdevtest.c

index a461c55e2f86337f457449b0c57f3ba6f6d6f0d1..6d9f80703027bcb1fe5e9680cde62e6636e30f39 100644 (file)
 #include <GL/glfbdev.h>
 #include <math.h>
 
-#define DEFAULT_DEPTH 8
+
+/**
+ * Choose one of these modes
+ */
+/*static const int XRes = 1280, YRes = 1024, Hz = 75;*/
+/*static const int XRes = 1280, YRes = 1024, Hz = 70;*/
+/*static const int XRes = 1280, YRes = 1024, Hz = 60;*/
+static const int XRes = 1024, YRes = 768, Hz = 70;
+
+static int DesiredDepth = 32;
+
+static int NumFrames = 100;
 
 static struct fb_fix_screeninfo FixedInfo;
 static struct fb_var_screeninfo VarInfo, OrigVarInfo;
-static int DesiredDepth = 0;
 static int OriginalVT = -1;
 static int ConsoleFD = -1;
 static int FrameBufferFD = -1;
@@ -227,7 +237,6 @@ initialize_fbdev( void )
    VarInfo = OrigVarInfo;
 
    /* set the depth, resolution, etc */
-   DesiredDepth = 32;
    if (DesiredDepth)
       VarInfo.bits_per_pixel = DesiredDepth;
 
@@ -251,16 +260,60 @@ initialize_fbdev( void )
       VarInfo.blue.length = 8;
       VarInfo.transp.length = 8;
    }
-   /* timing values taken from /etc/fb.modes (1280x1024 @ 75Hz) */
-   VarInfo.xres_virtual = VarInfo.xres = 1280;
-   VarInfo.yres_virtual = VarInfo.yres = 1024;
-   VarInfo.pixclock = 7408;
-   VarInfo.left_margin = 248;
-   VarInfo.right_margin = 16;
-   VarInfo.upper_margin = 38;
-   VarInfo.lower_margin = 1;
-   VarInfo.hsync_len = 144;
-   VarInfo.vsync_len = 3;
+
+   /* timing values taken from /etc/fb.modes */
+   if (XRes == 1280 && YRes == 1024) {
+      VarInfo.xres_virtual = VarInfo.xres = XRes;
+      VarInfo.yres_virtual = VarInfo.yres = YRes;
+      if (Hz == 75) {
+         VarInfo.pixclock = 7408;
+         VarInfo.left_margin = 248;
+         VarInfo.right_margin = 16;
+         VarInfo.upper_margin = 38;
+         VarInfo.lower_margin = 1;
+         VarInfo.hsync_len = 144;
+         VarInfo.vsync_len = 3;
+      }
+      else if (Hz == 70) {
+         VarInfo.pixclock = 7937;
+         VarInfo.left_margin = 216;
+         VarInfo.right_margin = 80;
+         VarInfo.upper_margin = 36;
+         VarInfo.lower_margin = 1;
+         VarInfo.hsync_len = 112;
+         VarInfo.vsync_len = 5;
+      }
+      else if (Hz == 60) {
+         VarInfo.pixclock = 9260;
+         VarInfo.left_margin = 248;
+         VarInfo.right_margin = 48;
+         VarInfo.upper_margin = 38;
+         VarInfo.lower_margin = 1;
+         VarInfo.hsync_len = 112;
+         VarInfo.vsync_len = 3;
+      }
+      else {
+         fprintf(stderr, "invalid rate for 1280x1024\n");
+         exit(1);
+      }
+   }
+   else if (XRes == 1024 && YRes == 768 && Hz == 70) {
+      VarInfo.xres_virtual = VarInfo.xres = XRes;
+      VarInfo.yres_virtual = VarInfo.yres = YRes;
+      if (Hz == 70) {
+         VarInfo.pixclock = 13334;
+         VarInfo.left_margin = 144;
+         VarInfo.right_margin = 24;
+         VarInfo.upper_margin = 29;
+         VarInfo.lower_margin = 3;
+         VarInfo.hsync_len = 136;
+         VarInfo.vsync_len = 6;
+      }
+      else {
+         fprintf(stderr, "invalid rate for 1024x768\n");
+         exit(1);
+      }
+   }
 
    VarInfo.xoffset = 0;
    VarInfo.yoffset = 0;
@@ -338,7 +391,7 @@ initialize_fbdev( void )
    printf("MMIOAddress = %p\n", MMIOAddress);
 
    /* try out some simple MMIO register reads */
-   if (1)
+   if (0)
    {
       typedef unsigned int CARD32;
       typedef unsigned char CARD8;
@@ -452,6 +505,7 @@ gltest( void )
    GLFBDevVisualPtr vis;
    int bytes, r, g, b, a;
    float ang;
+   int i;
 
    printf("GLFBDEV_VENDOR = %s\n", glFBDevGetString(GLFBDEV_VENDOR));
    printf("GLFBDEV_VERSION = %s\n", glFBDevGetString(GLFBDEV_VERSION));
@@ -491,13 +545,17 @@ gltest( void )
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
 
-   for (ang = 0; ang <= 180; ang += 15) {
+   printf("Drawing %d frames...\n", NumFrames);
+
+   ang = 0.0;
+   for (i = 0; i < NumFrames; i++) {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPushMatrix();
       glRotatef(ang, 1, 0, 0);
       doughnut(1, 3, 40, 20);
       glPopMatrix();
       glFBDevSwapBuffers(buf);
+      ang += 15.0;
    }
 
    /* clean up */
@@ -510,12 +568,29 @@ gltest( void )
 }
 
 
+static void
+parse_args(int argc, char *argv[])
+{
+   int i;
+
+   for (i = 1; i < argc; i++) {
+      if (strcmp(argv[i], "-f") == 0) {
+         NumFrames = atoi(argv[i+1]);
+         i++;
+      }
+   }
+}
+
+
 int
 main( int argc, char *argv[] )
 {
    signal(SIGUSR1, signal_handler);  /* exit if someone tries a vt switch */
    signal(SIGSEGV, signal_handler);  /* catch segfaults */
 
+   parse_args(argc, argv);
+
+   printf("Setting mode to %d x %d @ %d Hz, %d bpp\n", XRes, YRes, Hz, DesiredDepth);
    initialize_fbdev();
    gltest();
    shutdown_fbdev();