On Wed, Apr 12, 2017 at 6:14 AM, Boyan Ding <boyan.j.d...@gmail.com> wrote:

> This fixes the following error when using ARB_shader_clock on i965:
>         vec1 32 ssa_0 = intrinsic shader_clock () () ()
>         intrinsic store_var (ssa_0) (clock_retval) (3) /* wrmask=xy */
> error: src->ssa->num_components == num_components (nir/nir_validate.c:204)
>
> Cc: mesa-sta...@lists.freedesktop.org
> Signed-off-by: Boyan Ding <boyan.j.d...@gmail.com>
> ---
>  src/compiler/glsl/glsl_to_nir.cpp | 3 ++-
>  src/compiler/nir/nir_intrinsics.h | 2 +-
>  2 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/src/compiler/glsl/glsl_to_nir.cpp
> b/src/compiler/glsl/glsl_to_nir.cpp
> index f0557f985b..870d457681 100644
> --- a/src/compiler/glsl/glsl_to_nir.cpp
> +++ b/src/compiler/glsl/glsl_to_nir.cpp
> @@ -930,7 +930,8 @@ nir_visitor::visit(ir_call *ir)
>           nir_builder_instr_insert(&b, &instr->instr);
>           break;
>        case nir_intrinsic_shader_clock:
> -         nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
> +         nir_ssa_dest_init(&instr->instr, &instr->dest, 2, 32, NULL);
> +         instr->num_components = 2;
>

This made me go look at the spec, and things get a bit more subtle...  In
particular, ARB_shader_clock specifies two builtin functions:

        uvec2 clock2x32ARB(void);
        uint64_t clockARB(void);

 Where the second one only exists if you support int64.  On gen8+, we do
support int64...

My feeling is that the correct way to implement this is to make the NIR
intrinsic return a 64bit value and wrap it in a nir_unpack_64_2x32 if the
client asks for the 2x32 version.  If that's too much refactoring for you,
then this patch is probably sufficient to solve the issue today.

          nir_builder_instr_insert(&b, &instr->instr);
>           break;
>        case nir_intrinsic_store_ssbo: {
> diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_
> intrinsics.h
> index 105c56f759..3a519a73dd 100644
> --- a/src/compiler/nir/nir_intrinsics.h
> +++ b/src/compiler/nir/nir_intrinsics.h
> @@ -91,7 +91,7 @@ BARRIER(memory_barrier)
>   * The latter can be used as code motion barrier, which is currently not
>   * feasible with NIR.
>   */
> -INTRINSIC(shader_clock, 0, ARR(0), true, 1, 0, 0, xx, xx, xx,
> NIR_INTRINSIC_CAN_ELIMINATE)
> +INTRINSIC(shader_clock, 0, ARR(0), true, 2, 0, 0, xx, xx, xx,
> NIR_INTRINSIC_CAN_ELIMINATE)
>
>  /*
>   * Memory barrier with semantics analogous to the compute shader
> --
> 2.12.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to