[Mesa-dev] [PATCH 6/7] spirv/i965/anv: Relax push constant offset assertions being 32-bit aligned

Chema Casanova jmcasanova at igalia.com
Mon Feb 26 13:57:30 UTC 2018


El 23/02/18 a las 22:36, Jason Ekstrand escribió:
> Assuming the CTS is still happy with it after those changes,

CTS was happy, but piglit has complained a lot.

> 
> Reviewed-by: Jason Ekstrand <jason at jlekstrand.net
> <mailto:jason at jlekstrand.net>>
> 
> On Fri, Feb 23, 2018 at 1:16 PM, Chema Casanova <jmcasanova at igalia.com
> <mailto:jmcasanova at igalia.com>> wrote:
> 
>     On 23/02/18 20:09, Jason Ekstrand wrote:
>     > On Fri, Feb 23, 2018 at 1:26 AM, Jose Maria Casanova Crespo
>     > <jmcasanova at igalia.com <mailto:jmcasanova at igalia.com>
>     <mailto:jmcasanova at igalia.com <mailto:jmcasanova at igalia.com>>> wrote:
>     >
>     >     The introduction of 16-bit types with VK_KHR_16bit_storages
>     implies that
>     >     push constant offsets could be multiple of 2-bytes. Some
>     assertions are
>     >     relaxed so offsets can be multiple of 4-bytes or multiple of
>     size of the
>     >     base type.
>     >
>     >     For 16-bit types, the push constant offset takes into account the
>     >     internal offset in the 32-bit uniform bucket adding 2-bytes
>     when we
>     >     access
>     >     not 32-bit aligned elements. In all 32-bit aligned cases it just
>     >     becomes 0.
>     >     ---
>     >      src/compiler/spirv/vtn_variables.c              |  1 -
>     >      src/intel/compiler/brw_fs_nir.cpp               | 16
>     +++++++++++-----
>     >      src/intel/vulkan/anv_nir_lower_push_constants.c |  2 --
>     >      3 files changed, 11 insertions(+), 8 deletions(-)
>     >
>     >     diff --git a/src/compiler/spirv/vtn_variables.c
>     >     b/src/compiler/spirv/vtn_variables.c
>     >     index 81658afbd9..87236d0abd 100644
>     >     --- a/src/compiler/spirv/vtn_variables.c
>     >     +++ b/src/compiler/spirv/vtn_variables.c
>     >     @@ -760,7 +760,6 @@ _vtn_load_store_tail(struct vtn_builder *b,
>     >     nir_intrinsic_op op, bool load,
>     >         }
>     >
>     >         if (op == nir_intrinsic_load_push_constant) {
>     >     -      vtn_assert(access_offset % 4 == 0);
>     >
>     >            nir_intrinsic_set_base(instr, access_offset);
>     >            nir_intrinsic_set_range(instr, access_size);
>     >     diff --git a/src/intel/compiler/brw_fs_nir.cpp
>     >     b/src/intel/compiler/brw_fs_nir.cpp
>     >     index abf9098252..27611a21d0 100644
>     >     --- a/src/intel/compiler/brw_fs_nir.cpp
>     >     +++ b/src/intel/compiler/brw_fs_nir.cpp
>     >     @@ -3887,16 +3887,22 @@ fs_visitor::nir_emit_intrinsic(const
>     >     fs_builder &bld, nir_intrinsic_instr *instr
>     >            break;
>     >
>     >         case nir_intrinsic_load_uniform: {
>     >     -      /* Offsets are in bytes but they should always be multiples
>     >     of 4 */
>     >     -      assert(instr->const_index[0] % 4 == 0);
>     >     +      /* Offsets are in bytes but they should always be
>     multiple of 4
>     >     +       * or multiple of the size of the destination type. 2
>     for 16-bits
>     >     +       * types.
>     >
>     >     +       */
>     >     +      assert(instr->const_index[0] % 4 == 0 ||
>     >     +             instr->const_index[0] % type_sz(dest.type) == 0);
>     >
>     >
>     > Doubles are required to be 8-byte aligned so we can just have the dest
>     > type size check.
> 
>     Changed locally.


It seems that we can not guarantee that doubles are aligned
with offset of 8-bytes,

Without the % 4 == 0  several tests crash like:

Test:
piglit.spec.arb_gpu_shader_int64.execution.conversion.frag-conversion-explicit-uvec3-i64vec3

In this case we have a ivec3 uniform and then a i64vec3 whose offset
becomes 12 at this assertion.


>     >  
>     >
>     >            fs_reg src(UNIFORM, instr->const_index[0] / 4, dest.type);
>     >
>     >            nir_const_value *const_offset =
>     >     nir_src_as_const_value(instr->src[0]);
>     >            if (const_offset) {
>     >     -         /* Offsets are in bytes but they should always be
>     >     multiples of 4 */
>     >     -         assert(const_offset->u32[0] % 4 == 0);
>     >     -         src.offset = const_offset->u32[0];
>     >     +         assert(const_offset->u32[0] % 4 == 0 ||
>     >     +                const_offset->u32[0] % type_sz(dest.type) == 0);
>     >
>     >
>     > Same here.
> 
>     Changed locally.

This assertion change didn't raise any regression. I'm sending v2 with
just this change.

>     >     +         /* For 16-bit types we add the module of the
>     const_index[0]
>     >     +          * offset to access to not 32-bit aligned element */
>     >     +         src.offset = const_offset->u32[0] +
>     instr->const_index[0] % 4;
>     >
>     >               for (unsigned j = 0; j < instr->num_components; j++) {
>     >                  bld.MOV(offset(dest, bld, j), offset(src, bld, j));
>     >     diff --git a/src/intel/vulkan/anv_nir_lower_push_constants.c
>     >     b/src/intel/vulkan/anv_nir_lower_push_constants.c
>     >     index b66552825b..ad60d0c824 100644
>     >     --- a/src/intel/vulkan/anv_nir_lower_push_constants.c
>     >     +++ b/src/intel/vulkan/anv_nir_lower_push_constants.c
>     >     @@ -41,8 +41,6 @@ anv_nir_lower_push_constants(nir_shader *shader)
>     >                  if (intrin->intrinsic !=
>     nir_intrinsic_load_push_constant)
>     >                     continue;
>     >
>     >     -            assert(intrin->const_index[0] % 4 == 0);
>     >     -
>     >                  /* We just turn them into uniform loads */
>     >                  intrin->intrinsic = nir_intrinsic_load_uniform;
>     >               }
>     >     --
>     >     2.14.3
>     >
>     >
> 
> 
> 
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list