[Mesa-dev] [PATCH 1/2] st/mesa: add shader dumping for shader-db

Dave Airlie airlied at gmail.com
Tue Jul 28 17:38:15 PDT 2015


On 28 July 2015 at 20:05, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>

Reviewed-by: Dave Airlie <airlied at redhat.com>
>
> ---
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 66 ++++++++++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 4c6e48a..6f00727 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -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;
>  }
>
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list