Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tgsi_dump_c.c 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. /**************************************************************************
  2. *
  3. * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
  4. * All Rights Reserved.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the
  8. * "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish,
  10. * distribute, sub license, and/or sell copies of the Software, and to
  11. * permit persons to whom the Software is furnished to do so, subject to
  12. * the following conditions:
  13. *
  14. * The above copyright notice and this permission notice (including the
  15. * next paragraph) shall be included in all copies or substantial portions
  16. * of the Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19. * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21. * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  22. * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23. * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25. *
  26. **************************************************************************/
  27. #include "util/u_debug.h"
  28. #include "util/u_string.h"
  29. #include "tgsi_dump_c.h"
  30. #include "tgsi_build.h"
  31. #include "tgsi_info.h"
  32. #include "tgsi_parse.h"
  33. static void
  34. dump_enum(
  35. const unsigned e,
  36. const char **enums,
  37. const unsigned enums_count )
  38. {
  39. if (e >= enums_count) {
  40. debug_printf( "%u", e );
  41. }
  42. else {
  43. debug_printf( "%s", enums[e] );
  44. }
  45. }
  46. #define EOL() debug_printf( "\n" )
  47. #define TXT(S) debug_printf( "%s", S )
  48. #define CHR(C) debug_printf( "%c", C )
  49. #define UIX(I) debug_printf( "0x%x", I )
  50. #define UID(I) debug_printf( "%u", I )
  51. #define SID(I) debug_printf( "%d", I )
  52. #define FLT(F) debug_printf( "%10.4f", F )
  53. #define ENM(E,ENUMS) dump_enum( E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
  54. static const char *TGSI_PROCESSOR_TYPES[] =
  55. {
  56. "PROCESSOR_FRAGMENT",
  57. "PROCESSOR_VERTEX",
  58. "PROCESSOR_GEOMETRY"
  59. };
  60. static const char *TGSI_TOKEN_TYPES[] =
  61. {
  62. "TOKEN_TYPE_DECLARATION",
  63. "TOKEN_TYPE_IMMEDIATE",
  64. "TOKEN_TYPE_INSTRUCTION"
  65. };
  66. static const char *TGSI_FILES[] =
  67. {
  68. "FILE_NULL",
  69. "FILE_CONSTANT",
  70. "FILE_INPUT",
  71. "FILE_OUTPUT",
  72. "FILE_TEMPORARY",
  73. "FILE_SAMPLER",
  74. "FILE_ADDRESS",
  75. "FILE_IMMEDIATE"
  76. };
  77. static const char *TGSI_INTERPOLATES[] =
  78. {
  79. "INTERPOLATE_CONSTANT",
  80. "INTERPOLATE_LINEAR",
  81. "INTERPOLATE_PERSPECTIVE"
  82. };
  83. static const char *TGSI_SEMANTICS[] =
  84. {
  85. "SEMANTIC_POSITION",
  86. "SEMANTIC_COLOR",
  87. "SEMANTIC_BCOLOR",
  88. "SEMANTIC_FOG",
  89. "SEMANTIC_PSIZE",
  90. "SEMANTIC_GENERIC",
  91. "SEMANTIC_NORMAL"
  92. };
  93. static const char *TGSI_IMMS[] =
  94. {
  95. "IMM_FLOAT32"
  96. };
  97. static const char *TGSI_SATS[] =
  98. {
  99. "SAT_NONE",
  100. "SAT_ZERO_ONE",
  101. "SAT_MINUS_PLUS_ONE"
  102. };
  103. static const char *TGSI_INSTRUCTION_EXTS[] =
  104. {
  105. "INSTRUCTION_EXT_TYPE_NV",
  106. "INSTRUCTION_EXT_TYPE_LABEL",
  107. "INSTRUCTION_EXT_TYPE_TEXTURE"
  108. };
  109. static const char *TGSI_PRECISIONS[] =
  110. {
  111. "PRECISION_DEFAULT",
  112. "PRECISION_FLOAT32",
  113. "PRECISION_FLOAT16",
  114. "PRECISION_FIXED12"
  115. };
  116. static const char *TGSI_CCS[] =
  117. {
  118. "CC_GT",
  119. "CC_EQ",
  120. "CC_LT",
  121. "CC_UN",
  122. "CC_GE",
  123. "CC_LE",
  124. "CC_NE",
  125. "CC_TR",
  126. "CC_FL"
  127. };
  128. static const char *TGSI_SWIZZLES[] =
  129. {
  130. "SWIZZLE_X",
  131. "SWIZZLE_Y",
  132. "SWIZZLE_Z",
  133. "SWIZZLE_W"
  134. };
  135. static const char *TGSI_TEXTURES[] =
  136. {
  137. "TEXTURE_UNKNOWN",
  138. "TEXTURE_1D",
  139. "TEXTURE_2D",
  140. "TEXTURE_3D",
  141. "TEXTURE_CUBE",
  142. "TEXTURE_RECT",
  143. "TEXTURE_SHADOW1D",
  144. "TEXTURE_SHADOW2D",
  145. "TEXTURE_SHADOWRECT"
  146. };
  147. static const char *TGSI_SRC_REGISTER_EXTS[] =
  148. {
  149. "SRC_REGISTER_EXT_TYPE_SWZ",
  150. "SRC_REGISTER_EXT_TYPE_MOD"
  151. };
  152. static const char *TGSI_EXTSWIZZLES[] =
  153. {
  154. "EXTSWIZZLE_X",
  155. "EXTSWIZZLE_Y",
  156. "EXTSWIZZLE_Z",
  157. "EXTSWIZZLE_W",
  158. "EXTSWIZZLE_ZERO",
  159. "EXTSWIZZLE_ONE"
  160. };
  161. static const char *TGSI_WRITEMASKS[] =
  162. {
  163. "0",
  164. "WRITEMASK_X",
  165. "WRITEMASK_Y",
  166. "WRITEMASK_XY",
  167. "WRITEMASK_Z",
  168. "WRITEMASK_XZ",
  169. "WRITEMASK_YZ",
  170. "WRITEMASK_XYZ",
  171. "WRITEMASK_W",
  172. "WRITEMASK_XW",
  173. "WRITEMASK_YW",
  174. "WRITEMASK_XYW",
  175. "WRITEMASK_ZW",
  176. "WRITEMASK_XZW",
  177. "WRITEMASK_YZW",
  178. "WRITEMASK_XYZW"
  179. };
  180. static const char *TGSI_DST_REGISTER_EXTS[] =
  181. {
  182. "DST_REGISTER_EXT_TYPE_CONDCODE",
  183. "DST_REGISTER_EXT_TYPE_MODULATE"
  184. };
  185. static const char *TGSI_MODULATES[] =
  186. {
  187. "MODULATE_1X",
  188. "MODULATE_2X",
  189. "MODULATE_4X",
  190. "MODULATE_8X",
  191. "MODULATE_HALF",
  192. "MODULATE_QUARTER",
  193. "MODULATE_EIGHTH"
  194. };
  195. static void
  196. dump_declaration_verbose(
  197. struct tgsi_full_declaration *decl,
  198. unsigned ignored,
  199. unsigned deflt,
  200. struct tgsi_full_declaration *fd )
  201. {
  202. TXT( "\nFile : " );
  203. ENM( decl->Declaration.File, TGSI_FILES );
  204. if( deflt || fd->Declaration.UsageMask != decl->Declaration.UsageMask ) {
  205. TXT( "\nUsageMask : " );
  206. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_X ) {
  207. CHR( 'X' );
  208. }
  209. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_Y ) {
  210. CHR( 'Y' );
  211. }
  212. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_Z ) {
  213. CHR( 'Z' );
  214. }
  215. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_W ) {
  216. CHR( 'W' );
  217. }
  218. }
  219. if( deflt || fd->Declaration.Interpolate != decl->Declaration.Interpolate ) {
  220. TXT( "\nInterpolate: " );
  221. ENM( decl->Declaration.Interpolate, TGSI_INTERPOLATES );
  222. }
  223. if( deflt || fd->Declaration.Semantic != decl->Declaration.Semantic ) {
  224. TXT( "\nSemantic : " );
  225. UID( decl->Declaration.Semantic );
  226. }
  227. if( ignored ) {
  228. TXT( "\nPadding : " );
  229. UIX( decl->Declaration.Padding );
  230. }
  231. EOL();
  232. TXT( "\nFirst: " );
  233. UID( decl->DeclarationRange.First );
  234. TXT( "\nLast : " );
  235. UID( decl->DeclarationRange.Last );
  236. if( decl->Declaration.Semantic ) {
  237. EOL();
  238. TXT( "\nSemanticName : " );
  239. ENM( decl->Semantic.SemanticName, TGSI_SEMANTICS );
  240. TXT( "\nSemanticIndex: " );
  241. UID( decl->Semantic.SemanticIndex );
  242. if( ignored ) {
  243. TXT( "\nPadding : " );
  244. UIX( decl->Semantic.Padding );
  245. }
  246. }
  247. }
  248. static void
  249. dump_immediate_verbose(
  250. struct tgsi_full_immediate *imm,
  251. unsigned ignored )
  252. {
  253. unsigned i;
  254. TXT( "\nDataType : " );
  255. ENM( imm->Immediate.DataType, TGSI_IMMS );
  256. if( ignored ) {
  257. TXT( "\nPadding : " );
  258. UIX( imm->Immediate.Padding );
  259. }
  260. for( i = 0; i < imm->Immediate.NrTokens - 1; i++ ) {
  261. EOL();
  262. switch( imm->Immediate.DataType ) {
  263. case TGSI_IMM_FLOAT32:
  264. TXT( "\nFloat: " );
  265. FLT( imm->u.ImmediateFloat32[i].Float );
  266. break;
  267. default:
  268. assert( 0 );
  269. }
  270. }
  271. }
  272. static void
  273. dump_instruction_verbose(
  274. struct tgsi_full_instruction *inst,
  275. unsigned ignored,
  276. unsigned deflt,
  277. struct tgsi_full_instruction *fi )
  278. {
  279. unsigned i;
  280. TXT( "\nOpcode : OPCODE_" );
  281. TXT( tgsi_get_opcode_info( inst->Instruction.Opcode )->mnemonic );
  282. if( deflt || fi->Instruction.Saturate != inst->Instruction.Saturate ) {
  283. TXT( "\nSaturate : " );
  284. ENM( inst->Instruction.Saturate, TGSI_SATS );
  285. }
  286. if( deflt || fi->Instruction.NumDstRegs != inst->Instruction.NumDstRegs ) {
  287. TXT( "\nNumDstRegs : " );
  288. UID( inst->Instruction.NumDstRegs );
  289. }
  290. if( deflt || fi->Instruction.NumSrcRegs != inst->Instruction.NumSrcRegs ) {
  291. TXT( "\nNumSrcRegs : " );
  292. UID( inst->Instruction.NumSrcRegs );
  293. }
  294. if( ignored ) {
  295. TXT( "\nPadding : " );
  296. UIX( inst->Instruction.Padding );
  297. }
  298. if( deflt || tgsi_compare_instruction_ext_nv( inst->InstructionExtNv, fi->InstructionExtNv ) ) {
  299. EOL();
  300. TXT( "\nType : " );
  301. ENM( inst->InstructionExtNv.Type, TGSI_INSTRUCTION_EXTS );
  302. if( deflt || fi->InstructionExtNv.Precision != inst->InstructionExtNv.Precision ) {
  303. TXT( "\nPrecision : " );
  304. ENM( inst->InstructionExtNv.Precision, TGSI_PRECISIONS );
  305. }
  306. if( deflt || fi->InstructionExtNv.CondDstIndex != inst->InstructionExtNv.CondDstIndex ) {
  307. TXT( "\nCondDstIndex : " );
  308. UID( inst->InstructionExtNv.CondDstIndex );
  309. }
  310. if( deflt || fi->InstructionExtNv.CondFlowIndex != inst->InstructionExtNv.CondFlowIndex ) {
  311. TXT( "\nCondFlowIndex : " );
  312. UID( inst->InstructionExtNv.CondFlowIndex );
  313. }
  314. if( deflt || fi->InstructionExtNv.CondMask != inst->InstructionExtNv.CondMask ) {
  315. TXT( "\nCondMask : " );
  316. ENM( inst->InstructionExtNv.CondMask, TGSI_CCS );
  317. }
  318. if( deflt || fi->InstructionExtNv.CondSwizzleX != inst->InstructionExtNv.CondSwizzleX ) {
  319. TXT( "\nCondSwizzleX : " );
  320. ENM( inst->InstructionExtNv.CondSwizzleX, TGSI_SWIZZLES );
  321. }
  322. if( deflt || fi->InstructionExtNv.CondSwizzleY != inst->InstructionExtNv.CondSwizzleY ) {
  323. TXT( "\nCondSwizzleY : " );
  324. ENM( inst->InstructionExtNv.CondSwizzleY, TGSI_SWIZZLES );
  325. }
  326. if( deflt || fi->InstructionExtNv.CondSwizzleZ != inst->InstructionExtNv.CondSwizzleZ ) {
  327. TXT( "\nCondSwizzleZ : " );
  328. ENM( inst->InstructionExtNv.CondSwizzleZ, TGSI_SWIZZLES );
  329. }
  330. if( deflt || fi->InstructionExtNv.CondSwizzleW != inst->InstructionExtNv.CondSwizzleW ) {
  331. TXT( "\nCondSwizzleW : " );
  332. ENM( inst->InstructionExtNv.CondSwizzleW, TGSI_SWIZZLES );
  333. }
  334. if( deflt || fi->InstructionExtNv.CondDstUpdate != inst->InstructionExtNv.CondDstUpdate ) {
  335. TXT( "\nCondDstUpdate : " );
  336. UID( inst->InstructionExtNv.CondDstUpdate );
  337. }
  338. if( deflt || fi->InstructionExtNv.CondFlowEnable != inst->InstructionExtNv.CondFlowEnable ) {
  339. TXT( "\nCondFlowEnable: " );
  340. UID( inst->InstructionExtNv.CondFlowEnable );
  341. }
  342. if( ignored ) {
  343. TXT( "\nPadding : " );
  344. UIX( inst->InstructionExtNv.Padding );
  345. if( deflt || fi->InstructionExtNv.Extended != inst->InstructionExtNv.Extended ) {
  346. TXT( "\nExtended : " );
  347. UID( inst->InstructionExtNv.Extended );
  348. }
  349. }
  350. }
  351. if( deflt || tgsi_compare_instruction_ext_label( inst->InstructionExtLabel, fi->InstructionExtLabel ) ) {
  352. EOL();
  353. TXT( "\nType : " );
  354. ENM( inst->InstructionExtLabel.Type, TGSI_INSTRUCTION_EXTS );
  355. if( deflt || fi->InstructionExtLabel.Label != inst->InstructionExtLabel.Label ) {
  356. TXT( "\nLabel : " );
  357. UID( inst->InstructionExtLabel.Label );
  358. }
  359. if( ignored ) {
  360. TXT( "\nPadding : " );
  361. UIX( inst->InstructionExtLabel.Padding );
  362. if( deflt || fi->InstructionExtLabel.Extended != inst->InstructionExtLabel.Extended ) {
  363. TXT( "\nExtended: " );
  364. UID( inst->InstructionExtLabel.Extended );
  365. }
  366. }
  367. }
  368. if( deflt || tgsi_compare_instruction_ext_texture( inst->InstructionExtTexture, fi->InstructionExtTexture ) ) {
  369. EOL();
  370. TXT( "\nType : " );
  371. ENM( inst->InstructionExtTexture.Type, TGSI_INSTRUCTION_EXTS );
  372. if( deflt || fi->InstructionExtTexture.Texture != inst->InstructionExtTexture.Texture ) {
  373. TXT( "\nTexture : " );
  374. ENM( inst->InstructionExtTexture.Texture, TGSI_TEXTURES );
  375. }
  376. if( ignored ) {
  377. TXT( "\nPadding : " );
  378. UIX( inst->InstructionExtTexture.Padding );
  379. if( deflt || fi->InstructionExtTexture.Extended != inst->InstructionExtTexture.Extended ) {
  380. TXT( "\nExtended: " );
  381. UID( inst->InstructionExtTexture.Extended );
  382. }
  383. }
  384. }
  385. for( i = 0; i < inst->Instruction.NumDstRegs; i++ ) {
  386. struct tgsi_full_dst_register *dst = &inst->FullDstRegisters[i];
  387. struct tgsi_full_dst_register *fd = &fi->FullDstRegisters[i];
  388. EOL();
  389. TXT( "\nFile : " );
  390. ENM( dst->DstRegister.File, TGSI_FILES );
  391. if( deflt || fd->DstRegister.WriteMask != dst->DstRegister.WriteMask ) {
  392. TXT( "\nWriteMask: " );
  393. ENM( dst->DstRegister.WriteMask, TGSI_WRITEMASKS );
  394. }
  395. if( ignored ) {
  396. if( deflt || fd->DstRegister.Indirect != dst->DstRegister.Indirect ) {
  397. TXT( "\nIndirect : " );
  398. UID( dst->DstRegister.Indirect );
  399. }
  400. if( deflt || fd->DstRegister.Dimension != dst->DstRegister.Dimension ) {
  401. TXT( "\nDimension: " );
  402. UID( dst->DstRegister.Dimension );
  403. }
  404. }
  405. if( deflt || fd->DstRegister.Index != dst->DstRegister.Index ) {
  406. TXT( "\nIndex : " );
  407. SID( dst->DstRegister.Index );
  408. }
  409. if( ignored ) {
  410. TXT( "\nPadding : " );
  411. UIX( dst->DstRegister.Padding );
  412. if( deflt || fd->DstRegister.Extended != dst->DstRegister.Extended ) {
  413. TXT( "\nExtended : " );
  414. UID( dst->DstRegister.Extended );
  415. }
  416. }
  417. if( deflt || tgsi_compare_dst_register_ext_concode( dst->DstRegisterExtConcode, fd->DstRegisterExtConcode ) ) {
  418. EOL();
  419. TXT( "\nType : " );
  420. ENM( dst->DstRegisterExtConcode.Type, TGSI_DST_REGISTER_EXTS );
  421. if( deflt || fd->DstRegisterExtConcode.CondMask != dst->DstRegisterExtConcode.CondMask ) {
  422. TXT( "\nCondMask : " );
  423. ENM( dst->DstRegisterExtConcode.CondMask, TGSI_CCS );
  424. }
  425. if( deflt || fd->DstRegisterExtConcode.CondSwizzleX != dst->DstRegisterExtConcode.CondSwizzleX ) {
  426. TXT( "\nCondSwizzleX: " );
  427. ENM( dst->DstRegisterExtConcode.CondSwizzleX, TGSI_SWIZZLES );
  428. }
  429. if( deflt || fd->DstRegisterExtConcode.CondSwizzleY != dst->DstRegisterExtConcode.CondSwizzleY ) {
  430. TXT( "\nCondSwizzleY: " );
  431. ENM( dst->DstRegisterExtConcode.CondSwizzleY, TGSI_SWIZZLES );
  432. }
  433. if( deflt || fd->DstRegisterExtConcode.CondSwizzleZ != dst->DstRegisterExtConcode.CondSwizzleZ ) {
  434. TXT( "\nCondSwizzleZ: " );
  435. ENM( dst->DstRegisterExtConcode.CondSwizzleZ, TGSI_SWIZZLES );
  436. }
  437. if( deflt || fd->DstRegisterExtConcode.CondSwizzleW != dst->DstRegisterExtConcode.CondSwizzleW ) {
  438. TXT( "\nCondSwizzleW: " );
  439. ENM( dst->DstRegisterExtConcode.CondSwizzleW, TGSI_SWIZZLES );
  440. }
  441. if( deflt || fd->DstRegisterExtConcode.CondSrcIndex != dst->DstRegisterExtConcode.CondSrcIndex ) {
  442. TXT( "\nCondSrcIndex: " );
  443. UID( dst->DstRegisterExtConcode.CondSrcIndex );
  444. }
  445. if( ignored ) {
  446. TXT( "\nPadding : " );
  447. UIX( dst->DstRegisterExtConcode.Padding );
  448. if( deflt || fd->DstRegisterExtConcode.Extended != dst->DstRegisterExtConcode.Extended ) {
  449. TXT( "\nExtended : " );
  450. UID( dst->DstRegisterExtConcode.Extended );
  451. }
  452. }
  453. }
  454. if( deflt || tgsi_compare_dst_register_ext_modulate( dst->DstRegisterExtModulate, fd->DstRegisterExtModulate ) ) {
  455. EOL();
  456. TXT( "\nType : " );
  457. ENM( dst->DstRegisterExtModulate.Type, TGSI_DST_REGISTER_EXTS );
  458. if( deflt || fd->DstRegisterExtModulate.Modulate != dst->DstRegisterExtModulate.Modulate ) {
  459. TXT( "\nModulate: " );
  460. ENM( dst->DstRegisterExtModulate.Modulate, TGSI_MODULATES );
  461. }
  462. if( ignored ) {
  463. TXT( "\nPadding : " );
  464. UIX( dst->DstRegisterExtModulate.Padding );
  465. if( deflt || fd->DstRegisterExtModulate.Extended != dst->DstRegisterExtModulate.Extended ) {
  466. TXT( "\nExtended: " );
  467. UID( dst->DstRegisterExtModulate.Extended );
  468. }
  469. }
  470. }
  471. }
  472. for( i = 0; i < inst->Instruction.NumSrcRegs; i++ ) {
  473. struct tgsi_full_src_register *src = &inst->FullSrcRegisters[i];
  474. struct tgsi_full_src_register *fs = &fi->FullSrcRegisters[i];
  475. EOL();
  476. TXT( "\nFile : ");
  477. ENM( src->SrcRegister.File, TGSI_FILES );
  478. if( deflt || fs->SrcRegister.SwizzleX != src->SrcRegister.SwizzleX ) {
  479. TXT( "\nSwizzleX : " );
  480. ENM( src->SrcRegister.SwizzleX, TGSI_SWIZZLES );
  481. }
  482. if( deflt || fs->SrcRegister.SwizzleY != src->SrcRegister.SwizzleY ) {
  483. TXT( "\nSwizzleY : " );
  484. ENM( src->SrcRegister.SwizzleY, TGSI_SWIZZLES );
  485. }
  486. if( deflt || fs->SrcRegister.SwizzleZ != src->SrcRegister.SwizzleZ ) {
  487. TXT( "\nSwizzleZ : " );
  488. ENM( src->SrcRegister.SwizzleZ, TGSI_SWIZZLES );
  489. }
  490. if( deflt || fs->SrcRegister.SwizzleW != src->SrcRegister.SwizzleW ) {
  491. TXT( "\nSwizzleW : " );
  492. ENM( src->SrcRegister.SwizzleW, TGSI_SWIZZLES );
  493. }
  494. if( deflt || fs->SrcRegister.Negate != src->SrcRegister.Negate ) {
  495. TXT( "\nNegate : " );
  496. UID( src->SrcRegister.Negate );
  497. }
  498. if( ignored ) {
  499. if( deflt || fs->SrcRegister.Indirect != src->SrcRegister.Indirect ) {
  500. TXT( "\nIndirect : " );
  501. UID( src->SrcRegister.Indirect );
  502. }
  503. if( deflt || fs->SrcRegister.Dimension != src->SrcRegister.Dimension ) {
  504. TXT( "\nDimension: " );
  505. UID( src->SrcRegister.Dimension );
  506. }
  507. }
  508. if( deflt || fs->SrcRegister.Index != src->SrcRegister.Index ) {
  509. TXT( "\nIndex : " );
  510. SID( src->SrcRegister.Index );
  511. }
  512. if( ignored ) {
  513. if( deflt || fs->SrcRegister.Extended != src->SrcRegister.Extended ) {
  514. TXT( "\nExtended : " );
  515. UID( src->SrcRegister.Extended );
  516. }
  517. }
  518. if( deflt || tgsi_compare_src_register_ext_swz( src->SrcRegisterExtSwz, fs->SrcRegisterExtSwz ) ) {
  519. EOL();
  520. TXT( "\nType : " );
  521. ENM( src->SrcRegisterExtSwz.Type, TGSI_SRC_REGISTER_EXTS );
  522. if( deflt || fs->SrcRegisterExtSwz.ExtSwizzleX != src->SrcRegisterExtSwz.ExtSwizzleX ) {
  523. TXT( "\nExtSwizzleX: " );
  524. ENM( src->SrcRegisterExtSwz.ExtSwizzleX, TGSI_EXTSWIZZLES );
  525. }
  526. if( deflt || fs->SrcRegisterExtSwz.ExtSwizzleY != src->SrcRegisterExtSwz.ExtSwizzleY ) {
  527. TXT( "\nExtSwizzleY: " );
  528. ENM( src->SrcRegisterExtSwz.ExtSwizzleY, TGSI_EXTSWIZZLES );
  529. }
  530. if( deflt || fs->SrcRegisterExtSwz.ExtSwizzleZ != src->SrcRegisterExtSwz.ExtSwizzleZ ) {
  531. TXT( "\nExtSwizzleZ: " );
  532. ENM( src->SrcRegisterExtSwz.ExtSwizzleZ, TGSI_EXTSWIZZLES );
  533. }
  534. if( deflt || fs->SrcRegisterExtSwz.ExtSwizzleW != src->SrcRegisterExtSwz.ExtSwizzleW ) {
  535. TXT( "\nExtSwizzleW: " );
  536. ENM( src->SrcRegisterExtSwz.ExtSwizzleW, TGSI_EXTSWIZZLES );
  537. }
  538. if( deflt || fs->SrcRegisterExtSwz.NegateX != src->SrcRegisterExtSwz.NegateX ) {
  539. TXT( "\nNegateX : " );
  540. UID( src->SrcRegisterExtSwz.NegateX );
  541. }
  542. if( deflt || fs->SrcRegisterExtSwz.NegateY != src->SrcRegisterExtSwz.NegateY ) {
  543. TXT( "\nNegateY : " );
  544. UID( src->SrcRegisterExtSwz.NegateY );
  545. }
  546. if( deflt || fs->SrcRegisterExtSwz.NegateZ != src->SrcRegisterExtSwz.NegateZ ) {
  547. TXT( "\nNegateZ : " );
  548. UID( src->SrcRegisterExtSwz.NegateZ );
  549. }
  550. if( deflt || fs->SrcRegisterExtSwz.NegateW != src->SrcRegisterExtSwz.NegateW ) {
  551. TXT( "\nNegateW : " );
  552. UID( src->SrcRegisterExtSwz.NegateW );
  553. }
  554. if( ignored ) {
  555. TXT( "\nPadding : " );
  556. UIX( src->SrcRegisterExtSwz.Padding );
  557. if( deflt || fs->SrcRegisterExtSwz.Extended != src->SrcRegisterExtSwz.Extended ) {
  558. TXT( "\nExtended : " );
  559. UID( src->SrcRegisterExtSwz.Extended );
  560. }
  561. }
  562. }
  563. if( deflt || tgsi_compare_src_register_ext_mod( src->SrcRegisterExtMod, fs->SrcRegisterExtMod ) ) {
  564. EOL();
  565. TXT( "\nType : " );
  566. ENM( src->SrcRegisterExtMod.Type, TGSI_SRC_REGISTER_EXTS );
  567. if( deflt || fs->SrcRegisterExtMod.Complement != src->SrcRegisterExtMod.Complement ) {
  568. TXT( "\nComplement: " );
  569. UID( src->SrcRegisterExtMod.Complement );
  570. }
  571. if( deflt || fs->SrcRegisterExtMod.Bias != src->SrcRegisterExtMod.Bias ) {
  572. TXT( "\nBias : " );
  573. UID( src->SrcRegisterExtMod.Bias );
  574. }
  575. if( deflt || fs->SrcRegisterExtMod.Scale2X != src->SrcRegisterExtMod.Scale2X ) {
  576. TXT( "\nScale2X : " );
  577. UID( src->SrcRegisterExtMod.Scale2X );
  578. }
  579. if( deflt || fs->SrcRegisterExtMod.Absolute != src->SrcRegisterExtMod.Absolute ) {
  580. TXT( "\nAbsolute : " );
  581. UID( src->SrcRegisterExtMod.Absolute );
  582. }
  583. if( deflt || fs->SrcRegisterExtMod.Negate != src->SrcRegisterExtMod.Negate ) {
  584. TXT( "\nNegate : " );
  585. UID( src->SrcRegisterExtMod.Negate );
  586. }
  587. if( ignored ) {
  588. TXT( "\nPadding : " );
  589. UIX( src->SrcRegisterExtMod.Padding );
  590. if( deflt || fs->SrcRegisterExtMod.Extended != src->SrcRegisterExtMod.Extended ) {
  591. TXT( "\nExtended : " );
  592. UID( src->SrcRegisterExtMod.Extended );
  593. }
  594. }
  595. }
  596. }
  597. }
  598. void
  599. tgsi_dump_c(
  600. const struct tgsi_token *tokens,
  601. uint flags )
  602. {
  603. struct tgsi_parse_context parse;
  604. struct tgsi_full_instruction fi;
  605. struct tgsi_full_declaration fd;
  606. uint ignored = flags & TGSI_DUMP_C_IGNORED;
  607. uint deflt = flags & TGSI_DUMP_C_DEFAULT;
  608. tgsi_parse_init( &parse, tokens );
  609. TXT( "tgsi-dump begin -----------------" );
  610. TXT( "\nMajorVersion: " );
  611. UID( parse.FullVersion.Version.MajorVersion );
  612. TXT( "\nMinorVersion: " );
  613. UID( parse.FullVersion.Version.MinorVersion );
  614. EOL();
  615. TXT( "\nHeaderSize: " );
  616. UID( parse.FullHeader.Header.HeaderSize );
  617. TXT( "\nBodySize : " );
  618. UID( parse.FullHeader.Header.BodySize );
  619. TXT( "\nProcessor : " );
  620. ENM( parse.FullHeader.Processor.Processor, TGSI_PROCESSOR_TYPES );
  621. EOL();
  622. fi = tgsi_default_full_instruction();
  623. fd = tgsi_default_full_declaration();
  624. while( !tgsi_parse_end_of_tokens( &parse ) ) {
  625. tgsi_parse_token( &parse );
  626. TXT( "\nType : " );
  627. ENM( parse.FullToken.Token.Type, TGSI_TOKEN_TYPES );
  628. if( ignored ) {
  629. TXT( "\nSize : " );
  630. UID( parse.FullToken.Token.NrTokens );
  631. if( deflt || parse.FullToken.Token.Extended ) {
  632. TXT( "\nExtended : " );
  633. UID( parse.FullToken.Token.Extended );
  634. }
  635. }
  636. switch( parse.FullToken.Token.Type ) {
  637. case TGSI_TOKEN_TYPE_DECLARATION:
  638. dump_declaration_verbose(
  639. &parse.FullToken.FullDeclaration,
  640. ignored,
  641. deflt,
  642. &fd );
  643. break;
  644. case TGSI_TOKEN_TYPE_IMMEDIATE:
  645. dump_immediate_verbose(
  646. &parse.FullToken.FullImmediate,
  647. ignored );
  648. break;
  649. case TGSI_TOKEN_TYPE_INSTRUCTION:
  650. dump_instruction_verbose(
  651. &parse.FullToken.FullInstruction,
  652. ignored,
  653. deflt,
  654. &fi );
  655. break;
  656. default:
  657. assert( 0 );
  658. }
  659. EOL();
  660. }
  661. TXT( "\ntgsi-dump end -------------------\n" );
  662. tgsi_parse_free( &parse );
  663. }