[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