From 5c33e8c7729edd5e16020ebb8703be96523e04f2 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Wed, 9 May 2018 13:28:05 +1000 Subject: st/nir: use NIR for asm programs Reviewed-by: Eric Anholt --- 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 f256e2e862..a52c9f8256 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); + } 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; } @@ -706,6 +742,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. */ -- cgit v1.2.3