mesa: Remove unnecessary header.
[mesa.git] / src / mesa / main / debug.c
index 8b1707bab355a9206fad42dd38dd144bd03adaab..9bcfc1008a8852f402733053645ceecfdd279c35 100644 (file)
 #include "mtypes.h"
 #include "attrib.h"
 #include "colormac.h"
-#include "context.h"
 #include "enums.h"
+#include "formats.h"
 #include "hash.h"
 #include "imports.h"
 #include "debug.h"
 #include "get.h"
 #include "pixelstore.h"
 #include "readpix.h"
-#include "texgetimage.h"
 #include "texobj.h"
-#include "texformat.h"
 
 
 /**
@@ -54,15 +52,40 @@ const char *_mesa_prim_name[GL_POLYGON+4] = {
    "GL_QUAD_STRIP",
    "GL_POLYGON",
    "outside begin/end",
-   "inside unkown primitive",
+   "inside unknown primitive",
    "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 )
 {
    _mesa_debug(NULL,
-          "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+          "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
           msg,
           state,
           (state & _NEW_MODELVIEW)       ? "ctx->ModelView, " : "",
@@ -82,6 +105,7 @@ _mesa_print_state( const char *msg, GLuint state )
           (state & _NEW_POLYGON)         ? "ctx->Polygon, " : "",
           (state & _NEW_POLYGONSTIPPLE)  ? "ctx->PolygonStipple, " : "",
           (state & _NEW_SCISSOR)         ? "ctx->Scissor, " : "",
+          (state & _NEW_STENCIL)         ? "ctx->Stencil, " : "",
           (state & _NEW_TEXTURE)         ? "ctx->Texture, " : "",
           (state & _NEW_TRANSFORM)       ? "ctx->Transform, " : "",
           (state & _NEW_VIEWPORT)        ? "ctx->Viewport, " : "",
@@ -183,17 +207,17 @@ static void add_debug_flags( const char *debug )
 
    MESA_VERBOSE = 0x0;
    for (i = 0; i < Elements(debug_opt); i++) {
-      if (_mesa_strstr(debug, debug_opt[i].name))
+      if (strstr(debug, debug_opt[i].name))
          MESA_VERBOSE |= debug_opt[i].flag;
    }
 
    /* Debug flag:
     */
-   if (_mesa_strstr(debug, "flush")) 
+   if (strstr(debug, "flush"))
       MESA_DEBUG_FLAGS |= DEBUG_ALWAYS_FLUSH;
 
 #if defined(_FPU_GETCW) && defined(_FPU_SETCW)
-   if (_mesa_strstr(debug, "fpexceptions")) {
+   if (strstr(debug, "fpexceptions")) {
       /* raise FP exceptions */
       fpu_control_t mask;
       _FPU_GETCW(mask);
@@ -280,7 +304,7 @@ write_texture_image(struct gl_texture_object *texObj,
       GLubyte *buffer;
       char s[100];
 
-      buffer = (GLubyte *) _mesa_malloc(img->Width * img->Height
+      buffer = (GLubyte *) malloc(img->Width * img->Height
                                         * img->Depth * 4);
 
       store = ctx->Pack; /* save */
@@ -291,14 +315,14 @@ write_texture_image(struct gl_texture_object *texObj,
                               buffer, texObj, img);
 
       /* make filename */
-      _mesa_sprintf(s, "/tmp/teximage%u.ppm", texObj->Name);
+      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);
+      printf("  Writing image level %u to %s\n", level, s);
       write_ppm(s, buffer, img->Width, img->Height, 4, 0, 1, 2, GL_FALSE);
 
       ctx->Pack = store; /* restore */
 
-      _mesa_free(buffer);
+      free(buffer);
    }
 }
 
@@ -327,75 +351,112 @@ write_renderbuffer_image(const struct gl_renderbuffer *rb)
       return;
    }
 
-   buffer = (GLubyte *) _mesa_malloc(rb->Width * rb->Height * 4);
+   buffer = (GLubyte *) 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);
+   sprintf(s, "/tmp/renderbuffer%u.ppm", rb->Name);
 
-   _mesa_printf("  Writing renderbuffer image to %s\n", s);
+   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);
+   free(buffer);
 }
 
 
-static GLboolean DumpImages;
+/** 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);
+   printf("Texture %u\n", texObj->Name);
+   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) {
+            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;
+            }
          }
       }
    }
 }
 
 
+/**
+ * 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)
+{
+   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;
-
-   _mesa_printf("Renderbuffer %u: %u x %u  IntFormat = %s\n",
-                rb->Name, rb->Width, rb->Height,
-                _mesa_lookup_enum_by_nr(rb->InternalFormat));
-   if (DumpImages) {
-      write_renderbuffer_image(rb);
-   }
+   dump_renderbuffer(rb, WriteImages);
 }
 
 
@@ -404,10 +465,10 @@ dump_renderbuffer_cb(GLuint id, void *data, void *userData)
  * If dumpImages is true, write PPM of level[0] image to a file.
  */
 void
-_mesa_dump_renderbuffers(GLboolean dumpImages)
+_mesa_dump_renderbuffers(GLboolean writeImages)
 {
    GET_CURRENT_CONTEXT(ctx);
-   DumpImages = dumpImages;
+   WriteImages = writeImages;
    _mesa_HashWalk(ctx->Shared->RenderBuffers, dump_renderbuffer_cb, ctx);
 }
 
@@ -421,7 +482,7 @@ _mesa_dump_color_buffer(const char *filename)
    const GLuint h = ctx->DrawBuffer->Height;
    GLubyte *buf;
 
-   buf = (GLubyte *) _mesa_malloc(w * h * 4);
+   buf = (GLubyte *) malloc(w * h * 4);
 
    _mesa_PushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
    _mesa_PixelStorei(GL_PACK_ALIGNMENT, 1);
@@ -429,17 +490,17 @@ _mesa_dump_color_buffer(const char *filename)
 
    _mesa_ReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buf);
 
-   _mesa_printf("ReadBuffer %p 0x%x  DrawBuffer %p 0x%x\n",
-                ctx->ReadBuffer->_ColorReadBuffer,
-                ctx->ReadBuffer->ColorReadBuffer,
-                ctx->DrawBuffer->_ColorDrawBuffers[0],
-                ctx->DrawBuffer->ColorDrawBuffer[0]);
-   _mesa_printf("Writing %d x %d color buffer to %s\n", w, h, filename);
+   printf("ReadBuffer %p 0x%x  DrawBuffer %p 0x%x\n",
+         (void *) ctx->ReadBuffer->_ColorReadBuffer,
+         ctx->ReadBuffer->ColorReadBuffer,
+         (void *) ctx->DrawBuffer->_ColorDrawBuffers[0],
+         ctx->DrawBuffer->ColorDrawBuffer[0]);
+   printf("Writing %d x %d color buffer to %s\n", w, h, filename);
    write_ppm(filename, buf, w, h, 4, 0, 1, 2, GL_TRUE);
 
    _mesa_PopClientAttrib();
 
-   _mesa_free(buf);
+   free(buf);
 }
 
 
@@ -453,8 +514,8 @@ _mesa_dump_depth_buffer(const char *filename)
    GLubyte *buf2;
    GLuint i;
 
-   buf = (GLuint *) _mesa_malloc(w * h * 4);  /* 4 bpp */
-   buf2 = (GLubyte *) _mesa_malloc(w * h * 3); /* 3 bpp */
+   buf = (GLuint *) malloc(w * h * 4);  /* 4 bpp */
+   buf2 = (GLubyte *) malloc(w * h * 3); /* 3 bpp */
 
    _mesa_PushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
    _mesa_PixelStorei(GL_PACK_ALIGNMENT, 1);
@@ -469,13 +530,13 @@ _mesa_dump_depth_buffer(const char *filename)
       buf2[i*3+2] = (buf[i] >>  8) & 0xff;
    }
 
-   _mesa_printf("Writing %d x %d depth buffer to %s\n", w, h, filename);
+   printf("Writing %d x %d depth buffer to %s\n", w, h, filename);
    write_ppm(filename, buf2, w, h, 3, 0, 1, 2, GL_TRUE);
 
    _mesa_PopClientAttrib();
 
-   _mesa_free(buf);
-   _mesa_free(buf2);
+   free(buf);
+   free(buf2);
 }
 
 
@@ -489,8 +550,8 @@ _mesa_dump_stencil_buffer(const char *filename)
    GLubyte *buf2;
    GLuint i;
 
-   buf = (GLubyte *) _mesa_malloc(w * h);  /* 1 bpp */
-   buf2 = (GLubyte *) _mesa_malloc(w * h * 3); /* 3 bpp */
+   buf = (GLubyte *) malloc(w * h);  /* 1 bpp */
+   buf2 = (GLubyte *) malloc(w * h * 3); /* 3 bpp */
 
    _mesa_PushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
    _mesa_PixelStorei(GL_PACK_ALIGNMENT, 1);
@@ -504,11 +565,72 @@ _mesa_dump_stencil_buffer(const char *filename)
       buf2[i*3+2] = (buf[i] - 128) * 2;
    }
 
-   _mesa_printf("Writing %d x %d stencil buffer to %s\n", w, h, filename);
+   printf("Writing %d x %d stencil buffer to %s\n", w, h, filename);
    write_ppm(filename, buf2, w, h, 3, 0, 1, 2, GL_TRUE);
 
    _mesa_PopClientAttrib();
 
-   _mesa_free(buf);
-   _mesa_free(buf2);
+   free(buf);
+   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) {
+      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)
+            printf("%02x  ", data[0]);
+         else if (c==2)
+            printf("%02x%02x  ", data[0], data[1]);
+         else if (c==3)
+            printf("%02x%02x%02x  ", data[0], data[1], data[2]);
+         else if (c==4)
+            printf("%02x%02x%02x%02x  ", data[0], data[1], data[2], data[3]);
+         data += (img->RowStride - img->Width) * c;
+      }
+      /* XXX use img->ImageStride here */
+      printf("\n");
+   }
+#endif
 }