From: Dave Airlie Date: Tue, 24 Jan 2012 11:55:14 +0000 (+0000) Subject: tgsi: add source/destination type from opcodes. (v2) X-Git-Tag: mesa-9.0~3154 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=13e2e51f7058dff01281050db1b64639ad3b399e;p=platform%2Fupstream%2Fmesa.git tgsi: add source/destination type from opcodes. (v2) These two functions produce the src/dst types for an opcode. MOV is special since it can be used to mov float->float and int->int, so just return VOID. v2: use a new enum for the opcode type as per Jose's suggestion. Signed-off-by: Dave Airlie --- diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c index 2407448..a44f48c 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_info.c +++ b/src/gallium/auxiliary/tgsi/tgsi_info.c @@ -243,3 +243,100 @@ tgsi_get_processor_name( uint processor ) return "unknown shader type!"; } } + +/* + * infer the source type of a TGSI opcode. + * MOV is special so return VOID + */ +enum tgsi_opcode_type +tgsi_opcode_infer_src_type( uint opcode ) +{ + switch (opcode) { + case TGSI_OPCODE_MOV: + return TGSI_TYPE_UNTYPED; + case TGSI_OPCODE_AND: + case TGSI_OPCODE_OR: + case TGSI_OPCODE_XOR: + case TGSI_OPCODE_SAD: + case TGSI_OPCODE_U2F: + case TGSI_OPCODE_UADD: + case TGSI_OPCODE_UDIV: + case TGSI_OPCODE_UMOD: + case TGSI_OPCODE_UMAD: + case TGSI_OPCODE_UMUL: + case TGSI_OPCODE_UMAX: + case TGSI_OPCODE_UMIN: + case TGSI_OPCODE_USEQ: + case TGSI_OPCODE_USGE: + case TGSI_OPCODE_USLT: + case TGSI_OPCODE_USNE: + case TGSI_OPCODE_USHR: + case TGSI_OPCODE_SHL: + case TGSI_OPCODE_TXQ: + return TGSI_TYPE_UNSIGNED; + case TGSI_OPCODE_MOD: + case TGSI_OPCODE_I2F: + case TGSI_OPCODE_IDIV: + case TGSI_OPCODE_IMAX: + case TGSI_OPCODE_IMIN: + case TGSI_OPCODE_INEG: + case TGSI_OPCODE_ISGE: + case TGSI_OPCODE_ISHR: + case TGSI_OPCODE_ISLT: + case TGSI_OPCODE_IABS: + case TGSI_OPCODE_ISSG: + case TGSI_OPCODE_UARL: + return TGSI_TYPE_SIGNED; + default: + return TGSI_TYPE_FLOAT; + } +} + +/* + * infer the destination type of a TGSI opcode. + * MOV is special so return VOID + */ +enum tgsi_opcode_type +tgsi_opcode_infer_dst_type( uint opcode ) +{ + switch (opcode) { + case TGSI_OPCODE_MOV: + return TGSI_TYPE_UNTYPED; + case TGSI_OPCODE_F2U: + case TGSI_OPCODE_AND: + case TGSI_OPCODE_OR: + case TGSI_OPCODE_XOR: + case TGSI_OPCODE_SAD: + case TGSI_OPCODE_UADD: + case TGSI_OPCODE_UDIV: + case TGSI_OPCODE_UMOD: + case TGSI_OPCODE_UMAD: + case TGSI_OPCODE_UMUL: + case TGSI_OPCODE_UMAX: + case TGSI_OPCODE_UMIN: + case TGSI_OPCODE_USEQ: + case TGSI_OPCODE_USGE: + case TGSI_OPCODE_USLT: + case TGSI_OPCODE_USNE: + case TGSI_OPCODE_USHR: + case TGSI_OPCODE_SHL: + case TGSI_OPCODE_TXQ: + return TGSI_TYPE_UNSIGNED; + case TGSI_OPCODE_F2I: + case TGSI_OPCODE_IDIV: + case TGSI_OPCODE_IMAX: + case TGSI_OPCODE_IMIN: + case TGSI_OPCODE_INEG: + case TGSI_OPCODE_ISGE: + case TGSI_OPCODE_ISHR: + case TGSI_OPCODE_ISLT: + case TGSI_OPCODE_MOD: + case TGSI_OPCODE_UARL: + case TGSI_OPCODE_ARL: + case TGSI_OPCODE_IABS: + case TGSI_OPCODE_ISSG: + return TGSI_TYPE_SIGNED; + default: + return TGSI_TYPE_FLOAT; + } +} diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.h b/src/gallium/auxiliary/tgsi/tgsi_info.h index c0427fb..5414916 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_info.h +++ b/src/gallium/auxiliary/tgsi/tgsi_info.h @@ -30,6 +30,7 @@ #include "pipe/p_compiler.h" #include "pipe/p_shader_tokens.h" +#include "util/u_format.h" #if defined __cplusplus extern "C" { @@ -90,6 +91,20 @@ tgsi_get_opcode_name( uint opcode ); const char * tgsi_get_processor_name( uint processor ); +enum tgsi_opcode_type { + TGSI_TYPE_UNTYPED, /* for MOV */ + TGSI_TYPE_VOID, + TGSI_TYPE_UNSIGNED, + TGSI_TYPE_SIGNED, + TGSI_TYPE_FLOAT, + TGSI_TYPE_DOUBLE, +}; + +enum tgsi_opcode_type +tgsi_opcode_infer_src_type( uint opcode ); + +enum tgsi_opcode_type +tgsi_opcode_infer_dst_type( uint opcode ); #if defined __cplusplus }