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 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  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[TGSI_FILE_COUNT] =
  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. "FILE_LOOP",
  77. "FILE_PREDICATE"
  78. };
  79. static const char *TGSI_INTERPOLATES[] =
  80. {
  81. "INTERPOLATE_CONSTANT",
  82. "INTERPOLATE_LINEAR",
  83. "INTERPOLATE_PERSPECTIVE"
  84. };
  85. static const char *TGSI_SEMANTICS[] =
  86. {
  87. "SEMANTIC_POSITION",
  88. "SEMANTIC_COLOR",
  89. "SEMANTIC_BCOLOR",
  90. "SEMANTIC_FOG",
  91. "SEMANTIC_PSIZE",
  92. "SEMANTIC_GENERIC",
  93. "SEMANTIC_NORMAL"
  94. };
  95. static const char *TGSI_IMMS[] =
  96. {
  97. "IMM_FLOAT32"
  98. };
  99. static const char *TGSI_SATS[] =
  100. {
  101. "SAT_NONE",
  102. "SAT_ZERO_ONE",
  103. "SAT_MINUS_PLUS_ONE"
  104. };
  105. static const char *TGSI_INSTRUCTION_EXTS[] =
  106. {
  107. "",
  108. "INSTRUCTION_EXT_TYPE_LABEL",
  109. "INSTRUCTION_EXT_TYPE_TEXTURE"
  110. };
  111. static const char *TGSI_SWIZZLES[] =
  112. {
  113. "SWIZZLE_X",
  114. "SWIZZLE_Y",
  115. "SWIZZLE_Z",
  116. "SWIZZLE_W"
  117. };
  118. static const char *TGSI_TEXTURES[] =
  119. {
  120. "TEXTURE_UNKNOWN",
  121. "TEXTURE_1D",
  122. "TEXTURE_2D",
  123. "TEXTURE_3D",
  124. "TEXTURE_CUBE",
  125. "TEXTURE_RECT",
  126. "TEXTURE_SHADOW1D",
  127. "TEXTURE_SHADOW2D",
  128. "TEXTURE_SHADOWRECT"
  129. };
  130. static const char *TGSI_SRC_REGISTER_EXTS[] =
  131. {
  132. "",
  133. "SRC_REGISTER_EXT_TYPE_MOD"
  134. };
  135. static const char *TGSI_WRITEMASKS[] =
  136. {
  137. "0",
  138. "WRITEMASK_X",
  139. "WRITEMASK_Y",
  140. "WRITEMASK_XY",
  141. "WRITEMASK_Z",
  142. "WRITEMASK_XZ",
  143. "WRITEMASK_YZ",
  144. "WRITEMASK_XYZ",
  145. "WRITEMASK_W",
  146. "WRITEMASK_XW",
  147. "WRITEMASK_YW",
  148. "WRITEMASK_XYW",
  149. "WRITEMASK_ZW",
  150. "WRITEMASK_XZW",
  151. "WRITEMASK_YZW",
  152. "WRITEMASK_XYZW"
  153. };
  154. static const char *TGSI_DST_REGISTER_EXTS[] =
  155. {
  156. "",
  157. "DST_REGISTER_EXT_TYPE_MODULATE"
  158. };
  159. static const char *TGSI_MODULATES[] =
  160. {
  161. "MODULATE_1X",
  162. "MODULATE_2X",
  163. "MODULATE_4X",
  164. "MODULATE_8X",
  165. "MODULATE_HALF",
  166. "MODULATE_QUARTER",
  167. "MODULATE_EIGHTH"
  168. };
  169. static void
  170. dump_declaration_verbose(
  171. struct tgsi_full_declaration *decl,
  172. unsigned ignored,
  173. unsigned deflt,
  174. struct tgsi_full_declaration *fd )
  175. {
  176. TXT( "\nFile : " );
  177. ENM( decl->Declaration.File, TGSI_FILES );
  178. if( deflt || fd->Declaration.UsageMask != decl->Declaration.UsageMask ) {
  179. TXT( "\nUsageMask : " );
  180. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_X ) {
  181. CHR( 'X' );
  182. }
  183. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_Y ) {
  184. CHR( 'Y' );
  185. }
  186. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_Z ) {
  187. CHR( 'Z' );
  188. }
  189. if( decl->Declaration.UsageMask & TGSI_WRITEMASK_W ) {
  190. CHR( 'W' );
  191. }
  192. }
  193. if( deflt || fd->Declaration.Interpolate != decl->Declaration.Interpolate ) {
  194. TXT( "\nInterpolate: " );
  195. ENM( decl->Declaration.Interpolate, TGSI_INTERPOLATES );
  196. }
  197. if( deflt || fd->Declaration.Semantic != decl->Declaration.Semantic ) {
  198. TXT( "\nSemantic : " );
  199. UID( decl->Declaration.Semantic );
  200. }
  201. if( ignored ) {
  202. TXT( "\nPadding : " );
  203. UIX( decl->Declaration.Padding );
  204. }
  205. EOL();
  206. TXT( "\nFirst: " );
  207. UID( decl->DeclarationRange.First );
  208. TXT( "\nLast : " );
  209. UID( decl->DeclarationRange.Last );
  210. if( decl->Declaration.Semantic ) {
  211. EOL();
  212. TXT( "\nName : " );
  213. ENM( decl->Semantic.Name, TGSI_SEMANTICS );
  214. TXT( "\nIndex: " );
  215. UID( decl->Semantic.Index );
  216. if( ignored ) {
  217. TXT( "\nPadding : " );
  218. UIX( decl->Semantic.Padding );
  219. }
  220. }
  221. }
  222. static void
  223. dump_immediate_verbose(
  224. struct tgsi_full_immediate *imm,
  225. unsigned ignored )
  226. {
  227. unsigned i;
  228. TXT( "\nDataType : " );
  229. ENM( imm->Immediate.DataType, TGSI_IMMS );
  230. if( ignored ) {
  231. TXT( "\nPadding : " );
  232. UIX( imm->Immediate.Padding );
  233. }
  234. assert( imm->Immediate.NrTokens <= 4 + 1 );
  235. for( i = 0; i < imm->Immediate.NrTokens - 1; i++ ) {
  236. EOL();
  237. switch( imm->Immediate.DataType ) {
  238. case TGSI_IMM_FLOAT32:
  239. TXT( "\nFloat: " );
  240. FLT( imm->u[i].Float );
  241. break;
  242. default:
  243. assert( 0 );
  244. }
  245. }
  246. }
  247. static void
  248. dump_instruction_verbose(
  249. struct tgsi_full_instruction *inst,
  250. unsigned ignored,
  251. unsigned deflt,
  252. struct tgsi_full_instruction *fi )
  253. {
  254. unsigned i;
  255. TXT( "\nOpcode : OPCODE_" );
  256. TXT( tgsi_get_opcode_info( inst->Instruction.Opcode )->mnemonic );
  257. if( deflt || fi->Instruction.Saturate != inst->Instruction.Saturate ) {
  258. TXT( "\nSaturate : " );
  259. ENM( inst->Instruction.Saturate, TGSI_SATS );
  260. }
  261. if( deflt || fi->Instruction.NumDstRegs != inst->Instruction.NumDstRegs ) {
  262. TXT( "\nNumDstRegs : " );
  263. UID( inst->Instruction.NumDstRegs );
  264. }
  265. if( deflt || fi->Instruction.NumSrcRegs != inst->Instruction.NumSrcRegs ) {
  266. TXT( "\nNumSrcRegs : " );
  267. UID( inst->Instruction.NumSrcRegs );
  268. }
  269. if( ignored ) {
  270. TXT( "\nPadding : " );
  271. UIX( inst->Instruction.Padding );
  272. }
  273. if( deflt || tgsi_compare_instruction_ext_label( inst->InstructionExtLabel, fi->InstructionExtLabel ) ) {
  274. EOL();
  275. TXT( "\nType : " );
  276. ENM( inst->InstructionExtLabel.Type, TGSI_INSTRUCTION_EXTS );
  277. if( deflt || fi->InstructionExtLabel.Label != inst->InstructionExtLabel.Label ) {
  278. TXT( "\nLabel : " );
  279. UID( inst->InstructionExtLabel.Label );
  280. }
  281. if( ignored ) {
  282. TXT( "\nPadding : " );
  283. UIX( inst->InstructionExtLabel.Padding );
  284. if( deflt || fi->InstructionExtLabel.Extended != inst->InstructionExtLabel.Extended ) {
  285. TXT( "\nExtended: " );
  286. UID( inst->InstructionExtLabel.Extended );
  287. }
  288. }
  289. }
  290. if( deflt || tgsi_compare_instruction_ext_texture( inst->InstructionExtTexture, fi->InstructionExtTexture ) ) {
  291. EOL();
  292. TXT( "\nType : " );
  293. ENM( inst->InstructionExtTexture.Type, TGSI_INSTRUCTION_EXTS );
  294. if( deflt || fi->InstructionExtTexture.Texture != inst->InstructionExtTexture.Texture ) {
  295. TXT( "\nTexture : " );
  296. ENM( inst->InstructionExtTexture.Texture, TGSI_TEXTURES );
  297. }
  298. if( ignored ) {
  299. TXT( "\nPadding : " );
  300. UIX( inst->InstructionExtTexture.Padding );
  301. if( deflt || fi->InstructionExtTexture.Extended != inst->InstructionExtTexture.Extended ) {
  302. TXT( "\nExtended: " );
  303. UID( inst->InstructionExtTexture.Extended );
  304. }
  305. }
  306. }
  307. for( i = 0; i < inst->Instruction.NumDstRegs; i++ ) {
  308. struct tgsi_full_dst_register *dst = &inst->FullDstRegisters[i];
  309. struct tgsi_full_dst_register *fd = &fi->FullDstRegisters[i];
  310. EOL();
  311. TXT( "\nFile : " );
  312. ENM( dst->DstRegister.File, TGSI_FILES );
  313. if( deflt || fd->DstRegister.WriteMask != dst->DstRegister.WriteMask ) {
  314. TXT( "\nWriteMask: " );
  315. ENM( dst->DstRegister.WriteMask, TGSI_WRITEMASKS );
  316. }
  317. if( ignored ) {
  318. if( deflt || fd->DstRegister.Indirect != dst->DstRegister.Indirect ) {
  319. TXT( "\nIndirect : " );
  320. UID( dst->DstRegister.Indirect );
  321. }
  322. if( deflt || fd->DstRegister.Dimension != dst->DstRegister.Dimension ) {
  323. TXT( "\nDimension: " );
  324. UID( dst->DstRegister.Dimension );
  325. }
  326. }
  327. if( deflt || fd->DstRegister.Index != dst->DstRegister.Index ) {
  328. TXT( "\nIndex : " );
  329. SID( dst->DstRegister.Index );
  330. }
  331. if( ignored ) {
  332. TXT( "\nPadding : " );
  333. UIX( dst->DstRegister.Padding );
  334. if( deflt || fd->DstRegister.Extended != dst->DstRegister.Extended ) {
  335. TXT( "\nExtended : " );
  336. UID( dst->DstRegister.Extended );
  337. }
  338. }
  339. if( deflt || tgsi_compare_dst_register_ext_modulate( dst->DstRegisterExtModulate, fd->DstRegisterExtModulate ) ) {
  340. EOL();
  341. TXT( "\nType : " );
  342. ENM( dst->DstRegisterExtModulate.Type, TGSI_DST_REGISTER_EXTS );
  343. if( deflt || fd->DstRegisterExtModulate.Modulate != dst->DstRegisterExtModulate.Modulate ) {
  344. TXT( "\nModulate: " );
  345. ENM( dst->DstRegisterExtModulate.Modulate, TGSI_MODULATES );
  346. }
  347. if( ignored ) {
  348. TXT( "\nPadding : " );
  349. UIX( dst->DstRegisterExtModulate.Padding );
  350. if( deflt || fd->DstRegisterExtModulate.Extended != dst->DstRegisterExtModulate.Extended ) {
  351. TXT( "\nExtended: " );
  352. UID( dst->DstRegisterExtModulate.Extended );
  353. }
  354. }
  355. }
  356. }
  357. for( i = 0; i < inst->Instruction.NumSrcRegs; i++ ) {
  358. struct tgsi_full_src_register *src = &inst->FullSrcRegisters[i];
  359. struct tgsi_full_src_register *fs = &fi->FullSrcRegisters[i];
  360. EOL();
  361. TXT( "\nFile : ");
  362. ENM( src->SrcRegister.File, TGSI_FILES );
  363. if( deflt || fs->SrcRegister.SwizzleX != src->SrcRegister.SwizzleX ) {
  364. TXT( "\nSwizzleX : " );
  365. ENM( src->SrcRegister.SwizzleX, TGSI_SWIZZLES );
  366. }
  367. if( deflt || fs->SrcRegister.SwizzleY != src->SrcRegister.SwizzleY ) {
  368. TXT( "\nSwizzleY : " );
  369. ENM( src->SrcRegister.SwizzleY, TGSI_SWIZZLES );
  370. }
  371. if( deflt || fs->SrcRegister.SwizzleZ != src->SrcRegister.SwizzleZ ) {
  372. TXT( "\nSwizzleZ : " );
  373. ENM( src->SrcRegister.SwizzleZ, TGSI_SWIZZLES );
  374. }
  375. if( deflt || fs->SrcRegister.SwizzleW != src->SrcRegister.SwizzleW ) {
  376. TXT( "\nSwizzleW : " );
  377. ENM( src->SrcRegister.SwizzleW, TGSI_SWIZZLES );
  378. }
  379. if( deflt || fs->SrcRegister.Negate != src->SrcRegister.Negate ) {
  380. TXT( "\nNegate : " );
  381. UID( src->SrcRegister.Negate );
  382. }
  383. if( ignored ) {
  384. if( deflt || fs->SrcRegister.Indirect != src->SrcRegister.Indirect ) {
  385. TXT( "\nIndirect : " );
  386. UID( src->SrcRegister.Indirect );
  387. }
  388. if( deflt || fs->SrcRegister.Dimension != src->SrcRegister.Dimension ) {
  389. TXT( "\nDimension: " );
  390. UID( src->SrcRegister.Dimension );
  391. }
  392. }
  393. if( deflt || fs->SrcRegister.Index != src->SrcRegister.Index ) {
  394. TXT( "\nIndex : " );
  395. SID( src->SrcRegister.Index );
  396. }
  397. if( ignored ) {
  398. if( deflt || fs->SrcRegister.Extended != src->SrcRegister.Extended ) {
  399. TXT( "\nExtended : " );
  400. UID( src->SrcRegister.Extended );
  401. }
  402. }
  403. if( deflt || tgsi_compare_src_register_ext_mod( src->SrcRegisterExtMod, fs->SrcRegisterExtMod ) ) {
  404. EOL();
  405. TXT( "\nType : " );
  406. ENM( src->SrcRegisterExtMod.Type, TGSI_SRC_REGISTER_EXTS );
  407. if( deflt || fs->SrcRegisterExtMod.Complement != src->SrcRegisterExtMod.Complement ) {
  408. TXT( "\nComplement: " );
  409. UID( src->SrcRegisterExtMod.Complement );
  410. }
  411. if( deflt || fs->SrcRegisterExtMod.Bias != src->SrcRegisterExtMod.Bias ) {
  412. TXT( "\nBias : " );
  413. UID( src->SrcRegisterExtMod.Bias );
  414. }
  415. if( deflt || fs->SrcRegisterExtMod.Scale2X != src->SrcRegisterExtMod.Scale2X ) {
  416. TXT( "\nScale2X : " );
  417. UID( src->SrcRegisterExtMod.Scale2X );
  418. }
  419. if( deflt || fs->SrcRegisterExtMod.Absolute != src->SrcRegisterExtMod.Absolute ) {
  420. TXT( "\nAbsolute : " );
  421. UID( src->SrcRegisterExtMod.Absolute );
  422. }
  423. if( deflt || fs->SrcRegisterExtMod.Negate != src->SrcRegisterExtMod.Negate ) {
  424. TXT( "\nNegate : " );
  425. UID( src->SrcRegisterExtMod.Negate );
  426. }
  427. if( ignored ) {
  428. TXT( "\nPadding : " );
  429. UIX( src->SrcRegisterExtMod.Padding );
  430. if( deflt || fs->SrcRegisterExtMod.Extended != src->SrcRegisterExtMod.Extended ) {
  431. TXT( "\nExtended : " );
  432. UID( src->SrcRegisterExtMod.Extended );
  433. }
  434. }
  435. }
  436. }
  437. }
  438. void
  439. tgsi_dump_c(
  440. const struct tgsi_token *tokens,
  441. uint flags )
  442. {
  443. struct tgsi_parse_context parse;
  444. struct tgsi_full_instruction fi;
  445. struct tgsi_full_declaration fd;
  446. uint ignored = flags & TGSI_DUMP_C_IGNORED;
  447. uint deflt = flags & TGSI_DUMP_C_DEFAULT;
  448. tgsi_parse_init( &parse, tokens );
  449. TXT( "tgsi-dump begin -----------------" );
  450. TXT( "\nMajor: " );
  451. UID( parse.FullVersion.Version.Major );
  452. TXT( "\nMinor: " );
  453. UID( parse.FullVersion.Version.Minor );
  454. EOL();
  455. TXT( "\nHeaderSize: " );
  456. UID( parse.FullHeader.Header.HeaderSize );
  457. TXT( "\nBodySize : " );
  458. UID( parse.FullHeader.Header.BodySize );
  459. TXT( "\nProcessor : " );
  460. ENM( parse.FullHeader.Processor.Processor, TGSI_PROCESSOR_TYPES );
  461. EOL();
  462. fi = tgsi_default_full_instruction();
  463. fd = tgsi_default_full_declaration();
  464. while( !tgsi_parse_end_of_tokens( &parse ) ) {
  465. tgsi_parse_token( &parse );
  466. TXT( "\nType : " );
  467. ENM( parse.FullToken.Token.Type, TGSI_TOKEN_TYPES );
  468. if( ignored ) {
  469. TXT( "\nSize : " );
  470. UID( parse.FullToken.Token.NrTokens );
  471. if( deflt || parse.FullToken.Token.Extended ) {
  472. TXT( "\nExtended : " );
  473. UID( parse.FullToken.Token.Extended );
  474. }
  475. }
  476. switch( parse.FullToken.Token.Type ) {
  477. case TGSI_TOKEN_TYPE_DECLARATION:
  478. dump_declaration_verbose(
  479. &parse.FullToken.FullDeclaration,
  480. ignored,
  481. deflt,
  482. &fd );
  483. break;
  484. case TGSI_TOKEN_TYPE_IMMEDIATE:
  485. dump_immediate_verbose(
  486. &parse.FullToken.FullImmediate,
  487. ignored );
  488. break;
  489. case TGSI_TOKEN_TYPE_INSTRUCTION:
  490. dump_instruction_verbose(
  491. &parse.FullToken.FullInstruction,
  492. ignored,
  493. deflt,
  494. &fi );
  495. break;
  496. default:
  497. assert( 0 );
  498. }
  499. EOL();
  500. }
  501. TXT( "\ntgsi-dump end -------------------\n" );
  502. tgsi_parse_free( &parse );
  503. }