[Mesa-dev] [PATCH] i965/vec4: use a temp register to compute offsets for pull loads
Andres Gomez
agomez at igalia.com
Tue Feb 20 14:38:27 UTC 2018
Iago, this looks like a good candidate to nominate for inclusion in the
17.3 stable queue.
What do you think?
On Wed, 2017-11-29 at 11:49 +0100, Iago Toral Quiroga wrote:
> 64-bit pull loads are implemented by emitting 2 separate
> 32-bit pull load messages, where the second message loads from
> an offset at +16B.
>
> That addition of 16B to the original offset should not alter the
> original offset register used as source for the pull load instruction
> though, since the compiler might use that same offset register in other
> instructions (for example, for other pull loads in the shader code
> that take that same offset as reference).
>
> If the pull load is 32-bit then we only need to emit one message and
> we don't need to do offset calculations, but in that case the optimizer
> should be able to drop the redundant MOV.
>
> Fixes the following test on Haswell:
> KHR-GL45.gpu_shader_fp64.fp64.max_uniform_components
> ---
> src/intel/compiler/brw_vec4_nir.cpp | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/src/intel/compiler/brw_vec4_nir.cpp b/src/intel/compiler/brw_vec4_nir.cpp
> index 0a1caa9fad..84f5b37a9d 100644
> --- a/src/intel/compiler/brw_vec4_nir.cpp
> +++ b/src/intel/compiler/brw_vec4_nir.cpp
> @@ -888,7 +888,9 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
> if (const_offset) {
> offset_reg = brw_imm_ud(const_offset->u32[0] & ~15);
> } else {
> - offset_reg = get_nir_src(instr->src[1], nir_type_uint32, 1);
> + offset_reg = src_reg(this, glsl_type::uint_type);
> + emit(MOV(dst_reg(offset_reg),
> + get_nir_src(instr->src[1], nir_type_uint32, 1)));
> }
>
> src_reg packed_consts;
--
Br,
Andres
More information about the mesa-dev
mailing list