It is inconvenient to capture shaders by program name alone because this does not allow to capture shaders that get overwritten by shaders with the same program name (ie games when you change settings or piglit).
--- src/mesa/main/shaderapi.c | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 1d0ca5374b..65cf0a67a2 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -1343,29 +1343,46 @@ link_program(struct gl_context *ctx, struct gl_shader_program *shProg, /* Capture .shader_test files. */ const char *capture_path = _mesa_get_shader_capture_path(); if (shProg->Name != 0 && shProg->Name != ~0 && capture_path != NULL) { + FILE *file; - char *filename = ralloc_asprintf(NULL, "%s/%u.shader_test", - capture_path, shProg->Name); + char *filename = NULL; + char *fsource = NULL; + char *ftemp = NULL; + + asprintf(&fsource, "[require]\nGLSL%s >= %u.%02u\n", + shProg->IsES ? " ES" : "", + shProg->data->Version / 100, shProg->data->Version % 100); + + if (shProg->SeparateShader) { + ftemp = fsource; + asprintf(&fsource, "%sGL_ARB_separate_shader_objects\nSSO ENABLED\n", + ftemp); + free(ftemp); + } + + for (unsigned i = 0; i < shProg->NumShaders; i++) { + ftemp = fsource; + asprintf(&fsource, "%s\n[%s shader]\n%s\n", ftemp, + _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage), + shProg->Shaders[i]->Source); + free(ftemp); + } + + char shabuf[64] = {"mylittlebunny"}; + generate_sha1(fsource, shabuf); + + asprintf(&filename, "%s/%s_%u.shader_test", capture_path, + shabuf, shProg->Name); file = fopen(filename, "w"); if (file) { - fprintf(file, "[require]\nGLSL%s >= %u.%02u\n", - shProg->IsES ? " ES" : "", - shProg->data->Version / 100, shProg->data->Version % 100); - if (shProg->SeparateShader) - fprintf(file, "GL_ARB_separate_shader_objects\nSSO ENABLED\n"); - fprintf(file, "\n"); - - for (unsigned i = 0; i < shProg->NumShaders; i++) { - fprintf(file, "[%s shader]\n%s\n", - _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage), - shProg->Shaders[i]->Source); - } + fprintf(file, "%s", fsource); fclose(file); } else { _mesa_warning(ctx, "Failed to open %s", filename); } - ralloc_free(filename); + free(filename); + free(fsource); } if (shProg->data->LinkStatus == LINKING_FAILURE && -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev