ac/nir_to_llvm: add support for structs to get_sampler_desc()

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Timothy Arceri 2019-01-09 15:07:51 +11:00
parent b12316cc92
commit cb527d2c4c
1 changed files with 25 additions and 18 deletions

View File

@ -3282,27 +3282,34 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx,
base_index = tex_instr->sampler_index; base_index = tex_instr->sampler_index;
} else { } else {
while(deref_instr->deref_type != nir_deref_type_var) { while(deref_instr->deref_type != nir_deref_type_var) {
unsigned array_size = glsl_get_aoa_size(deref_instr->type); if (deref_instr->deref_type == nir_deref_type_array) {
if (!array_size) unsigned array_size = glsl_get_aoa_size(deref_instr->type);
array_size = 1; if (!array_size)
array_size = 1;
assert(deref_instr->deref_type == nir_deref_type_array); nir_const_value *const_value = nir_src_as_const_value(deref_instr->arr.index);
nir_const_value *const_value = nir_src_as_const_value(deref_instr->arr.index); if (const_value) {
if (const_value) { constant_index += array_size * const_value->u32[0];
constant_index += array_size * const_value->u32[0]; } else {
LLVMValueRef indirect = get_src(ctx, deref_instr->arr.index);
indirect = LLVMBuildMul(ctx->ac.builder, indirect,
LLVMConstInt(ctx->ac.i32, array_size, false), "");
if (!index)
index = indirect;
else
index = LLVMBuildAdd(ctx->ac.builder, index, indirect, "");
}
deref_instr = nir_src_as_deref(deref_instr->parent);
} else if (deref_instr->deref_type == nir_deref_type_struct) {
unsigned sidx = deref_instr->strct.index;
deref_instr = nir_src_as_deref(deref_instr->parent);
constant_index += glsl_get_record_location_offset(deref_instr->type, sidx);
} else { } else {
LLVMValueRef indirect = get_src(ctx, deref_instr->arr.index); unreachable("Unsupported deref type");
indirect = LLVMBuildMul(ctx->ac.builder, indirect,
LLVMConstInt(ctx->ac.i32, array_size, false), "");
if (!index)
index = indirect;
else
index = LLVMBuildAdd(ctx->ac.builder, index, indirect, "");
} }
deref_instr = nir_src_as_deref(deref_instr->parent);
} }
descriptor_set = deref_instr->var->data.descriptor_set; descriptor_set = deref_instr->var->data.descriptor_set;