tgsi: add option to dump floats as hex values

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.

[pulled from virgl driver repo]
Signed-off-by: Dave Airlie <airlied@redhat.com>
macos/master
Dave Airlie 12 years ago
parent 9fcf1e0ec0
commit d404b2279b
  1. 19
      src/gallium/auxiliary/tgsi/tgsi_dump.c
  2. 11
      src/gallium/auxiliary/tgsi/tgsi_text.c

@ -29,6 +29,7 @@
#include "util/u_string.h" #include "util/u_string.h"
#include "util/u_math.h" #include "util/u_math.h"
#include "util/u_memory.h" #include "util/u_memory.h"
#include "util/u_math.h"
#include "tgsi_dump.h" #include "tgsi_dump.h"
#include "tgsi_info.h" #include "tgsi_info.h"
#include "tgsi_iterate.h" #include "tgsi_iterate.h"
@ -43,6 +44,8 @@ struct dump_ctx
{ {
struct tgsi_iterate_context iter; struct tgsi_iterate_context iter;
boolean dump_float_as_hex;
uint instno; uint instno;
uint immno; uint immno;
int indent; int indent;
@ -83,6 +86,7 @@ dump_enum(
#define INSTID(I) ctx->dump_printf( ctx, "% 3u", I ) #define INSTID(I) ctx->dump_printf( ctx, "% 3u", I )
#define SID(I) ctx->dump_printf( ctx, "%d", I ) #define SID(I) ctx->dump_printf( ctx, "%d", I )
#define FLT(F) ctx->dump_printf( ctx, "%10.4f", F ) #define FLT(F) ctx->dump_printf( ctx, "%10.4f", F )
#define HFLT(F) ctx->dump_printf( ctx, "0x%08x", fui((F)) )
#define ENM(E,ENUMS) dump_enum( ctx, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) ) #define ENM(E,ENUMS) dump_enum( ctx, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
const char * const char *
@ -239,7 +243,10 @@ dump_imm_data(struct tgsi_iterate_context *iter,
for (i = 0; i < num_tokens; i++) { for (i = 0; i < num_tokens; i++) {
switch (data_type) { switch (data_type) {
case TGSI_IMM_FLOAT32: case TGSI_IMM_FLOAT32:
FLT( data[i].Float ); if (ctx->dump_float_as_hex)
HFLT( data[i].Float );
else
FLT( data[i].Float );
break; break;
case TGSI_IMM_UINT32: case TGSI_IMM_UINT32:
UID(data[i].Uint); UID(data[i].Uint);
@ -662,6 +669,11 @@ tgsi_dump(
ctx.dump_printf = dump_ctx_printf; ctx.dump_printf = dump_ctx_printf;
ctx.indentation = 0; ctx.indentation = 0;
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 ); tgsi_iterate_shader( tokens, &ctx.iter );
} }
@ -723,6 +735,11 @@ tgsi_dump_str(
ctx.ptr = str; ctx.ptr = str;
ctx.left = (int)size; 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 ); tgsi_iterate_shader( tokens, &ctx.base.iter );
} }

@ -195,8 +195,15 @@ static boolean parse_float( const char **pcur, float *val )
boolean integral_part = FALSE; boolean integral_part = FALSE;
boolean fractional_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 == '+') if (*cur == '-' || *cur == '+')
cur++; cur++;
if (is_digit( cur )) { if (is_digit( cur )) {
@ -228,6 +235,8 @@ static boolean parse_float( const char **pcur, float *val )
else else
return FALSE; return FALSE;
} }
out:
*pcur = cur; *pcur = cur;
return TRUE; return TRUE;
} }

Loading…
Cancel
Save