st/mesa: add shader dumping for shader-db
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -5877,6 +5877,71 @@ get_mesa_program(struct gl_context *ctx,
|
||||
|
||||
extern "C" {
|
||||
|
||||
static void
|
||||
st_dump_program_for_shader_db(struct gl_context *ctx,
|
||||
struct gl_shader_program *prog)
|
||||
{
|
||||
/* Dump only successfully compiled and linked shaders to the specified
|
||||
* file. This is for shader-db.
|
||||
*
|
||||
* These options allow some pre-processing of shaders while dumping,
|
||||
* because some apps have ill-formed shaders.
|
||||
*/
|
||||
const char *dump_filename = os_get_option("ST_DUMP_SHADERS");
|
||||
const char *insert_directives = os_get_option("ST_DUMP_INSERT");
|
||||
|
||||
if (dump_filename && prog->Name != 0) {
|
||||
FILE *f = fopen(dump_filename, "a");
|
||||
|
||||
if (f) {
|
||||
for (unsigned i = 0; i < prog->NumShaders; i++) {
|
||||
const struct gl_shader *sh = prog->Shaders[i];
|
||||
const char *source;
|
||||
bool skip_version = false;
|
||||
|
||||
if (!sh)
|
||||
continue;
|
||||
|
||||
source = sh->Source;
|
||||
|
||||
/* This string mustn't be changed. shader-db uses it to find
|
||||
* where the shader begins.
|
||||
*/
|
||||
fprintf(f, "GLSL %s shader %d source for linked program %d:\n",
|
||||
_mesa_shader_stage_to_string(sh->Stage),
|
||||
i, prog->Name);
|
||||
|
||||
/* Dump the forced version if set. */
|
||||
if (ctx->Const.ForceGLSLVersion) {
|
||||
fprintf(f, "#version %i\n", ctx->Const.ForceGLSLVersion);
|
||||
skip_version = true;
|
||||
}
|
||||
|
||||
/* Insert directives (optional). */
|
||||
if (insert_directives) {
|
||||
if (!ctx->Const.ForceGLSLVersion && prog->Version)
|
||||
fprintf(f, "#version %i\n", prog->Version);
|
||||
fprintf(f, "%s\n", insert_directives);
|
||||
skip_version = true;
|
||||
}
|
||||
|
||||
if (skip_version && strncmp(source, "#version ", 9) == 0) {
|
||||
const char *next_line = strstr(source, "\n");
|
||||
|
||||
if (next_line)
|
||||
source = next_line + 1;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf(f, "%s", source);
|
||||
fprintf(f, "\n");
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Link a shader.
|
||||
* Called via ctx->Driver.LinkShader()
|
||||
@@ -5997,6 +6062,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
_mesa_reference_program(ctx, &linked_prog, NULL);
|
||||
}
|
||||
|
||||
st_dump_program_for_shader_db(ctx, prog);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user