|
|
@@ -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; |
|
|
|
} |
|
|
|
|