1ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol/**************************************************************************
2ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol *
35ded4ffc506eb051b151d3e8b1e71b13576e951aMichal Krol * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * All Rights Reserved.
5ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol *
6ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * Permission is hereby granted, free of charge, to any person obtaining a
7ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * copy of this software and associated documentation files (the
8ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * "Software"), to deal in the Software without restriction, including
9ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * without limitation the rights to use, copy, modify, merge, publish,
10ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * distribute, sub license, and/or sell copies of the Software, and to
11ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * permit persons to whom the Software is furnished to do so, subject to
12ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * the following conditions:
13ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol *
14ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * The above copyright notice and this permission notice (including the
15ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * next paragraph) shall be included in all copies or substantial portions
16ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * of the Software.
17ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol *
18ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol *
26ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol **************************************************************************/
27ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol
28ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
29673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca#include "util/u_string.h"
303e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell#include "util/u_math.h"
31f01af4dbd26bec433cde08d011a5101edd7d83beBrian Paul#include "util/u_memory.h"
32abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "tgsi_dump.h"
332caaba8195d1019702246bd7f0c02aa95364a8bdMichal Krol#include "tgsi_info.h"
3483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol#include "tgsi_iterate.h"
3585b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul#include "tgsi_strings.h"
3683f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
3745cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
3845cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul/** Number of spaces to indent for IF/LOOP/etc */
3945cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paulstatic const int indent_spaces = 3;
4045cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
4145cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
4283f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krolstruct dump_ctx
4383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol{
4483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   struct tgsi_iterate_context iter;
4583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
4683f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   uint instno;
47848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   int indent;
48673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
4945cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   uint indentation;
5045cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
51a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   void (*dump_printf)(struct dump_ctx *ctx, const char *format, ...);
5283f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol};
53ffe58739da9eee2e99682747cc8f26e412c87430michal
54b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastatic void
55b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecadump_ctx_printf(struct dump_ctx *ctx, const char *format, ...)
56b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca{
57b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   va_list ap;
58b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   (void)ctx;
59b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   va_start(ap, format);
60a8bb49562938e94459f398a1733a76eb9c690f6cMarek Olšák   _debug_vprintf(format, ap);
61b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   va_end(ap);
62b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca}
63b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
64ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
653c4f1ba5a2edefd69b2c47abaf534fb3af3f259dJosé Fonsecadump_enum(
66b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx,
6782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint e,
6882f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   const char **enums,
6982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint enum_count )
70ffe58739da9eee2e99682747cc8f26e412c87430michal{
7182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   if (e >= enum_count)
72a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr      ctx->dump_printf( ctx, "%u", e );
7382f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   else
74a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr      ctx->dump_printf( ctx, "%s", enums[e] );
75ffe58739da9eee2e99682747cc8f26e412c87430michal}
76ffe58739da9eee2e99682747cc8f26e412c87430michal
77a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define EOL()           ctx->dump_printf( ctx, "\n" )
78a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define TXT(S)          ctx->dump_printf( ctx, "%s", S )
79a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define CHR(C)          ctx->dump_printf( ctx, "%c", C )
80a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define UIX(I)          ctx->dump_printf( ctx, "0x%x", I )
81a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define UID(I)          ctx->dump_printf( ctx, "%u", I )
82a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define INSTID(I)       ctx->dump_printf( ctx, "% 3u", I )
83a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define SID(I)          ctx->dump_printf( ctx, "%d", I )
84a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define FLT(F)          ctx->dump_printf( ctx, "%10.4f", F )
85b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca#define ENM(E,ENUMS)    dump_enum( ctx, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
86ffe58739da9eee2e99682747cc8f26e412c87430michal
8711dad217186a4c177cb41aa526531d6cd46ae5b0José Fonsecaconst char *
8892209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšáktgsi_swizzle_names[4] =
89f141399031981d6af19a32025ae7c1b947196480michal{
90f141399031981d6af19a32025ae7c1b947196480michal   "x",
91f141399031981d6af19a32025ae7c1b947196480michal   "y",
92f141399031981d6af19a32025ae7c1b947196480michal   "z",
93f141399031981d6af19a32025ae7c1b947196480michal   "w"
94f141399031981d6af19a32025ae7c1b947196480michal};
95f141399031981d6af19a32025ae7c1b947196480michal
9682f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krolstatic void
97afd01366b098bf790658e069caddb7a930da827dZack Rusin_dump_register_src(
98afd01366b098bf790658e069caddb7a930da827dZack Rusin   struct dump_ctx *ctx,
99afd01366b098bf790658e069caddb7a930da827dZack Rusin   const struct tgsi_full_src_register *src )
100afd01366b098bf790658e069caddb7a930da827dZack Rusin{
10111dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca   ENM(src->Register.File, tgsi_file_names);
1027472cd0f1f0f8284729274bc5c453d59d9ab4b55Michal Krol   if (src->Register.Dimension) {
10323969670387bc0bb7d0761936905e5eb4df963dcZack Rusin      if (src->Dimension.Indirect) {
10423969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR( '[' );
10511dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->DimIndirect.File, tgsi_file_names );
10623969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR( '[' );
10723969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         SID( src->DimIndirect.Index );
10823969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         TXT( "]." );
10911dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->DimIndirect.SwizzleX, tgsi_swizzle_names );
11023969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         if (src->Dimension.Index != 0) {
11123969670387bc0bb7d0761936905e5eb4df963dcZack Rusin            if (src->Dimension.Index > 0)
11223969670387bc0bb7d0761936905e5eb4df963dcZack Rusin               CHR( '+' );
11323969670387bc0bb7d0761936905e5eb4df963dcZack Rusin            SID( src->Dimension.Index );
11423969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         }
11523969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR( ']' );
11623969670387bc0bb7d0761936905e5eb4df963dcZack Rusin      } else {
11723969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR('[');
11823969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         SID(src->Dimension.Index);
11923969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR(']');
12023969670387bc0bb7d0761936905e5eb4df963dcZack Rusin      }
1217472cd0f1f0f8284729274bc5c453d59d9ab4b55Michal Krol   }
122afd01366b098bf790658e069caddb7a930da827dZack Rusin   if (src->Register.Indirect) {
123afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( '[' );
12411dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca      ENM( src->Indirect.File, tgsi_file_names );
125afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( '[' );
126afd01366b098bf790658e069caddb7a930da827dZack Rusin      SID( src->Indirect.Index );
127afd01366b098bf790658e069caddb7a930da827dZack Rusin      TXT( "]." );
12811dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca      ENM( src->Indirect.SwizzleX, tgsi_swizzle_names );
129afd01366b098bf790658e069caddb7a930da827dZack Rusin      if (src->Register.Index != 0) {
130afd01366b098bf790658e069caddb7a930da827dZack Rusin         if (src->Register.Index > 0)
131afd01366b098bf790658e069caddb7a930da827dZack Rusin            CHR( '+' );
132afd01366b098bf790658e069caddb7a930da827dZack Rusin         SID( src->Register.Index );
133afd01366b098bf790658e069caddb7a930da827dZack Rusin      }
134afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( ']' );
135afd01366b098bf790658e069caddb7a930da827dZack Rusin   } else {
136afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( '[' );
137afd01366b098bf790658e069caddb7a930da827dZack Rusin      SID( src->Register.Index );
138afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( ']' );
139afd01366b098bf790658e069caddb7a930da827dZack Rusin   }
140afd01366b098bf790658e069caddb7a930da827dZack Rusin}
141afd01366b098bf790658e069caddb7a930da827dZack Rusin
142101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
143afd01366b098bf790658e069caddb7a930da827dZack Rusinstatic void
144101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin_dump_register_dst(
145b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx,
146101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   const struct tgsi_full_dst_register *dst )
14773e1d0be756537376495547bc1e798805884b8efMichal Krol{
14811dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca   ENM(dst->Register.File, tgsi_file_names);
149101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   if (dst->Register.Dimension) {
150101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      if (dst->Dimension.Indirect) {
151101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR( '[' );
15211dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( dst->DimIndirect.File, tgsi_file_names );
153101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR( '[' );
154101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         SID( dst->DimIndirect.Index );
155101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         TXT( "]." );
15611dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( dst->DimIndirect.SwizzleX, tgsi_swizzle_names );
157101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if (dst->Dimension.Index != 0) {
158101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            if (dst->Dimension.Index > 0)
159101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               CHR( '+' );
160101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            SID( dst->Dimension.Index );
161101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         }
162101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR( ']' );
163101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      } else {
164101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR('[');
165101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         SID(dst->Dimension.Index);
166101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR(']');
167101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      }
168101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   }
169101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   if (dst->Register.Indirect) {
170101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( '[' );
17111dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca      ENM( dst->Indirect.File, tgsi_file_names );
172101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( '[' );
173101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      SID( dst->Indirect.Index );
174101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      TXT( "]." );
17511dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca      ENM( dst->Indirect.SwizzleX, tgsi_swizzle_names );
176101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      if (dst->Register.Index != 0) {
177101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if (dst->Register.Index > 0)
178101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            CHR( '+' );
179101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         SID( dst->Register.Index );
180101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      }
181101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( ']' );
182101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   } else {
183101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( '[' );
184101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      SID( dst->Register.Index );
185101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( ']' );
186f141399031981d6af19a32025ae7c1b947196480michal   }
18782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol}
18882f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krolstatic void
18982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol_dump_writemask(
190b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx,
19182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint writemask )
19282f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol{
19382f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   if (writemask != TGSI_WRITEMASK_XYZW) {
194058b978a5ae2a56e09fed6335b686c654444f4acmichal      CHR( '.' );
19582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_X)
196058b978a5ae2a56e09fed6335b686c654444f4acmichal         CHR( 'x' );
19782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_Y)
198058b978a5ae2a56e09fed6335b686c654444f4acmichal         CHR( 'y' );
19982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_Z)
200058b978a5ae2a56e09fed6335b686c654444f4acmichal         CHR( 'z' );
20182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_W)
202058b978a5ae2a56e09fed6335b686c654444f4acmichal         CHR( 'w' );
203058b978a5ae2a56e09fed6335b686c654444f4acmichal   }
20482f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol}
20582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol
2062b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusinstatic void
2072b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusindump_imm_data(struct tgsi_iterate_context *iter,
2082b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin              union tgsi_immediate_data *data,
2092b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin              unsigned num_tokens,
2102b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin              unsigned data_type)
2112b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin{
2122b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   struct dump_ctx *ctx = (struct dump_ctx *)iter;
2132b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   unsigned i ;
2142b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
2152b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   TXT( " {" );
2162b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
2172b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   assert( num_tokens <= 4 );
2182b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   for (i = 0; i < num_tokens; i++) {
2192b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      switch (data_type) {
2202b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      case TGSI_IMM_FLOAT32:
2212b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         FLT( data[i].Float );
2222b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         break;
2232b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      case TGSI_IMM_UINT32:
2242b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         UID(data[i].Uint);
2252b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         break;
2262b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      case TGSI_IMM_INT32:
2272b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         SID(data[i].Int);
2282b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         break;
2292b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      default:
2302b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         assert( 0 );
2312b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      }
2322b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
2332b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      if (i < num_tokens - 1)
2342b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         TXT( ", " );
2352b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   }
2362b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   TXT( "}" );
2372b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin}
2382b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
239673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecastatic boolean
240673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecaiter_declaration(
241673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter,
242673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_full_declaration *decl )
24382f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol{
244b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx = (struct dump_ctx *)iter;
245673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
24676164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   TXT( "DCL " );
24782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol
24811dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca   ENM(decl->Declaration.File, tgsi_file_names);
2494367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
2504367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   /* all geometry shader inputs are two dimensional */
2514367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   if (decl->Declaration.File == TGSI_FILE_INPUT &&
2524367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol       iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) {
2534367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      TXT("[]");
2544367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   }
2554367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
2564367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   if (decl->Declaration.Dimension) {
2574367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      CHR('[');
2584367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      SID(decl->Dim.Index2D);
2594367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      CHR(']');
2604367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   }
2614367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
2624367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   CHR('[');
2634367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   SID(decl->Range.First);
2644367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   if (decl->Range.First != decl->Range.Last) {
2654367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      TXT("..");
2664367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      SID(decl->Range.Last);
2674367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   }
2684367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   CHR(']');
2694367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
27082f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   _dump_writemask(
271b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      ctx,
27282f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      decl->Declaration.UsageMask );
273058b978a5ae2a56e09fed6335b686c654444f4acmichal
2742644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez   if (decl->Declaration.Local)
2752644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez      TXT( ", LOCAL" );
2762644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez
2772483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol   if (decl->Declaration.Semantic) {
278f141399031981d6af19a32025ae7c1b947196480michal      TXT( ", " );
27985b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul      ENM( decl->Semantic.Name, tgsi_semantic_names );
280763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell      if (decl->Semantic.Index != 0 ||
281763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell          decl->Semantic.Name == TGSI_SEMANTIC_GENERIC) {
2822483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol         CHR( '[' );
283763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         UID( decl->Semantic.Index );
2842483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol         CHR( ']' );
2852483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol      }
286f141399031981d6af19a32025ae7c1b947196480michal   }
287b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
288bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
289bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      TXT(", ");
290bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      ENM(decl->Resource.Resource, tgsi_texture_names);
291b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez      if (decl->Resource.Writable)
292b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez         TXT(", WR");
29382c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez      if (decl->Resource.Raw)
29482c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez         TXT(", RAW");
295a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   }
296a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
297a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
298bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      TXT(", ");
299a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      ENM(decl->SamplerView.Resource, tgsi_texture_names);
300a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      TXT(", ");
301a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      if ((decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeY) &&
302a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez          (decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeZ) &&
303a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez          (decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeW)) {
304a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         ENM(decl->SamplerView.ReturnTypeX, tgsi_type_names);
305bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      } else {
306a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         ENM(decl->SamplerView.ReturnTypeX, tgsi_type_names);
307bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         TXT(", ");
308a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         ENM(decl->SamplerView.ReturnTypeY, tgsi_type_names);
309bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         TXT(", ");
310a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         ENM(decl->SamplerView.ReturnTypeZ, tgsi_type_names);
311bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         TXT(", ");
312a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         ENM(decl->SamplerView.ReturnTypeW, tgsi_type_names);
313bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      }
314bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   }
315bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
3161279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   if (decl->Declaration.Interpolate) {
3171279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT &&
3181279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez          decl->Declaration.File == TGSI_FILE_INPUT)
3191279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      {
3201279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         TXT( ", " );
3211279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         ENM( decl->Interp.Interpolate, tgsi_interpolate_names );
3221279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
3232783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol
3241279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      if (decl->Interp.Centroid) {
3251279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         TXT( ", CENTROID" );
3261279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
3271279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
3281279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      if (decl->Interp.CylindricalWrap) {
3291279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         TXT(", CYLWRAP_");
3301279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) {
3311279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('X');
3321279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
3331279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Y) {
3341279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('Y');
3351279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
3361279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Z) {
3371279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('Z');
3381279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
3391279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_W) {
3401279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('W');
3411279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
3421279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
343dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul   }
344dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul
345dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul   if (decl->Declaration.Invariant) {
346dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul      TXT( ", INVARIANT" );
347dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul   }
348dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul
3496f6d740c851aa8bedc7c51dbd5db14de338787f1Michal Krol
3502b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   if (decl->Declaration.File == TGSI_FILE_IMMEDIATE_ARRAY) {
3512b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      unsigned i;
3522b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      char range_indent[4];
3532b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
3542b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      TXT(" {");
3552b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
3562b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      if (decl->Range.Last < 10)
3572b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[0] = '\0';
3582b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      else if (decl->Range.Last < 100) {
3592b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[0] = ' ';
3602b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[1] = '\0';
3612b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      } else if (decl->Range.Last < 1000) {
3622b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[0] = ' ';
3632b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[1] = ' ';
3642b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[2] = '\0';
3652b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      } else {
3662b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[0] = ' ';
3672b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[1] = ' ';
3682b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[2] = ' ';
3692b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         range_indent[3] = '\0';
3702b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      }
3712b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
3722b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      dump_imm_data(iter, decl->ImmediateData.u,
3732b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin                    4, TGSI_IMM_FLOAT32);
3742b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      for(i = 1; i <= decl->Range.Last; ++i) {
3752b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         /* indent by strlen of:
3762b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin          *   "DCL IMMX[0..1] {" */
3772b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         CHR('\n');
3782b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         TXT( "                " );
3792b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         TXT( range_indent );
3802b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         dump_imm_data(iter, decl->ImmediateData.u + i,
3812b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin                       4, TGSI_IMM_FLOAT32);
3822b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      }
3832b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
3842b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      TXT(" }");
3852b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   }
3862b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
38776164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   EOL();
388f141399031981d6af19a32025ae7c1b947196480michal
38983f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   return TRUE;
39083f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
39183f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
392adaaa29218f1babad874f50681ca971fdd3b8a40Keith Whitwellvoid
393673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecatgsi_dump_declaration(
394673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_full_declaration *decl )
395f141399031981d6af19a32025ae7c1b947196480michal{
396673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx ctx;
397673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
398a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
399673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
400673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   iter_declaration( &ctx.iter, (struct tgsi_full_declaration *)decl );
401673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca}
402673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
403673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecastatic boolean
4043ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusiniter_property(
4053ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_iterate_context *iter,
4063ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_full_property *prop )
4073ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
4083ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   int i;
4093ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct dump_ctx *ctx = (struct dump_ctx *)iter;
4103ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4113ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   TXT( "PROPERTY " );
41292209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák   ENM(prop->Property.PropertyName, tgsi_property_names);
4133ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4143ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   if (prop->Property.NrTokens > 1)
4153ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      TXT(" ");
4163ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4173ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   for (i = 0; i < prop->Property.NrTokens - 1; ++i) {
4183ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      switch (prop->Property.PropertyName) {
4193ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      case TGSI_PROPERTY_GS_INPUT_PRIM:
4203ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      case TGSI_PROPERTY_GS_OUTPUT_PRIM:
42192209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák         ENM(prop->u[i].Data, tgsi_primitive_names);
4223ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         break;
42373317139a4f78126af0dc4ddaef8206352740727Luca Barbieri      case TGSI_PROPERTY_FS_COORD_ORIGIN:
42492209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák         ENM(prop->u[i].Data, tgsi_fs_coord_origin_names);
42573317139a4f78126af0dc4ddaef8206352740727Luca Barbieri         break;
42673317139a4f78126af0dc4ddaef8206352740727Luca Barbieri      case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER:
42792209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák         ENM(prop->u[i].Data, tgsi_fs_coord_pixel_center_names);
42873317139a4f78126af0dc4ddaef8206352740727Luca Barbieri         break;
4293ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      default:
4303ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         SID( prop->u[i].Data );
4313ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         break;
4323ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      }
4333ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      if (i < prop->Property.NrTokens - 2)
4343ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         TXT( ", " );
4353ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   }
4363ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   EOL();
4373ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4383ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return TRUE;
4393ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
4403ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4413ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinvoid tgsi_dump_property(
4423ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   const struct tgsi_full_property *prop )
4433ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
4443ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct dump_ctx ctx;
4453ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
446a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
4473ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4483ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   iter_property( &ctx.iter, (struct tgsi_full_property *)prop );
4493ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
4503ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4513ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstatic boolean
452673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecaiter_immediate(
453673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter,
454673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_full_immediate *imm )
455673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca{
456673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx *ctx = (struct dump_ctx *) iter;
457673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
4582783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol   TXT( "IMM " );
45985b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul   ENM( imm->Immediate.DataType, tgsi_immediate_type_names );
460f141399031981d6af19a32025ae7c1b947196480michal
4612b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   dump_imm_data(iter, imm->u, imm->Immediate.NrTokens - 1,
4622b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin                 imm->Immediate.DataType);
4632783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol
4642783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol   EOL();
465f141399031981d6af19a32025ae7c1b947196480michal
46683f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   return TRUE;
46783f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
46883f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
469adaaa29218f1babad874f50681ca971fdd3b8a40Keith Whitwellvoid
470673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecatgsi_dump_immediate(
471673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_full_immediate *imm )
472f141399031981d6af19a32025ae7c1b947196480michal{
473673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx ctx;
474673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
475a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
476673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
477673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   iter_immediate( &ctx.iter, (struct tgsi_full_immediate *)imm );
478673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca}
479673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
480673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecastatic boolean
481673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecaiter_instruction(
482673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter,
483673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_full_instruction *inst )
484673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca{
485673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx *ctx = (struct dump_ctx *) iter;
486673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   uint instno = ctx->instno++;
487848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   const struct tgsi_opcode_info *info = tgsi_get_opcode_info( inst->Instruction.Opcode );
48882f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint i;
48982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   boolean first_reg = TRUE;
490f141399031981d6af19a32025ae7c1b947196480michal
4915e1ef85dc430a4439cd60b66262eab9062dd5f4fJakob Bornecrantz   INSTID( instno );
4925e1ef85dc430a4439cd60b66262eab9062dd5f4fJakob Bornecrantz   TXT( ": " );
4932b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
494848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx->indent -= info->pre_dedent;
495848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   for(i = 0; (int)i < ctx->indent; ++i)
496848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell      TXT( "  " );
497848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx->indent += info->post_indent;
4982b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
49914a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca   if (inst->Instruction.Predicate) {
50014a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      CHR( '(' );
50114a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
50214a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      if (inst->Predicate.Negate)
50314a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca         CHR( '!' );
50414a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
50514a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      TXT( "PRED[" );
50614a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      SID( inst->Predicate.Index );
50714a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      CHR( ']' );
50814a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
50914a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      if (inst->Predicate.SwizzleX != TGSI_SWIZZLE_X ||
51014a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca          inst->Predicate.SwizzleY != TGSI_SWIZZLE_Y ||
51114a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca          inst->Predicate.SwizzleZ != TGSI_SWIZZLE_Z ||
51214a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca          inst->Predicate.SwizzleW != TGSI_SWIZZLE_W) {
51314a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca         CHR( '.' );
51411dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleX, tgsi_swizzle_names );
51511dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleY, tgsi_swizzle_names );
51611dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleZ, tgsi_swizzle_names );
51711dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleW, tgsi_swizzle_names );
51814a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      }
51914a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
52014a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      TXT( ") " );
52114a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca   }
52214a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
523848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   TXT( info->mnemonic );
524f141399031981d6af19a32025ae7c1b947196480michal
52582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   switch (inst->Instruction.Saturate) {
526f141399031981d6af19a32025ae7c1b947196480michal   case TGSI_SAT_NONE:
527f141399031981d6af19a32025ae7c1b947196480michal      break;
528f141399031981d6af19a32025ae7c1b947196480michal   case TGSI_SAT_ZERO_ONE:
529f141399031981d6af19a32025ae7c1b947196480michal      TXT( "_SAT" );
530f141399031981d6af19a32025ae7c1b947196480michal      break;
531f141399031981d6af19a32025ae7c1b947196480michal   case TGSI_SAT_MINUS_PLUS_ONE:
53247a45aaa0fd1dbc0de45de2ed2995f81a0154bafMichal Krol      TXT( "_SATNV" );
533f141399031981d6af19a32025ae7c1b947196480michal      break;
534f141399031981d6af19a32025ae7c1b947196480michal   default:
535f141399031981d6af19a32025ae7c1b947196480michal      assert( 0 );
536f141399031981d6af19a32025ae7c1b947196480michal   }
537f141399031981d6af19a32025ae7c1b947196480michal
53882f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
5397d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *dst = &inst->Dst[i];
540f141399031981d6af19a32025ae7c1b947196480michal
54182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (!first_reg)
542f141399031981d6af19a32025ae7c1b947196480michal         CHR( ',' );
543f141399031981d6af19a32025ae7c1b947196480michal      CHR( ' ' );
544f141399031981d6af19a32025ae7c1b947196480michal
545101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      _dump_register_dst( ctx, dst );
5465b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      _dump_writemask( ctx, dst->Register.WriteMask );
547f141399031981d6af19a32025ae7c1b947196480michal
54886fe5f235b174e2aedd02bc14a94df818bc3ea74michal      first_reg = FALSE;
549f141399031981d6af19a32025ae7c1b947196480michal   }
550f141399031981d6af19a32025ae7c1b947196480michal
55182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
5527d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *src = &inst->Src[i];
553f141399031981d6af19a32025ae7c1b947196480michal
55482f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (!first_reg)
555f141399031981d6af19a32025ae7c1b947196480michal         CHR( ',' );
556f141399031981d6af19a32025ae7c1b947196480michal      CHR( ' ' );
557f141399031981d6af19a32025ae7c1b947196480michal
55891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.Negate)
559399190d13668ed457cf5d6bbbefe908a95bad289José Fonseca         CHR( '-' );
56091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.Absolute)
561f141399031981d6af19a32025ae7c1b947196480michal         CHR( '|' );
562f141399031981d6af19a32025ae7c1b947196480michal
563afd01366b098bf790658e069caddb7a930da827dZack Rusin      _dump_register_src(ctx, src);
564f141399031981d6af19a32025ae7c1b947196480michal
56591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.SwizzleX != TGSI_SWIZZLE_X ||
56691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          src->Register.SwizzleY != TGSI_SWIZZLE_Y ||
56791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          src->Register.SwizzleZ != TGSI_SWIZZLE_Z ||
56891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          src->Register.SwizzleW != TGSI_SWIZZLE_W) {
569f141399031981d6af19a32025ae7c1b947196480michal         CHR( '.' );
57011dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleX, tgsi_swizzle_names );
57111dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleY, tgsi_swizzle_names );
57211dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleZ, tgsi_swizzle_names );
57311dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleW, tgsi_swizzle_names );
574f141399031981d6af19a32025ae7c1b947196480michal      }
575f141399031981d6af19a32025ae7c1b947196480michal
57691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.Absolute)
577f141399031981d6af19a32025ae7c1b947196480michal         CHR( '|' );
578f141399031981d6af19a32025ae7c1b947196480michal
57986fe5f235b174e2aedd02bc14a94df818bc3ea74michal      first_reg = FALSE;
580f141399031981d6af19a32025ae7c1b947196480michal   }
581281dad225947b4f00bfc5e785d92d2a7c2f06afemichal
582ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   if (inst->Instruction.Texture) {
58336aa9cf781440ce685930586cbf53248cf9c0dc2Michal Krol      TXT( ", " );
58411dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca      ENM( inst->Texture.Texture, tgsi_texture_names );
5852083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      for (i = 0; i < inst->Texture.NumOffsets; i++) {
5862083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         TXT( ", " );
5872083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].File, tgsi_file_names);
5882083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         CHR( '[' );
5892083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         SID( inst->TexOffsets[i].Index );
5902083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         CHR( ']' );
5912083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         CHR( '.' );
5922083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].SwizzleX, tgsi_swizzle_names);
5932083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].SwizzleY, tgsi_swizzle_names);
5942083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].SwizzleZ, tgsi_swizzle_names);
5952083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      }
59636aa9cf781440ce685930586cbf53248cf9c0dc2Michal Krol   }
59736aa9cf781440ce685930586cbf53248cf9c0dc2Michal Krol
59882f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   switch (inst->Instruction.Opcode) {
599281dad225947b4f00bfc5e785d92d2a7c2f06afemichal   case TGSI_OPCODE_IF:
600281dad225947b4f00bfc5e785d92d2a7c2f06afemichal   case TGSI_OPCODE_ELSE:
601cb90c43676c258419e4b617c908570891d3674cbMichal Krol   case TGSI_OPCODE_BGNLOOP:
602cb90c43676c258419e4b617c908570891d3674cbMichal Krol   case TGSI_OPCODE_ENDLOOP:
6033a345e000350c1590367f01be5db6f0f10701283Brian   case TGSI_OPCODE_CAL:
6044a470f63c9c3f5aeef1e10ae42eee24c772f74fcmichal      TXT( " :" );
6057d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      UID( inst->Label.Label );
606281dad225947b4f00bfc5e785d92d2a7c2f06afemichal      break;
607281dad225947b4f00bfc5e785d92d2a7c2f06afemichal   }
6082783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol
60945cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   /* update indentation */
61045cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   if (inst->Instruction.Opcode == TGSI_OPCODE_IF ||
61145cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul       inst->Instruction.Opcode == TGSI_OPCODE_ELSE ||
61245cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul       inst->Instruction.Opcode == TGSI_OPCODE_BGNLOOP) {
61345cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul      ctx->indentation += indent_spaces;
61445cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   }
61545cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
61676164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   EOL();
617673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
618673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   return TRUE;
619f141399031981d6af19a32025ae7c1b947196480michal}
620f141399031981d6af19a32025ae7c1b947196480michal
621673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecavoid
622673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecatgsi_dump_instruction(
623673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_full_instruction *inst,
624673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   uint instno )
62583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol{
626673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx ctx;
62783f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
628673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   ctx.instno = instno;
629848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx.indent = 0;
630a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
63145cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   ctx.indentation = 0;
632673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
633673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   iter_instruction( &ctx.iter, (struct tgsi_full_instruction *)inst );
63483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
63583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
63683f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krolstatic boolean
63783f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krolprolog(
638673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter )
63983f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol{
640673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx *ctx = (struct dump_ctx *) iter;
64185b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul   ENM( iter->processor.Processor, tgsi_processor_type_names );
64276164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   EOL();
64383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   return TRUE;
64483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
64583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
6463c4f1ba5a2edefd69b2c47abaf534fb3af3f259dJosé Fonsecavoid
647b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecatgsi_dump(
64815c902455fe1b4572e614bf30912d92fe9c7bb28Michal Krol   const struct tgsi_token *tokens,
649b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   uint flags )
650ffe58739da9eee2e99682747cc8f26e412c87430michal{
65183f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   struct dump_ctx ctx;
652ffe58739da9eee2e99682747cc8f26e412c87430michal
65383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   ctx.iter.prolog = prolog;
65483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   ctx.iter.iterate_instruction = iter_instruction;
65583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   ctx.iter.iterate_declaration = iter_declaration;
65683f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   ctx.iter.iterate_immediate = iter_immediate;
6573ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   ctx.iter.iterate_property = iter_property;
65883f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   ctx.iter.epilog = NULL;
659ffe58739da9eee2e99682747cc8f26e412c87430michal
66083f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   ctx.instno = 0;
661848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx.indent = 0;
662a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
66345cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   ctx.indentation = 0;
664ffe58739da9eee2e99682747cc8f26e412c87430michal
66583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   tgsi_iterate_shader( tokens, &ctx.iter );
666ffe58739da9eee2e99682747cc8f26e412c87430michal}
667673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
668b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastruct str_dump_ctx
669b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca{
670b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx base;
671b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   char *str;
672b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   char *ptr;
6733e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell   int left;
674b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca};
675b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
676b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastatic void
677b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastr_dump_ctx_printf(struct dump_ctx *ctx, const char *format, ...)
678b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca{
679b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct str_dump_ctx *sctx = (struct str_dump_ctx *)ctx;
680b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
681b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   if(sctx->left > 1) {
6823e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      int written;
683b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      va_list ap;
684b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      va_start(ap, format);
685b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      written = util_vsnprintf(sctx->ptr, sctx->left, format, ap);
686b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      va_end(ap);
6873e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell
6883e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      /* Some complicated logic needed to handle the return value of
6893e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell       * vsnprintf:
6903e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell       */
6913e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      if (written > 0) {
6923e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell         written = MIN2(sctx->left, written);
6933e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell         sctx->ptr += written;
6943e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell         sctx->left -= written;
6953e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      }
696b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   }
697b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca}
698b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
699673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecavoid
700b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecatgsi_dump_str(
701673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_token *tokens,
702b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   uint flags,
703b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   char *str,
704b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   size_t size)
705673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca{
706b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct str_dump_ctx ctx;
707b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
708b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.base.iter.prolog = prolog;
709b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.base.iter.iterate_instruction = iter_instruction;
710b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.base.iter.iterate_declaration = iter_declaration;
711b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.base.iter.iterate_immediate = iter_immediate;
7123ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   ctx.base.iter.iterate_property = iter_property;
713b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.base.iter.epilog = NULL;
714b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
715b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.base.instno = 0;
716848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx.base.indent = 0;
717a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.base.dump_printf = &str_dump_ctx_printf;
71845cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   ctx.base.indentation = 0;
719b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
720b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.str = str;
721b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.str[0] = 0;
722b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.ptr = str;
7233e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell   ctx.left = (int)size;
724b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
725b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   tgsi_iterate_shader( tokens, &ctx.base.iter );
726673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca}
727