[Mesa-dev,1/2] st/mesa: add a debug option to compile shaders at link time

Submitted by Marek Olšák on April 10, 2015, 10:21 p.m.

Details

Message ID 1428704478-17911-1-git-send-email-maraeo@gmail.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Marek Olšák April 10, 2015, 10:21 p.m.
From: Marek Olšák <marek.olsak@amd.com>

---
 src/mesa/state_tracker/st_cb_program.c |  4 ++++
 src/mesa/state_tracker/st_debug.c      |  1 +
 src/mesa/state_tracker/st_debug.h      |  1 +
 src/mesa/state_tracker/st_program.c    | 44 ++++++++++++++++++++++++++++++++++
 src/mesa/state_tracker/st_program.h    |  3 +++
 5 files changed, 53 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index aa301d8..c382d7d 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -41,6 +41,7 @@ 
 #include "draw/draw_context.h"
 
 #include "st_context.h"
+#include "st_debug.h"
 #include "st_program.h"
 #include "st_mesa_to_tgsi.h"
 #include "st_cb_program.h"
@@ -214,6 +215,9 @@  st_program_string_notify( struct gl_context *ctx,
 	 st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
    }
 
+   if (ST_DEBUG & DEBUG_PRECOMPILE)
+      st_precompile_shader_variant(st, prog);
+
    /* XXX check if program is legal, within limits */
    return GL_TRUE;
 }
diff --git a/src/mesa/state_tracker/st_debug.c b/src/mesa/state_tracker/st_debug.c
index de3e3a9..50891c1 100644
--- a/src/mesa/state_tracker/st_debug.c
+++ b/src/mesa/state_tracker/st_debug.c
@@ -56,6 +56,7 @@  static const struct debug_named_value st_debug_flags[] = {
    { "draw",     DEBUG_DRAW, NULL },
    { "buffer",   DEBUG_BUFFER, NULL },
    { "wf",       DEBUG_WIREFRAME, NULL },
+   { "precompile",  DEBUG_PRECOMPILE, NULL },
    DEBUG_NAMED_VALUE_END
 };
 
diff --git a/src/mesa/state_tracker/st_debug.h b/src/mesa/state_tracker/st_debug.h
index cc81978..288eccf 100644
--- a/src/mesa/state_tracker/st_debug.h
+++ b/src/mesa/state_tracker/st_debug.h
@@ -47,6 +47,7 @@  st_print_current(void);
 #define DEBUG_DRAW      0x100
 #define DEBUG_BUFFER    0x200
 #define DEBUG_WIREFRAME 0x400
+#define DEBUG_PRECOMPILE   0x800
 
 #ifdef DEBUG
 extern int ST_DEBUG;
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 4cfd817..2415c03 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -1318,3 +1318,47 @@  st_print_current_vertex_program(void)
       }
    }
 }
+
+
+/**
+ * Compile one shader variant.
+ */
+void
+st_precompile_shader_variant(struct st_context *st,
+                             struct gl_program *prog)
+{
+   switch (prog->Target) {
+   case GL_VERTEX_PROGRAM_ARB: {
+      struct st_vertex_program *p = (struct st_vertex_program *)prog;
+      struct st_vp_variant_key key;
+
+      memset(&key, 0, sizeof(key));
+      key.st = st;
+      st_get_vp_variant(st, p, &key);
+      break;
+   }
+
+   case GL_GEOMETRY_PROGRAM_NV: {
+      struct st_geometry_program *p = (struct st_geometry_program *)prog;
+      struct st_gp_variant_key key;
+
+      memset(&key, 0, sizeof(key));
+      key.st = st;
+      st_get_gp_variant(st, p, &key);
+      break;
+   }
+
+   case GL_FRAGMENT_PROGRAM_ARB: {
+      struct st_fragment_program *p = (struct st_fragment_program *)prog;
+      struct st_fp_variant_key key;
+
+      memset(&key, 0, sizeof(key));
+      key.st = st;
+      st_get_fp_variant(st, p, &key);
+      break;
+   }
+
+   default:
+      assert(0);
+   }
+}
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index 451d7bb..b2c86fa 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -329,6 +329,9 @@  st_destroy_program_variants(struct st_context *st);
 extern void
 st_print_current_vertex_program(void);
 
+extern void
+st_precompile_shader_variant(struct st_context *st,
+                             struct gl_program *prog);
 
 #ifdef __cplusplus
 }