1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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.
26 **************************************************************************/
30 #include "pipe/p_debug.h"
31 #include "pipe/p_util.h"
32 #include "pipe/p_shader_tokens.h"
33 #include "tgsi_dump.h"
34 #include "tgsi_parse.h"
35 #include "tgsi_build.h"
41 struct gen_dump
*dump
,
56 struct gen_dump
*dump
,
60 struct text_dump
*td
= (struct text_dump
*) dump
;
61 unsigned new_length
= td
->length
+ size
;
63 if( new_length
>= td
->capacity
) {
64 unsigned new_capacity
= td
->capacity
;
67 if( new_capacity
== 0 ) {
73 } while( new_length
>= new_capacity
);
74 td
->text
= (char *) REALLOC(
78 td
->capacity
= new_capacity
;
81 &td
->text
[td
->length
],
84 td
->length
= new_length
;
85 td
->text
[td
->length
] = '\0';
96 struct gen_dump
*dump
,
100 struct file_dump
*fd
= (struct file_dump
*) dump
;
103 fwrite( data
, 1, size
, fd
->file
);
108 for (i
= 0; i
< size
; i
++ ) {
109 fprintf( fd
->file
, "%c", ((const char *) data
)[i
] );
117 struct gen_dump
*dump
,
121 size_t len
= strlen( str
);
123 for (i
= 0; i
< len
; i
++) {
124 dump
->write( dump
, &str
[i
], 1 );
125 if (str
[i
] == '\n') {
128 for (i
= 0; i
< dump
->tabs
; i
++) {
129 dump
->write( dump
, " ", 4 );
137 struct gen_dump
*dump
,
140 dump
->write( dump
, &chr
, 1 );
145 struct gen_dump
*dump
,
150 sprintf( str
, "0x%x", ui
);
151 gen_dump_str( dump
, str
);
156 struct gen_dump
*dump
,
161 sprintf( str
, "%u", ui
);
162 gen_dump_str( dump
, str
);
167 struct gen_dump
*dump
,
172 sprintf( str
, "%d", si
);
173 gen_dump_str( dump
, str
);
178 struct gen_dump
*dump
,
183 sprintf( str
, "%10.4f", flt
);
184 gen_dump_str( dump
, str
);
189 struct gen_dump
*dump
,
192 const unsigned enums_count
)
194 if (e
>= enums_count
) {
195 gen_dump_uid( dump
, e
);
198 gen_dump_str( dump
, enums
[e
] );
204 struct gen_dump
*dump
)
211 struct gen_dump
*dump
)
213 assert( dump
->tabs
> 0 );
218 #define TXT(S) gen_dump_str( dump, S )
219 #define CHR(C) gen_dump_chr( dump, C )
220 #define UIX(I) gen_dump_uix( dump, I )
221 #define UID(I) gen_dump_uid( dump, I )
222 #define SID(I) gen_dump_sid( dump, I )
223 #define FLT(F) gen_dump_flt( dump, F )
224 #define TAB() gen_dump_tab( dump )
225 #define UNT() gen_dump_untab( dump )
226 #define ENM(E,ENUMS) gen_dump_enum( dump, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )
228 static const char *TGSI_PROCESSOR_TYPES
[] =
230 "PROCESSOR_FRAGMENT",
235 static const char *TGSI_PROCESSOR_TYPES_SHORT
[] =
242 static const char *TGSI_TOKEN_TYPES
[] =
244 "TOKEN_TYPE_DECLARATION",
245 "TOKEN_TYPE_IMMEDIATE",
246 "TOKEN_TYPE_INSTRUCTION"
249 static const char *TGSI_FILES
[] =
261 static const char *TGSI_FILES_SHORT
[] =
273 static const char *TGSI_DECLARES
[] =
279 static const char *TGSI_INTERPOLATES
[] =
281 "INTERPOLATE_CONSTANT",
282 "INTERPOLATE_LINEAR",
283 "INTERPOLATE_PERSPECTIVE",
287 static const char *TGSI_INTERPOLATES_SHORT
[] =
295 static const char *TGSI_SEMANTICS
[] =
306 static const char *TGSI_SEMANTICS_SHORT
[] =
317 static const char *TGSI_IMMS
[] =
322 static const char *TGSI_IMMS_SHORT
[] =
327 static const char *TGSI_OPCODES
[] =
360 "OPCODE_CROSSPRODUCT",
361 "OPCODE_MULTIPLYMATRIX",
443 "OPCODE_TEXM3X3SPEC",
444 "OPCODE_TEXM3X3VSPEC",
450 "OPCODE_TEXM3X2DEPTH",
465 static const char *TGSI_OPCODES_SHORT
[] =
603 static const char *TGSI_SATS
[] =
610 static const char *TGSI_INSTRUCTION_EXTS
[] =
612 "INSTRUCTION_EXT_TYPE_NV",
613 "INSTRUCTION_EXT_TYPE_LABEL",
614 "INSTRUCTION_EXT_TYPE_TEXTURE"
617 static const char *TGSI_PRECISIONS
[] =
620 "TGSI_PRECISION_FLOAT32",
621 "TGSI_PRECISION_FLOAT16",
622 "TGSI_PRECISION_FIXED12"
625 static const char *TGSI_CCS
[] =
638 static const char *TGSI_SWIZZLES
[] =
646 static const char *TGSI_SWIZZLES_SHORT
[] =
654 static const char *TGSI_TEXTURES
[] =
667 static const char *TGSI_TEXTURES_SHORT
[] =
680 static const char *TGSI_SRC_REGISTER_EXTS
[] =
682 "SRC_REGISTER_EXT_TYPE_SWZ",
683 "SRC_REGISTER_EXT_TYPE_MOD"
686 static const char *TGSI_EXTSWIZZLES
[] =
696 static const char *TGSI_EXTSWIZZLES_SHORT
[] =
706 static const char *TGSI_WRITEMASKS
[] =
726 static const char *TGSI_DST_REGISTER_EXTS
[] =
728 "DST_REGISTER_EXT_TYPE_CONDCODE",
729 "DST_REGISTER_EXT_TYPE_MODULATE"
732 static const char *TGSI_MODULATES
[] =
744 dump_declaration_short(
745 struct gen_dump
*dump
,
746 struct tgsi_full_declaration
*decl
)
749 ENM( decl
->Declaration
.File
, TGSI_FILES_SHORT
);
751 switch( decl
->Declaration
.Declare
) {
752 case TGSI_DECLARE_RANGE
:
754 UID( decl
->u
.DeclarationRange
.First
);
755 if( decl
->u
.DeclarationRange
.First
!= decl
->u
.DeclarationRange
.Last
) {
757 UID( decl
->u
.DeclarationRange
.Last
);
765 if( decl
->Declaration
.UsageMask
!= TGSI_WRITEMASK_XYZW
) {
767 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_X
) {
770 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_Y
) {
773 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_Z
) {
776 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_W
) {
781 if( decl
->Declaration
.Interpolate
) {
783 ENM( decl
->Interpolation
.Interpolate
, TGSI_INTERPOLATES_SHORT
);
786 if( decl
->Declaration
.Semantic
) {
788 ENM( decl
->Semantic
.SemanticName
, TGSI_SEMANTICS_SHORT
);
790 UID( decl
->Semantic
.SemanticIndex
);
796 dump_declaration_verbose(
797 struct gen_dump
*dump
,
798 struct tgsi_full_declaration
*decl
,
801 struct tgsi_full_declaration
*fd
)
804 ENM( decl
->Declaration
.File
, TGSI_FILES
);
805 TXT( "\nDeclare : " );
806 ENM( decl
->Declaration
.Declare
, TGSI_DECLARES
);
807 if( deflt
|| fd
->Declaration
.UsageMask
!= decl
->Declaration
.UsageMask
) {
808 TXT( "\nUsageMask : " );
809 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_X
) {
812 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_Y
) {
815 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_Z
) {
818 if( decl
->Declaration
.UsageMask
& TGSI_WRITEMASK_W
) {
822 if( deflt
|| fd
->Declaration
.Interpolate
!= decl
->Declaration
.Interpolate
) {
823 TXT( "\nInterpolate: " );
824 UID( decl
->Declaration
.Interpolate
);
826 if( deflt
|| fd
->Declaration
.Semantic
!= decl
->Declaration
.Semantic
) {
827 TXT( "\nSemantic : " );
828 UID( decl
->Declaration
.Semantic
);
831 TXT( "\nPadding : " );
832 UIX( decl
->Declaration
.Padding
);
836 switch( decl
->Declaration
.Declare
) {
837 case TGSI_DECLARE_RANGE
:
839 UID( decl
->u
.DeclarationRange
.First
);
841 UID( decl
->u
.DeclarationRange
.Last
);
844 case TGSI_DECLARE_MASK
:
846 UIX( decl
->u
.DeclarationMask
.Mask
);
853 if( decl
->Declaration
.Interpolate
) {
855 TXT( "\nInterpolate: " );
856 ENM( decl
->Interpolation
.Interpolate
, TGSI_INTERPOLATES
);
858 TXT( "\nPadding : " );
859 UIX( decl
->Interpolation
.Padding
);
863 if( decl
->Declaration
.Semantic
) {
865 TXT( "\nSemanticName : " );
866 ENM( decl
->Semantic
.SemanticName
, TGSI_SEMANTICS
);
867 TXT( "\nSemanticIndex: " );
868 UID( decl
->Semantic
.SemanticIndex
);
870 TXT( "\nPadding : " );
871 UIX( decl
->Semantic
.Padding
);
877 dump_immediate_short(
878 struct gen_dump
*dump
,
879 struct tgsi_full_immediate
*imm
)
884 ENM( imm
->Immediate
.DataType
, TGSI_IMMS_SHORT
);
887 for( i
= 0; i
< imm
->Immediate
.Size
- 1; i
++ ) {
888 switch( imm
->Immediate
.DataType
) {
889 case TGSI_IMM_FLOAT32
:
890 FLT( imm
->u
.ImmediateFloat32
[i
].Float
);
897 if( i
< imm
->Immediate
.Size
- 2 ) {
905 dump_immediate_verbose(
906 struct gen_dump
*dump
,
907 struct tgsi_full_immediate
*imm
,
912 TXT( "\nDataType : " );
913 ENM( imm
->Immediate
.DataType
, TGSI_IMMS
);
915 TXT( "\nPadding : " );
916 UIX( imm
->Immediate
.Padding
);
919 for( i
= 0; i
< imm
->Immediate
.Size
- 1; i
++ ) {
921 switch( imm
->Immediate
.DataType
) {
922 case TGSI_IMM_FLOAT32
:
924 FLT( imm
->u
.ImmediateFloat32
[i
].Float
);
934 dump_instruction_short(
935 struct gen_dump
*dump
,
936 struct tgsi_full_instruction
*inst
,
940 boolean first_reg
= TRUE
;
945 ENM( inst
->Instruction
.Opcode
, TGSI_OPCODES_SHORT
);
947 switch( inst
->Instruction
.Saturate
) {
950 case TGSI_SAT_ZERO_ONE
:
953 case TGSI_SAT_MINUS_PLUS_ONE
:
960 for( i
= 0; i
< inst
->Instruction
.NumDstRegs
; i
++ ) {
961 struct tgsi_full_dst_register
*dst
= &inst
->FullDstRegisters
[i
];
968 ENM( dst
->DstRegister
.File
, TGSI_FILES_SHORT
);
971 SID( dst
->DstRegister
.Index
);
974 if( dst
->DstRegister
.WriteMask
!= TGSI_WRITEMASK_XYZW
) {
976 if( dst
->DstRegister
.WriteMask
& TGSI_WRITEMASK_X
) {
979 if( dst
->DstRegister
.WriteMask
& TGSI_WRITEMASK_Y
) {
982 if( dst
->DstRegister
.WriteMask
& TGSI_WRITEMASK_Z
) {
985 if( dst
->DstRegister
.WriteMask
& TGSI_WRITEMASK_W
) {
993 for( i
= 0; i
< inst
->Instruction
.NumSrcRegs
; i
++ ) {
994 struct tgsi_full_src_register
*src
= &inst
->FullSrcRegisters
[i
];
1001 if( src
->SrcRegisterExtMod
.Complement
) {
1004 if( src
->SrcRegisterExtMod
.Negate
) {
1007 if( src
->SrcRegisterExtMod
.Absolute
) {
1010 if( src
->SrcRegister
.Negate
) {
1014 ENM( src
->SrcRegister
.File
, TGSI_FILES_SHORT
);
1017 SID( src
->SrcRegister
.Index
);
1020 if (src
->SrcRegister
.Extended
) {
1021 if (src
->SrcRegisterExtSwz
.ExtSwizzleX
!= TGSI_EXTSWIZZLE_X
||
1022 src
->SrcRegisterExtSwz
.ExtSwizzleY
!= TGSI_EXTSWIZZLE_Y
||
1023 src
->SrcRegisterExtSwz
.ExtSwizzleZ
!= TGSI_EXTSWIZZLE_Z
||
1024 src
->SrcRegisterExtSwz
.ExtSwizzleW
!= TGSI_EXTSWIZZLE_W
) {
1026 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleX
, TGSI_EXTSWIZZLES_SHORT
);
1027 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleY
, TGSI_EXTSWIZZLES_SHORT
);
1028 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleZ
, TGSI_EXTSWIZZLES_SHORT
);
1029 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleW
, TGSI_EXTSWIZZLES_SHORT
);
1032 else if( src
->SrcRegister
.SwizzleX
!= TGSI_SWIZZLE_X
||
1033 src
->SrcRegister
.SwizzleY
!= TGSI_SWIZZLE_Y
||
1034 src
->SrcRegister
.SwizzleZ
!= TGSI_SWIZZLE_Z
||
1035 src
->SrcRegister
.SwizzleW
!= TGSI_SWIZZLE_W
) {
1037 ENM( src
->SrcRegister
.SwizzleX
, TGSI_SWIZZLES_SHORT
);
1038 ENM( src
->SrcRegister
.SwizzleY
, TGSI_SWIZZLES_SHORT
);
1039 ENM( src
->SrcRegister
.SwizzleZ
, TGSI_SWIZZLES_SHORT
);
1040 ENM( src
->SrcRegister
.SwizzleW
, TGSI_SWIZZLES_SHORT
);
1043 if( src
->SrcRegisterExtMod
.Absolute
) {
1046 if( src
->SrcRegisterExtMod
.Complement
) {
1053 if (inst
->InstructionExtTexture
.Texture
!= TGSI_TEXTURE_UNKNOWN
) {
1055 ENM( inst
->InstructionExtTexture
.Texture
, TGSI_TEXTURES_SHORT
);
1058 switch( inst
->Instruction
.Opcode
) {
1059 case TGSI_OPCODE_IF
:
1060 case TGSI_OPCODE_ELSE
:
1061 case TGSI_OPCODE_BGNLOOP2
:
1062 case TGSI_OPCODE_ENDLOOP2
:
1063 case TGSI_OPCODE_CAL
:
1065 UID( inst
->InstructionExtLabel
.Label
);
1071 dump_instruction_verbose(
1072 struct gen_dump
*dump
,
1073 struct tgsi_full_instruction
*inst
,
1076 struct tgsi_full_instruction
*fi
)
1080 TXT( "\nOpcode : " );
1081 ENM( inst
->Instruction
.Opcode
, TGSI_OPCODES
);
1082 if( deflt
|| fi
->Instruction
.Saturate
!= inst
->Instruction
.Saturate
) {
1083 TXT( "\nSaturate : " );
1084 ENM( inst
->Instruction
.Saturate
, TGSI_SATS
);
1086 if( deflt
|| fi
->Instruction
.NumDstRegs
!= inst
->Instruction
.NumDstRegs
) {
1087 TXT( "\nNumDstRegs : " );
1088 UID( inst
->Instruction
.NumDstRegs
);
1090 if( deflt
|| fi
->Instruction
.NumSrcRegs
!= inst
->Instruction
.NumSrcRegs
) {
1091 TXT( "\nNumSrcRegs : " );
1092 UID( inst
->Instruction
.NumSrcRegs
);
1095 TXT( "\nPadding : " );
1096 UIX( inst
->Instruction
.Padding
);
1099 if( deflt
|| tgsi_compare_instruction_ext_nv( inst
->InstructionExtNv
, fi
->InstructionExtNv
) ) {
1102 ENM( inst
->InstructionExtNv
.Type
, TGSI_INSTRUCTION_EXTS
);
1103 if( deflt
|| fi
->InstructionExtNv
.Precision
!= inst
->InstructionExtNv
.Precision
) {
1104 TXT( "\nPrecision : " );
1105 ENM( inst
->InstructionExtNv
.Precision
, TGSI_PRECISIONS
);
1107 if( deflt
|| fi
->InstructionExtNv
.CondDstIndex
!= inst
->InstructionExtNv
.CondDstIndex
) {
1108 TXT( "\nCondDstIndex : " );
1109 UID( inst
->InstructionExtNv
.CondDstIndex
);
1111 if( deflt
|| fi
->InstructionExtNv
.CondFlowIndex
!= inst
->InstructionExtNv
.CondFlowIndex
) {
1112 TXT( "\nCondFlowIndex : " );
1113 UID( inst
->InstructionExtNv
.CondFlowIndex
);
1115 if( deflt
|| fi
->InstructionExtNv
.CondMask
!= inst
->InstructionExtNv
.CondMask
) {
1116 TXT( "\nCondMask : " );
1117 ENM( inst
->InstructionExtNv
.CondMask
, TGSI_CCS
);
1119 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleX
!= inst
->InstructionExtNv
.CondSwizzleX
) {
1120 TXT( "\nCondSwizzleX : " );
1121 ENM( inst
->InstructionExtNv
.CondSwizzleX
, TGSI_SWIZZLES
);
1123 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleY
!= inst
->InstructionExtNv
.CondSwizzleY
) {
1124 TXT( "\nCondSwizzleY : " );
1125 ENM( inst
->InstructionExtNv
.CondSwizzleY
, TGSI_SWIZZLES
);
1127 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleZ
!= inst
->InstructionExtNv
.CondSwizzleZ
) {
1128 TXT( "\nCondSwizzleZ : " );
1129 ENM( inst
->InstructionExtNv
.CondSwizzleZ
, TGSI_SWIZZLES
);
1131 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleW
!= inst
->InstructionExtNv
.CondSwizzleW
) {
1132 TXT( "\nCondSwizzleW : " );
1133 ENM( inst
->InstructionExtNv
.CondSwizzleW
, TGSI_SWIZZLES
);
1135 if( deflt
|| fi
->InstructionExtNv
.CondDstUpdate
!= inst
->InstructionExtNv
.CondDstUpdate
) {
1136 TXT( "\nCondDstUpdate : " );
1137 UID( inst
->InstructionExtNv
.CondDstUpdate
);
1139 if( deflt
|| fi
->InstructionExtNv
.CondFlowEnable
!= inst
->InstructionExtNv
.CondFlowEnable
) {
1140 TXT( "\nCondFlowEnable: " );
1141 UID( inst
->InstructionExtNv
.CondFlowEnable
);
1144 TXT( "\nPadding : " );
1145 UIX( inst
->InstructionExtNv
.Padding
);
1146 if( deflt
|| fi
->InstructionExtNv
.Extended
!= inst
->InstructionExtNv
.Extended
) {
1147 TXT( "\nExtended : " );
1148 UID( inst
->InstructionExtNv
.Extended
);
1153 if( deflt
|| tgsi_compare_instruction_ext_label( inst
->InstructionExtLabel
, fi
->InstructionExtLabel
) ) {
1156 ENM( inst
->InstructionExtLabel
.Type
, TGSI_INSTRUCTION_EXTS
);
1157 if( deflt
|| fi
->InstructionExtLabel
.Label
!= inst
->InstructionExtLabel
.Label
) {
1158 TXT( "\nLabel : " );
1159 UID( inst
->InstructionExtLabel
.Label
);
1162 TXT( "\nPadding : " );
1163 UIX( inst
->InstructionExtLabel
.Padding
);
1164 if( deflt
|| fi
->InstructionExtLabel
.Extended
!= inst
->InstructionExtLabel
.Extended
) {
1165 TXT( "\nExtended: " );
1166 UID( inst
->InstructionExtLabel
.Extended
);
1171 if( deflt
|| tgsi_compare_instruction_ext_texture( inst
->InstructionExtTexture
, fi
->InstructionExtTexture
) ) {
1174 ENM( inst
->InstructionExtTexture
.Type
, TGSI_INSTRUCTION_EXTS
);
1175 if( deflt
|| fi
->InstructionExtTexture
.Texture
!= inst
->InstructionExtTexture
.Texture
) {
1176 TXT( "\nTexture : " );
1177 ENM( inst
->InstructionExtTexture
.Texture
, TGSI_TEXTURES
);
1180 TXT( "\nPadding : " );
1181 UIX( inst
->InstructionExtTexture
.Padding
);
1182 if( deflt
|| fi
->InstructionExtTexture
.Extended
!= inst
->InstructionExtTexture
.Extended
) {
1183 TXT( "\nExtended: " );
1184 UID( inst
->InstructionExtTexture
.Extended
);
1189 for( i
= 0; i
< inst
->Instruction
.NumDstRegs
; i
++ ) {
1190 struct tgsi_full_dst_register
*dst
= &inst
->FullDstRegisters
[i
];
1191 struct tgsi_full_dst_register
*fd
= &fi
->FullDstRegisters
[i
];
1195 ENM( dst
->DstRegister
.File
, TGSI_FILES
);
1196 if( deflt
|| fd
->DstRegister
.WriteMask
!= dst
->DstRegister
.WriteMask
) {
1197 TXT( "\nWriteMask: " );
1198 ENM( dst
->DstRegister
.WriteMask
, TGSI_WRITEMASKS
);
1201 if( deflt
|| fd
->DstRegister
.Indirect
!= dst
->DstRegister
.Indirect
) {
1202 TXT( "\nIndirect : " );
1203 UID( dst
->DstRegister
.Indirect
);
1205 if( deflt
|| fd
->DstRegister
.Dimension
!= dst
->DstRegister
.Dimension
) {
1206 TXT( "\nDimension: " );
1207 UID( dst
->DstRegister
.Dimension
);
1210 if( deflt
|| fd
->DstRegister
.Index
!= dst
->DstRegister
.Index
) {
1211 TXT( "\nIndex : " );
1212 SID( dst
->DstRegister
.Index
);
1215 TXT( "\nPadding : " );
1216 UIX( dst
->DstRegister
.Padding
);
1217 if( deflt
|| fd
->DstRegister
.Extended
!= dst
->DstRegister
.Extended
) {
1218 TXT( "\nExtended : " );
1219 UID( dst
->DstRegister
.Extended
);
1223 if( deflt
|| tgsi_compare_dst_register_ext_concode( dst
->DstRegisterExtConcode
, fd
->DstRegisterExtConcode
) ) {
1226 ENM( dst
->DstRegisterExtConcode
.Type
, TGSI_DST_REGISTER_EXTS
);
1227 if( deflt
|| fd
->DstRegisterExtConcode
.CondMask
!= dst
->DstRegisterExtConcode
.CondMask
) {
1228 TXT( "\nCondMask : " );
1229 ENM( dst
->DstRegisterExtConcode
.CondMask
, TGSI_CCS
);
1231 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleX
!= dst
->DstRegisterExtConcode
.CondSwizzleX
) {
1232 TXT( "\nCondSwizzleX: " );
1233 ENM( dst
->DstRegisterExtConcode
.CondSwizzleX
, TGSI_SWIZZLES
);
1235 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleY
!= dst
->DstRegisterExtConcode
.CondSwizzleY
) {
1236 TXT( "\nCondSwizzleY: " );
1237 ENM( dst
->DstRegisterExtConcode
.CondSwizzleY
, TGSI_SWIZZLES
);
1239 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleZ
!= dst
->DstRegisterExtConcode
.CondSwizzleZ
) {
1240 TXT( "\nCondSwizzleZ: " );
1241 ENM( dst
->DstRegisterExtConcode
.CondSwizzleZ
, TGSI_SWIZZLES
);
1243 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleW
!= dst
->DstRegisterExtConcode
.CondSwizzleW
) {
1244 TXT( "\nCondSwizzleW: " );
1245 ENM( dst
->DstRegisterExtConcode
.CondSwizzleW
, TGSI_SWIZZLES
);
1247 if( deflt
|| fd
->DstRegisterExtConcode
.CondSrcIndex
!= dst
->DstRegisterExtConcode
.CondSrcIndex
) {
1248 TXT( "\nCondSrcIndex: " );
1249 UID( dst
->DstRegisterExtConcode
.CondSrcIndex
);
1252 TXT( "\nPadding : " );
1253 UIX( dst
->DstRegisterExtConcode
.Padding
);
1254 if( deflt
|| fd
->DstRegisterExtConcode
.Extended
!= dst
->DstRegisterExtConcode
.Extended
) {
1255 TXT( "\nExtended : " );
1256 UID( dst
->DstRegisterExtConcode
.Extended
);
1261 if( deflt
|| tgsi_compare_dst_register_ext_modulate( dst
->DstRegisterExtModulate
, fd
->DstRegisterExtModulate
) ) {
1264 ENM( dst
->DstRegisterExtModulate
.Type
, TGSI_DST_REGISTER_EXTS
);
1265 if( deflt
|| fd
->DstRegisterExtModulate
.Modulate
!= dst
->DstRegisterExtModulate
.Modulate
) {
1266 TXT( "\nModulate: " );
1267 ENM( dst
->DstRegisterExtModulate
.Modulate
, TGSI_MODULATES
);
1270 TXT( "\nPadding : " );
1271 UIX( dst
->DstRegisterExtModulate
.Padding
);
1272 if( deflt
|| fd
->DstRegisterExtModulate
.Extended
!= dst
->DstRegisterExtModulate
.Extended
) {
1273 TXT( "\nExtended: " );
1274 UID( dst
->DstRegisterExtModulate
.Extended
);
1280 for( i
= 0; i
< inst
->Instruction
.NumSrcRegs
; i
++ ) {
1281 struct tgsi_full_src_register
*src
= &inst
->FullSrcRegisters
[i
];
1282 struct tgsi_full_src_register
*fs
= &fi
->FullSrcRegisters
[i
];
1286 ENM( src
->SrcRegister
.File
, TGSI_FILES
);
1287 if( deflt
|| fs
->SrcRegister
.SwizzleX
!= src
->SrcRegister
.SwizzleX
) {
1288 TXT( "\nSwizzleX : " );
1289 ENM( src
->SrcRegister
.SwizzleX
, TGSI_SWIZZLES
);
1291 if( deflt
|| fs
->SrcRegister
.SwizzleY
!= src
->SrcRegister
.SwizzleY
) {
1292 TXT( "\nSwizzleY : " );
1293 ENM( src
->SrcRegister
.SwizzleY
, TGSI_SWIZZLES
);
1295 if( deflt
|| fs
->SrcRegister
.SwizzleZ
!= src
->SrcRegister
.SwizzleZ
) {
1296 TXT( "\nSwizzleZ : " );
1297 ENM( src
->SrcRegister
.SwizzleZ
, TGSI_SWIZZLES
);
1299 if( deflt
|| fs
->SrcRegister
.SwizzleW
!= src
->SrcRegister
.SwizzleW
) {
1300 TXT( "\nSwizzleW : " );
1301 ENM( src
->SrcRegister
.SwizzleW
, TGSI_SWIZZLES
);
1303 if( deflt
|| fs
->SrcRegister
.Negate
!= src
->SrcRegister
.Negate
) {
1304 TXT( "\nNegate : " );
1305 UID( src
->SrcRegister
.Negate
);
1308 if( deflt
|| fs
->SrcRegister
.Indirect
!= src
->SrcRegister
.Indirect
) {
1309 TXT( "\nIndirect : " );
1310 UID( src
->SrcRegister
.Indirect
);
1312 if( deflt
|| fs
->SrcRegister
.Dimension
!= src
->SrcRegister
.Dimension
) {
1313 TXT( "\nDimension: " );
1314 UID( src
->SrcRegister
.Dimension
);
1317 if( deflt
|| fs
->SrcRegister
.Index
!= src
->SrcRegister
.Index
) {
1318 TXT( "\nIndex : " );
1319 SID( src
->SrcRegister
.Index
);
1322 if( deflt
|| fs
->SrcRegister
.Extended
!= src
->SrcRegister
.Extended
) {
1323 TXT( "\nExtended : " );
1324 UID( src
->SrcRegister
.Extended
);
1328 if( deflt
|| tgsi_compare_src_register_ext_swz( src
->SrcRegisterExtSwz
, fs
->SrcRegisterExtSwz
) ) {
1331 ENM( src
->SrcRegisterExtSwz
.Type
, TGSI_SRC_REGISTER_EXTS
);
1332 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleX
!= src
->SrcRegisterExtSwz
.ExtSwizzleX
) {
1333 TXT( "\nExtSwizzleX: " );
1334 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleX
, TGSI_EXTSWIZZLES
);
1336 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleY
!= src
->SrcRegisterExtSwz
.ExtSwizzleY
) {
1337 TXT( "\nExtSwizzleY: " );
1338 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleY
, TGSI_EXTSWIZZLES
);
1340 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleZ
!= src
->SrcRegisterExtSwz
.ExtSwizzleZ
) {
1341 TXT( "\nExtSwizzleZ: " );
1342 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleZ
, TGSI_EXTSWIZZLES
);
1344 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleW
!= src
->SrcRegisterExtSwz
.ExtSwizzleW
) {
1345 TXT( "\nExtSwizzleW: " );
1346 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleW
, TGSI_EXTSWIZZLES
);
1348 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateX
!= src
->SrcRegisterExtSwz
.NegateX
) {
1349 TXT( "\nNegateX : " );
1350 UID( src
->SrcRegisterExtSwz
.NegateX
);
1352 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateY
!= src
->SrcRegisterExtSwz
.NegateY
) {
1353 TXT( "\nNegateY : " );
1354 UID( src
->SrcRegisterExtSwz
.NegateY
);
1356 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateZ
!= src
->SrcRegisterExtSwz
.NegateZ
) {
1357 TXT( "\nNegateZ : " );
1358 UID( src
->SrcRegisterExtSwz
.NegateZ
);
1360 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateW
!= src
->SrcRegisterExtSwz
.NegateW
) {
1361 TXT( "\nNegateW : " );
1362 UID( src
->SrcRegisterExtSwz
.NegateW
);
1364 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtDivide
!= src
->SrcRegisterExtSwz
.ExtDivide
) {
1365 TXT( "\nExtDivide : " );
1366 ENM( src
->SrcRegisterExtSwz
.ExtDivide
, TGSI_EXTSWIZZLES
);
1369 TXT( "\nPadding : " );
1370 UIX( src
->SrcRegisterExtSwz
.Padding
);
1371 if( deflt
|| fs
->SrcRegisterExtSwz
.Extended
!= src
->SrcRegisterExtSwz
.Extended
) {
1372 TXT( "\nExtended : " );
1373 UID( src
->SrcRegisterExtSwz
.Extended
);
1378 if( deflt
|| tgsi_compare_src_register_ext_mod( src
->SrcRegisterExtMod
, fs
->SrcRegisterExtMod
) ) {
1381 ENM( src
->SrcRegisterExtMod
.Type
, TGSI_SRC_REGISTER_EXTS
);
1382 if( deflt
|| fs
->SrcRegisterExtMod
.Complement
!= src
->SrcRegisterExtMod
.Complement
) {
1383 TXT( "\nComplement: " );
1384 UID( src
->SrcRegisterExtMod
.Complement
);
1386 if( deflt
|| fs
->SrcRegisterExtMod
.Bias
!= src
->SrcRegisterExtMod
.Bias
) {
1388 UID( src
->SrcRegisterExtMod
.Bias
);
1390 if( deflt
|| fs
->SrcRegisterExtMod
.Scale2X
!= src
->SrcRegisterExtMod
.Scale2X
) {
1391 TXT( "\nScale2X : " );
1392 UID( src
->SrcRegisterExtMod
.Scale2X
);
1394 if( deflt
|| fs
->SrcRegisterExtMod
.Absolute
!= src
->SrcRegisterExtMod
.Absolute
) {
1395 TXT( "\nAbsolute : " );
1396 UID( src
->SrcRegisterExtMod
.Absolute
);
1398 if( deflt
|| fs
->SrcRegisterExtMod
.Negate
!= src
->SrcRegisterExtMod
.Negate
) {
1399 TXT( "\nNegate : " );
1400 UID( src
->SrcRegisterExtMod
.Negate
);
1403 TXT( "\nPadding : " );
1404 UIX( src
->SrcRegisterExtMod
.Padding
);
1405 if( deflt
|| fs
->SrcRegisterExtMod
.Extended
!= src
->SrcRegisterExtMod
.Extended
) {
1406 TXT( "\nExtended : " );
1407 UID( src
->SrcRegisterExtMod
.Extended
);
1416 struct gen_dump
*dump
,
1417 const struct tgsi_token
*tokens
,
1420 struct tgsi_parse_context parse
;
1421 struct tgsi_full_instruction fi
;
1422 struct tgsi_full_declaration fd
;
1423 unsigned verbose
= flags
& TGSI_DUMP_VERBOSE
;
1424 unsigned ignored
= !(flags
& TGSI_DUMP_NO_IGNORED
);
1425 unsigned deflt
= !(flags
& TGSI_DUMP_NO_DEFAULT
);
1426 unsigned instno
= 0;
1431 assert(strcmp(TGSI_OPCODES
[TGSI_OPCODE_CONT
], "OPCODE_CONT") == 0);
1433 tgsi_parse_init( &parse
, tokens
);
1435 TXT( "tgsi-dump begin -----------------" );
1438 ENM( parse
.FullHeader
.Processor
.Processor
, TGSI_PROCESSOR_TYPES_SHORT
);
1440 UID( parse
.FullVersion
.Version
.MajorVersion
);
1442 UID( parse
.FullVersion
.Version
.MinorVersion
);
1445 TXT( "\nMajorVersion: " );
1446 UID( parse
.FullVersion
.Version
.MajorVersion
);
1447 TXT( "\nMinorVersion: " );
1448 UID( parse
.FullVersion
.Version
.MinorVersion
);
1451 TXT( "\nHeaderSize: " );
1452 UID( parse
.FullHeader
.Header
.HeaderSize
);
1453 TXT( "\nBodySize : " );
1454 UID( parse
.FullHeader
.Header
.BodySize
);
1455 TXT( "\nProcessor : " );
1456 ENM( parse
.FullHeader
.Processor
.Processor
, TGSI_PROCESSOR_TYPES
);
1460 fi
= tgsi_default_full_instruction();
1461 fd
= tgsi_default_full_declaration();
1463 while( !tgsi_parse_end_of_tokens( &parse
) ) {
1464 tgsi_parse_token( &parse
);
1466 switch( parse
.FullToken
.Token
.Type
) {
1467 case TGSI_TOKEN_TYPE_DECLARATION
:
1468 dump_declaration_short(
1470 &parse
.FullToken
.FullDeclaration
);
1473 case TGSI_TOKEN_TYPE_IMMEDIATE
:
1474 dump_immediate_short(
1476 &parse
.FullToken
.FullImmediate
);
1479 case TGSI_TOKEN_TYPE_INSTRUCTION
:
1480 dump_instruction_short(
1482 &parse
.FullToken
.FullInstruction
,
1493 ENM( parse
.FullToken
.Token
.Type
, TGSI_TOKEN_TYPES
);
1496 UID( parse
.FullToken
.Token
.Size
);
1497 if( deflt
|| parse
.FullToken
.Token
.Extended
) {
1498 TXT( "\nExtended : " );
1499 UID( parse
.FullToken
.Token
.Extended
);
1503 switch( parse
.FullToken
.Token
.Type
) {
1504 case TGSI_TOKEN_TYPE_DECLARATION
:
1505 dump_declaration_verbose(
1507 &parse
.FullToken
.FullDeclaration
,
1513 case TGSI_TOKEN_TYPE_IMMEDIATE
:
1514 dump_immediate_verbose(
1516 &parse
.FullToken
.FullImmediate
,
1520 case TGSI_TOKEN_TYPE_INSTRUCTION
:
1521 dump_instruction_verbose(
1523 &parse
.FullToken
.FullInstruction
,
1537 TXT( "\ntgsi-dump end -------------------\n" );
1539 tgsi_parse_free( &parse
);
1546 assert(strcmp(TGSI_OPCODES
[TGSI_OPCODE_END
], "OPCODE_END") == 0);
1547 assert(strcmp(TGSI_OPCODES_SHORT
[TGSI_OPCODE_END
], "END") == 0);
1553 const struct tgsi_token
*tokens
,
1556 struct file_dump dump
;
1560 dump
.base
.write
= _file_dump_write
;
1563 static unsigned counter
= 0;
1565 sprintf( buffer
, "tgsi-dump-%.4u.txt", counter
++ );
1566 dump
.file
= fopen( buffer
, "wt" );
1578 fclose( dump
.file
);
1585 const struct tgsi_token
*tokens
,
1588 struct text_dump dump
;
1590 dump
.base
.write
= _text_dump_write
;