X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Ftgsi%2Ftgsi_dump.c;h=6d39ef21083eb193974a1d3687137574b5b12821;hb=9d7cd439880d9334d21ed099efa15ccf8b709748;hp=77bde86684efc68f7608cf2bc83896fdb3d86177;hpb=dbf3a15313eed930a3d8fdde12e457259c43651b;p=mesa.git diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c index 77bde86684e..6d39ef21083 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007-2008 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -18,7 +18,7 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -29,9 +29,11 @@ #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" +#include "tgsi_strings.h" /** Number of spaces to indent for IF/LOOP/etc */ @@ -42,12 +44,16 @@ struct dump_ctx { struct tgsi_iterate_context iter; + boolean dump_float_as_hex; + uint instno; + uint immno; int indent; uint indentation; + FILE *file; - void (*printf)(struct dump_ctx *ctx, const char *format, ...); + void (*dump_printf)(struct dump_ctx *ctx, const char *format, ...); }; static void @@ -56,7 +62,10 @@ dump_ctx_printf(struct dump_ctx *ctx, const char *format, ...) va_list ap; (void)ctx; va_start(ap, format); - _debug_vprintf(format, ap); + if (ctx->file) + vfprintf(ctx->file, format, ap); + else + _debug_vprintf(format, ap); va_end(ap); } @@ -68,77 +77,25 @@ dump_enum( uint enum_count ) { if (e >= enum_count) - ctx->printf( ctx, "%u", e ); + ctx->dump_printf( ctx, "%u", e ); else - ctx->printf( ctx, "%s", enums[e] ); + ctx->dump_printf( ctx, "%s", enums[e] ); } -#define EOL() ctx->printf( ctx, "\n" ) -#define TXT(S) ctx->printf( ctx, "%s", S ) -#define CHR(C) ctx->printf( ctx, "%c", C ) -#define UIX(I) ctx->printf( ctx, "0x%x", I ) -#define UID(I) ctx->printf( ctx, "%u", I ) -#define INSTID(I) ctx->printf( ctx, "% 3u", I ) -#define SID(I) ctx->printf( ctx, "%d", I ) -#define FLT(F) ctx->printf( ctx, "%10.4f", F ) +#define EOL() ctx->dump_printf( ctx, "\n" ) +#define TXT(S) ctx->dump_printf( ctx, "%s", S ) +#define CHR(C) ctx->dump_printf( ctx, "%c", C ) +#define UIX(I) ctx->dump_printf( ctx, "0x%x", I ) +#define UID(I) ctx->dump_printf( ctx, "%u", I ) +#define INSTID(I) ctx->dump_printf( ctx, "% 3u", I ) +#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 ) ) -static const char *processor_type_names[] = -{ - "FRAG", - "VERT", - "GEOM" -}; - -const char * -tgsi_file_names[TGSI_FILE_COUNT] = -{ - "NULL", - "CONST", - "IN", - "OUT", - "TEMP", - "SAMP", - "ADDR", - "IMM", - "PRED", - "SV", - "IMMX", - "TEMPX" -}; - -static const char *interpolate_names[] = -{ - "CONSTANT", - "LINEAR", - "PERSPECTIVE" -}; - -static const char *semantic_names[] = -{ - "POSITION", - "COLOR", - "BCOLOR", - "FOG", - "PSIZE", - "GENERIC", - "NORMAL", - "FACE", - "EDGEFLAG", - "PRIM_ID", - "INSTANCEID", - "STENCIL" -}; - -static const char *immediate_type_names[] = -{ - "FLT32", - "UINT32", - "INT32" -}; - const char * -tgsi_swizzle_names[] = +tgsi_swizzle_names[4] = { "x", "y", @@ -146,80 +103,31 @@ tgsi_swizzle_names[] = "w" }; -const char * -tgsi_texture_names[] = -{ - "UNKNOWN", - "1D", - "2D", - "3D", - "CUBE", - "RECT", - "SHADOW1D", - "SHADOW2D", - "SHADOWRECT" -}; - -static const char *property_names[] = -{ - "GS_INPUT_PRIMITIVE", - "GS_OUTPUT_PRIMITIVE", - "GS_MAX_OUTPUT_VERTICES", - "FS_COORD_ORIGIN", - "FS_COORD_PIXEL_CENTER" -}; - -static const char *primitive_names[] = -{ - "POINTS", - "LINES", - "LINE_LOOP", - "LINE_STRIP", - "TRIANGLES", - "TRIANGLE_STRIP", - "TRIANGLE_FAN", - "QUADS", - "QUAD_STRIP", - "POLYGON", - "LINES_ADJACENCY", - "LINE_STRIP_ADJACENCY", - "TRIANGLES_ADJACENCY", - "TRIANGLE_STRIP_ADJACENCY" -}; - -static const char *fs_coord_origin_names[] = -{ - "UPPER_LEFT", - "LOWER_LEFT" -}; - -static const char *fs_coord_pixel_center_names[] = -{ - "HALF_INTEGER", - "INTEGER" -}; - - static void _dump_register_src( struct dump_ctx *ctx, const struct tgsi_full_src_register *src ) { - ENM(src->Register.File, tgsi_file_names); + TXT(tgsi_file_name(src->Register.File)); if (src->Register.Dimension) { if (src->Dimension.Indirect) { CHR( '[' ); - ENM( src->DimIndirect.File, tgsi_file_names ); + TXT(tgsi_file_name(src->DimIndirect.File)); CHR( '[' ); SID( src->DimIndirect.Index ); TXT( "]." ); - ENM( src->DimIndirect.SwizzleX, tgsi_swizzle_names ); + ENM( src->DimIndirect.Swizzle, tgsi_swizzle_names ); if (src->Dimension.Index != 0) { if (src->Dimension.Index > 0) CHR( '+' ); SID( src->Dimension.Index ); } CHR( ']' ); + if (src->DimIndirect.ArrayID) { + CHR( '(' ); + SID( src->DimIndirect.ArrayID ); + CHR( ')' ); + } } else { CHR('['); SID(src->Dimension.Index); @@ -228,17 +136,22 @@ _dump_register_src( } if (src->Register.Indirect) { CHR( '[' ); - ENM( src->Indirect.File, tgsi_file_names ); + TXT(tgsi_file_name(src->Indirect.File)); CHR( '[' ); SID( src->Indirect.Index ); TXT( "]." ); - ENM( src->Indirect.SwizzleX, tgsi_swizzle_names ); + ENM( src->Indirect.Swizzle, tgsi_swizzle_names ); if (src->Register.Index != 0) { if (src->Register.Index > 0) CHR( '+' ); SID( src->Register.Index ); } CHR( ']' ); + if (src->Indirect.ArrayID) { + CHR( '(' ); + SID( src->Indirect.ArrayID ); + CHR( ')' ); + } } else { CHR( '[' ); SID( src->Register.Index ); @@ -252,21 +165,26 @@ _dump_register_dst( struct dump_ctx *ctx, const struct tgsi_full_dst_register *dst ) { - ENM(dst->Register.File, tgsi_file_names); + TXT(tgsi_file_name(dst->Register.File)); if (dst->Register.Dimension) { if (dst->Dimension.Indirect) { CHR( '[' ); - ENM( dst->DimIndirect.File, tgsi_file_names ); + TXT(tgsi_file_name(dst->DimIndirect.File)); CHR( '[' ); SID( dst->DimIndirect.Index ); TXT( "]." ); - ENM( dst->DimIndirect.SwizzleX, tgsi_swizzle_names ); + ENM( dst->DimIndirect.Swizzle, tgsi_swizzle_names ); if (dst->Dimension.Index != 0) { if (dst->Dimension.Index > 0) CHR( '+' ); SID( dst->Dimension.Index ); } CHR( ']' ); + if (dst->DimIndirect.ArrayID) { + CHR( '(' ); + SID( dst->DimIndirect.ArrayID ); + CHR( ')' ); + } } else { CHR('['); SID(dst->Dimension.Index); @@ -275,17 +193,22 @@ _dump_register_dst( } if (dst->Register.Indirect) { CHR( '[' ); - ENM( dst->Indirect.File, tgsi_file_names ); + TXT(tgsi_file_name(dst->Indirect.File)); CHR( '[' ); SID( dst->Indirect.Index ); TXT( "]." ); - ENM( dst->Indirect.SwizzleX, tgsi_swizzle_names ); + ENM( dst->Indirect.Swizzle, tgsi_swizzle_names ); if (dst->Register.Index != 0) { if (dst->Register.Index > 0) CHR( '+' ); SID( dst->Register.Index ); } CHR( ']' ); + if (dst->Indirect.ArrayID) { + CHR( '(' ); + SID( dst->Indirect.ArrayID ); + CHR( ')' ); + } } else { CHR( '[' ); SID( dst->Register.Index ); @@ -324,8 +247,18 @@ dump_imm_data(struct tgsi_iterate_context *iter, assert( num_tokens <= 4 ); for (i = 0; i < num_tokens; i++) { switch (data_type) { + case TGSI_IMM_FLOAT64: { + union di d; + d.ui = data[i].Uint | (uint64_t)data[i+1].Uint << 32; + DBL( d.d ); + i++; + 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); @@ -349,17 +282,30 @@ iter_declaration( struct tgsi_full_declaration *decl ) { struct dump_ctx *ctx = (struct dump_ctx *)iter; - - assert(Elements(semantic_names) == TGSI_SEMANTIC_COUNT); - assert(Elements(interpolate_names) == TGSI_INTERPOLATE_COUNT); + boolean patch = decl->Semantic.Name == TGSI_SEMANTIC_PATCH || + decl->Semantic.Name == TGSI_SEMANTIC_TESSINNER || + decl->Semantic.Name == TGSI_SEMANTIC_TESSOUTER || + decl->Semantic.Name == TGSI_SEMANTIC_PRIMID; TXT( "DCL " ); - ENM(decl->Declaration.File, tgsi_file_names); + TXT(tgsi_file_name(decl->Declaration.File)); - /* all geometry shader inputs are two dimensional */ + /* all geometry shader inputs and non-patch tessellation shader inputs are + * two dimensional + */ if (decl->Declaration.File == TGSI_FILE_INPUT && - iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { + (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY || + (!patch && + (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL || + iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL)))) { + TXT("[]"); + } + + /* all non-patch tess ctrl shader outputs are two dimensional */ + if (decl->Declaration.File == TGSI_FILE_OUTPUT && + !patch && + iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) { TXT("[]"); } @@ -381,10 +327,20 @@ iter_declaration( ctx, decl->Declaration.UsageMask ); + if (decl->Declaration.Array) { + TXT( ", ARRAY(" ); + SID(decl->Array.ArrayID); + CHR(')'); + } + + if (decl->Declaration.Local) + TXT( ", LOCAL" ); + if (decl->Declaration.Semantic) { TXT( ", " ); - ENM( decl->Semantic.Name, semantic_names ); + ENM( decl->Semantic.Name, tgsi_semantic_names ); if (decl->Semantic.Index != 0 || + decl->Semantic.Name == TGSI_SEMANTIC_TEXCOORD || decl->Semantic.Name == TGSI_SEMANTIC_GENERIC) { CHR( '[' ); UID( decl->Semantic.Index ); @@ -392,72 +348,83 @@ iter_declaration( } } - if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT && - decl->Declaration.File == TGSI_FILE_INPUT) - { - TXT( ", " ); - ENM( decl->Declaration.Interpolate, interpolate_names ); + if (decl->Declaration.File == TGSI_FILE_IMAGE) { + TXT(", "); + ENM(decl->Image.Resource, tgsi_texture_names); + TXT(", "); + TXT(util_format_name(decl->Image.Format)); + if (decl->Image.Writable) + TXT(", WR"); + if (decl->Image.Raw) + TXT(", RAW"); } - if (decl->Declaration.Centroid) { - TXT( ", CENTROID" ); + if (decl->Declaration.File == TGSI_FILE_BUFFER) { + if (decl->Declaration.Atomic) + TXT(", ATOMIC"); } - if (decl->Declaration.Invariant) { - TXT( ", INVARIANT" ); + if (decl->Declaration.File == TGSI_FILE_MEMORY) { + switch (decl->Declaration.MemType) { + /* Note: ,GLOBAL is optional / the default */ + case TGSI_MEMORY_TYPE_GLOBAL: TXT(", GLOBAL"); break; + case TGSI_MEMORY_TYPE_SHARED: TXT(", SHARED"); break; + case TGSI_MEMORY_TYPE_PRIVATE: TXT(", PRIVATE"); break; + case TGSI_MEMORY_TYPE_INPUT: TXT(", INPUT"); break; + } } - if (decl->Declaration.CylindricalWrap) { - TXT(", CYLWRAP_"); - if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) { - CHR('X'); - } - if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Y) { - CHR('Y'); - } - if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Z) { - CHR('Z'); - } - if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_W) { - CHR('W'); + if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { + TXT(", "); + ENM(decl->SamplerView.Resource, tgsi_texture_names); + TXT(", "); + if ((decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeY) && + (decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeZ) && + (decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeW)) { + ENM(decl->SamplerView.ReturnTypeX, tgsi_return_type_names); + } else { + ENM(decl->SamplerView.ReturnTypeX, tgsi_return_type_names); + TXT(", "); + ENM(decl->SamplerView.ReturnTypeY, tgsi_return_type_names); + TXT(", "); + ENM(decl->SamplerView.ReturnTypeZ, tgsi_return_type_names); + TXT(", "); + ENM(decl->SamplerView.ReturnTypeW, tgsi_return_type_names); } } - if (decl->Declaration.File == TGSI_FILE_IMMEDIATE_ARRAY) { - unsigned i; - char range_indent[4]; - - TXT(" {"); - - if (decl->Range.Last < 10) - range_indent[0] = '\0'; - else if (decl->Range.Last < 100) { - range_indent[0] = ' '; - range_indent[1] = '\0'; - } else if (decl->Range.Last < 1000) { - range_indent[0] = ' '; - range_indent[1] = ' '; - range_indent[2] = '\0'; - } else { - range_indent[0] = ' '; - range_indent[1] = ' '; - range_indent[2] = ' '; - range_indent[3] = '\0'; + if (decl->Declaration.Interpolate) { + if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT && + decl->Declaration.File == TGSI_FILE_INPUT) + { + TXT( ", " ); + ENM( decl->Interp.Interpolate, tgsi_interpolate_names ); } - dump_imm_data(iter, decl->ImmediateData.u, - 4, TGSI_IMM_FLOAT32); - for(i = 1; i <= decl->Range.Last; ++i) { - /* indent by strlen of: - * "DCL IMMX[0..1] {" */ - CHR('\n'); - TXT( " " ); - TXT( range_indent ); - dump_imm_data(iter, decl->ImmediateData.u + i, - 4, TGSI_IMM_FLOAT32); + if (decl->Interp.Location != TGSI_INTERPOLATE_LOC_CENTER) { + TXT( ", " ); + ENM( decl->Interp.Location, tgsi_interpolate_locations ); } - TXT(" }"); + if (decl->Interp.CylindricalWrap) { + TXT(", CYLWRAP_"); + if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) { + CHR('X'); + } + if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Y) { + CHR('Y'); + } + if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Z) { + CHR('Z'); + } + if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_W) { + CHR('W'); + } + } + } + + if (decl->Declaration.Invariant) { + TXT( ", INVARIANT" ); } EOL(); @@ -471,7 +438,7 @@ tgsi_dump_declaration( { struct dump_ctx ctx; - ctx.printf = dump_ctx_printf; + ctx.dump_printf = dump_ctx_printf; iter_declaration( &ctx.iter, (struct tgsi_full_declaration *)decl ); } @@ -481,13 +448,11 @@ iter_property( struct tgsi_iterate_context *iter, struct tgsi_full_property *prop ) { - int i; + unsigned i; struct dump_ctx *ctx = (struct dump_ctx *)iter; - assert(Elements(property_names) == TGSI_PROPERTY_COUNT); - TXT( "PROPERTY " ); - ENM(prop->Property.PropertyName, property_names); + ENM(prop->Property.PropertyName, tgsi_property_names); if (prop->Property.NrTokens > 1) TXT(" "); @@ -496,13 +461,13 @@ iter_property( switch (prop->Property.PropertyName) { case TGSI_PROPERTY_GS_INPUT_PRIM: case TGSI_PROPERTY_GS_OUTPUT_PRIM: - ENM(prop->u[i].Data, primitive_names); + ENM(prop->u[i].Data, tgsi_primitive_names); break; case TGSI_PROPERTY_FS_COORD_ORIGIN: - ENM(prop->u[i].Data, fs_coord_origin_names); + ENM(prop->u[i].Data, tgsi_fs_coord_origin_names); break; case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: - ENM(prop->u[i].Data, fs_coord_pixel_center_names); + ENM(prop->u[i].Data, tgsi_fs_coord_pixel_center_names); break; default: SID( prop->u[i].Data ); @@ -521,7 +486,7 @@ void tgsi_dump_property( { struct dump_ctx ctx; - ctx.printf = dump_ctx_printf; + ctx.dump_printf = dump_ctx_printf; iter_property( &ctx.iter, (struct tgsi_full_property *)prop ); } @@ -533,8 +498,10 @@ iter_immediate( { struct dump_ctx *ctx = (struct dump_ctx *) iter; - TXT( "IMM " ); - ENM( imm->Immediate.DataType, immediate_type_names ); + TXT( "IMM[" ); + SID( ctx->immno++ ); + TXT( "] " ); + ENM( imm->Immediate.DataType, tgsi_immediate_type_names ); dump_imm_data(iter, imm->u, imm->Immediate.NrTokens - 1, imm->Immediate.DataType); @@ -550,7 +517,7 @@ tgsi_dump_immediate( { struct dump_ctx ctx; - ctx.printf = dump_ctx_printf; + ctx.dump_printf = dump_ctx_printf; iter_immediate( &ctx.iter, (struct tgsi_full_immediate *)imm ); } @@ -600,17 +567,8 @@ iter_instruction( TXT( info->mnemonic ); - switch (inst->Instruction.Saturate) { - case TGSI_SAT_NONE: - break; - case TGSI_SAT_ZERO_ONE: + if (inst->Instruction.Saturate) { TXT( "_SAT" ); - break; - case TGSI_SAT_MINUS_PLUS_ONE: - TXT( "_SATNV" ); - break; - default: - assert( 0 ); } for (i = 0; i < inst->Instruction.NumDstRegs; i++) { @@ -658,16 +616,50 @@ iter_instruction( } if (inst->Instruction.Texture) { - TXT( ", " ); - ENM( inst->Texture.Texture, tgsi_texture_names ); + if (!(inst->Instruction.Opcode >= TGSI_OPCODE_SAMPLE && + inst->Instruction.Opcode <= TGSI_OPCODE_GATHER4)) { + TXT( ", " ); + ENM( inst->Texture.Texture, tgsi_texture_names ); + } + for (i = 0; i < inst->Texture.NumOffsets; i++) { + TXT( ", " ); + TXT(tgsi_file_name(inst->TexOffsets[i].File)); + CHR( '[' ); + SID( inst->TexOffsets[i].Index ); + CHR( ']' ); + CHR( '.' ); + ENM( inst->TexOffsets[i].SwizzleX, tgsi_swizzle_names); + ENM( inst->TexOffsets[i].SwizzleY, tgsi_swizzle_names); + ENM( inst->TexOffsets[i].SwizzleZ, tgsi_swizzle_names); + } + } + + if (inst->Instruction.Memory) { + uint32_t qualifier = inst->Memory.Qualifier; + while (qualifier) { + int bit = ffs(qualifier) - 1; + qualifier &= ~(1U << bit); + TXT(", "); + ENM(bit, tgsi_memory_names); + } + if (inst->Memory.Texture) { + TXT( ", " ); + ENM( inst->Memory.Texture, tgsi_texture_names ); + } + if (inst->Memory.Format) { + TXT( ", " ); + TXT( util_format_name(inst->Memory.Format) ); + } } switch (inst->Instruction.Opcode) { case TGSI_OPCODE_IF: + case TGSI_OPCODE_UIF: case TGSI_OPCODE_ELSE: case TGSI_OPCODE_BGNLOOP: case TGSI_OPCODE_ENDLOOP: case TGSI_OPCODE_CAL: + case TGSI_OPCODE_BGNSUB: TXT( " :" ); UID( inst->Label.Label ); break; @@ -675,6 +667,7 @@ iter_instruction( /* update indentation */ if (inst->Instruction.Opcode == TGSI_OPCODE_IF || + inst->Instruction.Opcode == TGSI_OPCODE_UIF || inst->Instruction.Opcode == TGSI_OPCODE_ELSE || inst->Instruction.Opcode == TGSI_OPCODE_BGNLOOP) { ctx->indentation += indent_spaces; @@ -693,9 +686,11 @@ tgsi_dump_instruction( struct dump_ctx ctx; ctx.instno = instno; + ctx.immno = instno; ctx.indent = 0; - ctx.printf = dump_ctx_printf; + ctx.dump_printf = dump_ctx_printf; ctx.indentation = 0; + ctx.file = NULL; iter_instruction( &ctx.iter, (struct tgsi_full_instruction *)inst ); } @@ -705,15 +700,13 @@ prolog( struct tgsi_iterate_context *iter ) { struct dump_ctx *ctx = (struct dump_ctx *) iter; - ENM( iter->processor.Processor, processor_type_names ); + ENM( iter->processor.Processor, tgsi_processor_type_names ); EOL(); return TRUE; } void -tgsi_dump( - const struct tgsi_token *tokens, - uint flags ) +tgsi_dump_to_file(const struct tgsi_token *tokens, uint flags, FILE *file) { struct dump_ctx ctx; @@ -725,19 +718,33 @@ tgsi_dump( ctx.iter.epilog = NULL; ctx.instno = 0; + ctx.immno = 0; ctx.indent = 0; - ctx.printf = dump_ctx_printf; + ctx.dump_printf = dump_ctx_printf; 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 ); } +void +tgsi_dump(const struct tgsi_token *tokens, uint flags) +{ + tgsi_dump_to_file(tokens, flags, NULL); +} + struct str_dump_ctx { struct dump_ctx base; char *str; char *ptr; int left; + bool nospace; }; static void @@ -760,10 +767,11 @@ str_dump_ctx_printf(struct dump_ctx *ctx, const char *format, ...) sctx->ptr += written; sctx->left -= written; } - } + } else + sctx->nospace = true; } -void +bool tgsi_dump_str( const struct tgsi_token *tokens, uint flags, @@ -780,14 +788,49 @@ tgsi_dump_str( ctx.base.iter.epilog = NULL; ctx.base.instno = 0; + ctx.base.immno = 0; ctx.base.indent = 0; - ctx.base.printf = &str_dump_ctx_printf; + ctx.base.dump_printf = &str_dump_ctx_printf; ctx.base.indentation = 0; + ctx.base.file = NULL; ctx.str = str; ctx.str[0] = 0; ctx.ptr = str; ctx.left = (int)size; + ctx.nospace = false; + + 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 ); + + return !ctx.nospace; +} + +void +tgsi_dump_instruction_str( + const struct tgsi_full_instruction *inst, + uint instno, + char *str, + size_t size) +{ + struct str_dump_ctx ctx; + + ctx.base.instno = instno; + ctx.base.immno = instno; + ctx.base.indent = 0; + ctx.base.dump_printf = &str_dump_ctx_printf; + ctx.base.indentation = 0; + ctx.base.file = NULL; + + ctx.str = str; + ctx.str[0] = 0; + ctx.ptr = str; + ctx.left = (int)size; + ctx.nospace = false; + + iter_instruction( &ctx.base.iter, (struct tgsi_full_instruction *)inst ); }