[Mesa-dev] [PATCH 07/16] nir/lower_tex: Add support for lowering coordinate offsets
Pohjolainen, Topi
topi.pohjolainen at intel.com
Fri Jul 22 08:11:52 UTC 2016
On Thu, Jul 21, 2016 at 09:21:53PM -0700, Jason Ekstrand wrote:
> On i965, we can't support coordinate offsets for texelFetch or rectangle
> textures. Previously, we were doing this with a GLSL pass but we need to
> do it in NIR if we want those workarounds for SPIR-V.
>
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> Cc: "12.0" <mesa-dev at lists.freedesktop.org>
> ---
> src/compiler/nir/nir.h | 10 ++++++++
> src/compiler/nir/nir_lower_tex.c | 54 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 64 insertions(+)
>
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> index d0f52b0..45f758c 100644
> --- a/src/compiler/nir/nir.h
> +++ b/src/compiler/nir/nir.h
> @@ -2405,6 +2405,16 @@ typedef struct nir_lower_tex_options {
> unsigned lower_txp;
>
> /**
> + * If true, lower away nir_tex_src_offset for all texelfetch instructions.
> + */
> + bool lower_txf_offset;
> +
> + /**
> + * If true, lower away nir_tex_src_offset for all rect textures.
> + */
> + bool lower_rect_offset;
> +
> + /**
> * If true, lower rect textures to 2D, using txs to fetch the
> * texture dimensions and dividing the texture coords by the
> * texture dims to normalize.
> diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c
> index 0cf1071..a1280e1 100644
> --- a/src/compiler/nir/nir_lower_tex.c
> +++ b/src/compiler/nir/nir_lower_tex.c
> @@ -128,6 +128,54 @@ project_src(nir_builder *b, nir_tex_instr *tex)
> tex_instr_remove_src(tex, proj_index);
> }
>
> +static bool
> +lower_offset(nir_builder *b, nir_tex_instr *tex)
> +{
> + int offset_index = tex_instr_find_src(tex, nir_tex_src_offset);
Could be 'const'.
> + if (offset_index < 0)
> + return false;
> +
> + int coord_index = tex_instr_find_src(tex, nir_tex_src_coord);
Same here.
> + assert(coord_index >= 0);
> +
> + assert(tex->src[offset_index].src.is_ssa);
> + assert(tex->src[coord_index].src.is_ssa);
> + nir_ssa_def *offset = tex->src[offset_index].src.ssa;
> + nir_ssa_def *coord = tex->src[coord_index].src.ssa;
In principle, it looks these could be declared constants as well:
const nir_ssa_def * const offset = tex->src[offset_index].src.ssa;
const nir_ssa_def * const coord = tex->src[coord_index].src.ssa;
But further digging tells me that they can be only:
nir_ssa_def * const offset = tex->src[offset_index].src.ssa;
nir_ssa_def * const coord = tex->src[coord_index].src.ssa;
Quite a few of the helpers in nir declare their inputs as read-write even
though they only read the contents...
> +
> + b->cursor = nir_before_instr(&tex->instr);
> +
> + nir_ssa_def *offset_coord;
> + if (nir_tex_instr_src_type(tex, coord_index) == nir_type_float) {
> + assert(tex->sampler_dim == GLSL_SAMPLER_DIM_RECT);
> + offset_coord = nir_fadd(b, coord, nir_i2f(b, offset));
> + } else {
> + offset_coord = nir_iadd(b, coord, offset);
> + }
> +
> + if (tex->is_array) {
> + /* The offset is not applied to the array index */
> + if (tex->coord_components == 2) {
> + offset_coord = nir_vec2(b, nir_channel(b, offset_coord, 0),
> + nir_channel(b, coord, 1));
> + } else if (tex->coord_components == 3) {
> + offset_coord = nir_vec3(b, nir_channel(b, offset_coord, 0),
> + nir_channel(b, offset_coord, 1),
> + nir_channel(b, coord, 2));
> + } else {
> + unreachable("Invalid number of components");
> + }
> + }
> +
> + nir_instr_rewrite_src(&tex->instr, &tex->src[coord_index].src,
> + nir_src_for_ssa(offset_coord));
> +
> + tex_instr_remove_src(tex, offset_index);
> +
> + return true;
> +}
> +
> +
> static nir_ssa_def *
> get_texture_size(nir_builder *b, nir_tex_instr *tex)
> {
> @@ -458,6 +506,12 @@ nir_lower_tex_block(nir_block *block, nir_builder *b,
> progress = true;
> }
>
> + if ((tex->op == nir_texop_txf && options->lower_txf_offset) ||
> + (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT &&
> + options->lower_rect_offset)) {
> + progress = lower_offset(b, tex) || progress;
> + }
> +
> if ((tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) && options->lower_rect) {
> lower_rect(b, tex);
> progress = true;
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list