diff options
author | Dave Airlie <[email protected]> | 2017-01-19 15:05:37 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-01-31 09:29:59 +1000 |
commit | 80cdf2c17edb141ea54d1941a0353ebe083ed501 (patch) | |
tree | dbc6de15eca3bfd63a753b89d7a7cb2f4e608050 | |
parent | 23999a363b5ef550635f6589325b2a502bdfca0a (diff) |
radv/ac: add geom input support to get deref offset.
This just adds the API and fixes up the callers.
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index bf42ed67db8..0e5fb1736be 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -2098,11 +2098,17 @@ static LLVMValueRef visit_load_ubo_buffer(struct nir_to_llvm_context *ctx, static void radv_get_deref_offset(struct nir_to_llvm_context *ctx, nir_deref *tail, - bool vs_in, unsigned *const_out, LLVMValueRef *indir_out) + bool vs_in, unsigned *vertex_index_out, + unsigned *const_out, LLVMValueRef *indir_out) { unsigned const_offset = 0; LLVMValueRef offset = NULL; + if (vertex_index_out != NULL) { + tail = tail->child; + nir_deref_array *deref_array = nir_deref_as_array(tail); + *vertex_index_out = deref_array->base_offset; + } while (tail->child != NULL) { const struct glsl_type *parent_type = tail->type; @@ -2158,7 +2164,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx, switch (instr->variables[0]->var->data.mode) { case nir_var_shader_in: radv_get_deref_offset(ctx, &instr->variables[0]->deref, - ctx->stage == MESA_SHADER_VERTEX, + ctx->stage == MESA_SHADER_VERTEX, NULL, &const_index, &indir_index); for (unsigned chan = 0; chan < ve; chan++) { if (indir_index) { @@ -2179,7 +2185,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx, break; case nir_var_local: radv_get_deref_offset(ctx, &instr->variables[0]->deref, false, - &const_index, &indir_index); + NULL, &const_index, &indir_index); for (unsigned chan = 0; chan < ve; chan++) { if (indir_index) { unsigned count = glsl_count_attribute_slots( @@ -2198,7 +2204,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx, return to_integer(ctx, ac_build_gather_values(&ctx->ac, values, ve)); case nir_var_shader_out: radv_get_deref_offset(ctx, &instr->variables[0]->deref, false, - &const_index, &indir_index); + NULL, &const_index, &indir_index); for (unsigned chan = 0; chan < ve; chan++) { if (indir_index) { unsigned count = glsl_count_attribute_slots( @@ -2219,7 +2225,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx, return to_integer(ctx, ac_build_gather_values(&ctx->ac, values, ve)); case nir_var_shared: { radv_get_deref_offset(ctx, &instr->variables[0]->deref, false, - &const_index, &indir_index); + NULL, &const_index, &indir_index); LLVMValueRef ptr = get_shared_memory_ptr(ctx, idx, ctx->i32); LLVMValueRef derived_ptr; @@ -2251,7 +2257,7 @@ visit_store_var(struct nir_to_llvm_context *ctx, switch (instr->variables[0]->var->data.mode) { case nir_var_shader_out: radv_get_deref_offset(ctx, &instr->variables[0]->deref, false, - &const_index, &indir_index); + NULL, &const_index, &indir_index); for (unsigned chan = 0; chan < 4; chan++) { int stride = 4; if (!(writemask & (1 << chan))) @@ -2291,7 +2297,7 @@ visit_store_var(struct nir_to_llvm_context *ctx, break; case nir_var_local: radv_get_deref_offset(ctx, &instr->variables[0]->deref, false, - &const_index, &indir_index); + NULL, &const_index, &indir_index); for (unsigned chan = 0; chan < 4; chan++) { if (!(writemask & (1 << chan))) continue; @@ -2322,7 +2328,7 @@ visit_store_var(struct nir_to_llvm_context *ctx, case nir_var_shared: { LLVMValueRef ptr; radv_get_deref_offset(ctx, &instr->variables[0]->deref, false, - &const_index, &indir_index); + NULL, &const_index, &indir_index); ptr = get_shared_memory_ptr(ctx, idx, ctx->i32); LLVMValueRef derived_ptr; |