[Mesa-dev] [PATCH v2 14/30] i965/fs: fix pull constant load component selection for doubles

Francisco Jerez currojerez at riseup.net
Fri May 13 22:46:35 UTC 2016


Samuel Iglesias Gonsálvez <siglesias at igalia.com> writes:

> From: Iago Toral Quiroga <itoral at igalia.com>
>
> UNIFORM_PULL_CONSTANT_LOAD is used to load a contiguous vec4 starting at a
> constant offset that is 16-byte aligned. If we need to access an unaligned
> offset we emit a load with an aligned offset and use the remaining constant
> offset to select the component into the vec4 result that we are interested
> in. This component must be computed in units of the type size, since that
> is what fs_reg::set_smear expects.
>
> This patch does this change in the two places where we use this message:
> In demote_pull_constants when we lower uniform access with constant offset
> into the pull constant buffer and in UBO loads with constant offset.
>
> v2 (Sam):
> - Fix set_smear() in fs_visitor::lower_constant_loads(), take into account
> source type instead and remove MAX2 (Curro).
> - Improve changes to nir_intrinsic_load_ubo case in nir_emit_intrinsic()
> (Curro).
>
> Signed-off-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>

Reviewed-by: Francisco Jerez <currojerez at riseup.net>

> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp     |  3 ++-
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 13 +++----------
>  2 files changed, 5 insertions(+), 11 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 2383d2c..ebc5128 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -2316,7 +2316,8 @@ fs_visitor::lower_constant_loads()
>           inst->src[i].file = VGRF;
>           inst->src[i].nr = dst.nr;
>           inst->src[i].reg_offset = 0;
> -         inst->src[i].set_smear(pull_index & 3);
> +         inst->src[i].set_smear((pull_index & 3) * 4 /
> +                                type_sz(inst->src[i].type));
>  
>           brw_mark_surface_used(prog_data, index);
>        }
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index 4648c58..2d57fd3 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -3378,17 +3378,10 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
>           bld.emit(FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD, packed_consts,
>                    surf_index, const_offset_reg);
>  
> -         for (unsigned i = 0; i < instr->num_components; i++) {
> -            packed_consts.set_smear(const_offset->u32[0] % 16 / 4 + i);
> +         const fs_reg consts = byte_offset(packed_consts, const_offset->u32[0] % 16);
>  
> -            /* The std140 packing rules don't allow vectors to cross 16-byte
> -             * boundaries, and a reg is 32 bytes.
> -             */
> -            assert(packed_consts.subreg_offset < 32);
> -
> -            bld.MOV(dest, packed_consts);
> -            dest = offset(dest, bld, 1);
> -         }
> +         for (unsigned i = 0; i < instr->num_components; i++)
> +            bld.MOV(offset(dest, bld, i), component(consts, i));
>        }
>        break;
>     }
> -- 
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160513/6c1e20f4/attachment-0001.sig>


More information about the mesa-dev mailing list