[Mesa-dev] [PATCH] mesa: debug facility to replace shaders when running apps
Brian Paul
brian.e.paul at gmail.com
Fri Aug 21 06:30:10 PDT 2015
On Fri, Aug 21, 2015 at 2:17 AM, Tapani Pälli <tapani.palli at intel.com>
wrote:
> Patch adds shader source and replace functionality in to the compiler.
>
I had some very primitive support for this sort of thing already. See
SHADER_SUBST in shaderapi.c However, feel free to replace it with
something better/nicer.
Also, please document this feature in docs/shading.html
> This can be used to debug individual (failing) shaders and measure
> performance impact of each shader.
>
> Functionality is controlled via 2 environment variables:
>
> MESA_SHADER_DUMP - path where shader sources are dumped
> MESA_SHADER_READ - path where replacement shaders are read
>
Let's put _PATH on the end of both of those to better describe the vars.
>
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> Suggested-by: Eero Tamminen <eero.t.tamminen at intel.com>
> ---
> src/glsl/glsl_parser_extras.cpp | 76
> +++++++++++++++++++++++++++++++++++++++++
> src/mesa/main/mtypes.h | 2 +-
> 2 files changed, 77 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/glsl_parser_extras.cpp
> b/src/glsl/glsl_parser_extras.cpp
> index 46896d7..17b79b0 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
>
Are you sure this is the right file for this new code? Maybe it should go
into a new source file. glsl_parser_extras.cpp already seems to have
become a dumping ground for a lot of unrelated things.
> @@ -1570,10 +1570,86 @@ set_shader_inout_layout(struct gl_shader *shader,
>
> extern "C" {
>
> +#include <sys/stat.h>
> +#include "util/mesa-sha1.h"
> +
> +static void
> +generate_sha1(struct gl_shader *shader, char sha_str[64])
>
const-qualify shader?
> +{
> + unsigned char sha[20];
> + _mesa_sha1_compute(shader->Source, strlen(shader->Source), sha);
> + _mesa_sha1_format(sha_str, sha);
> +}
> +
> +static void
> +construct_name(struct gl_shader *shader, const char *path,
>
const qualify shader?
Please add a comment to the function explaining what it does.
> + char *name, unsigned length)
> +{
> + char sha[64];
> + static const char *types[] = {
> + "VS", "TC", "TE", "GS", "FS", "CS",
> + };
> +
> + generate_sha1(shader, sha);
> + _mesa_snprintf(name, length, "%s/%s_%s.glsl", path,
> types[shader->Stage],
> + sha);
> +}
> +
> +static void
> +read_shader(struct gl_shader *shader)
>
Please put a comment on the function explaining what it does.
> +{
> + char name[PATH_MAX];
> + static char *read_path = getenv("MESA_SHADER_READ");
> +
> + if (!read_path)
> + return;
> +
> + construct_name(shader, read_path, name, PATH_MAX);
> +
> + FILE *in = fopen(name, "r");
> + if (in) {
> + fseek(in, 0, SEEK_END);
> + long size = ftell(in);
> + rewind(in);
> + char *source = (char *) malloc(size + 1);
>
Should probably check for source==NULL here. Otherwise, tools like
coverity will probably complain.
> + fread(source, size, 1, in);
> + source[size] = '\0';
> + free(shader->Source);
> + shader->Source = source;
> + fclose(in);
> + }
> +}
> +
> +static void
> +dump_shader(struct gl_shader *shader)
>
const-qualify shader?
> +{
> + char name[PATH_MAX];
> + static char *dump_path = getenv("MESA_SHADER_DUMP");
> +
> + if (!dump_path)
> + return;
> +
> + construct_name(shader, dump_path, name, PATH_MAX);
> +
> + FILE *out = fopen(name, "w");
> + if (out) {
> + fprintf(out, "%s", shader->Source);
>
fputs() instead?
> + fclose(out);
> + } else {
> + fprintf(stderr, "could not open %s for dumping shader\n", name);
>
Or, _mesa_warning()?
> + }
> +}
> +
> void
> _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader
> *shader,
> bool dump_ast, bool dump_hir)
> {
> + /* Dump original shader source to MESA_SHADER_DUMP and replace
> + * if corresponding entry found from MESA_SHADER_READ path.
> + */
> + dump_shader(shader);
> + read_shader(shader);
> +
> struct _mesa_glsl_parse_state *state =
> new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
> const char *source = shader->Source;
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index f61a245..fb47a22 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2346,7 +2346,7 @@ struct gl_shader
> bool IsES; /**< True if this shader uses GLSL ES */
>
> GLuint SourceChecksum; /**< for debug/logging purposes */
> - const GLchar *Source; /**< Source code string */
> + GLchar *Source; /**< Source code string */
>
Not sure why that change is needed.
-Brian
>
> struct gl_program *Program; /**< Post-compile assembly code */
> GLchar *InfoLog;
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150821/0973336f/attachment.html>
More information about the mesa-dev
mailing list