This patch causes libdrm, when NOUVEAU_DUMP=1 is set, to write the
pushbuffer to stdout instead of submitting it to the card.

renouveau-parse can then be used to parse it and obtain a readable
trace.

This is very useful for debugging and optimizing the Gallium driver.
---
 nouveau/nouveau_private.h |    1 +
 nouveau/nouveau_pushbuf.c |   13 +++++++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/nouveau/nouveau_private.h b/nouveau/nouveau_private.h
index 0e526a1..bed117a 100644
--- a/nouveau/nouveau_private.h
+++ b/nouveau/nouveau_private.h
@@ -40,6 +40,7 @@
 #define CALPB_BUFSZ   16384
 struct nouveau_pushbuf_priv {
        int no_aper_update;
+       int use_dump;
        int use_cal;
        uint32_t cal_suffix0;
        uint32_t cal_suffix1;
diff --git a/nouveau/nouveau_pushbuf.c b/nouveau/nouveau_pushbuf.c
index b6af216..4cb8985 100644
--- a/nouveau/nouveau_pushbuf.c
+++ b/nouveau/nouveau_pushbuf.c
@@ -148,7 +148,10 @@ nouveau_pushbuf_init(struct nouveau_channel *chan)
        struct nouveau_pushbuf_priv *nvpb = &nvchan->pb;
        int ret;
 
-       nouveau_pushbuf_init_call(chan);
+       if(getenv("NOUVEAU_DUMP"))
+               nvpb->use_dump = 1;
+       if(!nvpb->use_dump)
+               nouveau_pushbuf_init_call(chan);
 
        ret = nouveau_pushbuf_space(chan, 0);
        if (ret) {
@@ -190,7 +193,13 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, 
unsigned min)
        if (chan->cur == nvpb->pushbuf)
                return 0;
 
-       if (nvpb->use_cal) {
+       if (nvpb->use_dump) {
+               uint32_t* p;
+               printf("# begin %i dwords %i buffers %i relocs\n", chan->cur - 
nvpb->pushbuf, nvpb->nr_buffers, nvpb->nr_relocs);
+               for(p = nvpb->pushbuf; p != chan->cur; ++p)
+                       printf("%08x\n", *p);   
+               printf("# end\n");
+       } else if (nvpb->use_cal) {
                struct drm_nouveau_gem_pushbuf_call req;
 
                *(chan->cur++) = nvpb->cal_suffix0;
-- 
1.6.6.1.476.g01ddb

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to