diff options
Diffstat (limited to 'src/mesa/main/debug.c')
| -rw-r--r-- | src/mesa/main/debug.c | 243 | 
1 files changed, 220 insertions, 23 deletions
| diff --git a/src/mesa/main/debug.c b/src/mesa/main/debug.c index 8492c8561d..a42113edca 100644 --- a/src/mesa/main/debug.c +++ b/src/mesa/main/debug.c @@ -27,6 +27,8 @@  #include "attrib.h"  #include "colormac.h"  #include "context.h" +#include "enums.h" +#include "formats.h"  #include "hash.h"  #include "imports.h"  #include "debug.h" @@ -35,7 +37,6 @@  #include "readpix.h"  #include "texgetimage.h"  #include "texobj.h" -#include "texformat.h"  /** @@ -57,6 +58,31 @@ const char *_mesa_prim_name[GL_POLYGON+4] = {     "unknown state"  }; + +static const char * +tex_target_name(GLenum tgt) +{ +   static const struct { +      GLenum target; +      const char *name; +   } tex_targets[] = { +      { GL_TEXTURE_1D, "GL_TEXTURE_1D" }, +      { GL_TEXTURE_2D, "GL_TEXTURE_2D" }, +      { GL_TEXTURE_3D, "GL_TEXTURE_3D" }, +      { GL_TEXTURE_CUBE_MAP, "GL_TEXTURE_CUBE_MAP" }, +      { GL_TEXTURE_RECTANGLE, "GL_TEXTURE_RECTANGLE" }, +      { GL_TEXTURE_1D_ARRAY_EXT, "GL_TEXTURE_1D_ARRAY" }, +      { GL_TEXTURE_2D_ARRAY_EXT, "GL_TEXTURE_2D_ARRAY" } +   }; +   GLuint i; +   for (i = 0; i < Elements(tex_targets); i++) { +      if (tex_targets[i].target == tgt) +         return tex_targets[i].name; +   } +   return "UNKNOWN TEX TARGET"; +} + +  void  _mesa_print_state( const char *msg, GLuint state )  { @@ -167,14 +193,16 @@ static void add_debug_flags( const char *debug )     static const struct debug_option debug_opt[] = {        { "varray",    VERBOSE_VARRAY },        { "tex",       VERBOSE_TEXTURE }, -      { "imm",       VERBOSE_IMMEDIATE }, +      { "mat",       VERBOSE_MATERIAL },        { "pipe",      VERBOSE_PIPELINE },        { "driver",    VERBOSE_DRIVER },        { "state",     VERBOSE_STATE },        { "api",       VERBOSE_API },        { "list",      VERBOSE_DISPLAY_LIST },        { "lighting",  VERBOSE_LIGHTING }, -      { "disassem",  VERBOSE_DISASSEM } +      { "disassem",  VERBOSE_DISASSEM }, +      { "draw",      VERBOSE_DRAW }, +      { "swap",      VERBOSE_SWAPBUFFERS }     };     GLuint i; @@ -262,10 +290,13 @@ write_ppm(const char *filename, const GLubyte *buffer, int width, int height,  /** - * Write level[0] image to a ppm file. + * Write a texture image to a ppm file. + * \param face  cube face in [0,5] + * \param level  mipmap level   */  static void -write_texture_image(struct gl_texture_object *texObj, GLuint face, GLuint level) +write_texture_image(struct gl_texture_object *texObj, +                    GLuint face, GLuint level)  {     struct gl_texture_image *img = texObj->Image[face][level];     if (img) { @@ -285,7 +316,7 @@ write_texture_image(struct gl_texture_object *texObj, GLuint face, GLuint level)                                buffer, texObj, img);        /* make filename */ -      _mesa_sprintf(s, "/tmp/teximage%u.ppm", texObj->Name); +      _mesa_sprintf(s, "/tmp/tex%u.l%u.f%u.ppm", texObj->Name, level, face);        _mesa_printf("  Writing image level %u to %s\n", level, s);        write_ppm(s, buffer, img->Width, img->Height, 4, 0, 1, 2, GL_FALSE); @@ -297,29 +328,76 @@ write_texture_image(struct gl_texture_object *texObj, GLuint face, GLuint level)  } -static GLboolean DumpImages; +/** + * Write renderbuffer image to a ppm file. + */ +static void +write_renderbuffer_image(const struct gl_renderbuffer *rb) +{ +   GET_CURRENT_CONTEXT(ctx); +   GLubyte *buffer; +   char s[100]; +   GLenum format, type; + +   if (rb->_BaseFormat == GL_RGB ||  +       rb->_BaseFormat == GL_RGBA) { +      format = GL_RGBA; +      type = GL_UNSIGNED_BYTE; +   } +   else if (rb->_BaseFormat == GL_DEPTH_STENCIL) { +      format = GL_DEPTH_STENCIL; +      type = GL_UNSIGNED_INT_24_8; +   } +   else { +      return; +   } + +   buffer = (GLubyte *) _mesa_malloc(rb->Width * rb->Height * 4); + +   ctx->Driver.ReadPixels(ctx, 0, 0, rb->Width, rb->Height, +                          format, type, &ctx->DefaultPacking, buffer); + +   /* make filename */ +   _mesa_sprintf(s, "/tmp/renderbuffer%u.ppm", rb->Name); + +   _mesa_printf("  Writing renderbuffer image to %s\n", s); +   write_ppm(s, buffer, rb->Width, rb->Height, 4, 0, 1, 2, GL_TRUE); + +   _mesa_free(buffer); +} + + +/** How many texture images (mipmap levels, faces) to write to files */ +#define WRITE_NONE 0 +#define WRITE_ONE  1 +#define WRITE_ALL  2 + +static GLuint WriteImages;  static void -dump_texture_cb(GLuint id, void *data, void *userData) +dump_texture(struct gl_texture_object *texObj, GLuint writeImages)  { -   struct gl_texture_object *texObj = (struct gl_texture_object *) data; -   int i; +   const GLuint numFaces = texObj->Target == GL_TEXTURE_CUBE_MAP ? 6 : 1;     GLboolean written = GL_FALSE; -   (void) userData; +   GLuint i, j;     _mesa_printf("Texture %u\n", texObj->Name); -   _mesa_printf("  Target 0x%x\n", texObj->Target); +   _mesa_printf("  Target %s\n", tex_target_name(texObj->Target));     for (i = 0; i < MAX_TEXTURE_LEVELS; i++) { -      struct gl_texture_image *texImg = texObj->Image[0][i]; -      if (texImg) { -         _mesa_printf("  Image %u: %d x %d x %d, format %u at %p\n", i, -                      texImg->Width, texImg->Height, texImg->Depth, -                      texImg->TexFormat->MesaFormat, texImg->Data); -         if (DumpImages && !written) { -            GLuint face = 0; -            write_texture_image(texObj, face, i); -            written = GL_TRUE; +      for (j = 0; j < numFaces; j++) { +         struct gl_texture_image *texImg = texObj->Image[j][i]; +         if (texImg) { +            _mesa_printf("  Face %u level %u: %d x %d x %d, format %s at %p\n", +                         j, i, +                         texImg->Width, texImg->Height, texImg->Depth, +                         _mesa_get_format_name(texImg->TexFormat), +                         texImg->Data); +            if (writeImages == WRITE_ALL || +                (writeImages == WRITE_ONE && !written)) { +               write_texture_image(texObj, j, i); +               written = GL_TRUE; +            }           }        }     } @@ -327,18 +405,76 @@ dump_texture_cb(GLuint id, void *data, void *userData)  /** + * Dump a single texture. + */ +void +_mesa_dump_texture(GLuint texture, GLuint writeImages) +{ +   GET_CURRENT_CONTEXT(ctx); +   struct gl_texture_object *texObj = _mesa_lookup_texture(ctx, texture); +   if (texObj) { +      dump_texture(texObj, writeImages); +   } +} + + +static void +dump_texture_cb(GLuint id, void *data, void *userData) +{ +   struct gl_texture_object *texObj = (struct gl_texture_object *) data; +   (void) userData; +   dump_texture(texObj, WriteImages); +} + + +/**   * Print basic info about all texture objext to stdout.   * If dumpImages is true, write PPM of level[0] image to a file.   */  void -_mesa_dump_textures(GLboolean dumpImages) +_mesa_dump_textures(GLuint writeImages)  {     GET_CURRENT_CONTEXT(ctx); -   DumpImages = dumpImages; +   WriteImages = writeImages;     _mesa_HashWalk(ctx->Shared->TexObjects, dump_texture_cb, ctx);  } +static void +dump_renderbuffer(const struct gl_renderbuffer *rb, GLboolean writeImage) +{ +   _mesa_printf("Renderbuffer %u: %u x %u  IntFormat = %s\n", +                rb->Name, rb->Width, rb->Height, +                _mesa_lookup_enum_by_nr(rb->InternalFormat)); +   if (writeImage) { +      write_renderbuffer_image(rb); +   } +} + + +static void +dump_renderbuffer_cb(GLuint id, void *data, void *userData) +{ +   const struct gl_renderbuffer *rb = (const struct gl_renderbuffer *) data; +   (void) userData; +   dump_renderbuffer(rb, WriteImages); +} + + +/** + * Print basic info about all renderbuffers to stdout. + * If dumpImages is true, write PPM of level[0] image to a file. + */ +void +_mesa_dump_renderbuffers(GLboolean writeImages) +{ +   GET_CURRENT_CONTEXT(ctx); +   WriteImages = writeImages; +   _mesa_HashWalk(ctx->Shared->RenderBuffers, dump_renderbuffer_cb, ctx); +} + + +  void  _mesa_dump_color_buffer(const char *filename)  { @@ -438,3 +574,64 @@ _mesa_dump_stencil_buffer(const char *filename)     _mesa_free(buf);     _mesa_free(buf2);  } + + +/** + * Quick and dirty function to "print" a texture to stdout. + */ +void +_mesa_print_texture(GLcontext *ctx, const struct gl_texture_image *img) +{ +#if CHAN_TYPE != GL_UNSIGNED_BYTE +   _mesa_problem(NULL, "PrintTexture not supported"); +#else +   GLuint i, j, c; +   const GLubyte *data = (const GLubyte *) img->Data; + +   if (!data) { +      _mesa_printf("No texture data\n"); +      return; +   } + +   /* XXX add more formats or make into a new format utility function */ +   switch (img->TexFormat) { +      case MESA_FORMAT_A8: +      case MESA_FORMAT_L8: +      case MESA_FORMAT_I8: +      case MESA_FORMAT_CI8: +         c = 1; +         break; +      case MESA_FORMAT_AL88: +      case MESA_FORMAT_AL88_REV: +         c = 2; +         break; +      case MESA_FORMAT_RGB888: +      case MESA_FORMAT_BGR888: +         c = 3; +         break; +      case MESA_FORMAT_RGBA8888: +      case MESA_FORMAT_ARGB8888: +         c = 4; +         break; +      default: +         _mesa_problem(NULL, "error in PrintTexture\n"); +         return; +   } + +   for (i = 0; i < img->Height; i++) { +      for (j = 0; j < img->Width; j++) { +         if (c==1) +            _mesa_printf("%02x  ", data[0]); +         else if (c==2) +            _mesa_printf("%02x%02x  ", data[0], data[1]); +         else if (c==3) +            _mesa_printf("%02x%02x%02x  ", data[0], data[1], data[2]); +         else if (c==4) +            _mesa_printf("%02x%02x%02x%02x  ", data[0], data[1], data[2], data[3]); +         data += (img->RowStride - img->Width) * c; +      } +      /* XXX use img->ImageStride here */ +      _mesa_printf("\n"); +   } +#endif +} | 
