[Mesa-dev] [PATCH] mesa: Dump ARB_vp/fp source and IR when MESA_GLSL=dump.

Kenneth Graunke kenneth at whitecape.org
Sun May 11 23:03:03 PDT 2014


As far as I can tell, Mesa hasn't had a convenient way to dump ARB_vp/fp
source until now.  Using MESA_GLSL=dump is convenient, since it means
you can use a single environment variable to dump a program's shaders,
no matter which language they're written in.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/main/arbprogram.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

I've also got some shader-db patches to take advantage of this.

diff --git a/src/mesa/main/arbprogram.c b/src/mesa/main/arbprogram.c
index 247b492..fe8cd6b 100644
--- a/src/mesa/main/arbprogram.c
+++ b/src/mesa/main/arbprogram.c
@@ -38,6 +38,7 @@
 #include "main/arbprogram.h"
 #include "program/arbprogparse.h"
 #include "program/program.h"
+#include "program/prog_print.h"
 
 
 /**
@@ -308,6 +309,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
                        const GLvoid *string)
 {
    struct gl_program *base;
+   bool failed;
    GET_CURRENT_CONTEXT(ctx);
 
    FLUSH_VERTICES(ctx, _NEW_PROGRAM);
@@ -341,13 +343,36 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
       return;
    }
 
-   if (ctx->Program.ErrorPos == -1) {
+   failed = ctx->Program.ErrorPos != -1;
+
+   if (!failed) {
       /* finally, give the program to the driver for translation/checking */
       if (!ctx->Driver.ProgramStringNotify(ctx, target, base)) {
+         failed = true;
          _mesa_error(ctx, GL_INVALID_OPERATION,
                      "glProgramStringARB(rejected by driver");
       }
    }
+
+   if (ctx->_Shader->Flags & GLSL_DUMP) {
+      const char *shader_type =
+         target == GL_FRAGMENT_PROGRAM_ARB ? "fragment" : "vertex";
+
+      fprintf(stderr, "ARB_%s_program source for program %d:\n",
+              shader_type, base->Id);
+      fprintf(stderr, "%s\n", (const char *) string);
+
+      if (failed) {
+         fprintf(stderr, "ARB_%s_program %d failed to compile.\n",
+                 shader_type, base->Id);
+      } else {
+         fprintf(stderr, "Mesa IR for ARB_%s_program %d:\n",
+                 shader_type, base->Id);
+         _mesa_print_program(base);
+         fprintf(stderr, "\n");
+      }
+      fflush(stderr);
+   }
 }
 
 
-- 
1.9.2



More information about the mesa-dev mailing list