From b88aeff4f51e8a505a8c5e5905d80ae3b75ed3ef Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 10 Sep 2015 16:06:05 -0400 Subject: [PATCH] nir: add nir_channel() to get at single components of vec's Rather than make yet another copy of channel(), let's move it into nir. Signed-off-by: Rob Clark Reviewed-by: Jason Ekstrand --- src/glsl/nir/nir_builder.h | 6 ++++++ src/glsl/nir/nir_lower_tex_projector.c | 24 ++++++++------------- src/glsl/nir/nir_normalize_cubemap_coords.c | 20 ++++++----------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/glsl/nir/nir_builder.h b/src/glsl/nir/nir_builder.h index ffa31c90a45..cf50f699eae 100644 --- a/src/glsl/nir/nir_builder.h +++ b/src/glsl/nir/nir_builder.h @@ -216,6 +216,12 @@ nir_swizzle(nir_builder *build, nir_ssa_def *src, unsigned swiz[4], nir_imov_alu(build, alu_src, num_components); } +static inline nir_ssa_def * +nir_channel(nir_builder *b, nir_ssa_def *def, int c) +{ + return nir_swizzle(b, def, (unsigned[4]){c, c, c, c}, 1, false); +} + /** * Turns a nir_src into a nir_ssa_def * so it can be passed to * nir_build_alu()-based builder calls. diff --git a/src/glsl/nir/nir_lower_tex_projector.c b/src/glsl/nir/nir_lower_tex_projector.c index 6530021c8b7..9afa42f23a9 100644 --- a/src/glsl/nir/nir_lower_tex_projector.c +++ b/src/glsl/nir/nir_lower_tex_projector.c @@ -30,12 +30,6 @@ #include "nir.h" #include "nir_builder.h" -static nir_ssa_def * -channel(nir_builder *b, nir_ssa_def *def, int c) -{ - return nir_swizzle(b, def, (unsigned[4]){c, c, c, c}, 1, false); -} - static bool nir_lower_tex_projector_block(nir_block *block, void *void_state) { @@ -79,21 +73,21 @@ nir_lower_tex_projector_block(nir_block *block, void *void_state) switch (tex->coord_components) { case 4: projected = nir_vec4(b, - channel(b, projected, 0), - channel(b, projected, 1), - channel(b, projected, 2), - channel(b, unprojected, 3)); + nir_channel(b, projected, 0), + nir_channel(b, projected, 1), + nir_channel(b, projected, 2), + nir_channel(b, unprojected, 3)); break; case 3: projected = nir_vec3(b, - channel(b, projected, 0), - channel(b, projected, 1), - channel(b, unprojected, 2)); + nir_channel(b, projected, 0), + nir_channel(b, projected, 1), + nir_channel(b, unprojected, 2)); break; case 2: projected = nir_vec2(b, - channel(b, projected, 0), - channel(b, unprojected, 1)); + nir_channel(b, projected, 0), + nir_channel(b, unprojected, 1)); break; default: unreachable("bad texture coord count for array"); diff --git a/src/glsl/nir/nir_normalize_cubemap_coords.c b/src/glsl/nir/nir_normalize_cubemap_coords.c index 75b647f96cb..ca68bd7a94c 100644 --- a/src/glsl/nir/nir_normalize_cubemap_coords.c +++ b/src/glsl/nir/nir_normalize_cubemap_coords.c @@ -33,12 +33,6 @@ * or 1.0. This is based on the old GLSL IR based pass by Eric. */ -static nir_ssa_def * -channel(nir_builder *b, nir_ssa_def *def, int c) -{ - return nir_swizzle(b, def, (unsigned[4]){c, c, c, c}, 1, false); -} - static bool normalize_cubemap_coords_block(nir_block *block, void *void_state) { @@ -63,9 +57,9 @@ normalize_cubemap_coords_block(nir_block *block, void *void_state) assert(orig_coord->num_components >= 3); nir_ssa_def *abs = nir_fabs(b, orig_coord); - nir_ssa_def *norm = nir_fmax(b, channel(b, abs, 0), - nir_fmax(b, channel(b, abs, 1), - channel(b, abs, 2))); + nir_ssa_def *norm = nir_fmax(b, nir_channel(b, abs, 0), + nir_fmax(b, nir_channel(b, abs, 1), + nir_channel(b, abs, 2))); nir_ssa_def *normalized = nir_fmul(b, orig_coord, nir_frcp(b, norm)); @@ -74,10 +68,10 @@ normalize_cubemap_coords_block(nir_block *block, void *void_state) */ if (tex->coord_components == 4) { normalized = nir_vec4(b, - channel(b, normalized, 0), - channel(b, normalized, 1), - channel(b, normalized, 2), - channel(b, orig_coord, 3)); + nir_channel(b, normalized, 0), + nir_channel(b, normalized, 1), + nir_channel(b, normalized, 2), + nir_channel(b, orig_coord, 3)); } nir_instr_rewrite_src(&tex->instr, -- 2.30.2