From 6684e039eba9c2e9602b1cc9d5177f69e478ff46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 28 Feb 2019 10:53:11 +0100 Subject: [PATCH] nir: Add multiplier argument to nir_lower_uniforms_to_ubo. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note that locations can be set in different units, and the multiplier argument caters to supporting these different units. For example, st_glsl_to_nir uses dwords (4 bytes) so the multiplier should be 4, while tgsi_to_nir uses bytes, so the multiplier should be 16. Signed-Off-By: Timur Kristóf Tested-by: Andre Heider Tested-by: Rob Clark Reviewed-by: Timothy Arceri Reviewed-by: Eric Anholt --- src/compiler/nir/nir.h | 2 +- src/compiler/nir/nir_lower_uniforms_to_ubo.c | 23 +++++++++++++------- src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +- src/mesa/state_tracker/st_nir_builtins.c | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index a0b6db80b76..401635712f9 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3036,7 +3036,7 @@ void nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader, void nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask); void nir_lower_io_to_scalar_early(nir_shader *shader, nir_variable_mode mask); -bool nir_lower_uniforms_to_ubo(nir_shader *shader); +bool nir_lower_uniforms_to_ubo(nir_shader *shader, int multiplier); typedef struct nir_lower_subgroups_options { uint8_t subgroup_size; diff --git a/src/compiler/nir/nir_lower_uniforms_to_ubo.c b/src/compiler/nir/nir_lower_uniforms_to_ubo.c index b54c9943ab7..2f6b23a248f 100644 --- a/src/compiler/nir/nir_lower_uniforms_to_ubo.c +++ b/src/compiler/nir/nir_lower_uniforms_to_ubo.c @@ -22,18 +22,24 @@ */ /* - * Remap load_uniform intrinsics to UBO accesses of UBO binding point 0. Both - * the base and the offset are interpreted as 16-byte units. - * + * Remap load_uniform intrinsics to UBO accesses of UBO binding point 0. * Simultaneously, remap existing UBO accesses by increasing their binding * point by 1. + * + * Both the base and the offset are interpreted as 16-byte units. + * + * Note that locations can be set in different units, and the multiplier + * argument caters to supporting these different units. + * For example: + * - st_glsl_to_nir uses dwords (4 bytes) so the multiplier should be 4 + * - tgsi_to_nir uses bytes, so the multiplier should be 16 */ #include "nir.h" #include "nir_builder.h" static bool -lower_instr(nir_intrinsic_instr *instr, nir_builder *b) +lower_instr(nir_intrinsic_instr *instr, nir_builder *b, int multiplier) { b->cursor = nir_before_instr(&instr->instr); @@ -48,8 +54,8 @@ lower_instr(nir_intrinsic_instr *instr, nir_builder *b) if (instr->intrinsic == nir_intrinsic_load_uniform) { nir_ssa_def *ubo_idx = nir_imm_int(b, 0); nir_ssa_def *ubo_offset = - nir_iadd(b, nir_imm_int(b, 4 * nir_intrinsic_base(instr)), - nir_imul(b, nir_imm_int(b, 4), + nir_iadd(b, nir_imm_int(b, multiplier * nir_intrinsic_base(instr)), + nir_imul(b, nir_imm_int(b, multiplier), nir_ssa_for_src(b, instr->src[0], 1))); nir_intrinsic_instr *load = @@ -71,7 +77,7 @@ lower_instr(nir_intrinsic_instr *instr, nir_builder *b) } bool -nir_lower_uniforms_to_ubo(nir_shader *shader) +nir_lower_uniforms_to_ubo(nir_shader *shader, int multiplier) { bool progress = false; @@ -83,7 +89,8 @@ nir_lower_uniforms_to_ubo(nir_shader *shader) nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_intrinsic) progress |= lower_instr(nir_instr_as_intrinsic(instr), - &builder); + &builder, + multiplier); } } diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 84638fd88a5..dab98f18604 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -991,7 +991,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, if (st->ctx->Const.PackedDriverUniformStorage) { NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, st_glsl_type_dword_size, (nir_lower_io_options)0); - NIR_PASS_V(nir, nir_lower_uniforms_to_ubo); + NIR_PASS_V(nir, nir_lower_uniforms_to_ubo, 4); } st_nir_lower_samplers(screen, nir, shader_program, prog); diff --git a/src/mesa/state_tracker/st_nir_builtins.c b/src/mesa/state_tracker/st_nir_builtins.c index ce00b5e1671..8ec320cbb9c 100644 --- a/src/mesa/state_tracker/st_nir_builtins.c +++ b/src/mesa/state_tracker/st_nir_builtins.c @@ -66,7 +66,7 @@ st_nir_finish_builtin_shader(struct st_context *st, if (st->ctx->Const.PackedDriverUniformStorage) { NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, st_glsl_type_dword_size, (nir_lower_io_options)0); - NIR_PASS_V(nir, nir_lower_uniforms_to_ubo); + NIR_PASS_V(nir, nir_lower_uniforms_to_ubo, 4); } struct pipe_shader_state state = {