[Mesa-dev] [PATCH 4/4] tgsi: fix operand type of TGSI_OPCODE_NOT

Roland Scheidegger sroland at vmware.com
Mon May 6 03:45:52 PDT 2013


Am 05.05.2013 18:34, schrieb Chia-I Wu:
> It should be TGSI_TYPE_UNSIGNED, not TGSI_TYPE_FLOAT.
> 
> Fixed also gallivm not_emit_cpu() to use uint build context.
> 
> Signed-off-by: Chia-I Wu <olvaffe at gmail.com>
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c |    2 +-
>  src/gallium/auxiliary/tgsi/tgsi_info.c             |    1 +
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
> index dc7c090..1feaa19 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
> @@ -1314,7 +1314,7 @@ not_emit_cpu(
>     struct lp_build_tgsi_context * bld_base,
>     struct lp_build_emit_data * emit_data)
>  {
> -   emit_data->output[emit_data->chan] = lp_build_not(&bld_base->base,
> +   emit_data->output[emit_data->chan] = lp_build_not(&bld_base->uint_bld,
>                                                       emit_data->args[0]);
>  }
>  
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c
> index 90bb497..99b1c66 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_info.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_info.c
> @@ -276,6 +276,7 @@ tgsi_opcode_infer_type( uint opcode )
>     case TGSI_OPCODE_MOV:
>     case TGSI_OPCODE_UCMP:
>        return TGSI_TYPE_UNTYPED;
> +   case TGSI_OPCODE_NOT:
>     case TGSI_OPCODE_SHL:
>     case TGSI_OPCODE_AND:
>     case TGSI_OPCODE_OR:
> 

Series looks mostly good to me. I think the order might have been
supposed to be alphabetic at some point, but maybe by number makes more
sense.
I also think that this function leaves something to be desired (even
though that's nothing new), e.g. I believe UCMP is not correctly handled
- the first src arg is uint (or int but definitely not float) while the
other src args ought to be floats, but there's no way to have different
argument types for different src args (so if you have tgsi_exec
executing ucmp, it will actually assume all arguments are ints as it
doesn't use the type info here and can't handle different src types
currently hence it will do negation on src1/src2 corresponding to ints,
but gallivm code will just inherently know the first src type is a int
for comparison purposes (but do negation like on a float arg on it...)
whereas for 2nd and 3rd src arg it will do negation/abs like on float
arg as intended). Should probably be fixed at some point (or otherwise
forbid ucmp to have modifiers on src args and just make them ints).

Roland


More information about the mesa-dev mailing list