[Mesa-dev] [PATCH] i965/emit: Do the sampler index adjustment directly in header.0.3

Chris Forbes chrisf at ijw.co.nz
Thu Jan 22 14:56:42 PST 2015


Ugh, I'd thinko'd this on first reading and assumed that the
adjustment was header.3 += temp -- but it's not; it's header.3 = r0.3
+ temp so this is fine.

Reviewed-by: Chris Forbes <chrisf at ijw.co.nz>

On Fri, Jan 23, 2015 at 10:50 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> Prior to this commit, the adjust_sampler_state_pointer function took an
> extra register that it could use as scratch space.  The usual candidate was
> the destination of the sampler instruction.  However, if that register ever
> aliased anything important such as the sampler index, this would scratch
> all over important data.  Fortunately, the calculation is such that we can
> just do it in place and we don't need the scratch space at all.
>
> Cc: Chris Forbes <chrisf at ijw.co.nz>
> ---
>  src/mesa/drivers/dri/i965/brw_eu.h               | 3 +--
>  src/mesa/drivers/dri/i965/brw_eu_emit.c          | 5 ++---
>  src/mesa/drivers/dri/i965/brw_fs_generator.cpp   | 2 +-
>  src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 2 +-
>  4 files changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
> index 22d5a0a..a94ea42 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu.h
> +++ b/src/mesa/drivers/dri/i965/brw_eu.h
> @@ -283,8 +283,7 @@ void brw_SAMPLE(struct brw_compile *p,
>
>  void brw_adjust_sampler_state_pointer(struct brw_compile *p,
>                                        struct brw_reg header,
> -                                      struct brw_reg sampler_index,
> -                                      struct brw_reg scratch);
> +                                      struct brw_reg sampler_index);
>
>  void gen4_math(struct brw_compile *p,
>                struct brw_reg dest,
> diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> index c26bed2..39b2022 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
> +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> @@ -2383,8 +2383,7 @@ void brw_SAMPLE(struct brw_compile *p,
>   */
>  void brw_adjust_sampler_state_pointer(struct brw_compile *p,
>                                        struct brw_reg header,
> -                                      struct brw_reg sampler_index,
> -                                      struct brw_reg scratch)
> +                                      struct brw_reg sampler_index)
>  {
>     /* The "Sampler Index" field can only store values between 0 and 15.
>      * However, we can add an offset to the "Sampler State Pointer"
> @@ -2414,7 +2413,7 @@ void brw_adjust_sampler_state_pointer(struct brw_compile *p,
>           return;
>        }
>
> -      struct brw_reg temp = vec1(retype(scratch, BRW_REGISTER_TYPE_UD));
> +      struct brw_reg temp = get_element_ud(header, 3);
>
>        brw_AND(p, temp, get_element_ud(sampler_index, 0), brw_imm_ud(0x0f0));
>        brw_SHL(p, temp, temp, brw_imm_ud(4));
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> index d473739..4474902 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> @@ -697,7 +697,7 @@ fs_generator::generate_tex(fs_inst *inst, struct brw_reg dst, struct brw_reg src
>                         brw_imm_ud(inst->offset));
>           }
>
> -         brw_adjust_sampler_state_pointer(p, header_reg, sampler_index, dst);
> +         brw_adjust_sampler_state_pointer(p, header_reg, sampler_index);
>           brw_pop_insn_state(p);
>        }
>     }
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> index fd37a05..cb9ad6f 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> @@ -354,7 +354,7 @@ vec4_generator::generate_tex(vec4_instruction *inst,
>           if (dw2)
>              brw_MOV(p, get_element_ud(header, 2), brw_imm_ud(dw2));
>
> -         brw_adjust_sampler_state_pointer(p, header, sampler_index, dst);
> +         brw_adjust_sampler_state_pointer(p, header, sampler_index);
>           brw_pop_insn_state(p);
>        }
>     }
> --
> 2.2.1
>


More information about the mesa-dev mailing list