From: Marek Olšák Date: Tue, 23 Jul 2019 21:36:09 +0000 (-0400) Subject: radeonsi/nir: add an option to convert TGSI to NIR X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5f16fdefdfd3a52cca4cc885c0bcc472a4c03816;p=mesa.git radeonsi/nir: add an option to convert TGSI to NIR Use at your own risk. Reviewed-by: Timothy Arceri --- diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 12cbe194f63..4d701e1b81f 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -23,6 +23,7 @@ * */ +#include "nir/tgsi_to_nir.h" #include "tgsi/tgsi_parse.h" #include "util/u_async_debug.h" #include "util/u_memory.h" @@ -231,7 +232,11 @@ static void *si_create_compute_state( 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); diff --git a/src/gallium/drivers/radeonsi/si_debug_options.h b/src/gallium/drivers/radeonsi/si_debug_options.h index d6cb3157632..087e2984d02 100644 --- a/src/gallium/drivers/radeonsi/si_debug_options.h +++ b/src/gallium/drivers/radeonsi/si_debug_options.h @@ -1,5 +1,6 @@ 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") diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 3bf3284671d..5a7c9a0d4a7 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -1131,6 +1131,9 @@ radeonsi_screen_create_impl(struct radeon_winsys *ws, #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 && diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 325eae19bed..9e8e1db7a52 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -26,6 +26,7 @@ #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" @@ -2626,7 +2627,8 @@ static void *si_create_shader_selector(struct pipe_context *ctx, 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); @@ -2636,9 +2638,12 @@ static void *si_create_shader_selector(struct pipe_context *ctx, 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);