Page 1 of 1

OSMesa 'frontend' troubles

Posted: 06.08.2012, 22:12
by sgcb
Hi all

You guys are probably going to think I'm crazy, but I want to use celestia as sort of a real-time background generator. Specifically, I would like to take screenshots of celestia scenes and set it as my desktop background every so often (every minute for example). The external scripting necessary to do this should be relatively trivial (add cron job to execute celestia with background script which saves screenshot, set root window to display this image). AFAIK though, there is no way to take a celestia screenshot without first opening a celestia instance.(?) Which leads me to believe OSMesa (Off-Screen rendering) is a possible solution.

So using glutmain.cpp as reference, I took it upon myself, to create a new 'front end' to celestia: osmesamain.cpp (below). The code compiles, runs, and celestia detects the osmesa context as "render path: 0" (basic, I think), but when it goes to save the contents of the render buffer to file, the image is solid black. (Perhaps no data ever made it to render buffer?) This is where I'm stuck. I do not have enough knowledge of the celestia/opengl pipeline to determine what has gone awry.

svn diff configure.in

Code: Select all

Index: configure.in
===================================================================
--- configure.in   (revision 5213)
+++ configure.in   (working copy)
@@ -10,12 +10,16 @@
 dnl The following section confirms that the user provided necessary option
 dnl BEFORE anything is checked.
 
+ui_osmesa="no"
 ui_glut="no"
 ui_gtk="no"
 ui_gnome="no"
 ui_kde="no"
 ui_qt="no"
 
+AC_ARG_WITH([osmesa],
+       AC_HELP_STRING([--with-osmesa], [Use OSMesa for off-screen rendering]),
+       ui_osmesa="yes")
 AC_ARG_WITH([glut],
             AC_HELP_STRING([--with-glut], [Use Glut for the UI]),
             ui_glut="yes")
@@ -40,9 +44,10 @@
 dnl AC_MSG_ERROR([$ui_glut $ui_gtk $ui_gnome $ui_kde])
 
 dnl Check that an interface was provided
-if (test "$ui_glut" != "yes" -a "$ui_gtk" != "yes" -a "$ui_gnome" != "yes" -a "$ui_kde" != "yes" -a "$ui_qt" != "yes"); then
+if (test "$ui_osmesa" != "yes" -a "$ui_glut" != "yes" -a "$ui_gtk" != "yes" -a "$ui_gnome" != "yes" -a "$ui_kde" != "yes" -a "$ui_qt" != "yes"); then
    AC_MSG_ERROR([You must select an interface to build.
                   Possible options are:
+                    --with-osmesa    OSMesa rendering
                     --with-glut      GLUT front-end
                     --with-gtk       Enhanced GTK GUI
                     --with-gnome     Enhanced GTK GUI with Gnome features
@@ -160,6 +165,13 @@
 AM_CONDITIONAL(ENABLE_SPICE, test "$SPICE_LIBS" != "")
 
 
+AC_MSG_CHECKING([whether to enable OSMesa])
+if (test "$ui_osmesa" != "no"); then
+   AC_MSG_RESULT(yes)
+else
+   AC_MSG_RESULT(no)
+fi
+
 AC_MSG_CHECKING([whether to enable GLUT])
 if (test "$ui_glut" != "no"); then
    AC_MSG_RESULT(yes)
@@ -234,6 +246,17 @@
 
 PKG_PROG_PKG_CONFIG
 
+if (test "$ui_osmesa" = "yes"); then
+   dnl Check for OSMesa header
+   AC_CHECK_HEADERS(GL/osmesa.h, ,
+          [AC_MSG_ERROR([osmesa.h not found. See INSTALL file for help.])])
+
+   dnl Check for OSMesa
+   AC_CHECK_LIB(OSMesa32, OSMesaCreateContext, ,
+           [AC_MSG_ERROR([OSMesa library not found])])
+fi
+AM_CONDITIONAL(ENABLE_OSMESA, test "$ui_osmesa" = "yes")
+
 if (test "$ui_glut" = "yes"); then
    dnl Check for GLUT headers first.
    AC_CHECK_HEADERS(GL/glut.h, ,
@@ -472,6 +495,10 @@
 AC_MSG_RESULT(***************************************************************)
 AC_MSG_RESULT()
 
+if (test "$ui_osmesa" = "yes"); then
+   AC_MSG_RESULT([Front-End: OSMesa]);
+fi
+
 if (test "$ui_glut" = "yes"); then
    AC_MSG_RESULT([Front-End: GLUT]);
 fi

svn diff src/celestia Makefile.am

Code: Select all

Index: src/celestia/Makefile.am
===================================================================
--- src/celestia/Makefile.am   (revision 5213)
+++ src/celestia/Makefile.am   (working copy)
@@ -51,13 +51,17 @@
 GLUTSOURCES = glutmain.cpp
 endif
 
+if ENABLE_OSMESA
+OSMESASOURCES = osmesamain.cpp
+endif
+
 if ENABLE_THEORA
 THEORASOURCES = oggtheoracapture.cpp
 endif
 
 celestia_CXXFLAGS = $(LUA_CFLAGS) $(SPICE_CFLAGS) $(THEORA_CFLAGS) -Wl,--no-as-needed
 
-celestia_SOURCES = $(COMMONSOURCES) $(CELXSOURCES) $(GLUTSOURCES) $(THEORASOURCES)
+celestia_SOURCES = $(COMMONSOURCES) $(CELXSOURCES) $(GLUTSOURCES) $(OSMESASOURCES) $(THEORASOURCES)
 
 celestia_LDADD = \
    $(celestiaKDELIBS) \

Re: OSMesa 'frontend' troubles

Posted: 06.08.2012, 22:12
by sgcb
src/celestia/osmesamain.cpp

Code: Select all

/*
 * osmesamain.cpp
 *
 * OSMesa front end for Celestia.
 */

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <getopt.h>
#include <GL/glew.h>
/*
 * glew.h undefs GLAPI, but never undefs __gl_h_ so osmesa never includes gl.h.
 * Since GLAPI is the only thing it needs, define it here.
 */
#ifndef GLAPI
#   define GLAPI extern
#endif
#include <GL/osmesa.h>
#include "celestiacore.h"

using namespace std;

#define WIDTH 1920
#define HEIGHT 1080

static CelestiaCore* celestia_core = NULL;

static void cleanup(void);
static void write_targa(const char *, const GLfloat *, int, int);

int
main(int argc, char* argv[])
{
   char *script_arg = NULL;
   
   int c;
   while (1) {
      //int this_option_optind = optind ? optind : 1;
      int option_index = 0;
      static struct option long_options[] = {
         { "script",      required_argument,   0, 's' },
         { 0,         0,               0,   0 }
      };

      c = getopt_long(argc, argv, "s:", long_options, &option_index);
      if (c == -1) {
         break;
      }

      switch (c) {
      case 0:
         cout << "option " << long_options[option_index].name;
         if (optarg) {
            cout << " with arg " << optarg;
         }
         cout << "\n";
         break;
      case 's':
         script_arg = optarg;
      case '?':
         break;
      default:
         cout << "?? getopt returned character code 0x" << hex << c << " ??\n";
      }
   }

   celestia_core = new CelestiaCore();
   if (celestia_core == NULL) {
      cerr << "Out of memory.\n";
      return 1;
   }
   if (atexit(cleanup)) {
      cerr << "Cannot set atexit functio!\n";
   }

   if (!celestia_core->initSimulation()) {
      return 1;
   }
   
   OSMesaContext osmesa_ctx = OSMesaCreateContext(OSMESA_RGBA, NULL);
   GLfloat *buffer = (GLfloat *) malloc(WIDTH*HEIGHT*4*sizeof(GLfloat));
   if (!buffer) {
      cerr << "Alloc image buffer failed!\n";
      return 1;
   }

   if (!OSMesaMakeCurrent(osmesa_ctx, buffer, GL_FLOAT, WIDTH, HEIGHT)) {
      cerr << "OSMesaMakeCurrent failed!\n";
      return 1;
   }

   celestia_core->initRenderer();

   time_t curtime = time(NULL);
   celestia_core->start((double) curtime / 86400.0 +
         (double) astro::Date(1970, 1, 1));
   localtime(&curtime);
   celestia_core->setTimeZoneBias(-timezone);
   celestia_core->setTimeZoneName(tzname[daylight?0:1]);

   if (script_arg) {
      cout << "Using cel script: " << script_arg << endl;
      celestia_core->runScript(script_arg);
   }

   celestia_core->draw();
   glFinish();

   write_targa("out.tga", buffer, WIDTH, HEIGHT);

   free(buffer);
   OSMesaDestroyContext(osmesa_ctx);

   return 0;
}

static void
cleanup(void)
{
   if (celestia_core != NULL) {
      delete celestia_core;
   }
}

static void
write_targa(const char *fname, const GLfloat *buffer, int width, int height)
{
   ofstream fout(fname);
   if (fout.fail()) {
      cerr << "targa output failed!\n";
      return;
   }

   const GLfloat *ptr = buffer;
   
   cout << "writing tga file\n";

   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x02;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) 0x00;
   fout << (char) (WIDTH & 0xff);
   fout << (char) ((WIDTH >> 8) & 0xff);
   fout << (char) (HEIGHT & 0xff);
   fout << (char) ((HEIGHT >> 8) & 0xff);
   fout << (char) 0x18;
   fout << (char) 0x20;

   int i;
   int x;
   int y;
   for (y=height-1; y>=0; y--) {
      for (x=0; x<width; x++) {
         int r, g, b;
         i = (y*width + x) * 4;
         r = (int) (ptr[i+0] * 255.0);
         g = (int) (ptr[i+1] * 255.0);
         b = (int) (ptr[i+2] * 255.0);
         if (r > 255) r = 255;
         if (g > 255) g = 255;
         if (b > 255) b = 255;

         fout << (char) b;
         fout << (char) g;
         fout << (char) r;
      }
   }

   fout.close();
}

Re: OSMesa 'frontend' troubles

Posted: 07.08.2012, 04:26
by John Van Vliet
--- edit ---

Re: OSMesa 'frontend' troubles

Posted: 07.08.2012, 13:58
by sgcb
Right, I am using Debian GNU/Linux as my OS here and I'm using a radeon 4850 for graphics driven by open source mesa/gallium3d. Mesa/Gallium3d is provided by libgl1-mesa-dri and osmesa provided by libosmes6 both at version 8.0.4-1

If it's at all useful, I will provide the output of $ glxinfo and $ osmesainfo (this is not a distributed program that I'm aware of, I had to code this myself) I'm not a mesa developer by any means, but I /think/ osmesa uses mesa's software rasterizer for rendering which may mean the specific card/driver is less of a factor here than it might be in other situations.

$ glxinfo

Code: Select all

name of display: :1
display: :1  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.4
server glx extensions:
    GLX_ARB_multisample, GLX_EXT_import_context, GLX_EXT_texture_from_pixmap,
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_copy_sub_buffer,
    GLX_OML_swap_method, GLX_SGI_swap_control, GLX_SGIS_multisample,
    GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group,
    GLX_INTEL_swap_event
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:
    GLX_ARB_create_context, GLX_ARB_create_context_profile,
    GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context,
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_framebuffer_sRGB,
    GLX_EXT_create_context_es2_profile, GLX_MESA_copy_sub_buffer,
    GLX_MESA_multithread_makecurrent, GLX_MESA_swap_control,
    GLX_OML_swap_method, GLX_OML_sync_control, GLX_SGI_make_current_read,
    GLX_SGI_swap_control, GLX_SGI_video_sync, GLX_SGIS_multisample,
    GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group,
    GLX_EXT_texture_from_pixmap, GLX_INTEL_swap_event
GLX version: 1.4
GLX extensions:
    GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context,
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_copy_sub_buffer,
    GLX_MESA_multithread_makecurrent, GLX_MESA_swap_control,
    GLX_OML_swap_method, GLX_OML_sync_control, GLX_SGI_make_current_read,
    GLX_SGI_swap_control, GLX_SGI_video_sync, GLX_SGIS_multisample,
    GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group,
    GLX_EXT_texture_from_pixmap
OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD RV770
OpenGL version string: 2.1 Mesa 8.0.4
OpenGL shading language version string: 1.20
OpenGL extensions:
    GL_ARB_multisample, GL_EXT_abgr, GL_EXT_bgra, GL_EXT_blend_color,
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_copy_texture,
    GL_EXT_polygon_offset, GL_EXT_subtexture, GL_EXT_texture_object,
    GL_EXT_vertex_array, GL_EXT_compiled_vertex_array, GL_EXT_texture,
    GL_EXT_texture3D, GL_IBM_rasterpos_clip, GL_ARB_point_parameters,
    GL_EXT_draw_range_elements, GL_EXT_packed_pixels, GL_EXT_point_parameters,
    GL_EXT_rescale_normal, GL_EXT_separate_specular_color,
    GL_EXT_texture_edge_clamp, GL_SGIS_generate_mipmap,
    GL_SGIS_texture_border_clamp, GL_SGIS_texture_edge_clamp,
    GL_SGIS_texture_lod, GL_ARB_framebuffer_sRGB, GL_ARB_multitexture,
    GL_EXT_framebuffer_sRGB, GL_IBM_multimode_draw_arrays,
    GL_IBM_texture_mirrored_repeat, GL_ARB_texture_cube_map,
    GL_ARB_texture_env_add, GL_ARB_transpose_matrix,
    GL_EXT_blend_func_separate, GL_EXT_fog_coord, GL_EXT_multi_draw_arrays,
    GL_EXT_secondary_color, GL_EXT_texture_env_add,
    GL_EXT_texture_filter_anisotropic, GL_EXT_texture_lod_bias,
    GL_INGR_blend_func_separate, GL_NV_blend_square, GL_NV_light_max_exponent,
    GL_NV_texgen_reflection, GL_NV_texture_env_combine4, GL_S3_s3tc,
    GL_SUN_multi_draw_arrays, GL_ARB_texture_border_clamp,
    GL_ARB_texture_compression, GL_EXT_framebuffer_object,
    GL_EXT_texture_compression_s3tc, GL_EXT_texture_env_combine,
    GL_EXT_texture_env_dot3, GL_MESA_window_pos, GL_NV_packed_depth_stencil,
    GL_NV_texture_rectangle, GL_ARB_depth_texture, GL_ARB_occlusion_query,
    GL_ARB_shadow, GL_ARB_texture_env_combine, GL_ARB_texture_env_crossbar,
    GL_ARB_texture_env_dot3, GL_ARB_texture_mirrored_repeat,
    GL_ARB_window_pos, GL_EXT_stencil_two_side, GL_EXT_texture_cube_map,
    GL_NV_depth_clamp, GL_NV_fog_distance, GL_APPLE_packed_pixels,
    GL_APPLE_vertex_array_object, GL_ARB_draw_buffers,
    GL_ARB_fragment_program, GL_ARB_fragment_shader, GL_ARB_shader_objects,
    GL_ARB_vertex_program, GL_ARB_vertex_shader, GL_ATI_draw_buffers,
    GL_ATI_texture_env_combine3, GL_ATI_texture_float, GL_EXT_shadow_funcs,
    GL_EXT_stencil_wrap, GL_MESA_pack_invert, GL_NV_primitive_restart,
    GL_ARB_depth_clamp, GL_ARB_fragment_program_shadow,
    GL_ARB_half_float_pixel, GL_ARB_occlusion_query2, GL_ARB_point_sprite,
    GL_ARB_shading_language_100, GL_ARB_sync, GL_ARB_texture_non_power_of_two,
    GL_ARB_vertex_buffer_object, GL_ATI_blend_equation_separate,
    GL_EXT_blend_equation_separate, GL_OES_read_format,
    GL_ARB_color_buffer_float, GL_ARB_pixel_buffer_object,
    GL_ARB_texture_compression_rgtc, GL_ARB_texture_float,
    GL_ARB_texture_rectangle, GL_ATI_texture_compression_3dc,
    GL_EXT_packed_float, GL_EXT_pixel_buffer_object,
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_rgtc,
    GL_EXT_texture_mirror_clamp, GL_EXT_texture_rectangle,
    GL_EXT_texture_sRGB, GL_EXT_texture_shared_exponent,
    GL_ARB_framebuffer_object, GL_EXT_framebuffer_blit,
    GL_EXT_framebuffer_multisample, GL_EXT_packed_depth_stencil,
    GL_ARB_vertex_array_object, GL_ATI_separate_stencil,
    GL_ATI_texture_mirror_once, GL_EXT_draw_buffers2,
    GL_EXT_gpu_program_parameters, GL_EXT_texture_array,
    GL_EXT_texture_compression_latc, GL_EXT_texture_sRGB_decode,
    GL_EXT_timer_query, GL_OES_EGL_image, GL_MESA_texture_array,
    GL_ARB_copy_buffer, GL_ARB_depth_buffer_float, GL_ARB_half_float_vertex,
    GL_ARB_instanced_arrays, GL_ARB_map_buffer_range, GL_ARB_texture_rg,
    GL_ARB_texture_swizzle, GL_ARB_vertex_array_bgra,
    GL_EXT_separate_shader_objects, GL_EXT_texture_swizzle,
    GL_EXT_vertex_array_bgra, GL_NV_conditional_render,
    GL_AMD_draw_buffers_blend, GL_AMD_shader_stencil_export,
    GL_ARB_ES2_compatibility, GL_ARB_draw_buffers_blend,
    GL_ARB_draw_elements_base_vertex, GL_ARB_explicit_attrib_location,
    GL_ARB_fragment_coord_conventions, GL_ARB_provoking_vertex,
    GL_ARB_sampler_objects, GL_ARB_seamless_cube_map,
    GL_ARB_shader_stencil_export, GL_ARB_shader_texture_lod,
    GL_ARB_texture_rgb10_a2ui, GL_ARB_vertex_type_2_10_10_10_rev,
    GL_EXT_provoking_vertex, GL_EXT_texture_snorm,
    GL_MESA_texture_signed_rgba, GL_NV_texture_barrier, GL_ARB_robustness,
    GL_ARB_texture_storage

96 GLX Visuals
    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
----------------------------------------------------------------------------
0x021 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x022 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x0fd 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x0fe 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x0ff 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x100 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x101 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x102 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x103 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x104 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x105 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x106 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x107 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x108 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x109 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x10a 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x10b 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x10c 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x10d 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x10e 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x10f 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x110 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x111 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x112 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x113 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x114 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x115 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x116 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x117 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x118 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x119 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x11a 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x11b 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x11c 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x11d 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x11e 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x11f 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x120 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x121 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x122 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x123 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x124 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x125 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x126 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x127 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x128 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x129 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x12a 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x12b 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x12c 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x12d 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x12e 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x12f 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x130 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x131 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x132 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x133 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x134 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x135 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x136 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x137 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x138 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x139 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x13a 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x13b 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x13c 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x13d 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x13e 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x13f 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x140 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x141 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x142 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x143 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x144 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x145 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x146 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x147 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x148 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x149 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x14a 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x14b 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x14c 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x14d 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x14e 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x14f 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x150 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x151 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x152 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x153 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x154 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x155 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x156 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x157 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x158 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x159 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x06c 32 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None

144 GLXFBConfigs:
    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
----------------------------------------------------------------------------
0x06d 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x06e 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x06f 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x070 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x071 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x072 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x073 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x074 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x075 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x076 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x077 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x078 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x079 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x07a 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x07b 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x07c 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x07d 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x07e 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x07f 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x080 24 tc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x081 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x082 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x083 32 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x084 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x085 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x086 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x087 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x088 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x089 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x08a 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x08b 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x08c 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x08d 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x08e 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x08f 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x090 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x091 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x092 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x093 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x094 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x095 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x096 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x097 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x098 24 tc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x099 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x09a 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x09b 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x09c 24 tc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x09d  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x09e  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x09f  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0a0  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0a1  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0a2  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0a3  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0a4  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0a5  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0a6  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0a7  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0a8  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0a9  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0aa  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0ab  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0ac  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0ad  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0ae  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0af  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0b0  0 tc  0  16  0 r  . .   5  6  5  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0b1  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0b2  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0b3  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0b4  0 tc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0b5 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x0b6 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x0b7 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x0b8 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x0b9 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
0x0ba 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0 16 16 16 16  0 0 Slow
0x0bb 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x0bc 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x0bd 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x0be 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x0bf 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0  0  0  0  0  0 0 None
0x0c0 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 16  0 16 16 16 16  0 0 Slow
0x0c1 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x0c2 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x0c3 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x0c4 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x0c5 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0  0  0  0  0  0 0 None
0x0c6 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  0 16 16 16 16  0 0 Slow
0x0c7 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x0c8 24 dc  0  32  0 r  . .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x0c9 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x0ca 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x0cb 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
0x0cc 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 Slow
0x0cd 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0ce 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0cf 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0d0 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0d1 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0d2 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0d3 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0d4 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0d5 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0d6 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0d7 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0d8 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0d9 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0da 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0db 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0dc 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0dd 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0de 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0df 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0e0 24 dc  0  24  0 r  . .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0e1 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0e2 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0e3 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0e4 24 dc  0  24  0 r  y .   8  8  8  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0e5  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0e6  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0e7  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0e8  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0e9  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0  0  0  0  0  0 0 None
0x0ea  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0  0  0 16 16 16  0  0 0 Slow
0x0eb  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0ec  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0ed  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0ee  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0ef  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0  0  0  0  0  0 0 None
0x0f0  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 16  0 16 16 16  0  0 0 Slow
0x0f1  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0f2  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0f3  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0f4  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0f5  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0  0  0  0  0  0 0 None
0x0f6  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  0 16 16 16  0  0 0 Slow
0x0f7  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0f8  0 dc  0  16  0 r  . .   5  6  5  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0f9  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0fa  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8 16 16 16  0  0 0 Slow
0x0fb  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8  0  0  0  0  0 0 None
0x0fc  0 dc  0  16  0 r  y .   5  6  5  0 .  .  0 24  8 16 16 16  0  0 0 Slow


$ ./osmesainfo

Code: Select all

OpenGL vendor string: Brian Paul
OpenGL renderer string: Mesa OffScreen32
OPenGL version string: 2.1 Mesa 8.0.4
OpenGL shading language version string: 1.20
OpenGL extensions:
    GL_3DFX_texture_compression_FXT1, GL_APPLE_object_purgeable,
    GL_APPLE_packed_pixels, GL_APPLE_vertex_array_object, GL_ARB_copy_buffer,
    GL_ARB_depth_clamp, GL_ARB_depth_texture, GL_ARB_draw_buffers,
    GL_ARB_draw_elements_base_vertex, GL_ARB_draw_instanced,
    GL_ARB_explicit_attrib_location, GL_ARB_fragment_coord_conventions,
    GL_ARB_fragment_program, GL_ARB_fragment_program_shadow,
    GL_ARB_fragment_shader, GL_ARB_framebuffer_object,
    GL_ARB_half_float_pixel, GL_ARB_half_float_vertex,
    GL_ARB_map_buffer_range, GL_ARB_multisample, GL_ARB_multitexture,
    GL_ARB_occlusion_query, GL_ARB_occlusion_query2,
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite,
    GL_ARB_provoking_vertex, GL_ARB_robustness, GL_ARB_shader_objects,
    GL_ARB_shading_language_100, GL_ARB_shadow, GL_ARB_shadow_ambient,
    GL_ARB_sync, GL_ARB_texture_border_clamp, GL_ARB_texture_compression,
    GL_ARB_texture_compression_rgtc, GL_ARB_texture_cube_map,
    GL_ARB_texture_env_add, GL_ARB_texture_env_combine,
    GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3,
    GL_ARB_texture_mirrored_repeat, GL_ARB_texture_non_power_of_two,
    GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_storage,
    GL_ARB_texture_swizzle, GL_ARB_transpose_matrix, GL_ARB_vertex_array_bgra,
    GL_ARB_vertex_array_object, GL_ARB_vertex_buffer_object,
    GL_ARB_vertex_program, GL_ARB_vertex_shader, GL_ARB_window_pos,
    GL_ATI_blend_equation_separate, GL_ATI_draw_buffers,
    GL_ATI_envmap_bumpmap, GL_ATI_fragment_shader, GL_ATI_separate_stencil,
    GL_ATI_texture_compression_3dc, GL_ATI_texture_env_combine3,
    GL_ATI_texture_mirror_once, GL_EXT_abgr, GL_EXT_bgra, GL_EXT_blend_color,
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate,
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_compiled_vertex_array,
    GL_EXT_copy_texture, GL_EXT_depth_bounds_test, GL_EXT_draw_buffers2,
    GL_EXT_draw_instanced, GL_EXT_draw_range_elements, GL_EXT_fog_coord,
    GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample,
    GL_EXT_framebuffer_object, GL_EXT_gpu_program_parameters,
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil,
    GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, GL_EXT_point_parameters,
    GL_EXT_polygon_offset, GL_EXT_provoking_vertex, GL_EXT_rescale_normal,
    GL_EXT_secondary_color, GL_EXT_separate_shader_objects,
    GL_EXT_separate_specular_color, GL_EXT_shadow_funcs,
    GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, GL_EXT_subtexture,
    GL_EXT_texture, GL_EXT_texture3D, GL_EXT_texture_array,
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_latc,
    GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc,
    GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp,
    GL_EXT_texture_env_add, GL_EXT_texture_env_combine,
    GL_EXT_texture_env_dot3, GL_EXT_texture_filter_anisotropic,
    GL_EXT_texture_lod_bias, GL_EXT_texture_mirror_clamp,
    GL_EXT_texture_object, GL_EXT_texture_rectangle, GL_EXT_texture_sRGB,
    GL_EXT_texture_sRGB_decode, GL_EXT_texture_shared_exponent,
    GL_EXT_texture_swizzle, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra,
    GL_IBM_multimode_draw_arrays, GL_IBM_rasterpos_clip,
    GL_IBM_texture_mirrored_repeat, GL_INGR_blend_func_separate,
    GL_MESA_pack_invert, GL_MESA_resize_buffers, GL_MESA_texture_array,
    GL_MESA_window_pos, GL_MESA_ycbcr_texture, GL_NV_blend_square,
    GL_NV_conditional_render, GL_NV_depth_clamp, GL_NV_fragment_program,
    GL_NV_fragment_program_option, GL_NV_light_max_exponent,
    GL_NV_packed_depth_stencil, GL_NV_point_sprite, GL_NV_texgen_reflection,
    GL_NV_texture_env_combine4, GL_NV_texture_rectangle, GL_NV_vertex_program,
    GL_NV_vertex_program1_1, GL_OES_read_format, GL_S3_s3tc,
    GL_SGIS_generate_mipmap, GL_SGIS_texture_border_clamp,
    GL_SGIS_texture_edge_clamp, GL_SGIS_texture_lod, GL_SUN_multi_draw_arrays,

osmesainfo source code, osmesainfo.c:

Code: Select all

/*
 * Compile with something like:
 *   gcc -o osmesainfo osmesainfo.c -lOSMesa32 -lGL
 */

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <GL/osmesa.h>

#define WIDTH 1920
#define HEIGHT 1080

static void print_extension_list(const char *);
static int compare_string_ptr(const void *, const void *);

int
main(int argc, char **argv)
{
   OSMesaContext ctx = OSMesaCreateContext(OSMESA_RGBA, NULL);

   GLfloat *buffer = (GLfloat *) malloc(WIDTH*HEIGHT*4*sizeof(GLfloat));
   if (!buffer) {
      printf("Alloc image buffer failed!\n");
      return 0;
   }

   if (!OSMesaMakeCurrent(ctx, buffer, GL_FLOAT, WIDTH, HEIGHT)) {
      printf("OSMesaMakeCurrent failed!\n");
      return 0;
   }

   const char *gl_vendor = (const char *) glGetString(GL_VENDOR);
   const char *gl_renderer = (const char *) glGetString(GL_RENDERER);
   const char *gl_version = (const char *) glGetString(GL_VERSION);
   const char *gl_extensions = (const char *) glGetString(GL_EXTENSIONS);

   printf("OpenGL vendor string: %s\n", gl_vendor);
   printf("OpenGL renderer string: %s\n", gl_renderer);
   printf("OPenGL version string: %s\n", gl_version);
#ifdef GL_VERSION_2_0
   if (gl_version[0] >= '2' && gl_version[1] == '.') {
      char *v = (char *) glGetString(GL_SHADING_LANGUAGE_VERSION);
      printf("OpenGL shading language version string: %s\n", v);
   }
#endif
   printf("OpenGL extensions:\n");
   print_extension_list(gl_extensions);

   free(buffer);
   OSMesaDestroyContext(ctx);

   return 0;
}

static void
print_extension_list(const char *ext)
{
   /* count number of extensions, ignore successive spaces */
   int n_extensions = 0;
   int j = 1;
   do {
      if ((ext[j] == ' ' || ext[j] == 0) && ext[j-1] != ' ') {
         ++n_extensions;
      }
   } while (ext[j++]);

   char **extensions = (char **) malloc(n_extensions * sizeof *extensions);
   if (!extensions) {
      fprintf(stderr, "Error: malloc() failed!\n");
      exit(1);
   }

   int i = 0;
   int k = 0;

   for (j=0;;j++) {
      /*
       * Use De Morgan's law to provide less indentation for the body of the
       * loop. Everything after this if branch could've been placed in 'if
       * (ext[j] == ' ' || ext[j] == 0)'
       */
      if (ext[j] != ' ' && ext[j] != 0) {
         continue;
      }

      const int len = j - i;
      
      if (len) {
         assert(k < n_extensions);

         extensions[k] = malloc(len+1);
         if (!extensions[k]) {
            fprintf(stderr, "Error: malloc() failed!\n");
            exit(1);
         }

         memcpy(extensions[k], ext + i, len);
         extensions[k][len] = 0;

         ++k;
      }

      i += len +1;

      if (ext[j] == 0) {
         break;
      }
   }
   assert(k == n_extensions);

   qsort(extensions, n_extensions, sizeof extensions[0], compare_string_ptr);

   const char *indent_string = "    ";
   const int indent = 4;
   const int max = 79;
   int width = indent;

   printf("%s", indent_string);
   for (k=0; k<n_extensions; ++k) {
      const int len = strlen(extensions[k]);

      if ((width + len) > max) {
         printf("\n");
         width = indent;
         printf("%s", indent_string);
      }

      printf("%s", extensions[k]);

      width += len + 1;

      printf(", ");
      width += 2;
   }
   printf("\n");

   for (k=0; k<n_extensions; ++k) {
      free(extensions[k]);
   }
   free(extensions);
}

static int
compare_string_ptr(const void *p1, const void *p2)
{
   return strcmp(*(char * const *)p1, *(char * const *) p2);
}

Re: OSMesa 'frontend' troubles

Posted: 09.08.2012, 08:59
by John Van Vliet
--- edit ---

Re: OSMesa 'frontend' troubles

Posted: 09.08.2012, 16:07
by sgcb
There hasn't been much progress on my end. I'm in sort of a sleep mode waiting for any additional insight to come my way... :)

john Van Vliet wrote:it looks like you are calling the non gui as something like this

Code: Select all

osmesamain LocationScript.celx
Actually with the modifications I provided in my first post to configure.in and src/celestia/Makefile.am, I'm able to compile using celestia's autotools infrastructure.

Code: Select all

$ autoreconf -v -i
$ ./configure --with-osmesa
$ make

The 'celestia' binary is compiled using osmesamain.cpp's main entry point. Then:

Code: Select all

$ ./celestia --script /path/to/script.celx
executes with the provided startup script. Details regarding the command option handling can be found in the getopt manpage: $ man getopt_long

if using a script dose that script work in the normal celestia
It does work for me, though I do hope the "CELESTIA" text the fades in during launch can be removed somehow:

Code: Select all

longitude = math.rad(-92.93);
latitude = math.rad(0.0);

earth = celestia:find("Sol/Earth");
r = earth:radius() + 15000;

celestia:select(earth);

obs = celestia:getobserver();
obs:synchronous(earth);
obs:gotolonglat(earth, longitude, latitude, r, 0);


you are calling GLfloat but then changing to a 8 bit char
Here, I was using osdemo32 as example. It's possible I may have misunderstood something or made a logical error when porting that code to c++.

have you tried using a float all the way through and saving as a 32 bit float "raw" image

then use any program to read that raw
( like Gmic -- what can i say i like this program, it has mostly replaced ImageMagick)
I'm not quite sure how to do this. Like I mentioned, I'm not too graphically inclined and don't know the specific format to writing a raw image. I've tried writing the contents of 'buffer' to a file, however imagemagick's 'identify' utility does not recognize that format.

Thanks for the help so far. I really appreciate it! :)

Re: OSMesa 'frontend' troubles

Posted: 09.08.2012, 20:43
by John Van Vliet
--- edit ---

Re: OSMesa 'frontend' troubles

Posted: 09.08.2012, 21:13
by sgcb
john Van Vliet wrote:that is easy
that is located in the celestia.cfg file
Thanks :)

I don't understand this bit though
depending on the way you built it
Q8 or Q16
it is 8 bit or 16 bit
q16 can do 8 bit or 16 bit LSB/MSB images
What is Q8/Q16 referring to?

Re: OSMesa 'frontend' troubles

Posted: 05.01.2013, 05:36
by sgcb
It seems I've made some progress in this endeavor: It appears the only thing needed to get something drawn in the targa output file is to make a call to celestia_core->resize() before we dump to file and exit!

My problem now is that the 'camera' is somehow stuck at the center of the earth (seen in attachment) No amount of waiting for the script to complete seems to help the situation. At least not 512 iterations of simulation tick/draw:

Code: Select all

    celestia_core->resize(WIDTH, HEIGHT);

    for (int i=0; i<512; i++) {
        celestia_core->tick();
        celestia_core->draw();
    }

    glFinish();


Is there some subtlety to the render process that I'm missing? Let me know if you have any ideas. I'm stumped once again

Re: OSMesa 'frontend' troubles

Posted: 07.01.2013, 18:01
by symaski62
bug => distance: -6,378.1 km

:mrgreen: image ...