summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jrfonseca@tungstengraphics.com>2008-08-06 14:48:11 +0100
committerJosé Fonseca <jrfonseca@tungstengraphics.com>2008-08-07 18:58:29 +0100
commit72a5e479789febb552ec783a1cba0ed628dfa427 (patch)
tree9ab33d9b38f1254c37915b85d1c2098a22d50f72
parent9a20cecc5cf41c5eda6cedd5f30416bc1b49ac91 (diff)
gallium: New function to dump surfaces.
-rw-r--r--src/gallium/auxiliary/util/p_debug.c43
-rw-r--r--src/gallium/include/pipe/p_debug.h8
2 files changed, 44 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/util/p_debug.c b/src/gallium/auxiliary/util/p_debug.c
index cdc7e66361d..a3db13f96d9 100644
--- a/src/gallium/auxiliary/util/p_debug.c
+++ b/src/gallium/auxiliary/util/p_debug.c
@@ -50,12 +50,12 @@
#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
diff --git a/src/gallium/include/pipe/p_debug.h b/src/gallium/include/pipe/p_debug.h
index a5816c3cbb7..6478ae2f08e 100644
--- a/src/gallium/include/pipe/p_debug.h
+++ b/src/gallium/include/pipe/p_debug.h
@@ -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