[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:10:38 PST 2015
Jason,
This can't work. We care about the existing value in header.3 (it's a
pointer to the base of the sampler state table) -- you can't just
clobber it.
- Chris
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