i965: Dump shader source for linked shader programs.
authorEric Anholt <eric@anholt.net>
Fri, 22 Mar 2013 23:50:58 +0000 (16:50 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 1 Apr 2013 18:30:36 +0000 (11:30 -0700)
We dump shader source in ir_to_mesa.cpp, and we dump linked programs here,
but we had no reference from the linked programs to their source.  This
was preventing improvement of shader-db to use linked shader programs
instead of individual shader files (which is bogus, because it means we
optimize out VS outputs, and don't interpolate FS inputs!)

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_shader.cpp

index 066cf4e21f33000eb364f0ebcaf2936a08416a75..1a520391ec14383b77524556f310c0c9193cab7a 100644 (file)
@@ -113,6 +113,8 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
    struct brw_context *brw = brw_context(ctx);
    struct intel_context *intel = &brw->intel;
    unsigned int stage;
+   static const char *target_strings[]
+      = { "vertex", "fragment", "geometry" };
 
    for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) {
       struct brw_shader *shader =
@@ -256,12 +258,26 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
       _mesa_reference_program(ctx, &prog, NULL);
 
       if (ctx->Shader.Flags & GLSL_DUMP) {
-         static const char *target_strings[]
-            = { "vertex", "fragment", "geometry" };
          printf("\n");
          printf("GLSL IR for linked %s program %d:\n", target_strings[stage],
                 shProg->Name);
          _mesa_print_ir(shader->base.ir, NULL);
+         printf("\n");
+      }
+   }
+
+   if (ctx->Shader.Flags & GLSL_DUMP) {
+      for (unsigned i = 0; i < shProg->NumShaders; i++) {
+         const struct gl_shader *sh = shProg->Shaders[i];
+         if (!sh)
+            continue;
+
+         printf("GLSL %s shader %d source for linked program %d:\n",
+                target_strings[_mesa_shader_type_to_index(sh->Type)],
+                i,
+                shProg->Name);
+         printf("%s", sh->Source);
+         printf("\n");
       }
    }