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
) {
1050 if (src
->SrcRegisterExtSwz
.ExtDivide
!= TGSI_EXTSWIZZLE_ONE
) {
1052 ENM( src
->SrcRegisterExtSwz
.ExtDivide
, TGSI_EXTSWIZZLES_SHORT
);
1058 if (inst
->InstructionExtTexture
.Texture
!= TGSI_TEXTURE_UNKNOWN
) {
1060 ENM( inst
->InstructionExtTexture
.Texture
, TGSI_TEXTURES_SHORT
);
1063 switch( inst
->Instruction
.Opcode
) {
1064 case TGSI_OPCODE_IF
:
1065 case TGSI_OPCODE_ELSE
:
1066 case TGSI_OPCODE_BGNLOOP2
:
1067 case TGSI_OPCODE_ENDLOOP2
:
1068 case TGSI_OPCODE_CAL
:
1070 UID( inst
->InstructionExtLabel
.Label
);
1076 dump_instruction_verbose(
1077 struct gen_dump
*dump
,
1078 struct tgsi_full_instruction
*inst
,
1081 struct tgsi_full_instruction
*fi
)
1085 TXT( "\nOpcode : " );
1086 ENM( inst
->Instruction
.Opcode
, TGSI_OPCODES
);
1087 if( deflt
|| fi
->Instruction
.Saturate
!= inst
->Instruction
.Saturate
) {
1088 TXT( "\nSaturate : " );
1089 ENM( inst
->Instruction
.Saturate
, TGSI_SATS
);
1091 if( deflt
|| fi
->Instruction
.NumDstRegs
!= inst
->Instruction
.NumDstRegs
) {
1092 TXT( "\nNumDstRegs : " );
1093 UID( inst
->Instruction
.NumDstRegs
);
1095 if( deflt
|| fi
->Instruction
.NumSrcRegs
!= inst
->Instruction
.NumSrcRegs
) {
1096 TXT( "\nNumSrcRegs : " );
1097 UID( inst
->Instruction
.NumSrcRegs
);
1100 TXT( "\nPadding : " );
1101 UIX( inst
->Instruction
.Padding
);
1104 if( deflt
|| tgsi_compare_instruction_ext_nv( inst
->InstructionExtNv
, fi
->InstructionExtNv
) ) {
1107 ENM( inst
->InstructionExtNv
.Type
, TGSI_INSTRUCTION_EXTS
);
1108 if( deflt
|| fi
->InstructionExtNv
.Precision
!= inst
->InstructionExtNv
.Precision
) {
1109 TXT( "\nPrecision : " );
1110 ENM( inst
->InstructionExtNv
.Precision
, TGSI_PRECISIONS
);
1112 if( deflt
|| fi
->InstructionExtNv
.CondDstIndex
!= inst
->InstructionExtNv
.CondDstIndex
) {
1113 TXT( "\nCondDstIndex : " );
1114 UID( inst
->InstructionExtNv
.CondDstIndex
);
1116 if( deflt
|| fi
->InstructionExtNv
.CondFlowIndex
!= inst
->InstructionExtNv
.CondFlowIndex
) {
1117 TXT( "\nCondFlowIndex : " );
1118 UID( inst
->InstructionExtNv
.CondFlowIndex
);
1120 if( deflt
|| fi
->InstructionExtNv
.CondMask
!= inst
->InstructionExtNv
.CondMask
) {
1121 TXT( "\nCondMask : " );
1122 ENM( inst
->InstructionExtNv
.CondMask
, TGSI_CCS
);
1124 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleX
!= inst
->InstructionExtNv
.CondSwizzleX
) {
1125 TXT( "\nCondSwizzleX : " );
1126 ENM( inst
->InstructionExtNv
.CondSwizzleX
, TGSI_SWIZZLES
);
1128 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleY
!= inst
->InstructionExtNv
.CondSwizzleY
) {
1129 TXT( "\nCondSwizzleY : " );
1130 ENM( inst
->InstructionExtNv
.CondSwizzleY
, TGSI_SWIZZLES
);
1132 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleZ
!= inst
->InstructionExtNv
.CondSwizzleZ
) {
1133 TXT( "\nCondSwizzleZ : " );
1134 ENM( inst
->InstructionExtNv
.CondSwizzleZ
, TGSI_SWIZZLES
);
1136 if( deflt
|| fi
->InstructionExtNv
.CondSwizzleW
!= inst
->InstructionExtNv
.CondSwizzleW
) {
1137 TXT( "\nCondSwizzleW : " );
1138 ENM( inst
->InstructionExtNv
.CondSwizzleW
, TGSI_SWIZZLES
);
1140 if( deflt
|| fi
->InstructionExtNv
.CondDstUpdate
!= inst
->InstructionExtNv
.CondDstUpdate
) {
1141 TXT( "\nCondDstUpdate : " );
1142 UID( inst
->InstructionExtNv
.CondDstUpdate
);
1144 if( deflt
|| fi
->InstructionExtNv
.CondFlowEnable
!= inst
->InstructionExtNv
.CondFlowEnable
) {
1145 TXT( "\nCondFlowEnable: " );
1146 UID( inst
->InstructionExtNv
.CondFlowEnable
);
1149 TXT( "\nPadding : " );
1150 UIX( inst
->InstructionExtNv
.Padding
);
1151 if( deflt
|| fi
->InstructionExtNv
.Extended
!= inst
->InstructionExtNv
.Extended
) {
1152 TXT( "\nExtended : " );
1153 UID( inst
->InstructionExtNv
.Extended
);
1158 if( deflt
|| tgsi_compare_instruction_ext_label( inst
->InstructionExtLabel
, fi
->InstructionExtLabel
) ) {
1161 ENM( inst
->InstructionExtLabel
.Type
, TGSI_INSTRUCTION_EXTS
);
1162 if( deflt
|| fi
->InstructionExtLabel
.Label
!= inst
->InstructionExtLabel
.Label
) {
1163 TXT( "\nLabel : " );
1164 UID( inst
->InstructionExtLabel
.Label
);
1167 TXT( "\nPadding : " );
1168 UIX( inst
->InstructionExtLabel
.Padding
);
1169 if( deflt
|| fi
->InstructionExtLabel
.Extended
!= inst
->InstructionExtLabel
.Extended
) {
1170 TXT( "\nExtended: " );
1171 UID( inst
->InstructionExtLabel
.Extended
);
1176 if( deflt
|| tgsi_compare_instruction_ext_texture( inst
->InstructionExtTexture
, fi
->InstructionExtTexture
) ) {
1179 ENM( inst
->InstructionExtTexture
.Type
, TGSI_INSTRUCTION_EXTS
);
1180 if( deflt
|| fi
->InstructionExtTexture
.Texture
!= inst
->InstructionExtTexture
.Texture
) {
1181 TXT( "\nTexture : " );
1182 ENM( inst
->InstructionExtTexture
.Texture
, TGSI_TEXTURES
);
1185 TXT( "\nPadding : " );
1186 UIX( inst
->InstructionExtTexture
.Padding
);
1187 if( deflt
|| fi
->InstructionExtTexture
.Extended
!= inst
->InstructionExtTexture
.Extended
) {
1188 TXT( "\nExtended: " );
1189 UID( inst
->InstructionExtTexture
.Extended
);
1194 for( i
= 0; i
< inst
->Instruction
.NumDstRegs
; i
++ ) {
1195 struct tgsi_full_dst_register
*dst
= &inst
->FullDstRegisters
[i
];
1196 struct tgsi_full_dst_register
*fd
= &fi
->FullDstRegisters
[i
];
1200 ENM( dst
->DstRegister
.File
, TGSI_FILES
);
1201 if( deflt
|| fd
->DstRegister
.WriteMask
!= dst
->DstRegister
.WriteMask
) {
1202 TXT( "\nWriteMask: " );
1203 ENM( dst
->DstRegister
.WriteMask
, TGSI_WRITEMASKS
);
1206 if( deflt
|| fd
->DstRegister
.Indirect
!= dst
->DstRegister
.Indirect
) {
1207 TXT( "\nIndirect : " );
1208 UID( dst
->DstRegister
.Indirect
);
1210 if( deflt
|| fd
->DstRegister
.Dimension
!= dst
->DstRegister
.Dimension
) {
1211 TXT( "\nDimension: " );
1212 UID( dst
->DstRegister
.Dimension
);
1215 if( deflt
|| fd
->DstRegister
.Index
!= dst
->DstRegister
.Index
) {
1216 TXT( "\nIndex : " );
1217 SID( dst
->DstRegister
.Index
);
1220 TXT( "\nPadding : " );
1221 UIX( dst
->DstRegister
.Padding
);
1222 if( deflt
|| fd
->DstRegister
.Extended
!= dst
->DstRegister
.Extended
) {
1223 TXT( "\nExtended : " );
1224 UID( dst
->DstRegister
.Extended
);
1228 if( deflt
|| tgsi_compare_dst_register_ext_concode( dst
->DstRegisterExtConcode
, fd
->DstRegisterExtConcode
) ) {
1231 ENM( dst
->DstRegisterExtConcode
.Type
, TGSI_DST_REGISTER_EXTS
);
1232 if( deflt
|| fd
->DstRegisterExtConcode
.CondMask
!= dst
->DstRegisterExtConcode
.CondMask
) {
1233 TXT( "\nCondMask : " );
1234 ENM( dst
->DstRegisterExtConcode
.CondMask
, TGSI_CCS
);
1236 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleX
!= dst
->DstRegisterExtConcode
.CondSwizzleX
) {
1237 TXT( "\nCondSwizzleX: " );
1238 ENM( dst
->DstRegisterExtConcode
.CondSwizzleX
, TGSI_SWIZZLES
);
1240 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleY
!= dst
->DstRegisterExtConcode
.CondSwizzleY
) {
1241 TXT( "\nCondSwizzleY: " );
1242 ENM( dst
->DstRegisterExtConcode
.CondSwizzleY
, TGSI_SWIZZLES
);
1244 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleZ
!= dst
->DstRegisterExtConcode
.CondSwizzleZ
) {
1245 TXT( "\nCondSwizzleZ: " );
1246 ENM( dst
->DstRegisterExtConcode
.CondSwizzleZ
, TGSI_SWIZZLES
);
1248 if( deflt
|| fd
->DstRegisterExtConcode
.CondSwizzleW
!= dst
->DstRegisterExtConcode
.CondSwizzleW
) {
1249 TXT( "\nCondSwizzleW: " );
1250 ENM( dst
->DstRegisterExtConcode
.CondSwizzleW
, TGSI_SWIZZLES
);
1252 if( deflt
|| fd
->DstRegisterExtConcode
.CondSrcIndex
!= dst
->DstRegisterExtConcode
.CondSrcIndex
) {
1253 TXT( "\nCondSrcIndex: " );
1254 UID( dst
->DstRegisterExtConcode
.CondSrcIndex
);
1257 TXT( "\nPadding : " );
1258 UIX( dst
->DstRegisterExtConcode
.Padding
);
1259 if( deflt
|| fd
->DstRegisterExtConcode
.Extended
!= dst
->DstRegisterExtConcode
.Extended
) {
1260 TXT( "\nExtended : " );
1261 UID( dst
->DstRegisterExtConcode
.Extended
);
1266 if( deflt
|| tgsi_compare_dst_register_ext_modulate( dst
->DstRegisterExtModulate
, fd
->DstRegisterExtModulate
) ) {
1269 ENM( dst
->DstRegisterExtModulate
.Type
, TGSI_DST_REGISTER_EXTS
);
1270 if( deflt
|| fd
->DstRegisterExtModulate
.Modulate
!= dst
->DstRegisterExtModulate
.Modulate
) {
1271 TXT( "\nModulate: " );
1272 ENM( dst
->DstRegisterExtModulate
.Modulate
, TGSI_MODULATES
);
1275 TXT( "\nPadding : " );
1276 UIX( dst
->DstRegisterExtModulate
.Padding
);
1277 if( deflt
|| fd
->DstRegisterExtModulate
.Extended
!= dst
->DstRegisterExtModulate
.Extended
) {
1278 TXT( "\nExtended: " );
1279 UID( dst
->DstRegisterExtModulate
.Extended
);
1285 for( i
= 0; i
< inst
->Instruction
.NumSrcRegs
; i
++ ) {
1286 struct tgsi_full_src_register
*src
= &inst
->FullSrcRegisters
[i
];
1287 struct tgsi_full_src_register
*fs
= &fi
->FullSrcRegisters
[i
];
1291 ENM( src
->SrcRegister
.File
, TGSI_FILES
);
1292 if( deflt
|| fs
->SrcRegister
.SwizzleX
!= src
->SrcRegister
.SwizzleX
) {
1293 TXT( "\nSwizzleX : " );
1294 ENM( src
->SrcRegister
.SwizzleX
, TGSI_SWIZZLES
);
1296 if( deflt
|| fs
->SrcRegister
.SwizzleY
!= src
->SrcRegister
.SwizzleY
) {
1297 TXT( "\nSwizzleY : " );
1298 ENM( src
->SrcRegister
.SwizzleY
, TGSI_SWIZZLES
);
1300 if( deflt
|| fs
->SrcRegister
.SwizzleZ
!= src
->SrcRegister
.SwizzleZ
) {
1301 TXT( "\nSwizzleZ : " );
1302 ENM( src
->SrcRegister
.SwizzleZ
, TGSI_SWIZZLES
);
1304 if( deflt
|| fs
->SrcRegister
.SwizzleW
!= src
->SrcRegister
.SwizzleW
) {
1305 TXT( "\nSwizzleW : " );
1306 ENM( src
->SrcRegister
.SwizzleW
, TGSI_SWIZZLES
);
1308 if( deflt
|| fs
->SrcRegister
.Negate
!= src
->SrcRegister
.Negate
) {
1309 TXT( "\nNegate : " );
1310 UID( src
->SrcRegister
.Negate
);
1313 if( deflt
|| fs
->SrcRegister
.Indirect
!= src
->SrcRegister
.Indirect
) {
1314 TXT( "\nIndirect : " );
1315 UID( src
->SrcRegister
.Indirect
);
1317 if( deflt
|| fs
->SrcRegister
.Dimension
!= src
->SrcRegister
.Dimension
) {
1318 TXT( "\nDimension: " );
1319 UID( src
->SrcRegister
.Dimension
);
1322 if( deflt
|| fs
->SrcRegister
.Index
!= src
->SrcRegister
.Index
) {
1323 TXT( "\nIndex : " );
1324 SID( src
->SrcRegister
.Index
);
1327 if( deflt
|| fs
->SrcRegister
.Extended
!= src
->SrcRegister
.Extended
) {
1328 TXT( "\nExtended : " );
1329 UID( src
->SrcRegister
.Extended
);
1333 if( deflt
|| tgsi_compare_src_register_ext_swz( src
->SrcRegisterExtSwz
, fs
->SrcRegisterExtSwz
) ) {
1336 ENM( src
->SrcRegisterExtSwz
.Type
, TGSI_SRC_REGISTER_EXTS
);
1337 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleX
!= src
->SrcRegisterExtSwz
.ExtSwizzleX
) {
1338 TXT( "\nExtSwizzleX: " );
1339 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleX
, TGSI_EXTSWIZZLES
);
1341 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleY
!= src
->SrcRegisterExtSwz
.ExtSwizzleY
) {
1342 TXT( "\nExtSwizzleY: " );
1343 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleY
, TGSI_EXTSWIZZLES
);
1345 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleZ
!= src
->SrcRegisterExtSwz
.ExtSwizzleZ
) {
1346 TXT( "\nExtSwizzleZ: " );
1347 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleZ
, TGSI_EXTSWIZZLES
);
1349 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtSwizzleW
!= src
->SrcRegisterExtSwz
.ExtSwizzleW
) {
1350 TXT( "\nExtSwizzleW: " );
1351 ENM( src
->SrcRegisterExtSwz
.ExtSwizzleW
, TGSI_EXTSWIZZLES
);
1353 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateX
!= src
->SrcRegisterExtSwz
.NegateX
) {
1354 TXT( "\nNegateX : " );
1355 UID( src
->SrcRegisterExtSwz
.NegateX
);
1357 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateY
!= src
->SrcRegisterExtSwz
.NegateY
) {
1358 TXT( "\nNegateY : " );
1359 UID( src
->SrcRegisterExtSwz
.NegateY
);
1361 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateZ
!= src
->SrcRegisterExtSwz
.NegateZ
) {
1362 TXT( "\nNegateZ : " );
1363 UID( src
->SrcRegisterExtSwz
.NegateZ
);
1365 if( deflt
|| fs
->SrcRegisterExtSwz
.NegateW
!= src
->SrcRegisterExtSwz
.NegateW
) {
1366 TXT( "\nNegateW : " );
1367 UID( src
->SrcRegisterExtSwz
.NegateW
);
1369 if( deflt
|| fs
->SrcRegisterExtSwz
.ExtDivide
!= src
->SrcRegisterExtSwz
.ExtDivide
) {
1370 TXT( "\nExtDivide : " );
1371 ENM( src
->SrcRegisterExtSwz
.ExtDivide
, TGSI_EXTSWIZZLES
);
1374 TXT( "\nPadding : " );
1375 UIX( src
->SrcRegisterExtSwz
.Padding
);
1376 if( deflt
|| fs
->SrcRegisterExtSwz
.Extended
!= src
->SrcRegisterExtSwz
.Extended
) {
1377 TXT( "\nExtended : " );
1378 UID( src
->SrcRegisterExtSwz
.Extended
);
1383 if( deflt
|| tgsi_compare_src_register_ext_mod( src
->SrcRegisterExtMod
, fs
->SrcRegisterExtMod
) ) {
1386 ENM( src
->SrcRegisterExtMod
.Type
, TGSI_SRC_REGISTER_EXTS
);
1387 if( deflt
|| fs
->SrcRegisterExtMod
.Complement
!= src
->SrcRegisterExtMod
.Complement
) {
1388 TXT( "\nComplement: " );
1389 UID( src
->SrcRegisterExtMod
.Complement
);
1391 if( deflt
|| fs
->SrcRegisterExtMod
.Bias
!= src
->SrcRegisterExtMod
.Bias
) {
1393 UID( src
->SrcRegisterExtMod
.Bias
);
1395 if( deflt
|| fs
->SrcRegisterExtMod
.Scale2X
!= src
->SrcRegisterExtMod
.Scale2X
) {
1396 TXT( "\nScale2X : " );
1397 UID( src
->SrcRegisterExtMod
.Scale2X
);
1399 if( deflt
|| fs
->SrcRegisterExtMod
.Absolute
!= src
->SrcRegisterExtMod
.Absolute
) {
1400 TXT( "\nAbsolute : " );
1401 UID( src
->SrcRegisterExtMod
.Absolute
);
1403 if( deflt
|| fs
->SrcRegisterExtMod
.Negate
!= src
->SrcRegisterExtMod
.Negate
) {
1404 TXT( "\nNegate : " );
1405 UID( src
->SrcRegisterExtMod
.Negate
);
1408 TXT( "\nPadding : " );
1409 UIX( src
->SrcRegisterExtMod
.Padding
);
1410 if( deflt
|| fs
->SrcRegisterExtMod
.Extended
!= src
->SrcRegisterExtMod
.Extended
) {
1411 TXT( "\nExtended : " );
1412 UID( src
->SrcRegisterExtMod
.Extended
);
1421 struct gen_dump
*dump
,
1422 const struct tgsi_token
*tokens
,
1425 struct tgsi_parse_context parse
;
1426 struct tgsi_full_instruction fi
;
1427 struct tgsi_full_declaration fd
;
1428 unsigned verbose
= flags
& TGSI_DUMP_VERBOSE
;
1429 unsigned ignored
= !(flags
& TGSI_DUMP_NO_IGNORED
);
1430 unsigned deflt
= !(flags
& TGSI_DUMP_NO_DEFAULT
);
1431 unsigned instno
= 0;
1436 assert(strcmp(TGSI_OPCODES
[TGSI_OPCODE_CONT
], "OPCODE_CONT") == 0);
1438 tgsi_parse_init( &parse
, tokens
);
1440 TXT( "tgsi-dump begin -----------------" );
1443 ENM( parse
.FullHeader
.Processor
.Processor
, TGSI_PROCESSOR_TYPES_SHORT
);
1445 UID( parse
.FullVersion
.Version
.MajorVersion
);
1447 UID( parse
.FullVersion
.Version
.MinorVersion
);
1450 TXT( "\nMajorVersion: " );
1451 UID( parse
.FullVersion
.Version
.MajorVersion
);
1452 TXT( "\nMinorVersion: " );
1453 UID( parse
.FullVersion
.Version
.MinorVersion
);
1456 TXT( "\nHeaderSize: " );
1457 UID( parse
.FullHeader
.Header
.HeaderSize
);
1458 TXT( "\nBodySize : " );
1459 UID( parse
.FullHeader
.Header
.BodySize
);
1460 TXT( "\nProcessor : " );
1461 ENM( parse
.FullHeader
.Processor
.Processor
, TGSI_PROCESSOR_TYPES
);
1465 fi
= tgsi_default_full_instruction();
1466 fd
= tgsi_default_full_declaration();
1468 while( !tgsi_parse_end_of_tokens( &parse
) ) {
1469 tgsi_parse_token( &parse
);
1471 switch( parse
.FullToken
.Token
.Type
) {
1472 case TGSI_TOKEN_TYPE_DECLARATION
:
1473 dump_declaration_short(
1475 &parse
.FullToken
.FullDeclaration
);
1478 case TGSI_TOKEN_TYPE_IMMEDIATE
:
1479 dump_immediate_short(
1481 &parse
.FullToken
.FullImmediate
);
1484 case TGSI_TOKEN_TYPE_INSTRUCTION
:
1485 dump_instruction_short(
1487 &parse
.FullToken
.FullInstruction
,
1498 ENM( parse
.FullToken
.Token
.Type
, TGSI_TOKEN_TYPES
);
1501 UID( parse
.FullToken
.Token
.Size
);
1502 if( deflt
|| parse
.FullToken
.Token
.Extended
) {
1503 TXT( "\nExtended : " );
1504 UID( parse
.FullToken
.Token
.Extended
);
1508 switch( parse
.FullToken
.Token
.Type
) {
1509 case TGSI_TOKEN_TYPE_DECLARATION
:
1510 dump_declaration_verbose(
1512 &parse
.FullToken
.FullDeclaration
,
1518 case TGSI_TOKEN_TYPE_IMMEDIATE
:
1519 dump_immediate_verbose(
1521 &parse
.FullToken
.FullImmediate
,
1525 case TGSI_TOKEN_TYPE_INSTRUCTION
:
1526 dump_instruction_verbose(
1528 &parse
.FullToken
.FullInstruction
,
1542 TXT( "\ntgsi-dump end -------------------\n" );
1544 tgsi_parse_free( &parse
);
1551 assert(strcmp(TGSI_OPCODES
[TGSI_OPCODE_END
], "OPCODE_END") == 0);
1552 assert(strcmp(TGSI_OPCODES_SHORT
[TGSI_OPCODE_END
], "END") == 0);
1558 const struct tgsi_token
*tokens
,
1561 struct file_dump dump
;
1565 dump
.base
.write
= _file_dump_write
;
1568 static unsigned counter
= 0;
1570 sprintf( buffer
, "tgsi-dump-%.4u.txt", counter
++ );
1571 dump
.file
= fopen( buffer
, "wt" );
1583 fclose( dump
.file
);
1590 const struct tgsi_token
*tokens
,
1593 struct text_dump dump
;
1595 dump
.base
.write
= _text_dump_write
;