1ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol/**************************************************************************
2ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007-2008 VMware, Inc.
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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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"
32041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie#include "util/u_math.h"
33abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "tgsi_dump.h"
342caaba8195d1019702246bd7f0c02aa95364a8bdMichal Krol#include "tgsi_info.h"
3583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol#include "tgsi_iterate.h"
3685b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul#include "tgsi_strings.h"
3783f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
3845cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
3945cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul/** Number of spaces to indent for IF/LOOP/etc */
4045cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paulstatic const int indent_spaces = 3;
4145cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
4245cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
4383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krolstruct dump_ctx
4483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol{
4583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   struct tgsi_iterate_context iter;
4683f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
47041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie   boolean dump_float_as_hex;
48041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie
4983f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   uint instno;
509ccf91f9ef72f63871b0a8c6b43f7bd452d73b94José Fonseca   uint immno;
51848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   int indent;
52673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
5345cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   uint indentation;
548141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák   FILE *file;
5545cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
56a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   void (*dump_printf)(struct dump_ctx *ctx, const char *format, ...);
5783f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol};
58ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol
59b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastatic void
60b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecadump_ctx_printf(struct dump_ctx *ctx, const char *format, ...)
61b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca{
62b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   va_list ap;
63b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   (void)ctx;
64b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   va_start(ap, format);
658141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák   if (ctx->file)
668141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák      vfprintf(ctx->file, format, ap);
678141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák   else
688141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák      _debug_vprintf(format, ap);
69b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   va_end(ap);
70b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca}
71b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
72ffe58739da9eee2e99682747cc8f26e412c87430Michal Krolstatic void
733c4f1ba5a2edefd69b2c47abaf534fb3af3f259dJosé Fonsecadump_enum(
74b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx,
7582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint e,
7682f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   const char **enums,
7782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint enum_count )
78ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol{
7982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   if (e >= enum_count)
80a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr      ctx->dump_printf( ctx, "%u", e );
8182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   else
82a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr      ctx->dump_printf( ctx, "%s", enums[e] );
83ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol}
84ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol
85a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define EOL()           ctx->dump_printf( ctx, "\n" )
86a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define TXT(S)          ctx->dump_printf( ctx, "%s", S )
87a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define CHR(C)          ctx->dump_printf( ctx, "%c", C )
88a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define UIX(I)          ctx->dump_printf( ctx, "0x%x", I )
89a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define UID(I)          ctx->dump_printf( ctx, "%u", I )
90a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define INSTID(I)       ctx->dump_printf( ctx, "% 3u", I )
91a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define SID(I)          ctx->dump_printf( ctx, "%d", I )
92a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr#define FLT(F)          ctx->dump_printf( ctx, "%10.4f", F )
93fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie#define DBL(D)          ctx->dump_printf( ctx, "%10.8f", D )
94041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie#define HFLT(F)         ctx->dump_printf( ctx, "0x%08x", fui((F)) )
95b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca#define ENM(E,ENUMS)    dump_enum( ctx, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
96ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol
9711dad217186a4c177cb41aa526531d6cd46ae5b0José Fonsecaconst char *
9892209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšáktgsi_swizzle_names[4] =
99f141399031981d6af19a32025ae7c1b947196480Michal Krol{
100f141399031981d6af19a32025ae7c1b947196480Michal Krol   "x",
101f141399031981d6af19a32025ae7c1b947196480Michal Krol   "y",
102f141399031981d6af19a32025ae7c1b947196480Michal Krol   "z",
103f141399031981d6af19a32025ae7c1b947196480Michal Krol   "w"
104f141399031981d6af19a32025ae7c1b947196480Michal Krol};
105f141399031981d6af19a32025ae7c1b947196480Michal Krol
10682f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krolstatic void
107afd01366b098bf790658e069caddb7a930da827dZack Rusin_dump_register_src(
108afd01366b098bf790658e069caddb7a930da827dZack Rusin   struct dump_ctx *ctx,
109afd01366b098bf790658e069caddb7a930da827dZack Rusin   const struct tgsi_full_src_register *src )
110afd01366b098bf790658e069caddb7a930da827dZack Rusin{
11114541dacab218cbe82310d999d44130ebc3f6526Brian Paul   TXT(tgsi_file_name(src->Register.File));
1127472cd0f1f0f8284729274bc5c453d59d9ab4b55Michal Krol   if (src->Register.Dimension) {
11323969670387bc0bb7d0761936905e5eb4df963dcZack Rusin      if (src->Dimension.Indirect) {
11423969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR( '[' );
11514541dacab218cbe82310d999d44130ebc3f6526Brian Paul         TXT(tgsi_file_name(src->DimIndirect.File));
11623969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR( '[' );
11723969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         SID( src->DimIndirect.Index );
11823969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         TXT( "]." );
11921190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         ENM( src->DimIndirect.Swizzle, tgsi_swizzle_names );
12023969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         if (src->Dimension.Index != 0) {
12123969670387bc0bb7d0761936905e5eb4df963dcZack Rusin            if (src->Dimension.Index > 0)
12223969670387bc0bb7d0761936905e5eb4df963dcZack Rusin               CHR( '+' );
12323969670387bc0bb7d0761936905e5eb4df963dcZack Rusin            SID( src->Dimension.Index );
12423969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         }
12523969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR( ']' );
12621190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         if (src->DimIndirect.ArrayID) {
12721190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König            CHR( '(' );
12821190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König            SID( src->DimIndirect.ArrayID );
12921190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König            CHR( ')' );
13021190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         }
13123969670387bc0bb7d0761936905e5eb4df963dcZack Rusin      } else {
13223969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR('[');
13323969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         SID(src->Dimension.Index);
13423969670387bc0bb7d0761936905e5eb4df963dcZack Rusin         CHR(']');
13523969670387bc0bb7d0761936905e5eb4df963dcZack Rusin      }
1367472cd0f1f0f8284729274bc5c453d59d9ab4b55Michal Krol   }
137afd01366b098bf790658e069caddb7a930da827dZack Rusin   if (src->Register.Indirect) {
138afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( '[' );
13914541dacab218cbe82310d999d44130ebc3f6526Brian Paul      TXT(tgsi_file_name(src->Indirect.File));
140afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( '[' );
141afd01366b098bf790658e069caddb7a930da827dZack Rusin      SID( src->Indirect.Index );
142afd01366b098bf790658e069caddb7a930da827dZack Rusin      TXT( "]." );
14321190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König      ENM( src->Indirect.Swizzle, tgsi_swizzle_names );
144afd01366b098bf790658e069caddb7a930da827dZack Rusin      if (src->Register.Index != 0) {
145afd01366b098bf790658e069caddb7a930da827dZack Rusin         if (src->Register.Index > 0)
146afd01366b098bf790658e069caddb7a930da827dZack Rusin            CHR( '+' );
147afd01366b098bf790658e069caddb7a930da827dZack Rusin         SID( src->Register.Index );
148afd01366b098bf790658e069caddb7a930da827dZack Rusin      }
149afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( ']' );
15021190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König      if (src->Indirect.ArrayID) {
15121190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         CHR( '(' );
15221190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         SID( src->Indirect.ArrayID );
15321190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         CHR( ')' );
15421190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König      }
155afd01366b098bf790658e069caddb7a930da827dZack Rusin   } else {
156afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( '[' );
157afd01366b098bf790658e069caddb7a930da827dZack Rusin      SID( src->Register.Index );
158afd01366b098bf790658e069caddb7a930da827dZack Rusin      CHR( ']' );
159afd01366b098bf790658e069caddb7a930da827dZack Rusin   }
160afd01366b098bf790658e069caddb7a930da827dZack Rusin}
161afd01366b098bf790658e069caddb7a930da827dZack Rusin
162101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
163afd01366b098bf790658e069caddb7a930da827dZack Rusinstatic void
164101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin_dump_register_dst(
165b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx,
166101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   const struct tgsi_full_dst_register *dst )
16773e1d0be756537376495547bc1e798805884b8efMichal Krol{
16814541dacab218cbe82310d999d44130ebc3f6526Brian Paul   TXT(tgsi_file_name(dst->Register.File));
169101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   if (dst->Register.Dimension) {
170101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      if (dst->Dimension.Indirect) {
171101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR( '[' );
17214541dacab218cbe82310d999d44130ebc3f6526Brian Paul         TXT(tgsi_file_name(dst->DimIndirect.File));
173101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR( '[' );
174101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         SID( dst->DimIndirect.Index );
175101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         TXT( "]." );
17621190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         ENM( dst->DimIndirect.Swizzle, tgsi_swizzle_names );
177101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if (dst->Dimension.Index != 0) {
178101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            if (dst->Dimension.Index > 0)
179101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               CHR( '+' );
180101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            SID( dst->Dimension.Index );
181101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         }
182101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR( ']' );
18321190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         if (dst->DimIndirect.ArrayID) {
18421190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König            CHR( '(' );
18521190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König            SID( dst->DimIndirect.ArrayID );
18621190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König            CHR( ')' );
18721190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         }
188101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      } else {
189101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR('[');
190101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         SID(dst->Dimension.Index);
191101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         CHR(']');
192101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      }
193101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   }
194101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   if (dst->Register.Indirect) {
195101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( '[' );
19614541dacab218cbe82310d999d44130ebc3f6526Brian Paul      TXT(tgsi_file_name(dst->Indirect.File));
197101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( '[' );
198101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      SID( dst->Indirect.Index );
199101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      TXT( "]." );
20021190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König      ENM( dst->Indirect.Swizzle, tgsi_swizzle_names );
201101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      if (dst->Register.Index != 0) {
202101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if (dst->Register.Index > 0)
203101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            CHR( '+' );
204101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         SID( dst->Register.Index );
205101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      }
206101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( ']' );
20721190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König      if (dst->Indirect.ArrayID) {
20821190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         CHR( '(' );
20921190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         SID( dst->Indirect.ArrayID );
21021190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König         CHR( ')' );
21121190fbd56ec2f12dc5a1bf1d9fc32d507e8f0a3Christian König      }
212101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin   } else {
213101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( '[' );
214101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      SID( dst->Register.Index );
215101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      CHR( ']' );
216f141399031981d6af19a32025ae7c1b947196480Michal Krol   }
21782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol}
21882f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krolstatic void
21982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol_dump_writemask(
220b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx,
22182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint writemask )
22282f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol{
22382f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   if (writemask != TGSI_WRITEMASK_XYZW) {
224058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol      CHR( '.' );
22582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_X)
226058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol         CHR( 'x' );
22782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_Y)
228058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol         CHR( 'y' );
22982f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_Z)
230058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol         CHR( 'z' );
23182f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (writemask & TGSI_WRITEMASK_W)
232058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol         CHR( 'w' );
233058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol   }
23482f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol}
23582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol
2362b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusinstatic void
2372b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusindump_imm_data(struct tgsi_iterate_context *iter,
2382b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin              union tgsi_immediate_data *data,
2392b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin              unsigned num_tokens,
2402b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin              unsigned data_type)
2412b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin{
2422b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   struct dump_ctx *ctx = (struct dump_ctx *)iter;
2432b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   unsigned i ;
2442b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
2452b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   TXT( " {" );
2462b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
2472b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   assert( num_tokens <= 4 );
2482b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   for (i = 0; i < num_tokens; i++) {
2492b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      switch (data_type) {
250fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie      case TGSI_IMM_FLOAT64: {
251fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie         union di d;
252fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie         d.ui = data[i].Uint | (uint64_t)data[i+1].Uint << 32;
253fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie         DBL( d.d );
254fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie         i++;
255fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie         break;
256fa43e0443e206740e219d45abefee65bdb2c3ecbDave Airlie      }
2573985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie      case TGSI_IMM_INT64: {
2583985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         union di d;
2593985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         d.i = data[i].Uint | (uint64_t)data[i+1].Uint << 32;
2603985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         UID( d.i );
2613985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         i++;
2623985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         break;
2633985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie      }
2643985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie      case TGSI_IMM_UINT64: {
2653985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         union di d;
2663985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         d.ui = data[i].Uint | (uint64_t)data[i+1].Uint << 32;
2673985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         UID( d.ui );
2683985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         i++;
2693985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie         break;
2703985e6c044fabce276e137edfc2c99b91fd5b80fDave Airlie      }
2712b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      case TGSI_IMM_FLOAT32:
272041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie         if (ctx->dump_float_as_hex)
273041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie            HFLT( data[i].Float );
274041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie         else
275041081dc219dcf7f61748284033c6fd7627acc69Dave Airlie            FLT( data[i].Float );
2762b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         break;
2772b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      case TGSI_IMM_UINT32:
2782b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         UID(data[i].Uint);
2792b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         break;
2802b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      case TGSI_IMM_INT32:
2812b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         SID(data[i].Int);
2822b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         break;
2832b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      default:
2842b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         assert( 0 );
2852b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      }
2862b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
2872b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      if (i < num_tokens - 1)
2882b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         TXT( ", " );
2892b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   }
2902b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   TXT( "}" );
2912b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin}
2922b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
293673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecastatic boolean
294673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecaiter_declaration(
295673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter,
296673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_full_declaration *decl )
29782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol{
298b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx *ctx = (struct dump_ctx *)iter;
299d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin   boolean patch = decl->Semantic.Name == TGSI_SEMANTIC_PATCH ||
300d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin      decl->Semantic.Name == TGSI_SEMANTIC_TESSINNER ||
301d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin      decl->Semantic.Name == TGSI_SEMANTIC_TESSOUTER ||
302d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin      decl->Semantic.Name == TGSI_SEMANTIC_PRIMID;
303673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
30476164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   TXT( "DCL " );
30582f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol
30614541dacab218cbe82310d999d44130ebc3f6526Brian Paul   TXT(tgsi_file_name(decl->Declaration.File));
3074367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
308d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin   /* all geometry shader inputs and non-patch tessellation shader inputs are
309d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin    * two dimensional
310d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin    */
3114367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   if (decl->Declaration.File == TGSI_FILE_INPUT &&
312af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák       (iter->processor.Processor == PIPE_SHADER_GEOMETRY ||
313d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin        (!patch &&
314af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák         (iter->processor.Processor == PIPE_SHADER_TESS_CTRL ||
315af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák          iter->processor.Processor == PIPE_SHADER_TESS_EVAL)))) {
316d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin      TXT("[]");
317d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin   }
318d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin
319d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin   /* all non-patch tess ctrl shader outputs are two dimensional */
320d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin   if (decl->Declaration.File == TGSI_FILE_OUTPUT &&
321d7081828cc62df7efbc23ca1037a42d69dab94a7Ilia Mirkin       !patch &&
322af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák       iter->processor.Processor == PIPE_SHADER_TESS_CTRL) {
3234367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      TXT("[]");
3244367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   }
3254367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
3264367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   if (decl->Declaration.Dimension) {
3274367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      CHR('[');
3284367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      SID(decl->Dim.Index2D);
3294367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      CHR(']');
3304367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   }
3314367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
3324367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   CHR('[');
3334367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   SID(decl->Range.First);
3344367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   if (decl->Range.First != decl->Range.Last) {
3354367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      TXT("..");
3364367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol      SID(decl->Range.Last);
3374367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   }
3384367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol   CHR(']');
3394367de152cc5bd7240d75a33e75c1b1671b5cc16Michal Krol
34082f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   _dump_writemask(
341b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      ctx,
34282f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      decl->Declaration.UsageMask );
343058b978a5ae2a56e09fed6335b686c654444f4acMichal Krol
34416caeff2a5cc1237d30de9487b48b1cd775d9ae1Christian König   if (decl->Declaration.Array) {
34516caeff2a5cc1237d30de9487b48b1cd775d9ae1Christian König      TXT( ", ARRAY(" );
34616caeff2a5cc1237d30de9487b48b1cd775d9ae1Christian König      SID(decl->Array.ArrayID);
34716caeff2a5cc1237d30de9487b48b1cd775d9ae1Christian König      CHR(')');
34816caeff2a5cc1237d30de9487b48b1cd775d9ae1Christian König   }
34916caeff2a5cc1237d30de9487b48b1cd775d9ae1Christian König
3502644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez   if (decl->Declaration.Local)
3512644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez      TXT( ", LOCAL" );
3522644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez
3532483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol   if (decl->Declaration.Semantic) {
354f141399031981d6af19a32025ae7c1b947196480Michal Krol      TXT( ", " );
35585b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul      ENM( decl->Semantic.Name, tgsi_semantic_names );
356763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell      if (decl->Semantic.Index != 0 ||
3578acaf862dfeac62550514b0e46f5aa6212b08992Christoph Bumiller          decl->Semantic.Name == TGSI_SEMANTIC_TEXCOORD ||
358763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell          decl->Semantic.Name == TGSI_SEMANTIC_GENERIC) {
3592483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol         CHR( '[' );
360763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         UID( decl->Semantic.Index );
3612483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol         CHR( ']' );
3622483062f10e93fbbc5e3f629627b9e8addcc3f84Michal Krol      }
36304811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle
36404811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle      if (decl->Semantic.StreamX != 0 || decl->Semantic.StreamY != 0 ||
36504811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle          decl->Semantic.StreamZ != 0 || decl->Semantic.StreamW != 0) {
36604811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         TXT(", STREAM(");
36704811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         UID(decl->Semantic.StreamX);
36804811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         TXT(", ");
36904811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         UID(decl->Semantic.StreamY);
37004811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         TXT(", ");
37104811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         UID(decl->Semantic.StreamZ);
37204811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         TXT(", ");
37304811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         UID(decl->Semantic.StreamW);
37404811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle         CHR(')');
37504811354c87e40b0bd5e970fa413ea056ed94173Nicolai Hähnle      }
376f141399031981d6af19a32025ae7c1b947196480Michal Krol   }
377b9eeb8dccff3b440a299f19a0868a3ff1cda1e09Michal Krol
3788cc9a8aa2a97ca9e7a36a993954a3480d44c13d3Ilia Mirkin   if (decl->Declaration.File == TGSI_FILE_IMAGE) {
379bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      TXT(", ");
3808cc9a8aa2a97ca9e7a36a993954a3480d44c13d3Ilia Mirkin      ENM(decl->Image.Resource, tgsi_texture_names);
3818cc9a8aa2a97ca9e7a36a993954a3480d44c13d3Ilia Mirkin      TXT(", ");
382e2a1ec5f0f0314915fdfc9a8ef93f3789f356404Ilia Mirkin      TXT(util_format_name(decl->Image.Format));
3838cc9a8aa2a97ca9e7a36a993954a3480d44c13d3Ilia Mirkin      if (decl->Image.Writable)
384b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez         TXT(", WR");
3858cc9a8aa2a97ca9e7a36a993954a3480d44c13d3Ilia Mirkin      if (decl->Image.Raw)
38682c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez         TXT(", RAW");
387a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   }
388a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
389888ddd632d7f6af635cc948f1b3e8982b43800d2Ilia Mirkin   if (decl->Declaration.File == TGSI_FILE_BUFFER) {
390888ddd632d7f6af635cc948f1b3e8982b43800d2Ilia Mirkin      if (decl->Declaration.Atomic)
391888ddd632d7f6af635cc948f1b3e8982b43800d2Ilia Mirkin         TXT(", ATOMIC");
392888ddd632d7f6af635cc948f1b3e8982b43800d2Ilia Mirkin   }
393888ddd632d7f6af635cc948f1b3e8982b43800d2Ilia Mirkin
394a8328e3a50169c3c74656df7f63f56f061d9e751Samuel Pitoiset   if (decl->Declaration.File == TGSI_FILE_MEMORY) {
3953788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      switch (decl->Declaration.MemType) {
3963788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      /* Note: ,GLOBAL is optional / the default */
3973788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      case TGSI_MEMORY_TYPE_GLOBAL:  TXT(", GLOBAL");  break;
3983788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      case TGSI_MEMORY_TYPE_SHARED:  TXT(", SHARED");  break;
3993788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      case TGSI_MEMORY_TYPE_PRIVATE: TXT(", PRIVATE"); break;
4003788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      case TGSI_MEMORY_TYPE_INPUT:   TXT(", INPUT");   break;
4013788e1bf748eca3186377dfa60dbba1c37f8939eHans de Goede      }
402a8328e3a50169c3c74656df7f63f56f061d9e751Samuel Pitoiset   }
403a8328e3a50169c3c74656df7f63f56f061d9e751Samuel Pitoiset
404a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
405bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      TXT(", ");
406a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      ENM(decl->SamplerView.Resource, tgsi_texture_names);
407a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      TXT(", ");
408a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      if ((decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeY) &&
409a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez          (decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeZ) &&
410a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez          (decl->SamplerView.ReturnTypeX == decl->SamplerView.ReturnTypeW)) {
411e7a614c60c21a961d88f8cfd78969052fa7a2685Brian Paul         ENM(decl->SamplerView.ReturnTypeX, tgsi_return_type_names);
412bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      } else {
413e7a614c60c21a961d88f8cfd78969052fa7a2685Brian Paul         ENM(decl->SamplerView.ReturnTypeX, tgsi_return_type_names);
414bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         TXT(", ");
415e7a614c60c21a961d88f8cfd78969052fa7a2685Brian Paul         ENM(decl->SamplerView.ReturnTypeY, tgsi_return_type_names);
416bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         TXT(", ");
417e7a614c60c21a961d88f8cfd78969052fa7a2685Brian Paul         ENM(decl->SamplerView.ReturnTypeZ, tgsi_return_type_names);
418bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         TXT(", ");
419e7a614c60c21a961d88f8cfd78969052fa7a2685Brian Paul         ENM(decl->SamplerView.ReturnTypeW, tgsi_return_type_names);
420bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      }
421bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   }
422bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
4231279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   if (decl->Declaration.Interpolate) {
424af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák      if (iter->processor.Processor == PIPE_SHADER_FRAGMENT &&
4251279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez          decl->Declaration.File == TGSI_FILE_INPUT)
4261279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      {
4271279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         TXT( ", " );
4281279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         ENM( decl->Interp.Interpolate, tgsi_interpolate_names );
4291279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
4302783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol
4314c97ed4411e3653a082875b79587fb308c284a99Ilia Mirkin      if (decl->Interp.Location != TGSI_INTERPOLATE_LOC_CENTER) {
4324c97ed4411e3653a082875b79587fb308c284a99Ilia Mirkin         TXT( ", " );
4334c97ed4411e3653a082875b79587fb308c284a99Ilia Mirkin         ENM( decl->Interp.Location, tgsi_interpolate_locations );
4341279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
4351279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
4361279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      if (decl->Interp.CylindricalWrap) {
4371279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         TXT(", CYLWRAP_");
4381279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) {
4391279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('X');
4401279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
4411279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Y) {
4421279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('Y');
4431279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
4441279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Z) {
4451279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('Z');
4461279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
4471279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_W) {
4481279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez            CHR('W');
4491279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         }
4501279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
451dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul   }
452dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul
453dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul   if (decl->Declaration.Invariant) {
454dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul      TXT( ", INVARIANT" );
455dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul   }
456dc48ae97dcd84acf691b33b0ea2e76c5fdfe18e1Brian Paul
45776164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   EOL();
458f141399031981d6af19a32025ae7c1b947196480Michal Krol
45983f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   return TRUE;
46083f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
46183f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
462adaaa29218f1babad874f50681ca971fdd3b8a40Keith Whitwellvoid
463673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecatgsi_dump_declaration(
464673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_full_declaration *decl )
465f141399031981d6af19a32025ae7c1b947196480Michal Krol{
466673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx ctx;
467798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
468673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
469a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
470673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
471673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   iter_declaration( &ctx.iter, (struct tgsi_full_declaration *)decl );
472673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca}
473673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
474673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecastatic boolean
4753ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusiniter_property(
4763ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_iterate_context *iter,
4773ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_full_property *prop )
4783ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
479198d1bdb5f446ee055d5591a61c0174f87171820Brian Paul   unsigned i;
4803ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct dump_ctx *ctx = (struct dump_ctx *)iter;
4813ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4823ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   TXT( "PROPERTY " );
48392209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák   ENM(prop->Property.PropertyName, tgsi_property_names);
4843ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4853ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   if (prop->Property.NrTokens > 1)
4863ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      TXT(" ");
4873ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
4883ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   for (i = 0; i < prop->Property.NrTokens - 1; ++i) {
4893ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      switch (prop->Property.PropertyName) {
4903ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      case TGSI_PROPERTY_GS_INPUT_PRIM:
4913ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      case TGSI_PROPERTY_GS_OUTPUT_PRIM:
49292209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák         ENM(prop->u[i].Data, tgsi_primitive_names);
4933ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         break;
49473317139a4f78126af0dc4ddaef8206352740727Luca Barbieri      case TGSI_PROPERTY_FS_COORD_ORIGIN:
49592209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák         ENM(prop->u[i].Data, tgsi_fs_coord_origin_names);
49673317139a4f78126af0dc4ddaef8206352740727Luca Barbieri         break;
49773317139a4f78126af0dc4ddaef8206352740727Luca Barbieri      case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER:
49892209314df4f12e8b47336a25ba14cb6b9a23df2Marek Olšák         ENM(prop->u[i].Data, tgsi_fs_coord_pixel_center_names);
49973317139a4f78126af0dc4ddaef8206352740727Luca Barbieri         break;
5009690ab0cdf3cdbcdabce4858fd84711b3afbb9aaBrian Paul      case TGSI_PROPERTY_NEXT_SHADER:
5019690ab0cdf3cdbcdabce4858fd84711b3afbb9aaBrian Paul         ENM(prop->u[i].Data, tgsi_processor_type_names);
5029690ab0cdf3cdbcdabce4858fd84711b3afbb9aaBrian Paul         break;
5033ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      default:
5043ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         SID( prop->u[i].Data );
5053ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         break;
5063ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      }
5073ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      if (i < prop->Property.NrTokens - 2)
5083ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         TXT( ", " );
5093ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   }
5103ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   EOL();
5113ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
5123ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return TRUE;
5133ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
5143ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
5153ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinvoid tgsi_dump_property(
5163ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   const struct tgsi_full_property *prop )
5173ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
5183ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct dump_ctx ctx;
519798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
5203ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
521a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
5223ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
5233ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   iter_property( &ctx.iter, (struct tgsi_full_property *)prop );
5243ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
5253ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
5263ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstatic boolean
527673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecaiter_immediate(
528673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter,
529673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_full_immediate *imm )
530673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca{
531673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx *ctx = (struct dump_ctx *) iter;
532673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
5339ccf91f9ef72f63871b0a8c6b43f7bd452d73b94José Fonseca   TXT( "IMM[" );
5349ccf91f9ef72f63871b0a8c6b43f7bd452d73b94José Fonseca   SID( ctx->immno++ );
5359ccf91f9ef72f63871b0a8c6b43f7bd452d73b94José Fonseca   TXT( "] " );
53685b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul   ENM( imm->Immediate.DataType, tgsi_immediate_type_names );
537f141399031981d6af19a32025ae7c1b947196480Michal Krol
5382b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   dump_imm_data(iter, imm->u, imm->Immediate.NrTokens - 1,
5392b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin                 imm->Immediate.DataType);
5402783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol
5412783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol   EOL();
542f141399031981d6af19a32025ae7c1b947196480Michal Krol
54383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   return TRUE;
54483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
54583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
546adaaa29218f1babad874f50681ca971fdd3b8a40Keith Whitwellvoid
547673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecatgsi_dump_immediate(
548673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_full_immediate *imm )
549f141399031981d6af19a32025ae7c1b947196480Michal Krol{
550673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx ctx;
551798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
552673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
553a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
554673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
555673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   iter_immediate( &ctx.iter, (struct tgsi_full_immediate *)imm );
556673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca}
557673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
558673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecastatic boolean
559673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecaiter_instruction(
560673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter,
561673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_full_instruction *inst )
562673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca{
563673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx *ctx = (struct dump_ctx *) iter;
564673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   uint instno = ctx->instno++;
565848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   const struct tgsi_opcode_info *info = tgsi_get_opcode_info( inst->Instruction.Opcode );
56682f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   uint i;
56782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   boolean first_reg = TRUE;
568f141399031981d6af19a32025ae7c1b947196480Michal Krol
5695e1ef85dc430a4439cd60b66262eab9062dd5f4fJakob Bornecrantz   INSTID( instno );
5705e1ef85dc430a4439cd60b66262eab9062dd5f4fJakob Bornecrantz   TXT( ": " );
5712b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
572848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx->indent -= info->pre_dedent;
573848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   for(i = 0; (int)i < ctx->indent; ++i)
574848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell      TXT( "  " );
575848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx->indent += info->post_indent;
5762b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
57714a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca   if (inst->Instruction.Predicate) {
57814a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      CHR( '(' );
57914a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
58014a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      if (inst->Predicate.Negate)
58114a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca         CHR( '!' );
58214a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
58314a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      TXT( "PRED[" );
58414a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      SID( inst->Predicate.Index );
58514a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      CHR( ']' );
58614a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
58714a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      if (inst->Predicate.SwizzleX != TGSI_SWIZZLE_X ||
58814a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca          inst->Predicate.SwizzleY != TGSI_SWIZZLE_Y ||
58914a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca          inst->Predicate.SwizzleZ != TGSI_SWIZZLE_Z ||
59014a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca          inst->Predicate.SwizzleW != TGSI_SWIZZLE_W) {
59114a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca         CHR( '.' );
59211dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleX, tgsi_swizzle_names );
59311dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleY, tgsi_swizzle_names );
59411dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleZ, tgsi_swizzle_names );
59511dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( inst->Predicate.SwizzleW, tgsi_swizzle_names );
59614a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      }
59714a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
59814a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca      TXT( ") " );
59914a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca   }
60014a0328d4b21a2783a43932d2e4ed7ee75d79685José Fonseca
601848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   TXT( info->mnemonic );
602f141399031981d6af19a32025ae7c1b947196480Michal Krol
603e1c4e8aaaafddd0e04cf2a16e28ef8f1e09d8b44Marek Olšák   if (inst->Instruction.Saturate) {
604f141399031981d6af19a32025ae7c1b947196480Michal Krol      TXT( "_SAT" );
605f141399031981d6af19a32025ae7c1b947196480Michal Krol   }
606f141399031981d6af19a32025ae7c1b947196480Michal Krol
60782f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
6087d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *dst = &inst->Dst[i];
609f141399031981d6af19a32025ae7c1b947196480Michal Krol
61082f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (!first_reg)
611f141399031981d6af19a32025ae7c1b947196480Michal Krol         CHR( ',' );
612f141399031981d6af19a32025ae7c1b947196480Michal Krol      CHR( ' ' );
613f141399031981d6af19a32025ae7c1b947196480Michal Krol
614101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      _dump_register_dst( ctx, dst );
6155b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      _dump_writemask( ctx, dst->Register.WriteMask );
616f141399031981d6af19a32025ae7c1b947196480Michal Krol
61786fe5f235b174e2aedd02bc14a94df818bc3ea74Michal Krol      first_reg = FALSE;
618f141399031981d6af19a32025ae7c1b947196480Michal Krol   }
619f141399031981d6af19a32025ae7c1b947196480Michal Krol
62082f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
6217d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *src = &inst->Src[i];
622f141399031981d6af19a32025ae7c1b947196480Michal Krol
62382f11f7e7c0bbe0452da65f08195c2a346f820e9Michal Krol      if (!first_reg)
624f141399031981d6af19a32025ae7c1b947196480Michal Krol         CHR( ',' );
625f141399031981d6af19a32025ae7c1b947196480Michal Krol      CHR( ' ' );
626f141399031981d6af19a32025ae7c1b947196480Michal Krol
62791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.Negate)
628399190d13668ed457cf5d6bbbefe908a95bad289José Fonseca         CHR( '-' );
62991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.Absolute)
630f141399031981d6af19a32025ae7c1b947196480Michal Krol         CHR( '|' );
631f141399031981d6af19a32025ae7c1b947196480Michal Krol
632afd01366b098bf790658e069caddb7a930da827dZack Rusin      _dump_register_src(ctx, src);
633f141399031981d6af19a32025ae7c1b947196480Michal Krol
63491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.SwizzleX != TGSI_SWIZZLE_X ||
63591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          src->Register.SwizzleY != TGSI_SWIZZLE_Y ||
63691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          src->Register.SwizzleZ != TGSI_SWIZZLE_Z ||
63791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          src->Register.SwizzleW != TGSI_SWIZZLE_W) {
638f141399031981d6af19a32025ae7c1b947196480Michal Krol         CHR( '.' );
63911dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleX, tgsi_swizzle_names );
64011dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleY, tgsi_swizzle_names );
64111dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleZ, tgsi_swizzle_names );
64211dad217186a4c177cb41aa526531d6cd46ae5b0José Fonseca         ENM( src->Register.SwizzleW, tgsi_swizzle_names );
643f141399031981d6af19a32025ae7c1b947196480Michal Krol      }
644f141399031981d6af19a32025ae7c1b947196480Michal Krol
64591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (src->Register.Absolute)
646f141399031981d6af19a32025ae7c1b947196480Michal Krol         CHR( '|' );
647f141399031981d6af19a32025ae7c1b947196480Michal Krol
64886fe5f235b174e2aedd02bc14a94df818bc3ea74Michal Krol      first_reg = FALSE;
649f141399031981d6af19a32025ae7c1b947196480Michal Krol   }
650281dad225947b4f00bfc5e785d92d2a7c2f06afeMichal Krol
651ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   if (inst->Instruction.Texture) {
6523a9eb40ee16eedb6caff90a8c0c24b7d801063f3Roland Scheidegger      if (!(inst->Instruction.Opcode >= TGSI_OPCODE_SAMPLE &&
6533a9eb40ee16eedb6caff90a8c0c24b7d801063f3Roland Scheidegger            inst->Instruction.Opcode <= TGSI_OPCODE_GATHER4)) {
6543a9eb40ee16eedb6caff90a8c0c24b7d801063f3Roland Scheidegger         TXT( ", " );
6553a9eb40ee16eedb6caff90a8c0c24b7d801063f3Roland Scheidegger         ENM( inst->Texture.Texture, tgsi_texture_names );
6563a9eb40ee16eedb6caff90a8c0c24b7d801063f3Roland Scheidegger      }
6572083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      for (i = 0; i < inst->Texture.NumOffsets; i++) {
6582083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         TXT( ", " );
65914541dacab218cbe82310d999d44130ebc3f6526Brian Paul         TXT(tgsi_file_name(inst->TexOffsets[i].File));
6602083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         CHR( '[' );
6612083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         SID( inst->TexOffsets[i].Index );
6622083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         CHR( ']' );
6632083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         CHR( '.' );
6642083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].SwizzleX, tgsi_swizzle_names);
6652083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].SwizzleY, tgsi_swizzle_names);
6662083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         ENM( inst->TexOffsets[i].SwizzleZ, tgsi_swizzle_names);
6672083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      }
66850b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin   }
66950b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin
67050b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin   if (inst->Instruction.Memory) {
67150b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin      uint32_t qualifier = inst->Memory.Qualifier;
67250b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin      while (qualifier) {
67350b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin         int bit = ffs(qualifier) - 1;
67450b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin         qualifier &= ~(1U << bit);
67550b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin         TXT(", ");
67650b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin         ENM(bit, tgsi_memory_names);
67750b8488926c4fa45ed79148217b81e54252788e7Ilia Mirkin      }
6783243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle      if (inst->Memory.Texture) {
6793243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle         TXT( ", " );
6803243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle         ENM( inst->Memory.Texture, tgsi_texture_names );
6813243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle      }
6823243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle      if (inst->Memory.Format) {
6833243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle         TXT( ", " );
6843243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle         TXT( util_format_name(inst->Memory.Format) );
6853243b6fc97dc73555f72ce8c01f643d707b26610Nicolai Hähnle      }
68636aa9cf781440ce685930586cbf53248cf9c0dc2Michal Krol   }
68736aa9cf781440ce685930586cbf53248cf9c0dc2Michal Krol
68832d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau   if (inst->Instruction.Label) {
68932d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      switch (inst->Instruction.Opcode) {
69032d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_IF:
69132d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_UIF:
69232d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_ELSE:
69332d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_BGNLOOP:
69432d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_ENDLOOP:
69532d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_CAL:
69632d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      case TGSI_OPCODE_BGNSUB:
69732d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau         TXT( " :" );
69832d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau         UID( inst->Label.Label );
69932d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau         break;
70032d0dc50a07e88aef69754820a42b13054ccfa11Marc-André Lureau      }
701281dad225947b4f00bfc5e785d92d2a7c2f06afeMichal Krol   }
7022783f3bfabd6e316f7e221e950499c3631c041ceMichal Krol
70345cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   /* update indentation */
70445cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   if (inst->Instruction.Opcode == TGSI_OPCODE_IF ||
70550b3fc6204a28881f625605f988cb0866ae6a6a5José Fonseca       inst->Instruction.Opcode == TGSI_OPCODE_UIF ||
70645cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul       inst->Instruction.Opcode == TGSI_OPCODE_ELSE ||
70745cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul       inst->Instruction.Opcode == TGSI_OPCODE_BGNLOOP) {
70845cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul      ctx->indentation += indent_spaces;
70945cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   }
71045cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul
71176164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   EOL();
712673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
713673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   return TRUE;
714f141399031981d6af19a32025ae7c1b947196480Michal Krol}
715f141399031981d6af19a32025ae7c1b947196480Michal Krol
716673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecavoid
717673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonsecatgsi_dump_instruction(
718673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_full_instruction *inst,
719673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   uint instno )
72083f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol{
721673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx ctx;
722798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
72383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
724673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   ctx.instno = instno;
7259ccf91f9ef72f63871b0a8c6b43f7bd452d73b94José Fonseca   ctx.immno = instno;
726848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   ctx.indent = 0;
727a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
72845cd9d80dbc7298240b5dfaf929ecebeb5c6c6afBrian Paul   ctx.indentation = 0;
7292023906667cf349284cd3d3921dc1dcbb7506014Brian Paul   ctx.file = NULL;
730673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
731673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   iter_instruction( &ctx.iter, (struct tgsi_full_instruction *)inst );
73283f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
73383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
73483f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krolstatic boolean
73583f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krolprolog(
736673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct tgsi_iterate_context *iter )
73783f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol{
738673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   struct dump_ctx *ctx = (struct dump_ctx *) iter;
73985b5dac705fcf3fafb734696e1f863cfc21e2d6eBrian Paul   ENM( iter->processor.Processor, tgsi_processor_type_names );
74076164bf7a20ef6dabc3204a766f604becfba9997José Fonseca   EOL();
74183f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   return TRUE;
74283f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol}
74383f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol
744e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnlestatic void
745e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnleinit_dump_ctx(struct dump_ctx *ctx, uint flags)
746e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle{
747e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   memset(ctx, 0, sizeof(*ctx));
748e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle
749e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   ctx->iter.prolog = prolog;
750e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   ctx->iter.iterate_instruction = iter_instruction;
751e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   ctx->iter.iterate_declaration = iter_declaration;
752e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   ctx->iter.iterate_immediate = iter_immediate;
753e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   ctx->iter.iterate_property = iter_property;
754e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle
755e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   if (flags & TGSI_DUMP_FLOAT_AS_HEX)
756e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle      ctx->dump_float_as_hex = TRUE;
757e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle}
758e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle
7593c4f1ba5a2edefd69b2c47abaf534fb3af3f259dJosé Fonsecavoid
7608141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšáktgsi_dump_to_file(const struct tgsi_token *tokens, uint flags, FILE *file)
761ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol{
76283f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   struct dump_ctx ctx;
763798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
764ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol
765e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   init_dump_ctx(&ctx, flags);
766ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol
767a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.dump_printf = dump_ctx_printf;
7688141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák   ctx.file = file;
769ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol
77083f245bd242cd2c5f59f072095dcc47aa6153b21Michal Krol   tgsi_iterate_shader( tokens, &ctx.iter );
771ffe58739da9eee2e99682747cc8f26e412c87430Michal Krol}
772673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca
7738141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšákvoid
7748141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšáktgsi_dump(const struct tgsi_token *tokens, uint flags)
7758141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák{
7768141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák   tgsi_dump_to_file(tokens, flags, NULL);
7778141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák}
7788141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák
779b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastruct str_dump_ctx
780b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca{
781b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct dump_ctx base;
782b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   char *str;
783b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   char *ptr;
7843e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell   int left;
785531f5d1270782927911c5c720201e86c6f40182dDave Airlie   bool nospace;
786b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca};
787b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
788b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastatic void
789b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecastr_dump_ctx_printf(struct dump_ctx *ctx, const char *format, ...)
790b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca{
791b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct str_dump_ctx *sctx = (struct str_dump_ctx *)ctx;
792b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
793318d305f6dd416295003d04b6c9092ae988f894aNicolai Hähnle   if (!sctx->nospace) {
7943e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      int written;
795b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      va_list ap;
796b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      va_start(ap, format);
797b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      written = util_vsnprintf(sctx->ptr, sctx->left, format, ap);
798b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca      va_end(ap);
7993e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell
8003e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      /* Some complicated logic needed to handle the return value of
8013e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell       * vsnprintf:
8023e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell       */
8033e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      if (written > 0) {
804318d305f6dd416295003d04b6c9092ae988f894aNicolai Hähnle         if (written >= sctx->left) {
805318d305f6dd416295003d04b6c9092ae988f894aNicolai Hähnle            sctx->nospace = true;
806318d305f6dd416295003d04b6c9092ae988f894aNicolai Hähnle            written = sctx->left;
807318d305f6dd416295003d04b6c9092ae988f894aNicolai Hähnle         }
8083e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell         sctx->ptr += written;
8093e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell         sctx->left -= written;
8103e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell      }
811318d305f6dd416295003d04b6c9092ae988f894aNicolai Hähnle   }
812b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca}
813b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
814531f5d1270782927911c5c720201e86c6f40182dDave Airliebool
815b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonsecatgsi_dump_str(
816673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca   const struct tgsi_token *tokens,
817b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   uint flags,
818b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   char *str,
819b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   size_t size)
820673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca{
821b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   struct str_dump_ctx ctx;
822798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
823b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
824e08eaa5b723a22301f117ac6120c3d9cd399855eNicolai Hähnle   init_dump_ctx(&ctx.base, flags);
825b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
826a50d695ac20d894278b8e4bc1e0e8a159cd08a1dJohannes Obermayr   ctx.base.dump_printf = &str_dump_ctx_printf;
827b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
828b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.str = str;
829b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.str[0] = 0;
830b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   ctx.ptr = str;
8313e94521912ca75bb14093053bf1cd1001e79cd1bKeith Whitwell   ctx.left = (int)size;
832531f5d1270782927911c5c720201e86c6f40182dDave Airlie   ctx.nospace = false;
833b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca
834b8a7eef242f6bb97d90f6e0303d270b2cbc58421José Fonseca   tgsi_iterate_shader( tokens, &ctx.base.iter );
835531f5d1270782927911c5c720201e86c6f40182dDave Airlie
836531f5d1270782927911c5c720201e86c6f40182dDave Airlie   return !ctx.nospace;
837673489fa5cde4ce8d49918f20f007201a17bc45eJosé Fonseca}
838a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca
839a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonsecavoid
840a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonsecatgsi_dump_instruction_str(
841a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   const struct tgsi_full_instruction *inst,
842a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   uint instno,
843a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   char *str,
844a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   size_t size)
845a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca{
846a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   struct str_dump_ctx ctx;
847798f7a8596e3ff3f57a44812d7fd005f53f5557cWuZhen   memset(&ctx, 0, sizeof(ctx));
848a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca
849a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.base.instno = instno;
850a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.base.immno = instno;
851a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.base.indent = 0;
852a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.base.dump_printf = &str_dump_ctx_printf;
853a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.base.indentation = 0;
8548141b4cee514bb673e394f6fbe2cbe02e5b0faf2Marek Olšák   ctx.base.file = NULL;
855a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca
856a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.str = str;
857a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.str[0] = 0;
858a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.ptr = str;
859a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   ctx.left = (int)size;
860531f5d1270782927911c5c720201e86c6f40182dDave Airlie   ctx.nospace = false;
861a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca
862a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca   iter_instruction( &ctx.base.iter, (struct tgsi_full_instruction *)inst );
863a29e40a42382630c2d9d95d3a1e03a7b3db87addJosé Fonseca}
864