[Mesa-dev] [PATCH 2/4] nir/lower_tex_proj: add support projector lowering per sampler type

Rob Clark robdclark at gmail.com
Wed Sep 16 15:04:57 PDT 2015


On Wed, Sep 16, 2015 at 2:11 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Wed, Sep 16, 2015 at 2:07 PM, Rob Clark <robdclark at gmail.com> wrote:
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> Some hardware, such as adreno a3xx, supports txp on some but not all
>> sampler types.  In this case we want more fine grained control over
>> which texture projectors get lowered.
>
> I mentioned this on IRC, but should probably say it here too -- a3xx
> doesn't actually need this. The tex-miplevel-selection test was being
> picky, Iago changed it up in commit 181c264956 since Intel was having
> similar troubles. As I recall, sam.3d.p worked fine on my a320 with
> that change, but it was quite a while ago, and should be re-checked.

fyi, there is an updated version of the patchset here:

https://github.com/freedreno/mesa/commits/wip-tex-lowering

This adds an extra patch to handle RECT lowering to 2D, and now it
actually handles clamping + rect textures properly (unlike
tgsi_lowering) :-)

It also splits options out into a nir_lower_tex_options struct (rather
than ever increasing # of params to lowering fxn).  I did end up
keeping the lower_txp param, since for a3xx I need a way to tell the
pass not to lower txp (unless needed for clamp).  I guess I could
change it to a simple boolean.  Not sure if it is worth changing.

The one thing I did not do yet (and why I'm not resending to list yet)
is rename the pass to nir_lower_tex.

BR,
-R

>   -ilia
>
>>
>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>> ---
>>  src/glsl/nir/nir.h                     |  2 +-
>>  src/glsl/nir/nir_lower_tex_projector.c | 31 +++++++++++++++++++++++--------
>>  src/mesa/drivers/dri/i965/brw_nir.c    |  2 +-
>>  3 files changed, 25 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
>> index 284fccd..9d47001 100644
>> --- a/src/glsl/nir/nir.h
>> +++ b/src/glsl/nir/nir.h
>> @@ -1830,7 +1830,7 @@ void nir_lower_samplers(nir_shader *shader,
>>                          const struct gl_shader_program *shader_program);
>>
>>  void nir_lower_system_values(nir_shader *shader);
>> -void nir_lower_tex_projector(nir_shader *shader);
>> +void nir_lower_tex_projector(nir_shader *shader, unsigned lower_txp);
>>  void nir_lower_idiv(nir_shader *shader);
>>
>>  void nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables);
>> diff --git a/src/glsl/nir/nir_lower_tex_projector.c b/src/glsl/nir/nir_lower_tex_projector.c
>> index 11fcd61..ce20956 100644
>> --- a/src/glsl/nir/nir_lower_tex_projector.c
>> +++ b/src/glsl/nir/nir_lower_tex_projector.c
>> @@ -30,6 +30,11 @@
>>  #include "nir.h"
>>  #include "nir_builder.h"
>>
>> +typedef struct {
>> +   nir_builder b;
>> +   unsigned lower_txp;
>> +} lower_tex_state;
>> +
>>  static void
>>  project_src(nir_builder *b, nir_tex_instr *tex)
>>  {
>> @@ -109,37 +114,47 @@ project_src(nir_builder *b, nir_tex_instr *tex)
>>  static bool
>>  nir_lower_tex_projector_block(nir_block *block, void *void_state)
>>  {
>> -   nir_builder *b = void_state;
>> +   lower_tex_state *state = void_state;
>> +   nir_builder *b = &state->b;
>>
>>     nir_foreach_instr_safe(block, instr) {
>>        if (instr->type != nir_instr_type_tex)
>>           continue;
>>
>>        nir_tex_instr *tex = nir_instr_as_tex(instr);
>> +      bool lower_txp = !!(state->lower_txp & (1 << tex->sampler_dim));
>> +
>> +      if (lower_txp)
>> +         project_src(b, tex);
>>
>> -      project_src(b, tex);
>>     }
>>
>>     return true;
>>  }
>>
>>  static void
>> -nir_lower_tex_projector_impl(nir_function_impl *impl)
>> +nir_lower_tex_projector_impl(nir_function_impl *impl, lower_tex_state *state)
>>  {
>> -   nir_builder b;
>> -   nir_builder_init(&b, impl);
>> +   nir_builder_init(&state->b, impl);
>>
>> -   nir_foreach_block(impl, nir_lower_tex_projector_block, &b);
>> +   nir_foreach_block(impl, nir_lower_tex_projector_block, state);
>>
>>     nir_metadata_preserve(impl, nir_metadata_block_index |
>>                                 nir_metadata_dominance);
>>  }
>>
>> +/**
>> + * lower_txp:
>> + *    bitmask of (1 << GLSL_SAMPLER_DIM_x) to control for which
>> + *    sampler types a texture projector is lowered.
>> + */
>>  void
>> -nir_lower_tex_projector(nir_shader *shader)
>> +nir_lower_tex_projector(nir_shader *shader, unsigned lower_txp)
>>  {
>> +   lower_tex_state state;
>> +   state.lower_txp = lower_txp;
>>     nir_foreach_overload(shader, overload) {
>>        if (overload->impl)
>> -         nir_lower_tex_projector_impl(overload->impl);
>> +         nir_lower_tex_projector_impl(overload->impl, &state);
>>     }
>>  }
>> diff --git a/src/mesa/drivers/dri/i965/brw_nir.c b/src/mesa/drivers/dri/i965/brw_nir.c
>> index f326b23..2a924bb 100644
>> --- a/src/mesa/drivers/dri/i965/brw_nir.c
>> +++ b/src/mesa/drivers/dri/i965/brw_nir.c
>> @@ -96,7 +96,7 @@ brw_create_nir(struct brw_context *brw,
>>     nir_lower_global_vars_to_local(nir);
>>     nir_validate_shader(nir);
>>
>> -   nir_lower_tex_projector(nir);
>> +   nir_lower_tex_projector(nir, ~0);
>>     nir_validate_shader(nir);
>>
>>     nir_normalize_cubemap_coords(nir);
>> --
>> 2.4.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list