From 3e16434acdd549f2721efc4ec80dc11fca1321f6 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 5 Feb 2020 15:46:40 -0800 Subject: [PATCH] nir: Move intel's intrinsic_image_coordinate_components() to core nir. This is a query that both Intel and freedreno need to do. We can simplify it a lot with the new glsl_get_sampler_dim_coordinate_components() Reviewed-by: Kenneth Graunke Part-of: --- src/compiler/nir/nir.c | 11 +++++++++++ src/compiler/nir/nir.h | 3 +++ src/intel/compiler/brw_fs_nir.cpp | 23 +---------------------- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 552b42dd4e1..123f3e44502 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2254,3 +2254,14 @@ nir_rewrite_image_intrinsic(nir_intrinsic_instr *intrin, nir_ssa_def *src, nir_instr_rewrite_src(&intrin->instr, &intrin->src[0], nir_src_for_ssa(src)); } + +unsigned +nir_image_intrinsic_coord_components(const nir_intrinsic_instr *instr) +{ + enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr); + int coords = glsl_get_sampler_dim_coordinate_components(dim); + if (dim == GLSL_SAMPLER_DIM_CUBE) + return coords; + else + return coords + nir_intrinsic_image_array(instr); +} diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index dd3c3cafe8f..d43e3f45f66 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1765,6 +1765,9 @@ nir_intrinsic_align(const nir_intrinsic_instr *intrin) return align_offset ? 1 << (ffs(align_offset) - 1) : align_mul; } +unsigned +nir_image_intrinsic_coord_components(const nir_intrinsic_instr *instr); + /* Converts a image_deref_* intrinsic into a image_* one */ void nir_rewrite_image_intrinsic(nir_intrinsic_instr *instr, nir_ssa_def *handle, bool bindless); diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index 1c07f6fed0f..c602ff55dc4 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -4066,27 +4066,6 @@ fs_visitor::get_nir_ssbo_intrinsic_index(const brw::fs_builder &bld, return bld.emit_uniformize(surf_index); } -static unsigned -image_intrinsic_coord_components(nir_intrinsic_instr *instr) -{ - switch (nir_intrinsic_image_dim(instr)) { - case GLSL_SAMPLER_DIM_1D: - return 1 + nir_intrinsic_image_array(instr); - case GLSL_SAMPLER_DIM_2D: - case GLSL_SAMPLER_DIM_RECT: - return 2 + nir_intrinsic_image_array(instr); - case GLSL_SAMPLER_DIM_3D: - case GLSL_SAMPLER_DIM_CUBE: - return 3; - case GLSL_SAMPLER_DIM_BUF: - return 1; - case GLSL_SAMPLER_DIM_MS: - return 2 + nir_intrinsic_image_array(instr); - default: - unreachable("Invalid image dimension"); - } -} - /** * The offsets we get from NIR act as if each SIMD channel has it's own blob * of contiguous space. However, if we actually place each SIMD channel in @@ -4209,7 +4188,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr srcs[SURFACE_LOGICAL_SRC_ADDRESS] = get_nir_src(instr->src[1]); srcs[SURFACE_LOGICAL_SRC_IMM_DIMS] = - brw_imm_ud(image_intrinsic_coord_components(instr)); + brw_imm_ud(nir_image_intrinsic_coord_components(instr)); /* Emit an image load, store or atomic op. */ if (instr->intrinsic == nir_intrinsic_image_load || -- 2.30.2