mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 12:20:10 +01:00
Allow tgsi_dump print-out to stderr or a string buffer.
Handle source register complement modifier in exec and dump.
This commit is contained in:
parent
273f6e7698
commit
6cdcebe801
3 changed files with 220 additions and 100 deletions
|
|
@ -1066,6 +1066,10 @@ fetch_source(
|
|||
case TGSI_UTIL_SIGN_KEEP:
|
||||
break;
|
||||
}
|
||||
|
||||
if (reg->SrcRegisterExtMod.Complement) {
|
||||
micro_sub( chan, &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], chan );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -31,129 +31,196 @@
|
|||
#include "tgsi_parse.h"
|
||||
#include "tgsi_build.h"
|
||||
|
||||
struct gen_dump
|
||||
{
|
||||
unsigned tabs;
|
||||
void (* write)(
|
||||
struct gen_dump *dump,
|
||||
const void *data,
|
||||
unsigned size );
|
||||
};
|
||||
|
||||
struct text_dump
|
||||
{
|
||||
FILE *file;
|
||||
unsigned tabs;
|
||||
struct gen_dump base;
|
||||
char *text;
|
||||
unsigned length;
|
||||
unsigned capacity;
|
||||
};
|
||||
|
||||
static void
|
||||
text_dump_str(
|
||||
struct text_dump *dump,
|
||||
const char *str )
|
||||
_text_dump_write(
|
||||
struct gen_dump *dump,
|
||||
const void *data,
|
||||
unsigned size )
|
||||
{
|
||||
struct text_dump *td = (struct text_dump *) dump;
|
||||
unsigned new_length = td->length + size;
|
||||
|
||||
if( new_length >= td->capacity ) {
|
||||
unsigned new_capacity = td->capacity;
|
||||
|
||||
do {
|
||||
if( new_capacity == 0 ) {
|
||||
new_capacity = 256;
|
||||
}
|
||||
else {
|
||||
new_capacity *= 2;
|
||||
}
|
||||
} while( new_length >= new_capacity );
|
||||
td->text = (char *) REALLOC(
|
||||
td->text,
|
||||
td->capacity,
|
||||
new_capacity );
|
||||
td->capacity = new_capacity;
|
||||
}
|
||||
memcpy(
|
||||
&td->text[td->length],
|
||||
data,
|
||||
size );
|
||||
td->length = new_length;
|
||||
td->text[td->length] = '\0';
|
||||
}
|
||||
|
||||
struct file_dump
|
||||
{
|
||||
struct gen_dump base;
|
||||
FILE *file;
|
||||
};
|
||||
|
||||
static void
|
||||
_file_dump_write(
|
||||
struct gen_dump *dump,
|
||||
const void *data,
|
||||
unsigned size )
|
||||
{
|
||||
struct file_dump *fd = (struct file_dump *) dump;
|
||||
|
||||
#if 0
|
||||
fwrite( data, 1, size, fd->file );
|
||||
#else
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < size; i++ ) {
|
||||
fprintf( fd->file, "%c", ((const char *) data)[i] );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
gen_dump_str(
|
||||
struct gen_dump *dump,
|
||||
const char *str )
|
||||
{
|
||||
unsigned i;
|
||||
size_t len = strlen( str );
|
||||
size_t len = strlen( str );
|
||||
|
||||
for( i = 0; i < len; i++ ) {
|
||||
fprintf( dump->file, "%c", str[i] );
|
||||
|
||||
if( str[i] == '\n' ) {
|
||||
for (i = 0; i < len; i++) {
|
||||
dump->write( dump, &str[i], 1 );
|
||||
if (str[i] == '\n') {
|
||||
unsigned i;
|
||||
|
||||
for( i = 0; i < dump->tabs; i++ ) {
|
||||
fprintf( dump->file, " " );
|
||||
for (i = 0; i < dump->tabs; i++) {
|
||||
dump->write( dump, " ", 4 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_chr(
|
||||
struct text_dump *dump,
|
||||
const char chr )
|
||||
gen_dump_chr(
|
||||
struct gen_dump *dump,
|
||||
const char chr )
|
||||
{
|
||||
char str[2];
|
||||
|
||||
str[0] = chr;
|
||||
str[1] = '\0';
|
||||
text_dump_str( dump, str );
|
||||
dump->write( dump, &chr, 1 );
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_uix(
|
||||
struct text_dump *dump,
|
||||
const unsigned ui )
|
||||
gen_dump_uix(
|
||||
struct gen_dump *dump,
|
||||
const unsigned ui )
|
||||
{
|
||||
char str[36];
|
||||
char str[36];
|
||||
|
||||
sprintf( str, "0x%x", ui );
|
||||
text_dump_str( dump, str );
|
||||
gen_dump_str( dump, str );
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_uid(
|
||||
struct text_dump *dump,
|
||||
const unsigned ui )
|
||||
gen_dump_uid(
|
||||
struct gen_dump *dump,
|
||||
const unsigned ui )
|
||||
{
|
||||
char str[16];
|
||||
char str[16];
|
||||
|
||||
sprintf( str, "%u", ui );
|
||||
text_dump_str( dump, str );
|
||||
gen_dump_str( dump, str );
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_sid(
|
||||
struct text_dump *dump,
|
||||
const int si )
|
||||
gen_dump_sid(
|
||||
struct gen_dump *dump,
|
||||
const int si )
|
||||
{
|
||||
char str[16];
|
||||
char str[16];
|
||||
|
||||
sprintf( str, "%d", si );
|
||||
text_dump_str( dump, str );
|
||||
gen_dump_str( dump, str );
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_flt(
|
||||
struct text_dump *dump,
|
||||
const float f )
|
||||
gen_dump_flt(
|
||||
struct gen_dump *dump,
|
||||
const float flt )
|
||||
{
|
||||
char str[48];
|
||||
char str[48];
|
||||
|
||||
sprintf( str, "%10.4f", f );
|
||||
text_dump_str( dump, str );
|
||||
sprintf( str, "%10.4f", flt );
|
||||
gen_dump_str( dump, str );
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_enum(
|
||||
struct text_dump *dump,
|
||||
const unsigned e,
|
||||
const char **enums,
|
||||
const unsigned enums_count )
|
||||
gen_dump_enum(
|
||||
struct gen_dump *dump,
|
||||
const unsigned e,
|
||||
const char **enums,
|
||||
const unsigned enums_count )
|
||||
{
|
||||
if( e >= enums_count ) {
|
||||
text_dump_uid( dump, e );
|
||||
if (e >= enums_count) {
|
||||
gen_dump_uid( dump, e );
|
||||
}
|
||||
else {
|
||||
text_dump_str( dump, enums[e] );
|
||||
gen_dump_str( dump, enums[e] );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_tab(
|
||||
struct text_dump *dump )
|
||||
gen_dump_tab(
|
||||
struct gen_dump *dump )
|
||||
{
|
||||
dump->tabs++;
|
||||
++dump->tabs;
|
||||
}
|
||||
|
||||
static void
|
||||
text_dump_untab(
|
||||
struct text_dump *dump )
|
||||
gen_dump_untab(
|
||||
struct gen_dump *dump )
|
||||
{
|
||||
assert( dump->tabs > 0 );
|
||||
|
||||
--dump->tabs;
|
||||
}
|
||||
|
||||
#define TXT(S) text_dump_str( dump, S )
|
||||
#define CHR(C) text_dump_chr( dump, C )
|
||||
#define UIX(I) text_dump_uix( dump, I )
|
||||
#define UID(I) text_dump_uid( dump, I )
|
||||
#define SID(I) text_dump_sid( dump, I )
|
||||
#define FLT(F) text_dump_flt( dump, F )
|
||||
#define TAB() text_dump_tab( dump )
|
||||
#define UNT() text_dump_untab( dump )
|
||||
#define ENM(E,ENUMS) text_dump_enum( dump, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
|
||||
#define TXT(S) gen_dump_str( dump, S )
|
||||
#define CHR(C) gen_dump_chr( dump, C )
|
||||
#define UIX(I) gen_dump_uix( dump, I )
|
||||
#define UID(I) gen_dump_uid( dump, I )
|
||||
#define SID(I) gen_dump_sid( dump, I )
|
||||
#define FLT(F) gen_dump_flt( dump, F )
|
||||
#define TAB() gen_dump_tab( dump )
|
||||
#define UNT() gen_dump_untab( dump )
|
||||
#define ENM(E,ENUMS) gen_dump_enum( dump, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
|
||||
|
||||
static const char *TGSI_PROCESSOR_TYPES[] =
|
||||
{
|
||||
|
|
@ -659,8 +726,8 @@ static const char *TGSI_MODULATES[] =
|
|||
|
||||
static void
|
||||
dump_declaration_short(
|
||||
struct text_dump *dump,
|
||||
struct tgsi_full_declaration *decl )
|
||||
struct gen_dump *dump,
|
||||
struct tgsi_full_declaration *decl )
|
||||
{
|
||||
TXT( "\nDCL " );
|
||||
ENM( decl->Declaration.File, TGSI_FILES_SHORT );
|
||||
|
|
@ -711,11 +778,11 @@ dump_declaration_short(
|
|||
|
||||
static void
|
||||
dump_declaration_verbose(
|
||||
struct text_dump *dump,
|
||||
struct tgsi_full_declaration *decl,
|
||||
unsigned ignored,
|
||||
unsigned deflt,
|
||||
struct tgsi_full_declaration *fd )
|
||||
struct gen_dump *dump,
|
||||
struct tgsi_full_declaration *decl,
|
||||
unsigned ignored,
|
||||
unsigned deflt,
|
||||
struct tgsi_full_declaration *fd )
|
||||
{
|
||||
TXT( "\nFile : " );
|
||||
ENM( decl->Declaration.File, TGSI_FILES );
|
||||
|
|
@ -792,7 +859,7 @@ dump_declaration_verbose(
|
|||
|
||||
static void
|
||||
dump_immediate_short(
|
||||
struct text_dump *dump,
|
||||
struct gen_dump *dump,
|
||||
struct tgsi_full_immediate *imm )
|
||||
{
|
||||
unsigned i;
|
||||
|
|
@ -820,9 +887,9 @@ dump_immediate_short(
|
|||
|
||||
static void
|
||||
dump_immediate_verbose(
|
||||
struct text_dump *dump,
|
||||
struct gen_dump *dump,
|
||||
struct tgsi_full_immediate *imm,
|
||||
unsigned ignored )
|
||||
unsigned ignored )
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
|
|
@ -849,12 +916,12 @@ dump_immediate_verbose(
|
|||
|
||||
static void
|
||||
dump_instruction_short(
|
||||
struct text_dump *dump,
|
||||
struct tgsi_full_instruction *inst,
|
||||
unsigned instno )
|
||||
struct gen_dump *dump,
|
||||
struct tgsi_full_instruction *inst,
|
||||
unsigned instno )
|
||||
{
|
||||
unsigned i;
|
||||
boolean first_reg = TRUE;
|
||||
boolean first_reg = TRUE;
|
||||
|
||||
CHR( '\n' );
|
||||
UID( instno );
|
||||
|
|
@ -915,6 +982,9 @@ dump_instruction_short(
|
|||
}
|
||||
CHR( ' ' );
|
||||
|
||||
if( src->SrcRegisterExtMod.Complement ) {
|
||||
TXT( "(1 - " );
|
||||
}
|
||||
if( src->SrcRegisterExtMod.Negate ) {
|
||||
CHR( '-' );
|
||||
}
|
||||
|
|
@ -957,6 +1027,9 @@ dump_instruction_short(
|
|||
if( src->SrcRegisterExtMod.Absolute ) {
|
||||
CHR( '|' );
|
||||
}
|
||||
if( src->SrcRegisterExtMod.Complement ) {
|
||||
CHR( ')' );
|
||||
}
|
||||
|
||||
first_reg = FALSE;
|
||||
}
|
||||
|
|
@ -975,11 +1048,11 @@ dump_instruction_short(
|
|||
|
||||
static void
|
||||
dump_instruction_verbose(
|
||||
struct text_dump *dump,
|
||||
struct tgsi_full_instruction *inst,
|
||||
unsigned ignored,
|
||||
unsigned deflt,
|
||||
struct tgsi_full_instruction *fi )
|
||||
struct gen_dump *dump,
|
||||
struct tgsi_full_instruction *inst,
|
||||
unsigned ignored,
|
||||
unsigned deflt,
|
||||
struct tgsi_full_instruction *fi )
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
|
|
@ -1317,13 +1390,12 @@ dump_instruction_verbose(
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
tgsi_dump(
|
||||
static void
|
||||
dump_gen(
|
||||
struct gen_dump *dump,
|
||||
const struct tgsi_token *tokens,
|
||||
unsigned flags )
|
||||
unsigned flags )
|
||||
{
|
||||
struct text_dump _dump;
|
||||
struct text_dump *dump = &_dump;
|
||||
struct tgsi_parse_context parse;
|
||||
struct tgsi_full_instruction fi;
|
||||
struct tgsi_full_declaration fd;
|
||||
|
|
@ -1332,18 +1404,7 @@ tgsi_dump(
|
|||
unsigned deflt = !(flags & TGSI_DUMP_NO_DEFAULT);
|
||||
unsigned instno = 0;
|
||||
|
||||
{
|
||||
#if 0
|
||||
static unsigned counter = 0;
|
||||
char buffer[64];
|
||||
|
||||
sprintf( buffer, "tgsi-dump-%.4u.txt", counter++ );
|
||||
dump->file = fopen( buffer, "wt" );
|
||||
#else
|
||||
dump->file = stderr;
|
||||
#endif
|
||||
dump->tabs = 0;
|
||||
}
|
||||
dump->tabs = 0;
|
||||
|
||||
/* sanity check */
|
||||
assert(strcmp(TGSI_OPCODES[TGSI_OPCODE_CONT], "OPCODE_CONT") == 0);
|
||||
|
|
@ -1457,3 +1518,52 @@ tgsi_dump(
|
|||
tgsi_parse_free( &parse );
|
||||
}
|
||||
|
||||
void
|
||||
tgsi_dump(
|
||||
const struct tgsi_token *tokens,
|
||||
unsigned flags )
|
||||
{
|
||||
struct file_dump dump;
|
||||
|
||||
dump.base.write = _file_dump_write;
|
||||
#if 0
|
||||
{
|
||||
static unsigned counter = 0;
|
||||
char buffer[64];
|
||||
sprintf( buffer, "tgsi-dump-%.4u.txt", counter++ );
|
||||
dump.file = fopen( buffer, "wt" );
|
||||
}
|
||||
#else
|
||||
dump.file = stderr;
|
||||
#endif
|
||||
|
||||
dump_gen(
|
||||
&dump.base,
|
||||
tokens,
|
||||
flags );
|
||||
|
||||
#if 0
|
||||
fclose( dump.file );
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
tgsi_dump_str(
|
||||
char **str,
|
||||
const struct tgsi_token *tokens,
|
||||
unsigned flags )
|
||||
{
|
||||
struct text_dump dump;
|
||||
|
||||
dump.base.write = _text_dump_write;
|
||||
dump.text = NULL;
|
||||
dump.length = 0;
|
||||
dump.capacity = 0;
|
||||
|
||||
dump_gen(
|
||||
&dump.base,
|
||||
tokens,
|
||||
flags );
|
||||
|
||||
*str = dump.text;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,13 @@ extern "C" {
|
|||
void
|
||||
tgsi_dump(
|
||||
const struct tgsi_token *tokens,
|
||||
unsigned flags );
|
||||
unsigned flags );
|
||||
|
||||
void
|
||||
tgsi_dump_str(
|
||||
char **str,
|
||||
const struct tgsi_token *tokens,
|
||||
unsigned flags );
|
||||
|
||||
#if defined __cplusplus
|
||||
} // extern "C"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue