[Mesa-dev] [PATCH 1/4] tgsi: add option to dump floats as hex values
Marek Olšák
maraeo at gmail.com
Tue Oct 13 03:39:12 PDT 2015
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Tue, Oct 13, 2015 at 6:40 AM, Dave Airlie <airlied at gmail.com> wrote:
> This adds support to the parser to accept hex values as floats,
> and then adds support to the dumper to allow the user to select
> to dump float as 32-bit hex numbers.
>
> This is required to get accurate values for virgl use of TGSI.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/gallium/auxiliary/tgsi/tgsi_dump.c | 19 ++++++++++++++++++-
> src/gallium/auxiliary/tgsi/tgsi_dump.h | 2 ++
> src/gallium/auxiliary/tgsi/tgsi_text.c | 11 ++++++++++-
> 3 files changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> index 8ceb5b4..33f6a56 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> @@ -29,6 +29,7 @@
> #include "util/u_string.h"
> #include "util/u_math.h"
> #include "util/u_memory.h"
> +#include "util/u_math.h"
> #include "tgsi_dump.h"
> #include "tgsi_info.h"
> #include "tgsi_iterate.h"
> @@ -43,6 +44,8 @@ struct dump_ctx
> {
> struct tgsi_iterate_context iter;
>
> + boolean dump_float_as_hex;
> +
> uint instno;
> uint immno;
> int indent;
> @@ -88,6 +91,7 @@ dump_enum(
> #define SID(I) ctx->dump_printf( ctx, "%d", I )
> #define FLT(F) ctx->dump_printf( ctx, "%10.4f", F )
> #define DBL(D) ctx->dump_printf( ctx, "%10.8f", D )
> +#define HFLT(F) ctx->dump_printf( ctx, "0x%08x", fui((F)) )
> #define ENM(E,ENUMS) dump_enum( ctx, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
>
> const char *
> @@ -251,7 +255,10 @@ dump_imm_data(struct tgsi_iterate_context *iter,
> break;
> }
> case TGSI_IMM_FLOAT32:
> - FLT( data[i].Float );
> + if (ctx->dump_float_as_hex)
> + HFLT( data[i].Float );
> + else
> + FLT( data[i].Float );
> break;
> case TGSI_IMM_UINT32:
> UID(data[i].Uint);
> @@ -681,6 +688,11 @@ tgsi_dump_to_file(const struct tgsi_token *tokens, uint flags, FILE *file)
> ctx.indentation = 0;
> ctx.file = file;
>
> + if (flags & TGSI_DUMP_FLOAT_AS_HEX)
> + ctx.dump_float_as_hex = TRUE;
> + else
> + ctx.dump_float_as_hex = FALSE;
> +
> tgsi_iterate_shader( tokens, &ctx.iter );
> }
>
> @@ -749,6 +761,11 @@ tgsi_dump_str(
> ctx.ptr = str;
> ctx.left = (int)size;
>
> + if (flags & TGSI_DUMP_FLOAT_AS_HEX)
> + ctx.base.dump_float_as_hex = TRUE;
> + else
> + ctx.base.dump_float_as_hex = FALSE;
> +
> tgsi_iterate_shader( tokens, &ctx.base.iter );
> }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.h b/src/gallium/auxiliary/tgsi/tgsi_dump.h
> index 7c8f92e..6666b98 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.h
> @@ -38,6 +38,8 @@
> extern "C" {
> #endif
>
> +#define TGSI_DUMP_FLOAT_AS_HEX (1 << 0)
> +
> void
> tgsi_dump_str(
> const struct tgsi_token *tokens,
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 3e3ed5b..4a82c9b 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -195,8 +195,15 @@ static boolean parse_float( const char **pcur, float *val )
> boolean integral_part = FALSE;
> boolean fractional_part = FALSE;
>
> - *val = (float) atof( cur );
> + if (*cur == '0' && *(cur + 1) == 'x') {
> + union fi fi;
> + fi.ui = strtoul(cur, NULL, 16);
> + *val = fi.f;
> + cur += 10;
> + goto out;
> + }
>
> + *val = (float) atof( cur );
> if (*cur == '-' || *cur == '+')
> cur++;
> if (is_digit( cur )) {
> @@ -228,6 +235,8 @@ static boolean parse_float( const char **pcur, float *val )
> else
> return FALSE;
> }
> +
> +out:
> *pcur = cur;
> return TRUE;
> }
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list