Timothy Arceri <tarc...@itsqueeze.com> writes:

> ---
>  src/mesa/state_tracker/st_program.c | 65 +++++++++++++++++++++++++----
>  1 file changed, 58 insertions(+), 7 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_program.c 
> b/src/mesa/state_tracker/st_program.c
> index fe72ddaf2c0..4e2476a26ef 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -37,6 +37,7 @@
>  #include "main/mtypes.h"
>  #include "program/prog_parameter.h"
>  #include "program/prog_print.h"
> +#include "program/prog_to_nir.h"
>  #include "program/programopt.h"
>  
>  #include "compiler/nir/nir.h"
> @@ -377,6 +378,28 @@ st_release_cp_variants(struct st_context *st, struct 
> st_compute_program *stcp)
>     }
>  }
>  
> +/**
> + * Translate ARB (asm) program to NIR
> + */
> +static nir_shader *
> +st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog,
> +                         gl_shader_stage stage)
> +{
> +   const struct gl_shader_compiler_options *options =
> +      &st->ctx->Const.ShaderCompilerOptions[stage];
> +
> +   /* Translate to NIR */
> +   nir_shader *nir = prog_to_nir(prog, options->NirOptions);
> +   NIR_PASS_V(nir, nir_lower_regs_to_ssa); /* turn registers into SSA */
> +   nir_validate_shader(nir);
> +
> +   /* Optimise NIR */
> +   st_nir_opts(nir);
> +   nir_validate_shader(nir);
> +
> +   return nir;
> +}
> +
>  /**
>   * Translate a vertex program.
>   */
> @@ -458,15 +481,28 @@ st_translate_vertex_program(struct st_context *st,
>        /* No samplers are allowed in ARB_vp. */
>     }
>  
> -   if (stvp->shader_program) {
> -      struct gl_program *prog = stvp->shader_program->last_vert_prog;
> -      if (prog) {
> -         st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
> -                                          stvp->result_to_output,
> -                                          &stvp->tgsi.stream_output);
> +   enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir)
> +      st->pipe->screen->get_shader_param(st->pipe->screen, 
> PIPE_SHADER_VERTEX,
> +                                         PIPE_SHADER_CAP_PREFERRED_IR);
> +
> +   if (preferred_ir == PIPE_SHADER_IR_NIR) {
> +      if (stvp->shader_program) {
> +         struct gl_program *prog = stvp->shader_program->last_vert_prog;
> +         if (prog) {
> +            
> st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
> +                                             stvp->result_to_output,
> +                                             &stvp->tgsi.stream_output);
> +         }
> +
> +         st_store_ir_in_disk_cache(st, &stvp->Base, true);

Doesn't this block want to be run in the shader_program &&
!PIPE_SHADER_IR_NIR case?

> +      } else {
> +         nir_shader *nir = st_translate_prog_to_nir(st, &stvp->Base,
> +                                                    MESA_SHADER_VERTEX);
> +
> +         stvp->tgsi.type = PIPE_SHADER_IR_NIR;
> +         stvp->tgsi.ir.nir = nir;
>        }
>  
> -      st_store_ir_in_disk_cache(st, &stvp->Base, true);
>        return true;
>     }
>  
> @@ -699,6 +735,21 @@ st_translate_fragment_program(struct st_context *st,
>        }
>     }
>  
> +   enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir)
> +      st->pipe->screen->get_shader_param(st->pipe->screen,
> +                                         PIPE_SHADER_FRAGMENT,
> +                                         PIPE_SHADER_CAP_PREFERRED_IR);
> +
> +   if (preferred_ir == PIPE_SHADER_IR_NIR) {
> +      nir_shader *nir = st_translate_prog_to_nir(st, &stfp->Base,
> +                                                 MESA_SHADER_FRAGMENT);
> +
> +      stfp->tgsi.type = PIPE_SHADER_IR_NIR;
> +      stfp->tgsi.ir.nir = nir;
> +
> +      return true;
> +   }
> +
>     /*
>      * Convert Mesa program inputs to TGSI input register semantics.
>      */
> -- 
> 2.17.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Attachment: signature.asc
Description: PGP signature

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

Reply via email to