Use at your own risk.
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
  *
  */
 
+#include "nir/tgsi_to_nir.h"
 #include "tgsi/tgsi_parse.h"
 #include "util/u_async_debug.h"
 #include "util/u_memory.h"
        program->input_size = cso->req_input_mem;
 
        if (cso->ir_type != PIPE_SHADER_IR_NATIVE) {
-               if (cso->ir_type == PIPE_SHADER_IR_TGSI) {
+               if (sscreen->options.always_nir &&
+                   cso->ir_type == PIPE_SHADER_IR_TGSI) {
+                       program->ir_type = PIPE_SHADER_IR_NIR;
+                       sel->nir = tgsi_to_nir(cso->prog, ctx->screen);
+               } else if (cso->ir_type == PIPE_SHADER_IR_TGSI) {
                        sel->tokens = tgsi_dup_tokens(cso->prog);
                        if (!sel->tokens) {
                                FREE(program);
 
 OPT_BOOL(clear_db_cache_before_clear, false, "Clear DB cache before fast depth clear")
 OPT_BOOL(enable_nir, false, "Enable NIR")
+OPT_BOOL(always_nir, false, "Enable NIR and always convert TGSI to NIR")
 OPT_BOOL(aux_debug, false, "Generate ddebug_dumps for the auxiliary context")
 OPT_BOOL(sync_compile, false, "Always compile synchronously (will cause stalls)")
 OPT_BOOL(dump_shader_binary, false, "Dump shader binary as part of ddebug_dumps")
 
 #include "si_debug_options.h"
        }
 
+       if (sscreen->options.always_nir)
+               sscreen->options.enable_nir = true;
+
        sscreen->has_gfx9_scissor_bug = sscreen->info.family == CHIP_VEGA10 ||
                                        sscreen->info.family == CHIP_RAVEN;
        sscreen->has_msaa_sample_loc_bug = (sscreen->info.family >= CHIP_POLARIS10 &&
 
 #include "sid.h"
 
 #include "compiler/nir/nir_serialize.h"
+#include "nir/tgsi_to_nir.h"
 #include "tgsi/tgsi_parse.h"
 #include "util/hash_table.h"
 #include "util/crc32.h"
 
        sel->so = state->stream_output;
 
-       if (state->type == PIPE_SHADER_IR_TGSI) {
+       if (state->type == PIPE_SHADER_IR_TGSI &&
+           !sscreen->options.always_nir) {
                sel->tokens = tgsi_dup_tokens(state->tokens);
                if (!sel->tokens) {
                        FREE(sel);
                tgsi_scan_shader(state->tokens, &sel->info);
                tgsi_scan_tess_ctrl(state->tokens, &sel->info, &sel->tcs_info);
        } else {
-               assert(state->type == PIPE_SHADER_IR_NIR);
-
-               sel->nir = state->ir.nir;
+               if (state->type == PIPE_SHADER_IR_TGSI) {
+                       sel->nir = tgsi_to_nir(state->tokens, ctx->screen);
+               } else {
+                       assert(state->type == PIPE_SHADER_IR_NIR);
+                       sel->nir = state->ir.nir;
+               }
 
                si_nir_opts(sel->nir);
                si_nir_scan_shader(sel->nir, &sel->info);