Reviewed-by: Alejandro Piñeiro <apinhe...@igalia.com>

On 02/01/18 17:30, Jason Ekstrand wrote:
> ---
>  src/compiler/spirv/spirv_to_nir.c | 29 +++++++++++++++++++++++++++++
>  src/compiler/spirv/vtn_private.h  |  1 +
>  2 files changed, 30 insertions(+)
>
> diff --git a/src/compiler/spirv/spirv_to_nir.c 
> b/src/compiler/spirv/spirv_to_nir.c
> index dcff56f..751fb03 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -31,6 +31,9 @@
>  #include "nir/nir_constant_expressions.h"
>  #include "spirv_info.h"
>  
> +#include <fcntl.h>
> +#include <unistd.h>
> +
>  void
>  vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level,
>          size_t spirv_offset, const char *message)
> @@ -94,6 +97,27 @@ vtn_log_err(struct vtn_builder *b,
>     ralloc_free(msg);
>  }
>  
> +static void
> +vtn_dump_shader(struct vtn_builder *b, const char *path, const char *prefix)
> +{
> +   static int idx = 0;
> +
> +   char filename[1024];
> +   int len = snprintf(filename, sizeof(filename), "%s/%s-%d.spirv",
> +                      path, prefix, idx++);
> +   if (len < 0 || len >= sizeof(filename))
> +      return;
> +
> +   int fd = open(filename, O_CREAT | O_CLOEXEC | O_WRONLY, 0777);
> +   if (fd < 0)
> +      return;
> +
> +   write(fd, b->spirv, b->spirv_word_count * 4);
> +   close(fd);
> +
> +   vtn_info("SPIR-V shader dumped to %s", filename);
> +}
> +
>  void
>  _vtn_warn(struct vtn_builder *b, const char *file, unsigned line,
>            const char *fmt, ...)
> @@ -117,6 +141,10 @@ _vtn_fail(struct vtn_builder *b, const char *file, 
> unsigned line,
>                 file, line, fmt, args);
>     va_end(args);
>  
> +   const char *dump_path = getenv("MESA_SPIRV_FAIL_DUMP_PATH");
> +   if (dump_path)
> +      vtn_dump_shader(b, dump_path, "fail");
> +
>     longjmp(b->fail_jump, 1);
>  }
>  
> @@ -3690,6 +3718,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
>     /* Initialize the stn_builder object */
>     struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
>     b->spirv = words;
> +   b->spirv_word_count = word_count;
>     b->file = NULL;
>     b->line = -1;
>     b->col = -1;
> diff --git a/src/compiler/spirv/vtn_private.h 
> b/src/compiler/spirv/vtn_private.h
> index f7d8f49..374643a 100644
> --- a/src/compiler/spirv/vtn_private.h
> +++ b/src/compiler/spirv/vtn_private.h
> @@ -531,6 +531,7 @@ struct vtn_builder {
>     jmp_buf fail_jump;
>  
>     const uint32_t *spirv;
> +   size_t spirv_word_count;
>  
>     nir_shader *shader;
>     const struct spirv_to_nir_options *options;

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to