st/mesa: add a debug option to compile shaders at link time

v2: fix crashes

Tested-by: Tom Stellard <thomas.stellard@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Marek Olšák
2015-04-10 23:58:34 +02:00
parent 993a6288f7
commit 99eef3b8b3
6 changed files with 55 additions and 4 deletions

View File

@@ -41,6 +41,7 @@
#include "draw/draw_context.h" #include "draw/draw_context.h"
#include "st_context.h" #include "st_context.h"
#include "st_debug.h"
#include "st_program.h" #include "st_program.h"
#include "st_mesa_to_tgsi.h" #include "st_mesa_to_tgsi.h"
#include "st_cb_program.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; 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 */ /* XXX check if program is legal, within limits */
return GL_TRUE; return GL_TRUE;
} }

View File

@@ -56,6 +56,7 @@ static const struct debug_named_value st_debug_flags[] = {
{ "draw", DEBUG_DRAW, NULL }, { "draw", DEBUG_DRAW, NULL },
{ "buffer", DEBUG_BUFFER, NULL }, { "buffer", DEBUG_BUFFER, NULL },
{ "wf", DEBUG_WIREFRAME, NULL }, { "wf", DEBUG_WIREFRAME, NULL },
{ "precompile", DEBUG_PRECOMPILE, NULL },
DEBUG_NAMED_VALUE_END DEBUG_NAMED_VALUE_END
}; };

View File

@@ -47,6 +47,7 @@ st_print_current(void);
#define DEBUG_DRAW 0x100 #define DEBUG_DRAW 0x100
#define DEBUG_BUFFER 0x200 #define DEBUG_BUFFER 0x200
#define DEBUG_WIREFRAME 0x400 #define DEBUG_WIREFRAME 0x400
#define DEBUG_PRECOMPILE 0x800
#ifdef DEBUG #ifdef DEBUG
extern int ST_DEBUG; extern int ST_DEBUG;

View File

@@ -5383,7 +5383,8 @@ st_translate_program(
* program constant) has to happen before creating this linkage. * program constant) has to happen before creating this linkage.
*/ */
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
if (program->shader_program->_LinkedShaders[i] == NULL) if (program->shader_program->_LinkedShaders[i] == NULL ||
program->shader_program->_LinkedShaders[i]->Program == NULL)
continue; continue;
_mesa_associate_uniform_storage(ctx, program->shader_program, _mesa_associate_uniform_storage(ctx, program->shader_program,

View File

@@ -185,9 +185,6 @@ st_prepare_vertex_program(struct gl_context *ctx,
if (stvp->Base.IsPositionInvariant) if (stvp->Base.IsPositionInvariant)
_mesa_insert_mvp_code(ctx, &stvp->Base); _mesa_insert_mvp_code(ctx, &stvp->Base);
if (!stvp->glsl_to_tgsi)
assert(stvp->Base.Base.NumInstructions > 1);
/* /*
* Determine number of inputs, the mappings between VERT_ATTRIB_x * Determine number of inputs, the mappings between VERT_ATTRIB_x
* and TGSI generic input indexes, plus input attrib semantic info. * and TGSI generic input indexes, plus input attrib semantic info.
@@ -1318,3 +1315,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);
}
}

View File

@@ -329,6 +329,9 @@ st_destroy_program_variants(struct st_context *st);
extern void extern void
st_print_current_vertex_program(void); st_print_current_vertex_program(void);
extern void
st_precompile_shader_variant(struct st_context *st,
struct gl_program *prog);
#ifdef __cplusplus #ifdef __cplusplus
} }