From 3fb229e010fdedc3511fd4c154083ce1ab2556c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 20 Aug 2021 23:59:05 -0400 Subject: [PATCH] ac,radeonsi: load VS inputs at the call site of nir_intrinsic_load_input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit to match ACO Reviewed-by: Timur Kristóf Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 22 +++++++++---------- .../drivers/radeonsi/si_shader_internal.h | 1 - src/gallium/drivers/radeonsi/si_shader_llvm.c | 4 +--- .../drivers/radeonsi/si_shader_llvm_vs.c | 18 ++++++++------- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 05a19e6aeb6..9efadbd0d27 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -3344,22 +3344,22 @@ static LLVMValueRef visit_load(struct ac_nir_context *ctx, nir_intrinsic_instr * nir_intrinsic_io_semantics(instr).fb_fetch_output) return ctx->abi->emit_fbfetch(ctx->abi); - /* Other non-fragment cases have inputs and outputs in temporaries. */ - if (ctx->stage != MESA_SHADER_FRAGMENT) { - for (unsigned chan = component; chan < count + component; chan++) { - if (is_output) { - values[chan] = LLVMBuildLoad(ctx->ac.builder, ctx->abi->outputs[base * 4 + chan], ""); - } else { - values[chan] = ctx->abi->inputs[base * 4 + chan]; - if (!values[chan]) - values[chan] = LLVMGetUndef(ctx->ac.i32); - } - } + if (ctx->stage == MESA_SHADER_VERTEX && !is_output) + return ctx->abi->load_inputs(ctx->abi, base, component, count, 0, component_type); + + /* Other non-fragment cases have outputs in temporaries. */ + if (is_output && (ctx->stage == MESA_SHADER_VERTEX || ctx->stage == MESA_SHADER_TESS_EVAL)) { + assert(is_output); + + for (unsigned chan = component; chan < count + component; chan++) + values[chan] = LLVMBuildLoad(ctx->ac.builder, ctx->abi->outputs[base * 4 + chan], ""); + LLVMValueRef result = ac_build_varying_gather_values(&ctx->ac, values, count, component); return LLVMBuildBitCast(ctx->ac.builder, result, dest_type, ""); } /* Fragment shader inputs. */ + assert(ctx->stage == MESA_SHADER_FRAGMENT); unsigned vertex_id = 2; /* P0 */ if (instr->intrinsic == nir_intrinsic_load_input_vertex) { diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 467e378f461..3970125f549 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -257,7 +257,6 @@ void si_llvm_init_ps_callbacks(struct si_shader_context *ctx); void si_llvm_init_resource_callbacks(struct si_shader_context *ctx); /* si_shader_llvm_vs.c */ -void si_llvm_load_vs_inputs(struct si_shader_context *ctx, struct nir_shader *nir); void si_llvm_streamout_store_output(struct si_shader_context *ctx, LLVMValueRef const *so_buffers, LLVMValueRef const *so_write_offsets, struct pipe_stream_output *stream_out, diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index 81841ec81ce..8854584e059 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -441,9 +441,7 @@ static void si_llvm_declare_compute_memory(struct si_shader_context *ctx) static bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir) { - if (nir->info.stage == MESA_SHADER_VERTEX) { - si_llvm_load_vs_inputs(ctx, nir); - } else if (nir->info.stage == MESA_SHADER_FRAGMENT) { + if (nir->info.stage == MESA_SHADER_FRAGMENT) { unsigned colors_read = ctx->shader->selector->info.colors_read; LLVMValueRef main_fn = ctx->main_fn; diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c index 9a05115e170..73dff3f2203 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c @@ -252,18 +252,19 @@ static void load_input_vs(struct si_shader_context *ctx, unsigned input_index, L out[i] = ac_to_float(&ctx->ac, fetches[i]); } -void si_llvm_load_vs_inputs(struct si_shader_context *ctx, struct nir_shader *nir) +static LLVMValueRef si_load_vs_input(struct ac_shader_abi *abi, unsigned driver_location, + unsigned component, unsigned num_components, + unsigned vertex_index, LLVMTypeRef type) { - const struct si_shader_info *info = &ctx->shader->selector->info; + struct si_shader_context *ctx = si_shader_context_from_abi(abi); + LLVMValueRef values[4]; - for (unsigned i = 0; i < info->num_inputs; i++) { - LLVMValueRef values[4]; + load_input_vs(ctx, driver_location, values); - load_input_vs(ctx, i, values); + for (unsigned i = 0; i < 4; i++) + values[i] = LLVMBuildBitCast(ctx->ac.builder, values[i], type, ""); - for (unsigned chan = 0; chan < 4; chan++) - ctx->abi.inputs[i * 4 + chan] = ac_to_integer(&ctx->ac, values[chan]); - } + return ac_build_varying_gather_values(&ctx->ac, values, num_components, component); } void si_llvm_streamout_store_output(struct si_shader_context *ctx, LLVMValueRef const *so_buffers, @@ -1130,4 +1131,5 @@ void si_llvm_init_vs_callbacks(struct si_shader_context *ctx, bool ngg_cull_shad ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue; ctx->abi.load_base_vertex = get_base_vertex; + ctx->abi.load_inputs = si_load_vs_input; }