gallium: New function to dump surfaces.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Wed, 6 Aug 2008 13:48:11 +0000 (14:48 +0100)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 7 Aug 2008 17:58:29 +0000 (18:58 +0100)
src/gallium/auxiliary/util/p_debug.c
src/gallium/include/pipe/p_debug.h

index cdc7e66361d95db205c42fbb38a3925facfafca6..a3db13f96d988cbf403994dff1eb5987430f7d6b 100644 (file)
 
 #endif
 
-
-
 #include "pipe/p_compiler.h" 
 #include "pipe/p_util.h" 
 #include "pipe/p_debug.h" 
 #include "pipe/p_format.h" 
+#include "pipe/p_state.h" 
+#include "pipe/p_inlines.h" 
 #include "util/u_string.h" 
 
 
@@ -509,7 +509,7 @@ char *pf_sprint_name( char *str, enum pipe_format format )
 void debug_dump_image(const char *prefix,
                       unsigned format, unsigned cpp,
                       unsigned width, unsigned height,
-                      unsigned pitch,
+                      unsigned stride,
                       const void *data)     
 {
 #ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
@@ -530,7 +530,7 @@ void debug_dump_image(const char *prefix,
    for(i = 0; i < sizeof(filename); ++i)
       wfilename[i] = (WCHAR)filename[i];
    
-   pMap = (unsigned char *)EngMapFile(wfilename, sizeof(header) + cpp*width*height, &iFile);
+   pMap = (unsigned char *)EngMapFile(wfilename, sizeof(header) + height*width*cpp, &iFile);
    if(!pMap)
       return;
    
@@ -542,11 +542,44 @@ void debug_dump_image(const char *prefix,
    pMap += sizeof(header);
    
    for(i = 0; i < height; ++i) {
-      memcpy(pMap, (unsigned char *)data + cpp*pitch*i, cpp*width);
+      memcpy(pMap, (unsigned char *)data + stride*i, cpp*width);
       pMap += cpp*width;
    }
       
    EngUnmapFile(iFile);
 #endif
 }
+
+void debug_dump_surface(const char *prefix,
+                        struct pipe_surface *surface)     
+{
+   unsigned surface_usage;
+   void *data;
+
+   if (!surface)
+      goto error1;
+
+   /* XXX: force mappable surface */
+   surface_usage = surface->usage;
+   surface->usage |= PIPE_BUFFER_USAGE_CPU_READ;
+   
+   data = pipe_surface_map(surface, 
+                           PIPE_BUFFER_USAGE_CPU_READ);
+   if(!data)
+      goto error2;
+   
+   debug_dump_image(prefix, 
+                    surface->format,
+                    surface->block.size, 
+                    surface->nblocksx,
+                    surface->nblocksy,
+                    surface->stride,
+                    data);
+   
+   pipe_surface_unmap(surface);
+error2:
+   surface->usage = surface_usage;
+error1:
+   ;
+}
 #endif
index a5816c3cbb70f8958050132ee6386b49d69bfe0b..6478ae2f08e6a1816eb4c6707d02c6a8a9d3752f 100644 (file)
@@ -332,13 +332,17 @@ debug_profile_stop(void);
 
 
 #ifdef DEBUG
+struct pipe_surface;
 void debug_dump_image(const char *prefix,
                       unsigned format, unsigned cpp,
                       unsigned width, unsigned height,
-                      unsigned pitch,
+                      unsigned stride,
                       const void *data);
+void debug_dump_surface(const char *prefix,
+                        struct pipe_surface *surface);   
 #else
-#define debug_dump_image(prefix, format, cpp, width, height, pitch, data) ((void)0)
+#define debug_dump_image(prefix, format, cpp, width, height, stride, data) ((void)0)
+#define debug_dump_surface(prefix, surface) ((void)0)
 #endif