diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c index b80f48d9738..97f42553ebd 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c @@ -1107,6 +1107,10 @@ etna_compile_shader_nir(struct etna_shader_variant *v) etna_optimize_loop(s); + /* TODO: remove this extra run if nir_opt_peephole_select is able to handle ubo's. */ + if (OPT(s, etna_nir_lower_ubo_to_uniform)) + etna_optimize_loop(s); + NIR_PASS_V(s, etna_lower_io, v); if (v->shader->specs->vs_need_z_div) diff --git a/src/gallium/drivers/etnaviv/etnaviv_nir.c b/src/gallium/drivers/etnaviv/etnaviv_nir.c index 9c650c45147..bbb02467cf0 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_nir.c @@ -77,39 +77,6 @@ etna_lower_io(nir_shader *shader, struct etna_shader_variant *v) alu->src[0].swizzle[2] = 0; nir_instr_rewrite_src(instr, &intr->src[1], nir_src_for_ssa(ssa)); } break; - case nir_intrinsic_load_uniform: { - /* convert indirect load_uniform to load_ubo when possible - * this is required on HALTI5+ because address register is not implemented - * address register loads also arent done optimally - */ - if (v->shader->specs->halti < 2 || nir_src_is_const(intr->src[0])) - break; - - nir_intrinsic_instr *load_ubo = - nir_intrinsic_instr_create(b.shader, nir_intrinsic_load_ubo); - load_ubo->num_components = intr->num_components; - nir_intrinsic_set_align(load_ubo, intr->dest.ssa.bit_size / 8, 0); - nir_ssa_dest_init(&load_ubo->instr, &load_ubo->dest, - load_ubo->num_components, 32, NULL); - - b.cursor = nir_before_instr(instr); - load_ubo->src[0] = nir_src_for_ssa(nir_imm_int(&b, 0)); - load_ubo->src[1] = nir_src_for_ssa(nir_iadd(&b, - nir_imul(&b, intr->src[0].ssa, nir_imm_int(&b, 16)), - nir_imm_int(&b, nir_intrinsic_base(intr) * 16))); - nir_builder_instr_insert(&b, &load_ubo->instr); - nir_ssa_def_rewrite_uses(&intr->dest.ssa, - nir_src_for_ssa(&load_ubo->dest.ssa)); - nir_instr_remove(&intr->instr); - } break; - case nir_intrinsic_load_ubo: { - nir_const_value *idx = nir_src_as_const_value(intr->src[0]); - assert(idx); - /* offset index by 1, index 0 is used for converted load_uniform */ - b.cursor = nir_before_instr(instr); - nir_instr_rewrite_src(instr, &intr->src[0], - nir_src_for_ssa(nir_imm_int(&b, idx[0].u32 + 1))); - } break; case nir_intrinsic_load_vertex_id: case nir_intrinsic_load_instance_id: /* detect use of vertex_id/instance_id */ diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index d54b0cdb274..e6a71c070d7 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -1050,6 +1050,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, .lower_fceil = !screen->specs.has_sign_floor_ceil, .lower_fsqrt = !screen->specs.has_sin_cos_sqrt, .lower_sincos = !screen->specs.has_sin_cos_sqrt, + .lower_uniforms_to_ubo = screen->specs.halti >= 2, }; /* apply debug options that disable individual features */