[Mesa-dev] [PATCH 11/17] i965/fs: Rework wm_fs_emit to take a nir_shader and a brw_compiler

Jason Ekstrand jason at jlekstrand.net
Sat Oct 10 08:09:25 PDT 2015


Ignore this.  It's just an accidental re-send.

On Sat, Oct 10, 2015 at 8:04 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> This commit removes all dependence on GL state by getting rid of the
> brw_context parameter and the GL data structures.
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 59 ++++++++++++++++--------------------
>  src/mesa/drivers/dri/i965/brw_wm.c   | 14 +++++++--
>  src/mesa/drivers/dri/i965/brw_wm.h   | 13 +++++---
>  3 files changed, 47 insertions(+), 39 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 3c83f2a..8bdc676 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -5115,40 +5115,39 @@ fs_visitor::run_cs()
>  }
>
>  const unsigned *
> -brw_wm_fs_emit(struct brw_context *brw,
> +brw_wm_fs_emit(const struct brw_compiler *compiler, void *log_data,
>                 void *mem_ctx,
>                 const struct brw_wm_prog_key *key,
>                 struct brw_wm_prog_data *prog_data,
> -               struct gl_fragment_program *fp,
> -               struct gl_shader_program *prog,
> +               const nir_shader *shader,
> +               struct gl_program *prog,
>                 int shader_time_index8, int shader_time_index16,
> -               unsigned *final_assembly_size)
> +               bool use_rep_send,
> +               unsigned *final_assembly_size,
> +               char **error_str)
>  {
> -   /* Now the main event: Visit the shader IR and generate our FS IR for it.
> -    */
> -   fs_visitor v(brw->intelScreen->compiler, brw, mem_ctx, key,
> -                &prog_data->base, &fp->Base, fp->Base.nir, 8, shader_time_index8);
> +   fs_visitor v(compiler, log_data, mem_ctx, key,
> +                &prog_data->base, prog, shader, 8,
> +                shader_time_index8);
>     if (!v.run_fs(false /* do_rep_send */)) {
> -      if (prog) {
> -         prog->LinkStatus = false;
> -         ralloc_strcat(&prog->InfoLog, v.fail_msg);
> -      }
> -
> -      _mesa_problem(NULL, "Failed to compile fragment shader: %s\n",
> -                    v.fail_msg);
> +      if (error_str)
> +         *error_str = ralloc_strdup(mem_ctx, v.fail_msg);
>
>        return NULL;
>     }
>
>     cfg_t *simd16_cfg = NULL;
> -   fs_visitor v2(brw->intelScreen->compiler, brw, mem_ctx, key,
> -                 &prog_data->base, &fp->Base, fp->Base.nir, 16, shader_time_index16);
> -   if (likely(!(INTEL_DEBUG & DEBUG_NO16) || brw->use_rep_send)) {
> +   fs_visitor v2(compiler, log_data, mem_ctx, key,
> +                 &prog_data->base, prog, shader, 16,
> +                 shader_time_index16);
> +   if (likely(!(INTEL_DEBUG & DEBUG_NO16) || use_rep_send)) {
>        if (!v.simd16_unsupported) {
>           /* Try a SIMD16 compile */
>           v2.import_uniforms(&v);
> -         if (!v2.run_fs(brw->use_rep_send)) {
> -            perf_debug("SIMD16 shader failed to compile: %s", v2.fail_msg);
> +         if (!v2.run_fs(use_rep_send)) {
> +            compiler->shader_perf_log(log_data,
> +                                      "SIMD16 shader failed to compile: %s",
> +                                      v2.fail_msg);
>           } else {
>              simd16_cfg = v2.cfg;
>           }
> @@ -5156,8 +5155,8 @@ brw_wm_fs_emit(struct brw_context *brw,
>     }
>
>     cfg_t *simd8_cfg;
> -   int no_simd8 = (INTEL_DEBUG & DEBUG_NO8) || brw->no_simd8;
> -   if ((no_simd8 || brw->gen < 5) && simd16_cfg) {
> +   int no_simd8 = (INTEL_DEBUG & DEBUG_NO8) || use_rep_send;
> +   if ((no_simd8 || compiler->devinfo->gen < 5) && simd16_cfg) {
>        simd8_cfg = NULL;
>        prog_data->no_8 = true;
>     } else {
> @@ -5165,20 +5164,14 @@ brw_wm_fs_emit(struct brw_context *brw,
>        prog_data->no_8 = false;
>     }
>
> -   fs_generator g(brw->intelScreen->compiler, brw,
> -                  mem_ctx, (void *) key, &prog_data->base,
> +   fs_generator g(compiler, log_data, mem_ctx, (void *) key, &prog_data->base,
>                    v.promoted_constants, v.runtime_check_aads_emit, "FS");
>
>     if (unlikely(INTEL_DEBUG & DEBUG_WM)) {
> -      char *name;
> -      if (prog)
> -         name = ralloc_asprintf(mem_ctx, "%s fragment shader %d",
> -                                prog->Label ? prog->Label : "unnamed",
> -                                prog->Name);
> -      else
> -         name = ralloc_asprintf(mem_ctx, "fragment program %d", fp->Base.Id);
> -
> -      g.enable_debug(name);
> +      g.enable_debug(ralloc_asprintf(mem_ctx, "%s fragment shader %s",
> +                                     shader->info.label ? shader->info.label :
> +                                                          "unnamed",
> +                                     shader->info.name));
>     }
>
>     if (simd8_cfg)
> diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
> index 4d5e7f6..ab9461a 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm.c
> @@ -230,9 +230,19 @@ brw_codegen_wm_prog(struct brw_context *brw,
>        st_index16 = brw_get_shader_time_index(brw, prog, &fp->program.Base, ST_FS16);
>     }
>
> -   program = brw_wm_fs_emit(brw, mem_ctx, key, &prog_data,
> -                            &fp->program, prog, st_index8, st_index16, &program_size);
> +   char *error_str = NULL;
> +   program = brw_wm_fs_emit(brw->intelScreen->compiler, brw, mem_ctx,
> +                            key, &prog_data, fp->program.Base.nir,
> +                            &fp->program.Base, st_index8, st_index16,
> +                            brw->use_rep_send, &program_size, &error_str);
>     if (program == NULL) {
> +      if (prog) {
> +         prog->LinkStatus = false;
> +         ralloc_strcat(&prog->InfoLog, error_str);
> +      }
> +
> +      _mesa_problem(NULL, "Failed to compile fragment shader: %s\n", error_str);
> +
>        ralloc_free(mem_ctx);
>        return false;
>     }
> diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h
> index 6ee22b2..ac22bee 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm.h
> +++ b/src/mesa/drivers/dri/i965/brw_wm.h
> @@ -61,20 +61,25 @@
>  extern "C" {
>  #endif
>
> +struct nir_shader;
> +
>  /**
>   * Compile a fragment shader.
>   *
>   * Returns the final assembly and the program's size.
>   */
> -const unsigned *brw_wm_fs_emit(struct brw_context *brw,
> +const unsigned *brw_wm_fs_emit(const struct brw_compiler *compiler,
> +                               void *log_data,
>                                 void *mem_ctx,
>                                 const struct brw_wm_prog_key *key,
>                                 struct brw_wm_prog_data *prog_data,
> -                               struct gl_fragment_program *fp,
> -                               struct gl_shader_program *prog,
> +                               const struct nir_shader *shader,
> +                               struct gl_program *prog,
>                                 int shader_time_index8,
>                                 int shader_time_index16,
> -                               unsigned *final_assembly_size);
> +                               bool use_rep_send,
> +                               unsigned *final_assembly_size,
> +                               char **error_str);
>
>  GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
>  struct gl_shader *brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type);
> --
> 2.5.0.400.gff86faf
>


More information about the mesa-dev mailing list