tgsi: add option to dump floats as hex values
authorDave Airlie <airlied@gmail.com>
Mon, 16 Sep 2013 00:13:55 +0000 (10:13 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 23 Oct 2015 01:55:02 +0000 (11:55 +1000)
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.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_dump.h
src/gallium/auxiliary/tgsi/tgsi_text.c

index 5d80cca5b0e31120fe468a057ccc5c0bd5991f63..347073927733ac53cfa634973cebe5e1824067bd 100644 (file)
@@ -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);
@@ -682,6 +689,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 );
 }
 
@@ -750,6 +762,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 );
 }
 
index 7c8f92ee7bccd532adf1415dbf654ff0f3d3d214..6666b983e9c78675c80a8e9dd6828df66bda6734 100644 (file)
@@ -38,6 +38,8 @@
 extern "C" {
 #endif
 
+#define TGSI_DUMP_FLOAT_AS_HEX (1 << 0)
+
 void
 tgsi_dump_str(
    const struct tgsi_token *tokens,
index 3e3ed5b19d12e0f1e82349c64472d994607f0734..4a82c9b3552b8f6ec2428c25fb674562a0d42168 100644 (file)
@@ -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;
 }