ac/nir: Implement the deref instr for shared memory.
v2: Store the result in ctx->ssa_defs. Acked-by: Rob Clark <robdclark@gmail.com> Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Acked-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
c11833ab24
commit
4a888beea9
|
@ -3583,6 +3583,34 @@ static void visit_jump(struct ac_llvm_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
static void visit_deref(struct ac_nir_context *ctx,
|
||||
nir_deref_instr *instr)
|
||||
{
|
||||
if (instr->mode != nir_var_shared)
|
||||
return;
|
||||
|
||||
LLVMValueRef result = NULL;
|
||||
switch(instr->deref_type) {
|
||||
case nir_deref_type_var: {
|
||||
struct hash_entry *entry = _mesa_hash_table_search(ctx->vars, instr->var);
|
||||
result = entry->data;
|
||||
break;
|
||||
}
|
||||
case nir_deref_type_struct:
|
||||
result = ac_build_gep0(&ctx->ac, get_src(ctx, instr->parent),
|
||||
LLVMConstInt(ctx->ac.i32, instr->strct.index, 0));
|
||||
break;
|
||||
case nir_deref_type_array:
|
||||
result = ac_build_gep0(&ctx->ac, get_src(ctx, instr->parent),
|
||||
get_src(ctx, instr->arr.index));
|
||||
break;
|
||||
default:
|
||||
unreachable("Unhandled deref_instr deref type");
|
||||
}
|
||||
|
||||
ctx->ssa_defs[instr->dest.ssa.index] = result;
|
||||
}
|
||||
|
||||
static void visit_cf_list(struct ac_nir_context *ctx,
|
||||
struct exec_list *list);
|
||||
|
||||
|
@ -3613,6 +3641,9 @@ static void visit_block(struct ac_nir_context *ctx, nir_block *block)
|
|||
case nir_instr_type_jump:
|
||||
visit_jump(&ctx->ac, nir_instr_as_jump(instr));
|
||||
break;
|
||||
case nir_instr_type_deref:
|
||||
visit_deref(ctx, nir_instr_as_deref(instr));
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Unknown NIR instr type: ");
|
||||
nir_print_instr(instr, stderr);
|
||||
|
|
Loading…
Reference in New Issue