ReactOS  0.4.15-dev-1039-gb9754fa
shader.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Luis Busquets
3  * Copyright 2011 Travis Athougies
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include "wine/test.h"
21 #include "d3dx9.h"
22 
23 #define FCC_TEXT MAKEFOURCC('T','E','X','T')
24 #define FCC_CTAB MAKEFOURCC('C','T','A','B')
25 
26 static const DWORD shader_zero[] = {0x0};
27 
28 static const DWORD shader_invalid[] = {0xeeee0100};
29 
30 static const DWORD shader_empty[] = {0xfffe0200, 0x0000ffff};
31 
32 static const DWORD simple_fx[] = {0x46580000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
33 
34 static const DWORD simple_tx[] = {0x54580000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
35 
36 static const DWORD simple_7ffe[] = {0x7ffe0000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
37 
38 static const DWORD simple_7fff[] = {0x7fff0000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
39 
40 static const DWORD simple_vs[] = {
41  0xfffe0101, /* vs_1_1 */
42  0x0000001f, 0x80000000, 0x900f0000, /* dcl_position0 v0 */
43  0x00000009, 0xc0010000, 0x90e40000, 0xa0e40000, /* dp4 oPos.x, v0, c0 */
44  0x00000009, 0xc0020000, 0x90e40000, 0xa0e40001, /* dp4 oPos.y, v0, c1 */
45  0x00000009, 0xc0040000, 0x90e40000, 0xa0e40002, /* dp4 oPos.z, v0, c2 */
46  0x00000009, 0xc0080000, 0x90e40000, 0xa0e40003, /* dp4 oPos.w, v0, c3 */
47  0x0000ffff}; /* END */
48 
49 static const DWORD simple_ps[] = {
50  0xffff0101, /* ps_1_1 */
51  0x00000051, 0xa00f0001, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, /* def c1 = 1.0, 0.0, 0.0, 0.0 */
52  0x00000042, 0xb00f0000, /* tex t0 */
53  0x00000008, 0x800f0000, 0xa0e40001, 0xa0e40000, /* dp3 r0, c1, c0 */
54  0x00000005, 0x800f0000, 0x90e40000, 0x80e40000, /* mul r0, v0, r0 */
55  0x00000005, 0x800f0000, 0xb0e40000, 0x80e40000, /* mul r0, t0, r0 */
56  0x0000ffff}; /* END */
57 
58 static const DWORD shader_with_ctab[] = {
59  0xfffe0300, /* vs_3_0 */
60  0x0002fffe, FCC_TEXT, 0x00000000, /* TEXT comment */
61  0x0008fffe, FCC_CTAB, 0x0000001c, 0x00000010, 0xfffe0300, 0x00000000, /* CTAB comment */
62  0x00000000, 0x00000000, 0x00000000,
63  0x0004fffe, FCC_TEXT, 0x00000000, 0x00000000, 0x00000000, /* TEXT comment */
64  0x0000ffff}; /* END */
65 
66 static const DWORD shader_with_invalid_ctab[] = {
67  0xfffe0300, /* vs_3_0 */
68  0x0005fffe, FCC_CTAB, /* CTAB comment */
69  0x0000001c, 0x000000a9, 0xfffe0300,
70  0x00000000, 0x00000000,
71  0x0000ffff}; /* END */
72 
74  0xfffe0300, /* vs_3_0 */
75  0x002efffe, FCC_CTAB, /* CTAB comment */
76  0x0000001c, 0x000000a4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
77  0x0000009c,
78  0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc */
79  0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000, /* Constant 2 desc */
80  0x00000090, 0x00040002, 0x00000003, 0x00000080, 0x00000000, /* Constant 3 desc */
81  0x736e6f43, 0x746e6174, 0xabab0031, /* Constant 1 name string */
82  0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
83  0x736e6f43, 0x746e6174, 0xabab0032, /* Constant 2 name string */
84  0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 2 & 3 type desc */
85  0x736e6f43, 0x746e6174, 0xabab0033, /* Constant 3 name string */
86  0x335f7376, 0xab00305f, /* Target name string */
87  0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
88  0x0000ffff}; /* END */
89 
90 static const DWORD ctab_basic[] = {
91  0xfffe0300, /* vs_3_0 */
92  0x0040fffe, FCC_CTAB, /* CTAB comment */
93  0x0000001c, 0x000000ec, 0xfffe0300, 0x00000005, 0x0000001c, 0x20008100, /* Header */
94  0x000000e4,
95  0x00000080, 0x00060002, 0x00000001, 0x00000084, 0x00000000, /* Constant 1 desc (f) */
96  0x00000094, 0x00070002, 0x00000001, 0x00000098, 0x00000000, /* Constant 2 desc (f4) */
97  0x000000A8, 0x00040002, 0x00000001, 0x000000AC, 0x00000000, /* Constant 3 desc (i) */
98  0x000000BC, 0x00050002, 0x00000001, 0x000000C0, 0x00000000, /* Constant 4 desc (i4) */
99  0x000000D0, 0x00000002, 0x00000004, 0x000000D4, 0x00000000, /* Constant 5 desc (mvp) */
100  0xabab0066, 0x00030000, 0x00010001, 0x00000001, 0x00000000, /* Constant 1 name/type desc */
101  0xab003466, 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 2 name/type desc */
102  0xabab0069, 0x00020000, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 name/type desc */
103  0xab003469, 0x00020001, 0x00040001, 0x00000001, 0x00000000, /* Constant 4 name/type desc */
104  0x0070766d, 0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 5 name/type desc */
105  0x335f7376, 0xab00305f, /* Target name string */
106  0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
107  0x0000ffff}; /* END */
108 
110  {"mvp", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL},
111  {"i", D3DXRS_FLOAT4, 4, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL},
112  {"i4", D3DXRS_FLOAT4, 5, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 1, 0, 16, NULL},
113  {"f", D3DXRS_FLOAT4, 6, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL},
114  {"f4", D3DXRS_FLOAT4, 7, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16, NULL}};
115 
116 static const DWORD ctab_matrices[] = {
117  0xfffe0300, /* vs_3_0 */
118  0x0032fffe, FCC_CTAB, /* CTAB comment */
119  0x0000001c, 0x000000b4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
120  0x000000ac,
121  0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc (fmatrix3x1) */
122  0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000, /* Constant 2 desc (fmatrix4x4) */
123  0x00000090, 0x00040002, 0x00000002, 0x0000009c, 0x00000000, /* Constant 3 desc (imatrix2x3) */
124  0x74616D66, 0x33786972, 0xab003178, /* Constant 1 name */
125  0x00030003, 0x00010003, 0x00000001, 0x00000000, /* Constant 1 type desc */
126  0x74616D66, 0x34786972, 0xab003478, /* Constant 2 name */
127  0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 2 type desc */
128  0x74616D69, 0x32786972, 0xab003378, /* Constant 3 name */
129  0x00020002, 0x00030002, 0x00000001, 0x00000000, /* Constant 3 type desc */
130  0x335f7376, 0xab00305f, /* Target name string */
131  0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
132  0x0000ffff}; /* END */
133 
135  {"fmatrix4x4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL},
136  {"imatrix2x3", D3DXRS_FLOAT4, 4, 2, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 1, 0, 24, NULL},
137  {"fmatrix3x1", D3DXRS_FLOAT4, 7, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL},
138 };
139 
140 static const DWORD ctab_matrices2[] = {
141  0xfffe0200, /* vs_2_0 */
142  0x0058fffe, FCC_CTAB, /* CTAB comment */
143  0x0000001c, 0x0000012b, 0xfffe0200, 0x00000006, 0x0000001c, 0x00000100, /* Header */
144  0x00000124,
145  0x00000094, 0x00070002, 0x00000003, 0x0000009c, 0x00000000, /* Constant 1 desc (c2x3) */
146  0x000000ac, 0x000d0002, 0x00000002, 0x000000b4, 0x00000000, /* Constant 2 desc (c3x2) */
147  0x000000c4, 0x000a0002, 0x00000003, 0x000000cc, 0x00000000, /* Constant 3 desc (c3x3) */
148  0x000000dc, 0x000f0002, 0x00000002, 0x000000e4, 0x00000000, /* Constant 4 desc (r2x3) */
149  0x000000f4, 0x00040002, 0x00000003, 0x000000fc, 0x00000000, /* Constant 5 desc (r3x2) */
150  0x0000010c, 0x00000002, 0x00000004, 0x00000114, 0x00000000, /* Constant 6 desc (r4x4) */
151  0x33783263, 0xababab00, /* Constant 1 name */
152  0x00030003, 0x00030002, 0x00000001, 0x00000000, /* Constant 1 type desc */
153  0x32783363, 0xababab00, /* Constant 2 name */
154  0x00030003, 0x00020003, 0x00000001, 0x00000000, /* Constant 2 type desc */
155  0x33783363, 0xababab00, /* Constant 3 name */
156  0x00030003, 0x00030003, 0x00000001, 0x00000000, /* Constant 3 type desc */
157  0x33783272, 0xababab00, /* Constant 4 name */
158  0x00030002, 0x00030002, 0x00000001, 0x00000000, /* Constant 4 type desc */
159  0x32783372, 0xababab00, /* Constant 5 name */
160  0x00030002, 0x00020003, 0x00000001, 0x00000000, /* Constant 5 type desc */
161  0x34783472, 0xababab00, /* Constant 6 name */
162  0x00030002, 0x00040004, 0x00000001, 0x00000000, /* Constant 6 type desc */
163  0x325f7376, 0x4100305f, 0x41414141, 0x00414141, /* Target and Creator name */
164  0x0000ffff}; /* END */
165 
167  {"c2x3", D3DXRS_FLOAT4, 7, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL},
168  {"c3x2", D3DXRS_FLOAT4, 13, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL},
169  {"c3x3", D3DXRS_FLOAT4, 10, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 3, 1, 0, 36, NULL},
170  {"r2x3", D3DXRS_FLOAT4, 15, 2, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL},
171  {"r3x2", D3DXRS_FLOAT4, 4, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL},
172  {"r4x4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL}};
173 
174 static const DWORD ctab_arrays[] = {
175  0xfffe0300, /* vs_3_0 */
176  0x0052fffe, FCC_CTAB, /* CTAB comment */
177  0x0000001c, 0x0000013c, 0xfffe0300, 0x00000006, 0x0000001c, 0x20008100, /* Header */
178  0x00000134,
179  0x00000094, 0x000E0002, 0x00000002, 0x0000009c, 0x00000000, /* Constant 1 desc (barray) */
180  0x000000ac, 0x00100002, 0x00000002, 0x000000b8, 0x00000000, /* Constant 2 desc (bvecarray) */
181  0x000000c8, 0x00080002, 0x00000004, 0x000000d0, 0x00000000, /* Constant 3 desc (farray) */
182  0x000000e0, 0x00000002, 0x00000008, 0x000000ec, 0x00000000, /* Constant 4 desc (fmtxarray) */
183  0x000000fc, 0x000C0002, 0x00000002, 0x00000108, 0x00000000, /* Constant 5 desc (fvecarray) */
184  0x00000118, 0x00120002, 0x00000001, 0x00000124, 0x00000000, /* Constant 6 desc (ivecarray) */
185  0x72726162, 0xab007961, /* Constant 1 name */
186  0x00010000, 0x00010001, 0x00000002, 0x00000000, /* Constant 1 type desc */
187  0x63657662, 0x61727261, 0xabab0079, /* Constant 2 name */
188  0x00010001, 0x00030001, 0x00000003, 0x00000000, /* Constant 2 type desc */
189  0x72726166, 0xab007961, /* Constant 3 name */
190  0x00030000, 0x00010001, 0x00000004, 0x00000000, /* constant 3 type desc */
191  0x78746d66, 0x61727261, 0xabab0079, /* Constant 4 name */
192  0x00030002, 0x00040004, 0x00000002, 0x00000000, /* Constant 4 type desc */
193  0x63657666, 0x61727261, 0xabab0079, /* Constant 5 name */
194  0x00030001, 0x00040001, 0x00000002, 0x00000000, /* Constant 5 type desc */
195  0x63657669, 0x61727261, 0xabab0079, /* Constant 6 name */
196  0x00020001, 0x00040001, 0x00000001, 0x00000000, /* Constant 6 type desc */
197  0x335f7376, 0xab00305f, /* Target name string */
198  0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
199  0x0000ffff}; /* END */
200 
202  {"fmtxarray", D3DXRS_FLOAT4, 0, 8, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 128, NULL},
203  {"farray", D3DXRS_FLOAT4, 8, 4, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 4, 0, 16, NULL},
204  {"fvecarray", D3DXRS_FLOAT4, 12, 2, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 2, 0, 32, NULL},
205  {"barray", D3DXRS_FLOAT4, 14, 2, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 2, 0, 8, NULL},
206  {"bvecarray", D3DXRS_FLOAT4, 16, 2, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 3, 0, 36, NULL},
207  {"ivecarray", D3DXRS_FLOAT4, 18, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 1, 0, 16, NULL}};
208 
209 static const DWORD ctab_with_default_values[] = {
210  0xfffe0200, /* vs_2_0 */
211  0x007bfffe, FCC_CTAB, /* CTAB comment */
212  0x0000001c, 0x000001b7, 0xfffe0200, 0x00000005, 0x0000001c, /* header */
213  0x00000100, 0x000001b0,
214  0x00000080, 0x00080002, 0x00000003, 0x00000084, 0x00000094, /* constant 1 desc (arr) */
215  0x000000c4, 0x000c0002, 0x00000001, 0x000000c8, 0x000000d8, /* constant 2 desc (flt) */
216  0x000000e8, 0x00040002, 0x00000004, 0x000000f0, 0x00000100, /* constant 3 desc (mat3) */
217  0x00000140, 0x00000002, 0x00000004, 0x000000f0, 0x00000148, /* constant 4 desc (mat4) */
218  0x00000188, 0x000b0002, 0x00000001, 0x00000190, 0x000001a0, /* constant 5 desc (vec4) */
219  0x00727261, /* constant 1 name */
220  0x00030000, 0x00010001, 0x00000003, 0x00000000, /* constant 1 type desc */
221  0x42c80000, 0x00000000, 0x00000000, 0x00000000, /* constant 1 default value */
222  0x43480000, 0x00000000, 0x00000000, 0x00000000,
223  0x43960000, 0x00000000, 0x00000000, 0x00000000,
224  0x00746c66, /* constant 2 name */
225  0x00030000, 0x00010001, 0x00000001, 0x00000000, /* constant 2 type desc */
226  0x411fd70a, 0x00000000, 0x00000000, 0x00000000, /* constant 2 default value */
227  0x3374616d, /* constant 3 name */
228  0xababab00,
229  0x00030003, 0x00040004, 0x00000001, 0x00000000, /* constant 3 & 4 type desc */
230  0x41300000, 0x425c0000, 0x42c60000, 0x44a42000, /* constat 3 default value */
231  0x41b00000, 0x42840000, 0x447c8000, 0x44b0c000,
232  0x42040000, 0x429a0000, 0x448ae000, 0x44bd6000,
233  0x42300000, 0x42b00000, 0x44978000, 0x44ca0000,
234  0x3474616d, /* constant 4 name */
235  0xababab00,
236  0x3f800000, 0x40a00000, 0x41100000, 0x41500000, /* constant 4 default value */
237  0x40000000, 0x40c00000, 0x41200000, 0x41600000,
238  0x40400000, 0x40e00000, 0x41300000, 0x41700000,
239  0x40800000, 0x41000000, 0x41400000, 0x41800000,
240  0x34636576, /* constant 5 name */
241  0xababab00,
242  0x00030001, 0x00040001, 0x00000001, 0x00000000, /* constant 5 type desc */
243  0x41200000, 0x41a00000, 0x41f00000, 0x42200000, /* constant 5 default value */
244  0x325f7376, 0x4d004141, 0x41414141, 0x00000000, /* target & creator string */
245  0x0000ffff}; /* END */
246 
247 static const float mat4_default_value[] = {1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16};
248 static const float mat3_default_value[] = {11, 55, 99, 1313, 22, 66, 1010, 1414, 33, 77, 1111, 1515, 44, 88, 1212, 1616};
249 static const float arr_default_value[] = {100, 0, 0, 0, 200, 0, 0, 0, 300, 0, 0, 0};
250 static const float vec4_default_value[] = {10, 20, 30, 40};
251 static const float flt_default_value[] = {9.99, 0, 0, 0};
252 
254  {"mat4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, mat4_default_value},
255  {"mat3", D3DXRS_FLOAT4, 4, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, mat3_default_value},
256  {"arr", D3DXRS_FLOAT4, 8, 3, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 3, 0, 12, arr_default_value},
257  {"vec4", D3DXRS_FLOAT4, 11, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16, vec4_default_value},
258  {"flt", D3DXRS_FLOAT4, 12, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, flt_default_value}};
259 
260 static const DWORD ctab_samplers[] = {
261  0xfffe0300, /* vs_3_0 */
262  0x0032fffe, FCC_CTAB, /* CTAB comment */
263  0x0000001c, 0x000000b4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
264  0x000000ac,
265  0x00000058, 0x00020002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc (notsampler) */
266  0x00000074, 0x00000003, 0x00000001, 0x00000080, 0x00000000, /* Constant 2 desc (sampler1) */
267  0x00000090, 0x00030003, 0x00000001, 0x0000009c, 0x00000000, /* Constant 3 desc (sampler2) */
268  0x73746f6e, 0x6c706d61, 0xab007265, /* Constant 1 name */
269  0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
270  0x706d6173, 0x3172656c, 0xababab00, /* Constant 2 name */
271  0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 2 type desc */
272  0x706d6173, 0x3272656c, 0xababab00, /* Constant 3 name */
273  0x000d0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 type desc */
274  0x335f7376, 0xab00305f, /* Target name string */
275  0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
276  0x0000ffff}; /* END */
277 
279  {"sampler1", D3DXRS_SAMPLER, 0, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4, NULL},
280  {"sampler2", D3DXRS_SAMPLER, 3, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER3D, 1, 1, 1, 0, 4, NULL},
281  {"notsampler", D3DXRS_FLOAT4, 2, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16, NULL}};
282 
283 static const DWORD fx_shader_with_ctab[] =
284 {
285  0x46580200, /* FX20 */
286  0x002efffe, FCC_CTAB, /* CTAB comment */
287  0x0000001c, 0x000000a4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
288  0x0000009c,
289  0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc */
290  0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000, /* Constant 2 desc */
291  0x00000090, 0x00040002, 0x00000003, 0x00000080, 0x00000000, /* Constant 3 desc */
292  0x736e6f43, 0x746e6174, 0xabab0031, /* Constant 1 name string */
293  0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
294  0x736e6f43, 0x746e6174, 0xabab0032, /* Constant 2 name string */
295  0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 2 & 3 type desc */
296  0x736e6f43, 0x746e6174, 0xabab0033, /* Constant 3 name string */
297  0x335f7376, 0xab00305f, /* Target name string */
298  0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
299  0x0000ffff /* END */
300 };
301 
302 static void test_get_shader_size(void)
303 {
304  UINT shader_size, expected;
305 
306  shader_size = D3DXGetShaderSize(simple_vs);
307  expected = sizeof(simple_vs);
308  ok(shader_size == expected, "Got shader size %u, expected %u\n", shader_size, expected);
309 
310  shader_size = D3DXGetShaderSize(simple_ps);
311  expected = sizeof(simple_ps);
312  ok(shader_size == expected, "Got shader size %u, expected %u\n", shader_size, expected);
313 
314  shader_size = D3DXGetShaderSize(NULL);
315  ok(shader_size == 0, "Got shader size %u, expected 0\n", shader_size);
316 }
317 
318 static void test_get_shader_version(void)
319 {
320  DWORD shader_version;
321 
322  shader_version = D3DXGetShaderVersion(simple_vs);
323  ok(shader_version == D3DVS_VERSION(1, 1), "Got shader version 0x%08x, expected 0x%08x\n",
324  shader_version, D3DVS_VERSION(1, 1));
325 
326  shader_version = D3DXGetShaderVersion(simple_ps);
327  ok(shader_version == D3DPS_VERSION(1, 1), "Got shader version 0x%08x, expected 0x%08x\n",
328  shader_version, D3DPS_VERSION(1, 1));
329 
330  shader_version = D3DXGetShaderVersion(NULL);
331  ok(shader_version == 0, "Got shader version 0x%08x, expected 0\n", shader_version);
332 }
333 
334 static void test_find_shader_comment(void)
335 {
336  const void *data = (void *)0xdeadbeef;
337  HRESULT hr;
338  UINT size = 100;
339 
340  hr = D3DXFindShaderComment(NULL, MAKEFOURCC('C','T','A','B'), &data, &size);
341  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
342  ok(!data, "Got %p, expected NULL\n", data);
343  ok(!size, "Got %u, expected 0\n", size);
344 
346  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
347  ok(size == 28, "Got %u, expected 28\n", size);
348 
350  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
351  ok(data == shader_with_ctab + 6, "Got result %p, expected %p\n", data, shader_with_ctab + 6);
352 
354  ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
355  ok(!data, "Got %p, expected NULL\n", data);
356  ok(!size, "Got %u, expected 0\n", size);
357 
358  hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('X','X','X','X'), &data, &size);
359  ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
360  ok(!data, "Got %p, expected NULL\n", data);
361  ok(!size, "Got %u, expected 0\n", size);
362 
363  hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, &size);
364  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
365  ok(data == shader_with_ctab + 6, "Got result %p, expected %p\n", data, shader_with_ctab + 6);
366  ok(size == 28, "Got result %u, expected 28\n", size);
367 
368  hr = D3DXFindShaderComment(shader_zero, MAKEFOURCC('C','T','A','B'), &data, &size);
369  ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
370  ok(!data, "Got %p, expected NULL\n", data);
371  ok(!size, "Got %u, expected 0\n", size);
372 
373  hr = D3DXFindShaderComment(shader_invalid, MAKEFOURCC('C','T','A','B'), &data, &size);
374  ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
375  ok(!data, "Got %p, expected NULL\n", data);
376  ok(!size, "Got %u, expected 0\n", size);
377 
378  hr = D3DXFindShaderComment(shader_empty, MAKEFOURCC('C','T','A','B'), &data, &size);
379  ok(hr == S_FALSE, "Got result %x, expected %x (S_FALSE)\n", hr, S_FALSE);
380  ok(!data, "Got %p, expected NULL\n", data);
381  ok(!size, "Got %u, expected 0\n", size);
382 
384  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
385  ok(data == simple_fx + 3, "Got result %p, expected %p\n", data, simple_fx + 3);
386  ok(size == 4, "Got result %u, expected 4\n", size);
387 
389  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
390  ok(data == simple_tx + 3, "Got result %p, expected %p\n", data, simple_tx + 3);
391  ok(size == 4, "Got result %u, expected 4\n", size);
392 
394  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
395  ok(data == simple_7ffe + 3, "Got result %p, expected %p\n", data, simple_7ffe + 3);
396  ok(size == 4, "Got result %u, expected 4\n", size);
397 
399  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
400  ok(data == simple_7fff + 3, "Got result %p, expected %p\n", data, simple_7fff + 3);
401  ok(size == 4, "Got result %u, expected 4\n", size);
402 }
403 
405 {
406  ID3DXConstantTable *constant_table;
407  HRESULT hr;
408  void *data;
409  DWORD size;
411 
412  constant_table = (ID3DXConstantTable *)0xdeadbeef;
413  hr = D3DXGetShaderConstantTableEx(NULL, 0, &constant_table);
414  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
415  ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
416 
417  constant_table = (ID3DXConstantTable *)0xdeadbeef;
418  hr = D3DXGetShaderConstantTableEx(shader_zero, 0, &constant_table);
419  ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
420  ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
421 
422  constant_table = (ID3DXConstantTable *)0xdeadbeef;
423  hr = D3DXGetShaderConstantTableEx(shader_invalid, 0, &constant_table);
424  ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
425  ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
426 
427  constant_table = (ID3DXConstantTable *)0xdeadbeef;
428  hr = D3DXGetShaderConstantTableEx(shader_empty, 0, &constant_table);
429  ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
430  ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
431 
432  /* No CTAB data */
433  constant_table = (ID3DXConstantTable *)0xdeadbeef;
434  hr = D3DXGetShaderConstantTableEx(simple_ps, 0, &constant_table);
435  ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
436  ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
437 
438  /* With invalid CTAB data */
440  ok(hr == D3DXERR_INVALIDDATA || broken(hr == D3D_OK), /* winxp 64-bit, w2k3 64-bit */
441  "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
442  if (constant_table) ID3DXConstantTable_Release(constant_table);
443 
444  hr = D3DXGetShaderConstantTableEx(simple_fx, 0, &constant_table);
445  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
446  ok(!constant_table, "D3DXGetShaderConstantTableEx() returned a non-NULL constant table.\n");
447 
448  hr = D3DXGetShaderConstantTableEx(simple_tx, 0, &constant_table);
449  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
450  ok(!constant_table, "D3DXGetShaderConstantTableEx() returned a non-NULL constant table.\n");
451 
452  hr = D3DXGetShaderConstantTableEx(shader_with_ctab, 0, &constant_table);
453  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
454  ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
455 
456  if (constant_table)
457  {
458  size = ID3DXConstantTable_GetBufferSize(constant_table);
459  ok(size == 28, "Got result %x, expected 28\n", size);
460 
461  data = ID3DXConstantTable_GetBufferPointer(constant_table);
462  ok(!memcmp(data, shader_with_ctab + 6, size), "Retrieved wrong CTAB data\n");
463 
464  hr = ID3DXConstantTable_GetDesc(constant_table, NULL);
465  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
466 
467  hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
468  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
469  ok(desc.Creator == (const char *)data + 0x10, "Got result %p, expected %p\n",
470  desc.Creator, (const char *)data + 0x10);
471  ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
472  ok(desc.Constants == 0, "Got result %x, expected 0\n", desc.Constants);
473 
474  ID3DXConstantTable_Release(constant_table);
475  }
476 
478  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
479  ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
480 
481  if (constant_table)
482  {
484  D3DXCONSTANT_DESC constant_desc;
485  D3DXCONSTANT_DESC constant_desc_save;
486  UINT nb;
487 
488  /* Test GetDesc */
489  hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
490  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
491  ok(!strcmp(desc.Creator, "Wine project"), "Got result '%s', expected 'Wine project'\n", desc.Creator);
492  ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
493  ok(desc.Constants == 3, "Got result %x, expected 3\n", desc.Constants);
494 
495  /* Test GetConstant */
496  constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
497  ok(constant != NULL, "No constant found\n");
498  hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
499  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
500  ok(!strcmp(constant_desc.Name, "Constant1"), "Got result '%s', expected 'Constant1'\n",
501  constant_desc.Name);
502  ok(constant_desc.Class == D3DXPC_VECTOR, "Got result %x, expected %u (D3DXPC_VECTOR)\n",
503  constant_desc.Class, D3DXPC_VECTOR);
504  ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
505  constant_desc.Type, D3DXPT_FLOAT);
506  ok(constant_desc.Rows == 1, "Got result %x, expected 1\n", constant_desc.Rows);
507  ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
508 
509  constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 1);
510  ok(constant != NULL, "No constant found\n");
511  hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
512  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
513  ok(!strcmp(constant_desc.Name, "Constant2"), "Got result '%s', expected 'Constant2'\n",
514  constant_desc.Name);
515  ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
516  constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
517  ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
518  constant_desc.Type, D3DXPT_FLOAT);
519  ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
520  ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
521 
522  constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 2);
523  ok(constant != NULL, "No constant found\n");
524  hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
525  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
526  ok(!strcmp(constant_desc.Name, "Constant3"), "Got result '%s', expected 'Constant3'\n",
527  constant_desc.Name);
528  ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
529  constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
530  ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
531  constant_desc.Type, D3DXPT_FLOAT);
532  ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
533  ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
534  constant_desc_save = constant_desc; /* For GetConstantDesc test */
535 
536  constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 3);
537  ok(constant == NULL, "Got result %p, expected NULL\n", constant);
538 
539  /* Test GetConstantByName */
540  constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant unknown");
541  ok(constant == NULL, "Got result %p, expected NULL\n", constant);
542  constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant3");
543  ok(constant != NULL, "No constant found\n");
544  hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
545  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
546  ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
547 
548  /* Test GetConstantDesc */
549  constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
550  ok(constant != NULL, "No constant found\n");
551  hr = ID3DXConstantTable_GetConstantDesc(constant_table, NULL, &constant_desc, &nb);
552  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
553  hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, NULL, &nb);
554  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
555  hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, NULL);
556  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
557  hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant unknown", &constant_desc, &nb);
558  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
559  hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant3", &constant_desc, &nb);
560  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
561  ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
562 
563  ID3DXConstantTable_Release(constant_table);
564  }
565 
566  hr = D3DXGetShaderConstantTableEx(fx_shader_with_ctab, 0, &constant_table);
567  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
568  ok(!constant_table, "D3DXGetShaderConstantTableEx() returned a non-NULL constant table.\n");
569 }
570 
571 static void test_constant_table(const char *test_name, const DWORD *ctable_fn,
572  const D3DXCONSTANT_DESC *expecteds, UINT count)
573 {
574  UINT i;
575  ID3DXConstantTable *ctable;
576 
577  HRESULT res;
578 
579  /* Get the constant table from the shader itself */
580  res = D3DXGetShaderConstantTable(ctable_fn, &ctable);
581  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on %s: got %08x\n", test_name, res);
582 
583  for (i = 0; i < count; i++)
584  {
585  const D3DXCONSTANT_DESC *expected = &expecteds[i];
586  D3DXHANDLE const_handle;
587  D3DXCONSTANT_DESC actual;
588  UINT pCount = 1;
589 
591 
592  res = ID3DXConstantTable_GetConstantDesc(ctable, const_handle, &actual, &pCount);
593  ok(SUCCEEDED(res), "%s in %s: ID3DXConstantTable_GetConstantDesc returned %08x\n", expected->Name,
594  test_name, res);
595  ok(pCount == 1, "%s in %s: Got more or less descriptions: %d\n", expected->Name, test_name, pCount);
596 
597  ok(strcmp(actual.Name, expected->Name) == 0,
598  "%s in %s: Got different names: Got %s, expected %s\n", expected->Name,
599  test_name, actual.Name, expected->Name);
600  ok(actual.RegisterSet == expected->RegisterSet,
601  "%s in %s: Got different register sets: Got %d, expected %d\n",
602  expected->Name, test_name, actual.RegisterSet, expected->RegisterSet);
603  ok(actual.RegisterIndex == expected->RegisterIndex,
604  "%s in %s: Got different register indices: Got %d, expected %d\n",
605  expected->Name, test_name, actual.RegisterIndex, expected->RegisterIndex);
606  ok(actual.RegisterCount == expected->RegisterCount,
607  "%s in %s: Got different register counts: Got %d, expected %d\n",
608  expected->Name, test_name, actual.RegisterCount, expected->RegisterCount);
609  ok(actual.Class == expected->Class,
610  "%s in %s: Got different classes: Got %d, expected %d\n", expected->Name,
611  test_name, actual.Class, expected->Class);
612  ok(actual.Type == expected->Type,
613  "%s in %s: Got different types: Got %d, expected %d\n", expected->Name,
614  test_name, actual.Type, expected->Type);
615  ok(actual.Rows == expected->Rows && actual.Columns == expected->Columns,
616  "%s in %s: Got different dimensions: Got (%d, %d), expected (%d, %d)\n",
617  expected->Name, test_name, actual.Rows, actual.Columns, expected->Rows,
618  expected->Columns);
619  ok(actual.Elements == expected->Elements,
620  "%s in %s: Got different element count: Got %d, expected %d\n",
621  expected->Name, test_name, actual.Elements, expected->Elements);
622  ok(actual.StructMembers == expected->StructMembers,
623  "%s in %s: Got different struct member count: Got %d, expected %d\n",
624  expected->Name, test_name, actual.StructMembers, expected->StructMembers);
625  ok(actual.Bytes == expected->Bytes,
626  "%s in %s: Got different byte count: Got %d, expected %d\n",
627  expected->Name, test_name, actual.Bytes, expected->Bytes);
628 
629  if (!expected->DefaultValue)
630  {
631  ok(actual.DefaultValue == NULL,
632  "%s in %s: Got different default value: expected NULL\n",
633  expected->Name, test_name);
634  }
635  else
636  {
637  ok(actual.DefaultValue != NULL,
638  "%s in %s: Got different default value: expected non-NULL\n",
639  expected->Name, test_name);
640  ok(memcmp(actual.DefaultValue, expected->DefaultValue, expected->Bytes) == 0,
641  "%s in %s: Got different default value\n", expected->Name, test_name);
642  }
643  }
644 
645  /* Finally, release the constant table */
647 }
648 
649 static void test_constant_tables(void)
650 {
663 }
664 
665 static void test_setting_basic_table(IDirect3DDevice9 *device)
666 {
667  static const D3DXMATRIX mvp = {{{
668  0.514f, 0.626f, 0.804f, 0.786f,
669  0.238f, 0.956f, 0.374f, 0.483f,
670  0.109f, 0.586f, 0.900f, 0.255f,
671  0.898f, 0.411f, 0.932f, 0.275f}}};
672  static const D3DXVECTOR4 f4 = {0.350f, 0.526f, 0.925f, 0.021f};
673  static const float f = 0.12543f;
674  static const int i = 321;
675  static const D3DXMATRIX *matrix_pointer[] = {&mvp};
676 
677  ID3DXConstantTable *ctable;
678 
679  HRESULT res;
680  float out[16];
681  ULONG refcnt;
682 
683  /* Get the constant table from the shader itself */
685  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
686 
687  /* Set constants */
689  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable mvp: got 0x%08x\n", res);
690 
692  ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
693 
694  /* Check that setting i again will overwrite the previous value */
696  ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
697 
699  ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f: got 0x%08x\n", res);
700 
702  ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f4: got 0x%08x\n", res);
703 
704  /* Get constants back and validate */
706  ok(out[0] == S(U(mvp))._11 && out[4] == S(U(mvp))._12 && out[8] == S(U(mvp))._13 && out[12] == S(U(mvp))._14,
707  "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
708  out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
709  ok(out[1] == S(U(mvp))._21 && out[5] == S(U(mvp))._22 && out[9] == S(U(mvp))._23 && out[13] == S(U(mvp))._24,
710  "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
711  out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
712  ok(out[2] == S(U(mvp))._31 && out[6] == S(U(mvp))._32 && out[10] == S(U(mvp))._33 && out[14] == S(U(mvp))._34,
713  "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
714  out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
715  ok(out[3] == S(U(mvp))._41 && out[7] == S(U(mvp))._42 && out[11] == S(U(mvp))._43 && out[15] == S(U(mvp))._44,
716  "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
717  out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
718 
720  ok(out[0] == (float)i && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
721  "The variable i was not set correctly, out={%f, %f, %f, %f}, should be {%d, 0.0, 0.0, 0.0}\n",
722  out[0], out[1], out[2], out[3], i);
723 
725  ok(out[0] == f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
726  "The variable f was not set correctly, out={%f, %f, %f, %f}, should be {%f, 0.0, 0.0, 0.0}\n",
727  out[0], out[1], out[2], out[3], f);
728 
730  ok(memcmp(out, &f4, sizeof(f4)) == 0,
731  "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
732  out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
733 
734  /* Finally test using a set* function for one type to set a variable of another type (should succeed) */
736  ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
737 
739  ok(out[0] == f4.x && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
740  "The variable f was not set correctly by ID3DXConstantTable_SetVector, got %f, should be %f\n",
741  out[0], f4.x);
742 
743  memset(out, 0, sizeof(out));
746  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable f: 0x%08x\n", res);
747 
749  ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
750  "The variable f was not set correctly by ID3DXConstantTable_SetMatrix, got %f, should be %f\n",
751  out[0], S(U(mvp))._11);
752 
753  /* Clear registers */
754  memset(out, 0, sizeof(out));
758 
759  /* SetVector shouldn't change the value of a matrix constant */
761  ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
762 
764  ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
765  && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
766  && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
767  && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
768  "The variable mvp was not set correctly by ID3DXConstantTable_SetVector, "
769  "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
770  "should be all 0.0f\n",
771  out[0], out[1], out[2], out[3],
772  out[4], out[5], out[6], out[7],
773  out[8], out[9], out[10], out[11],
774  out[12], out[13], out[14], out[15]);
775 
777  ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable mvp: 0x%08x\n", res);
778 
780  ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
781  && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
782  && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
783  && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
784  "The variable mvp was not set correctly by ID3DXConstantTable_SetFloat, "
785  "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
786  "should be all 0.0f\n",
787  out[0], out[1], out[2], out[3],
788  out[4], out[5], out[6], out[7],
789  out[8], out[9], out[10], out[11],
790  out[12], out[13], out[14], out[15]);
791 
793  ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f4: 0x%08x\n", res);
794 
796  ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
797  "The variable f4 was not set correctly by ID3DXConstantTable_SetFloat, "
798  "got {%f, %f, %f, %f}, should be all 0.0f\n",
799  out[0], out[1], out[2], out[3]);
800 
802  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f: 0x%08x\n", res);
803 
805  ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
806  "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTranspose, got %f, should be %f\n",
807  out[0], S(U(mvp))._11);
808 
810  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f4: 0x%08x\n", res);
811 
813  ok(out[0] == S(U(mvp))._11 && out[1] == S(U(mvp))._21 && out[2] == S(U(mvp))._31 && out[3] == S(U(mvp))._41,
814  "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTranspose, "
815  "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
816  out[0], out[1], out[2], out[3],
817  S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
818 
819  memset(out, 0, sizeof(out));
821  res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f", matrix_pointer, 1);
822  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f: got %#x\n", res);
823 
825  ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
826  "The variable f was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
827  "got %f, should be %f\n",
828  out[0], S(U(mvp))._11);
829 
830  res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f4", matrix_pointer, 1);
831  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f4: got %#x\n", res);
832 
834  ok(out[0] == S(U(mvp))._11 && out[1] == S(U(mvp))._12 && out[2] == S(U(mvp))._13 && out[3] == S(U(mvp))._14,
835  "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
836  "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
837  out[0], out[1], out[2], out[3],
838  S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
839 
840  memset(out, 0, sizeof(out));
843  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f: got %#x\n", res);
844 
846  ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
847  "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
848  "got %f, should be %f\n",
849  out[0], S(U(mvp))._11);
850 
852  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f4: got %#x\n", res);
853 
855  ok(out[0] == S(U(mvp))._11 && out[1] == S(U(mvp))._21 && out[2] == S(U(mvp))._31 && out[3] == S(U(mvp))._41,
856  "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
857  "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
858  out[0], out[1], out[2], out[3],
859  S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
860 
862  ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
863 }
864 
865 static void test_setting_matrices_table(IDirect3DDevice9 *device)
866 {
867  static const D3DXMATRIX fmatrix =
868  {{{2.001f, 1.502f, 9.003f, 1.004f,
869  5.005f, 3.006f, 3.007f, 6.008f,
870  9.009f, 5.010f, 7.011f, 1.012f,
871  5.013f, 5.014f, 5.015f, 9.016f}}};
872  static const D3DXMATRIX *matrix_pointer[] = {&fmatrix};
873 
874  ID3DXConstantTable *ctable;
875 
876  HRESULT res;
877  float out[32];
878 
880  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
881 
882  res = ID3DXConstantTable_SetMatrix(ctable, device, "imatrix2x3", &fmatrix);
883  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable imatrix2x3: got %#x\n", res);
884 
885  res = ID3DXConstantTable_SetMatrix(ctable, device, "fmatrix3x1", &fmatrix);
886  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix3x1: got %#x\n", res);
887 
889  ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
890  && out[3] == 0
891  && out[4] == (int)S(U(fmatrix))._21 && out[5] == (int)S(U(fmatrix))._22 && out[6] == (int)S(U(fmatrix))._23
892  && out[7] == 0,
893  "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
894  "should be {%d, %d, %d, %d; %d, %d, %d, %d}\n",
895  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
896  (int)S(U(fmatrix))._11, (int)S(U(fmatrix))._12, (int)S(U(fmatrix))._13, 0,
897  (int)S(U(fmatrix))._21, (int)S(U(fmatrix))._22, (int)S(U(fmatrix))._23, 0);
898 
900  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f,
901  "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
902  out[0], out[1], out[2], out[3],
903  S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f);
904 
906 
908  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
909 
910  /* SetMatrix */
911  res = ID3DXConstantTable_SetMatrix(ctable, device, "c2x3", &fmatrix);
912  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c2x3: got %#x\n", res);
913 
914  res = ID3DXConstantTable_SetMatrix(ctable, device, "r2x3", &fmatrix);
915  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r2x3: got %#x\n", res);
916 
917  res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x2", &fmatrix);
918  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x2: got %#x\n", res);
919 
920  res = ID3DXConstantTable_SetMatrix(ctable, device, "r3x2", &fmatrix);
921  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r3x2: got %#x\n", res);
922 
923  res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x3", &fmatrix);
924  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x3: got %#x\n", res);
925 
927  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
928  && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
929  && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
930  "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
931  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
932  out[0], out[1], out[2], out[3],
933  out[4], out[5], out[6], out[7],
934  out[8], out[9], out[10], out[11],
935  S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
936  S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
937  S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
938 
939  res = ID3DXConstantTable_SetMatrix(ctable, device, "r4x4", &fmatrix);
940  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r4x4: got %#x\n", res);
941 
943  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
944  && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
945  "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
946  "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
947  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
948  S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
949  S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
950 
952  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
953  && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
954  "The variable c3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
955  "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
956  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
957  S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
958  S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
959 
961  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
962  && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
963  && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
964  "The variable r3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
965  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
966  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
967  S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
968  S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
969  S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
970 
972  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
973  && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f
974  && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == S(U(fmatrix))._33 && out[11] == 0.0f,
975  "The variable c3x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
976  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
977  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
978  S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
979  S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f,
980  S(U(fmatrix))._13, S(U(fmatrix))._23, S(U(fmatrix))._33, 0.0f);
981 
983  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == S(U(fmatrix))._14
984  && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == S(U(fmatrix))._24
985  && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == S(U(fmatrix))._33 && out[11] == S(U(fmatrix))._34
986  && out[12] == S(U(fmatrix))._41 && out[13] == S(U(fmatrix))._42 && out[14] == S(U(fmatrix))._43 && out[15] == S(U(fmatrix))._44,
987  "The variable r4x4 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
988  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
989  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
990  out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
991  S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, S(U(fmatrix))._14,
992  S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, S(U(fmatrix))._24,
993  S(U(fmatrix))._31, S(U(fmatrix))._32, S(U(fmatrix))._33, S(U(fmatrix))._34,
994  S(U(fmatrix))._41, S(U(fmatrix))._42, S(U(fmatrix))._43, S(U(fmatrix))._44);
995 
996  /* SetMatrixTranspose */
998  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable c2x3: got %#x\n", res);
999 
1001  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable r2x3: got %#x\n", res);
1002 
1004  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
1005  && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
1006  && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
1007  "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1008  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1009  out[0], out[1], out[2], out[3],
1010  out[4], out[5], out[6], out[7],
1011  out[8], out[9], out[10], out[11],
1012  S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
1013  S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
1014  S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
1015 
1017  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
1018  && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
1019  "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
1020  "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1021  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1022  S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
1023  S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
1024 
1025  /* SetMatrixPointerArray */
1026  res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "c2x3", matrix_pointer, 1);
1027  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable c2x3: got %#x\n", res);
1028 
1029  res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "r2x3", matrix_pointer, 1);
1030  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable r2x3: got %#x\n", res);
1031 
1033  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
1034  && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
1035  && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
1036  "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1037  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1038  out[0], out[1], out[2], out[3],
1039  out[4], out[5], out[6], out[7],
1040  out[8], out[9], out[10], out[11],
1041  S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
1042  S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
1043  S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
1044 
1046  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
1047  && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
1048  "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
1049  "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1050  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1051  S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
1052  S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
1053 
1054  /* SetMatrixTransposePointerArray */
1055  res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "c2x3", matrix_pointer, 1);
1056  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable c2x3: got %#x\n", res);
1057 
1058  res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "r2x3", matrix_pointer, 1);
1059  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable r2x3: got %#x\n", res);
1060 
1062  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
1063  && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
1064  && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
1065  "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1066  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1067  out[0], out[1], out[2], out[3],
1068  out[4], out[5], out[6], out[7],
1069  out[8], out[9], out[10], out[11],
1070  S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
1071  S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
1072  S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
1073 
1075  ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
1076  && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
1077  "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
1078  "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1079  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1080  S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
1081  S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
1082 
1084 }
1085 
1086 static void test_setting_arrays_table(IDirect3DDevice9 *device)
1087 {
1088  static const float farray[8] = {
1089  0.005f, 0.745f, 0.973f, 0.264f,
1090  0.010f, 0.020f, 0.030f, 0.040f};
1091  static const D3DXMATRIX fmtxarray[2] = {
1092  {{{0.001f, 0.002f, 0.003f, 0.004f,
1093  0.005f, 0.006f, 0.007f, 0.008f,
1094  0.009f, 0.010f, 0.011f, 0.012f,
1095  0.013f, 0.014f, 0.015f, 0.016f}}},
1096  {{{0.010f, 0.020f, 0.030f, 0.040f,
1097  0.050f, 0.060f, 0.070f, 0.080f,
1098  0.090f, 0.100f, 0.110f, 0.120f,
1099  0.130f, 0.140f, 0.150f, 0.160f}}}};
1100  static const int iarray[4] = {1, 2, 3, 4};
1101  static const D3DXVECTOR4 fvecarray[2] = {
1102  {0.745f, 0.997f, 0.353f, 0.237f},
1103  {0.060f, 0.455f, 0.333f, 0.983f}};
1104  static BOOL barray[4] = {FALSE, 100, TRUE, TRUE};
1105 
1106  ID3DXConstantTable *ctable;
1107 
1108  HRESULT res;
1109  float out[32];
1110  ULONG refcnt;
1111 
1112  /* Clear registers */
1113  memset(out, 0, sizeof(out));
1116 
1117  /* Get the constant table from the shader */
1119  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
1120 
1121  /* Set constants */
1122 
1123  /* Make sure that we cannot set registers that do not belong to this constant */
1124  res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 8);
1125  ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got 0x%08x\n", res);
1126 
1128  ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1129  "The in-bounds elements of the array were not set, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1130  out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1131  ok(out[16] == 0.0f && out[20] == 0.0f && out[24] == 0.0f && out[28] == 0.0f,
1132  "The excess elements of the array were set, out={%f, %f, %f, %f}, should be all 0.0f\n",
1133  out[16], out[20], out[24], out[28]);
1134 
1135  /* ivecarray takes up only 1 register, but a matrix takes up 4, so no elements should be set */
1136  res = ID3DXConstantTable_SetMatrix(ctable, device, "ivecarray", &fmtxarray[0]);
1137  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got 0x%08x\n", res);
1138 
1140  ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
1141  "The array was set, out={%f, %f, %f, %f}, should be all 0.0f\n", out[0], out[1], out[2], out[3]);
1142 
1143  /* Try setting an integer array to an array declared as a float array */
1144  res = ID3DXConstantTable_SetIntArray(ctable, device, "farray", iarray, 4);
1145  ok(res == D3D_OK, "ID3DXConstantTable_SetIntArray failed: got 0x%08x\n", res);
1146 
1148  ok(out[0] == iarray[0] && out[4] == iarray[1] && out[8] == iarray[2] && out[12] == iarray[3],
1149  "SetIntArray did not properly set a float array: out={%f, %f, %f, %f}, should be {%d, %d, %d, %d}\n",
1150  out[0], out[4], out[8], out[12], iarray[0], iarray[1], iarray[2], iarray[3]);
1151 
1152  res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 4);
1153  ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got x0%08x\n", res);
1154 
1155  res = ID3DXConstantTable_SetVectorArray(ctable, device, "fvecarray", fvecarray, 2);
1156  ok(res == D3D_OK, "ID3DXConstantTable_SetVectorArray failed: got 0x%08x\n", res);
1157 
1158  res = ID3DXConstantTable_SetMatrixArray(ctable, device, "fmtxarray", fmtxarray, 2);
1159  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixArray failed: got 0x%08x\n", res);
1160 
1161  res = ID3DXConstantTable_SetBoolArray(ctable, device, "barray", barray, 2);
1162  ok(res == D3D_OK, "ID3DXConstantTable_SetBoolArray failed: got 0x%08x\n", res);
1163 
1164  /* Read back constants */
1166  ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1167  "The variable farray was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1168  out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1169 
1171  ok(out[0] == fvecarray[0].x && out[1] == fvecarray[0].y && out[2] == fvecarray[0].z && out[3] == fvecarray[0].w &&
1172  out[4] == fvecarray[1].x && out[5] == fvecarray[1].y && out[6] == fvecarray[1].z && out[7] == fvecarray[1].w,
1173  "The variable fvecarray was not set correctly, out={{%f, %f, %f, %f}, {%f, %f, %f, %f}}, should be "
1174  "{{%f, %f, %f, %f}, {%f, %f, %f, %f}}\n", out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1175  fvecarray[0].x, fvecarray[0].y, fvecarray[0].z, fvecarray[0].w, fvecarray[1].x, fvecarray[1].y,
1176  fvecarray[1].z, fvecarray[1].w);
1177 
1179  ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1180  && out[4] == 1.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1181  "The variable barray was not set correctly, out={%f, %f %f, %f; %f, %f, %f, %f}, should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1182  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1183  0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);
1184 
1186  /* Just check a few elements in each matrix to make sure fmtxarray was set row-major */
1187  ok(out[0] == S(U(fmtxarray[0]))._11 && out[1] == S(U(fmtxarray[0]))._12 && out[2] == S(U(fmtxarray[0]))._13 && out[3] == S(U(fmtxarray[0]))._14,
1188  "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1189  out[0], out[1], out[2], out[3], S(U(fmtxarray[0]))._11, S(U(fmtxarray[0]))._12, S(U(fmtxarray[0]))._13, S(U(fmtxarray[0]))._14);
1190  ok(out[16] == S(U(fmtxarray[1]))._11 && out[17] == S(U(fmtxarray[1]))._12 && out[18] == S(U(fmtxarray[1]))._13 && out[19] == S(U(fmtxarray[1]))._14,
1191  "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1192  out[16], out[17], out[18], out[19], S(U(fmtxarray[1]))._11, S(U(fmtxarray[1]))._12, S(U(fmtxarray[1]))._13, S(U(fmtxarray[1]))._14);
1193 
1195  ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
1196 }
1197 
1198 static void test_SetDefaults(IDirect3DDevice9 *device)
1199 {
1200  static const D3DXMATRIX mvp = {{{
1201  0.51f, 0.62f, 0.80f, 0.78f,
1202  0.23f, 0.95f, 0.37f, 0.48f,
1203  0.10f, 0.58f, 0.90f, 0.25f,
1204  0.89f, 0.41f, 0.93f, 0.27f}}};
1205  static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1206 
1207  float out[16];
1208 
1209  HRESULT res;
1210  ID3DXConstantTable *ctable;
1211 
1213  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1214 
1216  ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed: got %08x\n", res);
1217 
1218  res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
1219  ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got %08x\n", res);
1220 
1222  ok(res == D3D_OK, "ID3dXConstantTable_SetDefaults failed: got %08x\n", res);
1223 
1224  /* SetDefaults doesn't change constants without default values */
1226  ok(out[0] == S(U(mvp))._11 && out[4] == S(U(mvp))._12 && out[8] == S(U(mvp))._13 && out[12] == S(U(mvp))._14,
1227  "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1228  out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1229  ok(out[1] == S(U(mvp))._21 && out[5] == S(U(mvp))._22 && out[9] == S(U(mvp))._23 && out[13] == S(U(mvp))._24,
1230  "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1231  out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1232  ok(out[2] == S(U(mvp))._31 && out[6] == S(U(mvp))._32 && out[10] == S(U(mvp))._33 && out[14] == S(U(mvp))._34,
1233  "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1234  out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1235  ok(out[3] == S(U(mvp))._41 && out[7] == S(U(mvp))._42 && out[11] == S(U(mvp))._43 && out[15] == S(U(mvp))._44,
1236  "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1237  out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1238 
1240  ok(memcmp(out, &f4, sizeof(f4)) == 0,
1241  "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1242  out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1243 
1245 
1247  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1248 
1250  ok(res == D3D_OK, "ID3DXConstantTable_SetDefaults failed: got %08x\n", res);
1251 
1254  "The variable mat4 was not set correctly to default value\n");
1255 
1258  "The variable mat3 was not set correctly to default value\n");
1259 
1262  "The variable array was not set correctly to default value\n");
1263 
1266  "The variable vec4 was not set correctly to default value\n");
1267 
1270  "The variable flt was not set correctly to default value\n");
1271 
1273 }
1274 
1275 static void test_SetValue(IDirect3DDevice9 *device)
1276 {
1277  static const D3DXMATRIX mvp = {{{
1278  0.51f, 0.62f, 0.80f, 0.78f,
1279  0.23f, 0.95f, 0.37f, 0.48f,
1280  0.10f, 0.58f, 0.90f, 0.25f,
1281  0.89f, 0.41f, 0.93f, 0.27f}}};
1282  static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1283  static const FLOAT arr[] = {0.33f, 0.55f, 0.96f, 1.00f,
1284  1.00f, 1.00f, 1.00f, 1.00f,
1285  1.00f, 1.00f, 1.00f, 1.00f};
1286  static int imatrix[] = {1, 2, 3, 4, 5, 6};
1287  static float fmatrix[] = {1.1f, 2.2f, 3.3f, 4.4f};
1288  static BOOL barray[] = {TRUE, FALSE};
1289  static float fvecarray[] = {9.1f, 9.2f, 9.3f, 9.4f, 9.5f, 9.6f, 9.7f, 9.8f};
1290  static float farray[] = {2.2f, 3.3f};
1291 
1292  static const float def[16] = {5.5f, 5.5f, 5.5f, 5.5f,
1293  5.5f, 5.5f, 5.5f, 5.5f,
1294  5.5f, 5.5f, 5.5f, 5.5f,
1295  5.5f, 5.5f, 5.5f, 5.5f};
1296  float out[16];
1297 
1298  HRESULT res;
1299  ID3DXConstantTable *ctable;
1300 
1302  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1303 
1305 
1306  /* SetValue called with 0 bytes size doesn't change value */
1308  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1309 
1311  ok(memcmp(out, def, sizeof(f4)) == 0,
1312  "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1313  out[0], out[1], out[2], out[3], def[0], def[1], def[2], def[3]);
1314 
1315  res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, sizeof(f4));
1316  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1317 
1319  ok(memcmp(out, &f4, sizeof(f4)) == 0,
1320  "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1321  out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1322 
1324 
1325  /* SetValue called with size smaller than constant size doesn't change value */
1326  res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp) / 2);
1327  ok(res == D3D_OK, "ID3DXConstantTable_SetValue returned %08x\n", res);
1328 
1330  ok(memcmp(out, def, sizeof(def)) == 0,
1331  "The variable mvp was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1332  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1333  out[0], out[4], out[ 8], out[12],
1334  out[1], out[5], out[ 9], out[13],
1335  out[2], out[6], out[10], out[14],
1336  out[3], out[7], out[11], out[15],
1337  def[0], def[4], def[ 8], def[12],
1338  def[1], def[5], def[ 9], def[13],
1339  def[2], def[6], def[10], def[14],
1340  def[3], def[7], def[11], def[15]);
1341 
1342  res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp));
1343  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1344 
1346  ok(out[0] == S(U(mvp))._11 && out[4] == S(U(mvp))._12 && out[8] == S(U(mvp))._13 && out[12] == S(U(mvp))._14,
1347  "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1348  out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1349  ok(out[1] == S(U(mvp))._21 && out[5] == S(U(mvp))._22 && out[9] == S(U(mvp))._23 && out[13] == S(U(mvp))._24,
1350  "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1351  out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1352  ok(out[2] == S(U(mvp))._31 && out[6] == S(U(mvp))._32 && out[10] == S(U(mvp))._33 && out[14] == S(U(mvp))._34,
1353  "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1354  out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1355  ok(out[3] == S(U(mvp))._41 && out[7] == S(U(mvp))._42 && out[11] == S(U(mvp))._43 && out[15] == S(U(mvp))._44,
1356  "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1357  out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1358 
1360 
1362  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1363 
1364  res = ID3DXConstantTable_SetValue(ctable, device, "arr", arr, sizeof(arr));
1365  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1366 
1368  ok(out[0] == arr[0] && out[4] == arr[1] && out[8] == arr[2]
1369  && out[1] == 0 && out[2] == 0 && out[3] == 0 && out[5] == 0 && out[6] == 0 && out[7] == 0
1370  && out[9] == 0 && out[10] == 0 && out[11] == 0,
1371  "The variable arr was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f}, "
1372  "should be {0.33, 0, 0, 0, 0.55, 0, 0, 0, 0.96, 0, 0, 0}\n",
1373  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11]);
1374 
1376 
1378  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1379 
1380  res = ID3DXConstantTable_SetValue(ctable, device, "fmatrix3x1", fmatrix, sizeof(fmatrix));
1381  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1382 
1383  res = ID3DXConstantTable_SetValue(ctable, device, "imatrix2x3", imatrix, sizeof(imatrix));
1384  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1385 
1387  ok(out[0] == imatrix[0] && out[1] == imatrix[1] && out[2] == imatrix[2] && out[3] == 0.0f
1388  && out[4] == imatrix[3] && out[5] == imatrix[4] && out[6] == imatrix[5] && out[7] == 0.0f,
1389  "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1390  "should be {%d, %d, %d, 0, %d, %d, %d, 0}\n",
1391  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1392  imatrix[0], imatrix[1], imatrix[2], imatrix[3], imatrix[4], imatrix[5]);
1393 
1395  ok(out[0] == fmatrix[0] && out[1] == fmatrix[1] && out[2] == fmatrix[2] && out[3] == 0.0f,
1396  "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1397  out[0], out[1] ,out[2], out[4],
1398  fmatrix[0], fmatrix[1], fmatrix[2], 0.0f);
1399 
1401 
1403  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1404 
1405  res = ID3DXConstantTable_SetValue(ctable, device, "barray", barray, sizeof(barray));
1406  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1407 
1408  res = ID3DXConstantTable_SetValue(ctable, device, "fvecarray", fvecarray, sizeof(fvecarray));
1409  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1410 
1412  res = ID3DXConstantTable_SetValue(ctable, device, "farray", farray, sizeof(farray));
1413  ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1414 
1415  /* 2 elements of farray were set */
1417  ok(out[0] == farray[0] && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1418  && out[4] == farray[1] && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
1419  && out[8] == def[8] && out[9] == def[9] && out[10] == def[10] && out[11] == def[11]
1420  && out[12] == def[12] && out[13] == def[13] && out[14] == def[14] && out[15] == def[15],
1421  "The variable farray was not set correctly, should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1422  "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1423  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1424  out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
1425  farray[0], 0.0f, 0.0f, 0.0f,
1426  farray[1], 0.0f, 0.0f, 0.0f,
1427  def[8], def[9], def[10], def[11],
1428  def[12], def[13], def[14], def[15]);
1429 
1431  ok(out[0] == fvecarray[0] && out[1] == fvecarray[1] && out[2] == fvecarray[2] && out[3] == fvecarray[3]
1432  && out[4] == fvecarray[4] && out[5] == fvecarray[5] && out[6] == fvecarray[6] && out[7] == fvecarray[7],
1433  "The variable fvecarray was not set correctly, out ={%f, %f, %f, %f, %f, %f, %f, %f}, "
1434  "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1435  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1436  fvecarray[0], fvecarray[1], fvecarray[2], fvecarray[3], fvecarray[4], fvecarray[5], fvecarray[6], fvecarray[7]);
1437 
1439  ok(out[0] == 1.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1440  && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1441  "The variable barray was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1442  "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1443  out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1444  1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
1445 
1447 }
1448 
1449 static void test_setting_constants(void)
1450 {
1451  HWND wnd;
1452  IDirect3D9 *d3d;
1453  IDirect3DDevice9 *device;
1454  D3DPRESENT_PARAMETERS d3dpp;
1455  HRESULT hr;
1456  ULONG refcnt;
1457 
1458  if (!(wnd = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0,
1459  640, 480, NULL, NULL, NULL, NULL)))
1460  {
1461  skip("Couldn't create application window\n");
1462  return;
1463  }
1464  if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION)))
1465  {
1466  skip("Couldn't create IDirect3D9 object\n");
1467  DestroyWindow(wnd);
1468  return;
1469  }
1470 
1471  ZeroMemory(&d3dpp, sizeof(d3dpp));
1472  d3dpp.Windowed = TRUE;
1475  if (FAILED(hr))
1476  {
1477  skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1478  IDirect3D9_Release(d3d);
1479  DestroyWindow(wnd);
1480  return;
1481  }
1482 
1488 
1489  /* Release resources */
1490  refcnt = IDirect3DDevice9_Release(device);
1491  ok(refcnt == 0, "The Direct3D device reference count was %u, should be 0\n", refcnt);
1492 
1493  refcnt = IDirect3D9_Release(d3d);
1494  ok(refcnt == 0, "The Direct3D object referenct count was %u, should be 0\n", refcnt);
1495 
1496  if (wnd) DestroyWindow(wnd);
1497 }
1498 
1499 static void test_get_sampler_index(void)
1500 {
1501  ID3DXConstantTable *ctable;
1502 
1503  HRESULT res;
1504  UINT index;
1505 
1506  ULONG refcnt;
1507 
1509  ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on ctab_samplers: got %08x\n", res);
1510 
1512  ok(index == 0, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 0\n", index);
1513 
1515  ok(index == 3, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 3\n", index);
1516 
1518  ok(index == -1, "ID3DXConstantTable_GetSamplerIndex found nonexistent sampler: Got %d\n",
1519  index);
1520 
1522  ok(index == -1, "ID3DXConstantTable_GetSamplerIndex succeeded on non-sampler constant: Got %d\n",
1523  index);
1524 
1526  ok(refcnt == 0, "The ID3DXConstantTable reference count was %u, should be 0\n", refcnt);
1527 }
1528 
1529 /*
1530  * fxc.exe /Tps_3_0
1531  */
1532 #if 0
1533 sampler s;
1534 sampler1D s1D;
1535 sampler2D s2D;
1536 sampler3D s3D;
1537 samplerCUBE scube;
1538 float4 init;
1539 float4 main(float3 tex : TEXCOORD0) : COLOR
1540 {
1541  float4 tmp = init;
1542  tmp = tmp + tex1D(s1D, tex.x);
1543  tmp = tmp + tex1D(s1D, tex.y);
1544  tmp = tmp + tex3D(s3D, tex.xyz);
1545  tmp = tmp + tex1D(s, tex.x);
1546  tmp = tmp + tex2D(s2D, tex.xy);
1547  tmp = tmp + texCUBE(scube, tex.xyz);
1548  return tmp;
1549 }
1550 #endif
1552 {
1553  0xffff0300, /* ps_3_0 */
1554  0x0054fffe, FCC_CTAB, /* CTAB comment */
1555  0x0000001c, 0x0000011b, 0xffff0300, 0x00000006, 0x0000001c, 0x00000100, /* Header */
1556  0x00000114,
1557  0x00000094, 0x00000002, 0x00000001, 0x0000009c, 0x00000000, /* Constant 1 desc (init) */
1558  0x000000ac, 0x00040003, 0x00000001, 0x000000b0, 0x00000000, /* Constant 2 desc (s) */
1559  0x000000c0, 0x00000003, 0x00000001, 0x000000c4, 0x00000000, /* Constant 3 desc (s1D) */
1560  0x000000d4, 0x00010003, 0x00000001, 0x000000d8, 0x00000000, /* Constant 4 desc (s2D) */
1561  0x000000e8, 0x00030003, 0x00000001, 0x000000ec, 0x00000000, /* Constant 5 desc (s3D) */
1562  0x000000fc, 0x00020003, 0x00000001, 0x00000104, 0x00000000, /* Constant 6 desc (scube) */
1563  0x74696e69, 0xababab00, /* Constant 1 name */
1564  0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
1565  0xabab0073, /* Constant 2 name */
1566  0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 2 type desc */
1567  0x00443173, /* Constant 3 name */
1568  0x000b0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 type desc */
1569  0x00443273, /* Constant 4 name */
1570  0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 4 type desc */
1571  0x00443373, /* Constant 5 name */
1572  0x000d0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 5 type desc */
1573  0x62756373, 0xabab0065, /* Constant 6 name */
1574  0x000e0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 6 type desc */
1575  0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, /* Target/Creator name string */
1576  0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
1577  0x332e3235, 0x00313131,
1578  0x0200001f, 0x80000005, 0x90070000, 0x0200001f, 0x90000000, 0xa00f0800, /* shader */
1579  0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f, 0x98000000, 0xa00f0802,
1580  0x0200001f, 0xa0000000, 0xa00f0803, 0x0200001f, 0x90000000, 0xa00f0804,
1581  0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000,
1582  0x80e40000, 0xa0e40000, 0x03000042, 0x800f0001, 0x90550000, 0xa0e40800,
1583  0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1584  0x90e40000, 0xa0e40803, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001,
1585  0x03000042, 0x800f0001, 0x90e40000, 0xa0e40804, 0x03000002, 0x800f0000,
1586  0x80e40000, 0x80e40001, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801,
1587  0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1588  0x90e40000, 0xa0e40802, 0x03000002, 0x800f0800, 0x80e40000, 0x80e40001,
1589  0x0000ffff, /* END */
1590 };
1591 
1592 static void test_get_shader_samplers(void)
1593 {
1594  const char *samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
1595  const char *sampler_orig;
1596  UINT count = 2;
1597  HRESULT hr;
1598 
1599 if (0)
1600 {
1601  /* crashes if bytecode is NULL */
1603  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1604 }
1605 
1607  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1608 
1609  samplers[5] = "dummy";
1610 
1612  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1613 
1614  /* check that sampler points to shader blob */
1615  sampler_orig = (const char *)&get_shader_samplers_blob[0x2e];
1616  ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1617 
1618  sampler_orig = (const char *)&get_shader_samplers_blob[0x33];
1619  ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1620 
1621  sampler_orig = (const char *)&get_shader_samplers_blob[0x38];
1622  ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1623 
1624  sampler_orig = (const char *)&get_shader_samplers_blob[0x3d];
1625  ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1626 
1627  sampler_orig = (const char *)&get_shader_samplers_blob[0x42];
1628  ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1629 
1630  ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1631 
1632  /* reset samplers */
1633  memset(samplers, 0, sizeof(samplers));
1634  samplers[5] = "dummy";
1635 
1637  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1638  ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1639 
1641  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1642  ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1643 
1644  /* check that sampler points to shader blob */
1645  sampler_orig = (const char *)&get_shader_samplers_blob[0x2e];
1646  ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1647 
1648  sampler_orig = (const char *)&get_shader_samplers_blob[0x33];
1649  ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1650 
1651  sampler_orig = (const char *)&get_shader_samplers_blob[0x38];
1652  ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1653 
1654  sampler_orig = (const char *)&get_shader_samplers_blob[0x3d];
1655  ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1656 
1657  sampler_orig = (const char *)&get_shader_samplers_blob[0x42];
1658  ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1659 
1660  ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1661 
1662  /* check without ctab */
1664  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1665  ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1666 
1667  /* check invalid ctab */
1669  ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1670  ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1671 }
1672 
1673 /*
1674  * fxc.exe /Tvs_3_0
1675  */
1676 #if 0
1677 float f = {1.1f}, f_2[2] = {2.1f, 2.2f};
1678 struct {float f; int i;} s = {3.1f, 31},
1679 s_2[2] = {{4.1f, 41}, {4.2f, 42}},
1680 s_3[3] = {{5.1f, 51}, {5.2f, 52}, {5.3f, 53}};
1681 struct {int i1; int i2; float2 f_2; row_major float3x1 r[2];}
1682 p[2] = {{11, 12, {13.1, 14.1}, {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}}},
1683  {15, 16, {17.1, 18.1}, {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}}}};
1684 int i[1] = {6};
1685 float2x3 f23[2] = {{0.11, 0.21, 0.31, 0.41, 0.51, 0.61}, {0.12, 0.22, 0.32, 0.42, 0.52, 0.62}};
1686 float3x2 f32[2] = {{1.11, 1.21, 1.31, 1.41, 1.51, 1.61}, {1.12, 1.22, 1.32, 1.42, 1.52, 1.62}};
1687 float3 v[2] = {{2.11, 2.21, 2.31}, {2.41, 2.51, 2.61}};
1688 row_major float3x1 r31[2] = {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}};
1689 row_major float1x3 r13[2] = {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}};
1690 float4 main(float4 pos : POSITION) : POSITION
1691 {
1692  float4 tmp = 0.0f;
1693  tmp.zyw = v[1] + r13[1] + r31[1] + p[1].r[1];
1694  tmp.x += f * f_2[1] * pos.x * p[1].f_2.y;
1695  tmp.y += s.f * pos.y * s_2[0].i;
1696  tmp.z += s_3[0].f * pos.z * s_3[2].f * i[0] * f23[1]._11 * f32[1]._32;
1697  return tmp;
1698 }
1699 #endif
1701 {
1702 0xfffe0300, 0x0185fffe, 0x42415443, 0x0000001c, 0x000005df, 0xfffe0300, 0x0000000c, 0x0000001c,
1703 0x00000100, 0x000005d8, 0x0000010c, 0x002d0002, 0x00000001, 0x00000110, 0x00000120, 0x00000130,
1704 0x001d0002, 0x00000004, 0x00000134, 0x00000144, 0x000001a4, 0x00210002, 0x00000004, 0x000001a8,
1705 0x000001b8, 0x000001f8, 0x00250002, 0x00000002, 0x000001fc, 0x0000020c, 0x0000022c, 0x002f0002,
1706 0x00000001, 0x00000230, 0x00000240, 0x00000250, 0x00000002, 0x00000012, 0x000002b0, 0x000002c0,
1707 0x000003e0, 0x002b0002, 0x00000002, 0x000003e4, 0x000003f4, 0x00000414, 0x00120002, 0x00000006,
1708 0x00000418, 0x00000428, 0x00000488, 0x002e0002, 0x00000001, 0x000004ac, 0x000004bc, 0x000004dc,
1709 0x00270002, 0x00000002, 0x000004e0, 0x000004f0, 0x00000530, 0x00180002, 0x00000005, 0x00000534,
1710 0x00000544, 0x000005a4, 0x00290002, 0x00000002, 0x000005a8, 0x000005b8, 0xabab0066, 0x00030000,
1711 0x00010001, 0x00000001, 0x00000000, 0x3f8ccccd, 0x00000000, 0x00000000, 0x00000000, 0x00333266,
1712 0x00030003, 0x00030002, 0x00000002, 0x00000000, 0x3de147ae, 0x3ed1eb85, 0x00000000, 0x00000000,
1713 0x3e570a3d, 0x3f028f5c, 0x00000000, 0x00000000, 0x3e9eb852, 0x3f1c28f6, 0x00000000, 0x00000000,
1714 0x3df5c28f, 0x3ed70a3d, 0x00000000, 0x00000000, 0x3e6147ae, 0x3f051eb8, 0x00000000, 0x00000000,
1715 0x3ea3d70a, 0x3f1eb852, 0x00000000, 0x00000000, 0x00323366, 0x00030003, 0x00020003, 0x00000002,
1716 0x00000000, 0x3f8e147b, 0x3fa7ae14, 0x3fc147ae, 0x00000000, 0x3f9ae148, 0x3fb47ae1, 0x3fce147b,
1717 0x00000000, 0x3f8f5c29, 0x3fa8f5c3, 0x3fc28f5c, 0x00000000, 0x3f9c28f6, 0x3fb5c28f, 0x3fcf5c29,
1718 0x00000000, 0x00325f66, 0x00030000, 0x00010001, 0x00000002, 0x00000000, 0x40066666, 0x00000000,
1719 0x00000000, 0x00000000, 0x400ccccd, 0x00000000, 0x00000000, 0x00000000, 0xabab0069, 0x00020000,
1720 0x00010001, 0x00000001, 0x00000000, 0x40c00000, 0x00000000, 0x00000000, 0x00000000, 0x31690070,
1721 0xababab00, 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0xab003269, 0x00030001, 0x00020001,
1722 0x00000001, 0x00000000, 0xabab0072, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x00000252,
1723 0x00000258, 0x00000268, 0x00000258, 0x000001f8, 0x0000026c, 0x0000027c, 0x00000280, 0x00000005,
1724 0x000a0001, 0x00040002, 0x00000290, 0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x41400000,
1725 0x00000000, 0x00000000, 0x00000000, 0x4151999a, 0x4161999a, 0x00000000, 0x00000000, 0x40470a3d,
1726 0x00000000, 0x00000000, 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a,
1727 0x00000000, 0x00000000, 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7,
1728 0x00000000, 0x00000000, 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0x41700000,
1729 0x00000000, 0x00000000, 0x00000000, 0x41800000, 0x00000000, 0x00000000, 0x00000000, 0x4188cccd,
1730 0x4190cccd, 0x00000000, 0x00000000, 0x4083851f, 0x00000000, 0x00000000, 0x00000000, 0x4086b852,
1731 0x00000000, 0x00000000, 0x00000000, 0x4089eb85, 0x00000000, 0x00000000, 0x00000000, 0x408d1eb8,
1732 0x00000000, 0x00000000, 0x00000000, 0x409051ec, 0x00000000, 0x00000000, 0x00000000, 0x4093851f,
1733 0x00000000, 0x00000000, 0x00000000, 0x00333172, 0x00030002, 0x00030001, 0x00000002, 0x00000000,
1734 0x4083851f, 0x4086b852, 0x4089eb85, 0x00000000, 0x408d1eb8, 0x409051ec, 0x4093851f, 0x00000000,
1735 0x00313372, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x40470a3d, 0x00000000, 0x00000000,
1736 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a, 0x00000000, 0x00000000,
1737 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7, 0x00000000, 0x00000000,
1738 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0xabab0073, 0x00030000, 0x00010001,
1739 0x00000001, 0x00000000, 0x0000010c, 0x0000048c, 0x0000022c, 0x00000258, 0x00000005, 0x00020001,
1740 0x00020001, 0x0000049c, 0x40466666, 0x00000000, 0x00000000, 0x00000000, 0x41f80000, 0x00000000,
1741 0x00000000, 0x00000000, 0x00325f73, 0x00000005, 0x00020001, 0x00020002, 0x0000049c, 0x40833333,
1742 0x00000000, 0x00000000, 0x00000000, 0x42240000, 0x00000000, 0x00000000, 0x00000000, 0x40866666,
1743 0x00000000, 0x00000000, 0x00000000, 0x42280000, 0x00000000, 0x00000000, 0x00000000, 0x00335f73,
1744 0x00000005, 0x00020001, 0x00020003, 0x0000049c, 0x40a33333, 0x00000000, 0x00000000, 0x00000000,
1745 0x424c0000, 0x00000000, 0x00000000, 0x00000000, 0x40a66666, 0x00000000, 0x00000000, 0x00000000,
1746 0x42500000, 0x00000000, 0x00000000, 0x00000000, 0x40a9999a, 0x00000000, 0x00000000, 0x00000000,
1747 0x42540000, 0x00000000, 0x00000000, 0x00000000, 0xabab0076, 0x00030001, 0x00030001, 0x00000002,
1748 0x00000000, 0x40070a3d, 0x400d70a4, 0x4013d70a, 0x00000000, 0x401a3d71, 0x4020a3d7, 0x40270a3d,
1749 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
1750 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f,
1751 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0x80070000, 0xa0e4002a,
1752 0x03000002, 0x80070000, 0x80e40000, 0xa0e4002c, 0x03000002, 0x80040000, 0x80aa0000, 0xa0000017,
1753 0x03000002, 0xe0080000, 0x80aa0000, 0xa0000011, 0x02000001, 0x80010001, 0xa000002d, 0x03000005,
1754 0x80040000, 0x80000001, 0xa0000026, 0x03000005, 0x80040000, 0x80aa0000, 0x90000000, 0x03000005,
1755 0xe0010000, 0x80aa0000, 0xa055000b, 0x03000002, 0x80020000, 0x80550000, 0xa0000016, 0x03000002,
1756 0x80010000, 0x80000000, 0xa0000015, 0x03000002, 0x80010000, 0x80000000, 0xa000000f, 0x03000002,
1757 0x80020000, 0x80550000, 0xa0000010, 0x03000005, 0x80040000, 0xa000002e, 0x90550000, 0x04000004,
1758 0xe0020000, 0x80aa0000, 0xa0000028, 0x80550000, 0x03000005, 0x80020000, 0xa0000018, 0x90aa0000,
1759 0x03000005, 0x80020000, 0x80550000, 0xa000001c, 0x03000005, 0x80020000, 0x80550000, 0xa000002f,
1760 0x03000005, 0x80020000, 0x80550000, 0xa0000020, 0x04000004, 0xe0040000, 0x80550000, 0xa0aa0024,
1761 0x80000000, 0x0000ffff,
1762 };
1763 
1764 const struct
1765 {
1766  const char *fullname;
1769 }
1771 {
1772  {"f", {"f", D3DXRS_FLOAT4, 45, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 72},
1773  {"f23", {"f23", D3DXRS_FLOAT4, 29, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 2, 0, 48, NULL}, 81},
1774  {"f23[0]", {"f23", D3DXRS_FLOAT4, 29, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL}, 81},
1775  {"f23[1]", {"f23", D3DXRS_FLOAT4, 32, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL}, 93},
1776  {"f32", {"f32", D3DXRS_FLOAT4, 33, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 2, 0, 48, NULL}, 110},
1777  {"f32[0]", {"f32", D3DXRS_FLOAT4, 33, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL}, 110},
1778  {"f32[1]", {"f32", D3DXRS_FLOAT4, 35, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL}, 118},
1779  {"f_2", {"f_2", D3DXRS_FLOAT4, 37, 2, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 2, 0, 8, NULL}, 131},
1780  {"f_2[0]", {"f_2", D3DXRS_FLOAT4, 37, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 131},
1781  {"f_2[1]", {"f_2", D3DXRS_FLOAT4, 38, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 135},
1782  {"i", {"i", D3DXRS_FLOAT4, 47, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 144},
1783  {"i[0]", {"i", D3DXRS_FLOAT4, 47, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 144},
1784  {"p", {"p", D3DXRS_FLOAT4, 0, 18, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 2, 4, 80, NULL}, 176},
1785  {"p[0]", {"p", D3DXRS_FLOAT4, 0, 9, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 1, 4, 40, NULL}, 176},
1786  {"p[0].i1", {"i1", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 176},
1787  {"p[0].i2", {"i2", D3DXRS_FLOAT4, 1, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 180},
1788  {"p[0].f_2", {"f_2", D3DXRS_FLOAT4, 2, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 1, 0, 8, NULL}, 184},
1789  {"p[0].r", {"r", D3DXRS_FLOAT4, 3, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 188},
1790  {"p[0].r[0]", {"r", D3DXRS_FLOAT4, 3, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 188},
1791  {"p[0].r[1]", {"r", D3DXRS_FLOAT4, 6, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 200},
1792  {"p[1]", {"p", D3DXRS_FLOAT4, 9, 9, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 1, 4, 40, NULL}, 212},
1793  {"p[1].i1", {"i1", D3DXRS_FLOAT4, 9, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 212},
1794  {"p[1].i2", {"i2", D3DXRS_FLOAT4, 10, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 216},
1795  {"p[1].f_2", {"f_2", D3DXRS_FLOAT4, 11, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 1, 0, 8, NULL}, 220},
1796  {"p[1].r", {"r", D3DXRS_FLOAT4, 12, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 224},
1797  {"p[1].r[0]", {"r", D3DXRS_FLOAT4, 12, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 224},
1798  {"p[1].r[1]", {"r", D3DXRS_FLOAT4, 15, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 236},
1799  {"r13", {"r13", D3DXRS_FLOAT4, 43, 2, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 253},
1800  {"r13[0]", {"r13", D3DXRS_FLOAT4, 43, 1, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 253},
1801  {"r13[1]", {"r13", D3DXRS_FLOAT4, 44, 1, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 257},
1802  {"r31", {"r31", D3DXRS_FLOAT4, 18, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 266},
1803  {"r31[0]", {"r31", D3DXRS_FLOAT4, 18, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 266},
1804  {"r31[1]", {"r31", D3DXRS_FLOAT4, 21, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 278},
1805  {"s", {"s", D3DXRS_FLOAT4, 46, 1, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 303},
1806  {"s.f", {"f", D3DXRS_FLOAT4, 46, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 303},
1807  {"s.i", {"i", D3DXRS_FLOAT4, 47, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 307},
1808  {"s_2", {"s_2", D3DXRS_FLOAT4, 39, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 2, 2, 16, NULL}, 316},
1809  {"s_2[0]", {"s_2", D3DXRS_FLOAT4, 39, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 316},
1810  {"s_2[0].f", {"f", D3DXRS_FLOAT4, 39, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 316},
1811  {"s_2[0].i", {"i", D3DXRS_FLOAT4, 40, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 320},
1812  {"s_2[1]", {"s_2", D3DXRS_FLOAT4, 41, 0, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 324},
1813  {"s_2[1].f", {"f", D3DXRS_FLOAT4, 41, 0, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 324},
1814  {"s_2[1].i", {"i", D3DXRS_FLOAT4, 41, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 328},
1815  {"s_3", {"s_3", D3DXRS_FLOAT4, 24, 5, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 3, 2, 24, NULL}, 337},
1816  {"s_3[0]", {"s_3", D3DXRS_FLOAT4, 24, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 337},
1817  {"s_3[0].f", {"f", D3DXRS_FLOAT4, 24, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 337},
1818  {"s_3[0].i", {"i", D3DXRS_FLOAT4, 25, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 341},
1819  {"s_3[1]", {"s_3", D3DXRS_FLOAT4, 26, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 345},
1820  {"s_3[1].f", {"f", D3DXRS_FLOAT4, 26, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 345},
1821  {"s_3[1].i", {"i", D3DXRS_FLOAT4, 27, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 349},
1822  {"s_3[2]", {"s_3", D3DXRS_FLOAT4, 28, 1, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 353},
1823  {"s_3[2].f", {"f", D3DXRS_FLOAT4, 28, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 353},
1824  {"s_3[2].i", {"i", D3DXRS_FLOAT4, 29, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 357},
1825  {"v", {"v", D3DXRS_FLOAT4, 41, 2, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 366},
1826  {"v[0]", {"v", D3DXRS_FLOAT4, 41, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 366},
1827  {"v[1]", {"v", D3DXRS_FLOAT4, 42, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 370},
1828 };
1829 
1831 {
1832  ID3DXConstantTable *ctable;
1833  HRESULT hr;
1834  ULONG count;
1835  UINT i;
1836  UINT nr = 1;
1839  DWORD *ctab;
1840 
1842  ok(hr == D3D_OK, "D3DXGetShaderConstantTable failed, got %08x, expected %08x\n", hr, D3D_OK);
1843 
1845  ok(ctab[0] == test_get_shader_constant_variables_blob[3], "ID3DXConstantTable_GetBufferPointer failed\n");
1846 
1848  {
1849  const char *fullname = test_get_shader_constant_variables_data[i].fullname;
1850  const D3DXCONSTANT_DESC *expected_desc = &test_get_shader_constant_variables_data[i].desc;
1852 
1854  ok(constant != NULL, "GetConstantByName \"%s\" failed\n", fullname);
1855 
1857  ok(hr == D3D_OK, "GetConstantDesc \"%s\" failed, got %08x, expected %08x\n", fullname, hr, D3D_OK);
1858 
1859  ok(!strcmp(expected_desc->Name, desc.Name), "GetConstantDesc \"%s\" failed, got \"%s\", expected \"%s\"\n",
1860  fullname, desc.Name, expected_desc->Name);
1861  ok(expected_desc->RegisterSet == desc.RegisterSet, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1862  fullname, desc.RegisterSet, expected_desc->RegisterSet);
1863  ok(expected_desc->RegisterIndex == desc.RegisterIndex, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1864  fullname, desc.RegisterIndex, expected_desc->RegisterIndex);
1865  ok(expected_desc->RegisterCount == desc.RegisterCount, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1866  fullname, desc.RegisterCount, expected_desc->RegisterCount);
1867  ok(expected_desc->Class == desc.Class, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1868  fullname, desc.Class, expected_desc->Class);
1869  ok(expected_desc->Type == desc.Type, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1870  fullname, desc.Type, expected_desc->Type);
1871  ok(expected_desc->Rows == desc.Rows, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1872  fullname, desc.Rows, expected_desc->Rows);
1873  ok(expected_desc->Columns == desc.Columns, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1874  fullname, desc.Columns, expected_desc->Columns);
1875  ok(expected_desc->Elements == desc.Elements, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1876  fullname, desc.Elements, expected_desc->Elements);
1877  ok(expected_desc->StructMembers == desc.StructMembers, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1878  fullname, desc.StructMembers, expected_desc->StructMembers);
1879  ok(expected_desc->Bytes == desc.Bytes, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1880  fullname, desc.Bytes, expected_desc->Bytes);
1881  ok(ctaboffset == (DWORD *)desc.DefaultValue - ctab, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1882  fullname, (UINT)((DWORD *)desc.DefaultValue - ctab), ctaboffset);
1883  }
1884 
1886  ok(element == NULL, "GetConstantElement failed\n");
1887 
1889  ok(constant != NULL, "GetConstantByName failed\n");
1890 
1892  ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1893 
1895  ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1896 
1898  ok(constant != NULL, "GetConstantByName failed\n");
1899 
1901  ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1902 
1904  ok(element == NULL, "GetConstant failed\n");
1905 
1907  ok(element == NULL, "GetConstant failed\n");
1908 
1910  ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1911 
1913  ok(NULL == element, "GetConstantByName failed\n");
1914 
1916  ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1917 
1919  ok(element == NULL, "GetConstantByName failed\n");
1920 
1922  ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1923 
1925  ok(element == NULL, "GetConstantElement failed\n");
1926 
1928  ok(constant != NULL, "GetConstantByName failed\n");
1929 
1931  ok(element != constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1932 
1934  ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1935 
1937  ok(constant != NULL, "GetConstantByName failed\n");
1938 
1940  ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1941 
1943  ok(constant != NULL, "GetConstantByName failed\n");
1944 
1946  ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1947 
1949  ok(element == constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1950 
1951  element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "invalid");
1952  ok(element == NULL, "GetConstantByName failed\n");
1953 
1955  ok(constant != NULL, "GetConstantByName failed\n");
1956 
1958  ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1959 
1961  ok(count == 0, "Release failed, got %u, expected %u\n", count, 0);
1962 }
1963 
1964 #define REGISTER_OUTPUT_SIZE 48
1965 
1969 
1971 {
1972  enum Type type;
1978 };
1979 
1981 {
1982  const char *fullname;
1985 };
1986 
1988 {
1989  /* float */
1990  {0x40000123, 0x00000000, 0x40800123, 0x40a00123,
1991  0x40c00123, 0x40e00123, 0x41000123, 0x41100123,
1992  0x41200123, 0x41300123, 0x41400123, 0x41500123,
1993  0x41600123, 0x41700123, 0x41800123, 0x41900123,
1994  0x41a00123, 0x41b00123, 0x41c00123, 0x41d00123,
1995  0x00000000, 0x41f00123, 0x42000123, 0x42100123,
1996  0x00000000, 0x42300123, 0x42400123, 0x42500123,
1997  0x42600123, 0x42700123, 0x42800123, 0x42900123,
1998  0x43000123, 0x43100123, 0x43200123, 0x43300123,
1999  0x43400123, 0x43500123, 0x43600123, 0x43700123,
2000  0x43800123, 0x43900123, 0x43a00123, 0x43b00123,
2001  0x43c00123, 0x43d00123, 0x43e00123, 0x43f00123},
2002  /* int */
2003  {0x00000002, 0x00000003, 0x00000004, 0x00000005,
2004  0x00000000, 0x00000007, 0x00000008, 0x00000009,
2005  0x0000000a, 0x0000000b, 0x0000000c, 0x0000000d,
2006  0x0000000e, 0x0000000f, 0x00000010, 0x00000011,
2007  0x00000012, 0x00000000, 0x00000000, 0x00000015,
2008  0x00000016, 0x00000017, 0x00000018, 0x00000019,
2009  0x0000001a, 0x0000001b, 0x0000001c, 0x0000001d,
2010  0x0000001e, 0x0000001f, 0x00000020, 0x00000021,
2011  0x00000022, 0x00000023, 0x00000024, 0x00000025,
2012  0x00000026, 0x00000027, 0x00000028, 0x00000029,
2013  0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
2014  0x0000002e, 0x0000002f, 0x00000030, 0x00000031},
2015 };
2016 
2017 /*
2018  * fxc.exe /Tvs_3_0
2019  */
2020 #if 0
2021 bool b = 1;
2022 int n = 8;
2023 float f = 5.1;
2024 int nf = 11;
2025 bool bf = 1;
2026 float4 main(float4 pos : POSITION) : POSITION
2027 {
2028  float4 tmp = 0;
2029  int i;
2030  if (b) for (i = 0; i < n; i++) tmp.x += pos.z * f * nf;
2031  else for (i = 0; i < n; i++) tmp.y += pos.y * f * bf;
2032  return tmp;
2033 }
2034 #endif
2036 {
2037 0xfffe0300, 0x0051fffe, 0x42415443, 0x0000001c, 0x0000010f, 0xfffe0300, 0x00000005, 0x0000001c,
2038 0x00000100, 0x00000108, 0x00000080, 0x00000000, 0x00000001, 0x00000084, 0x00000094, 0x00000098,
2039 0x00020002, 0x00000001, 0x00000084, 0x0000009c, 0x000000ac, 0x00000002, 0x00000001, 0x000000b0,
2040 0x000000c0, 0x000000d0, 0x00000001, 0x00000001, 0x000000d4, 0x000000e4, 0x000000f4, 0x00010002,
2041 0x00000001, 0x000000d4, 0x000000f8, 0xabab0062, 0x00010000, 0x00010001, 0x00000001, 0x00000000,
2042 0xffffffff, 0xab006662, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0xabab0066, 0x00030000,
2043 0x00010001, 0x00000001, 0x00000000, 0x40a33333, 0x00000000, 0x00000000, 0x00000000, 0xabab006e,
2044 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0x00000008, 0x00000000, 0x00000001, 0x00000000,
2045 0xab00666e, 0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369,
2046 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
2047 0x392e3932, 0x332e3235, 0x00313131, 0x05000051, 0xa00f0003, 0x00000000, 0x00000000, 0x00000000,
2048 0x00000000, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x01000028,
2049 0xe0e40800, 0x03000005, 0x80010000, 0xa0000000, 0x90aa0000, 0x02000001, 0x80010001, 0xa0000003,
2050 0x01000026, 0xf0e40000, 0x04000004, 0x80010001, 0x80000000, 0xa0000001, 0x80000001, 0x00000027,
2051 0x02000001, 0x80020001, 0xa0000003, 0x0000002a, 0x03000005, 0x80010000, 0xa0000000, 0x90550000,
2052 0x02000001, 0x80020001, 0xa0000003, 0x01000026, 0xf0e40000, 0x04000004, 0x80020001, 0x80000000,
2053 0xa0000002, 0x80550001, 0x00000027, 0x02000001, 0x80010001, 0xa0000003, 0x0000002b, 0x02000001,
2054 0xe0030000, 0x80e40001, 0x02000001, 0xe00c0000, 0xa0000003, 0x0000ffff,
2055 };
2056 
2058 {
2059  {"f", {"f", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 48},
2060 };
2061 
2063 {
2064  {SetFloat, 0, 0, 0, 4, {0x40000123}},
2065  {SetInt, 1, 0, 0, 4, {0x40000000}},
2066  {SetBool, 1, 0, 0, 4, {0x3f800000}},
2067  {SetIntArray},
2068  {SetIntArray, 1, 1, REGISTER_OUTPUT_SIZE, 4, {0x40000000}},
2069  {SetBoolArray},
2070  {SetBoolArray, 1, 1, REGISTER_OUTPUT_SIZE, 4, {0x3f800000}},
2071  {SetFloatArray},
2072  {SetFloatArray, 0, 1, REGISTER_OUTPUT_SIZE, 4, {0x40000123}},
2073  {SetValue, 0, 0, 3},
2074  {SetValue, 0, 4, REGISTER_OUTPUT_SIZE * 4, 4, {0x40000123}},
2075  {SetVector, 0, 0, 0, 4, {0x40000123}},
2076  {SetVectorArray},
2077  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x40000123}},
2078  {SetMatrix, 0, 0, 0, 4, {0x40000123},},
2079  {SetMatrixArray},
2080  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123}},
2081  {SetMatrixTranspose, 0, 0, 0, 4, {0x40000123},},
2083  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123}},
2085  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123}},
2087  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123}},
2088 };
2089 
2091 {
2092  {"n", {"n", D3DXRS_INT4, 0, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 57},
2093 };
2094 
2096 {
2097  {SetFloat, 0, 0, 0, 4,
2098  {0x00000002, 0x00000000, 0x00000001}},
2099  {SetInt, 1, 0, 0, 4,
2100  {0x00000002, 0x00000000, 0x00000001}},
2101  {SetBool, 1, 0, 0, 4,
2102  {0x00000001, 0x00000000, 0x00000001}},
2103  {SetIntArray},
2104  {SetIntArray, 1, 1, REGISTER_OUTPUT_SIZE, 4,
2105  {0x00000002, 0x00000000, 0x00000001}},
2106  {SetBoolArray},
2108  {0x00000001, 0x00000000, 0x00000001}},
2109  {SetFloatArray},
2111  {0x00000002, 0x00000000, 0x00000001}},
2112  {SetValue, 1, 0, 3},
2113  {SetValue, 1, 4, REGISTER_OUTPUT_SIZE * 4, 4,
2114  {0x00000002, 0x00000000, 0x00000001}},
2115  {SetVector, 0, 0, 0, 4,
2116  {0x00000002, 0x00000000, 0x00000001},},
2117  {SetVectorArray},
2118  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4,
2119  {0x00000002, 0x00000000, 0x00000001}},
2120  {SetMatrix, 0, 0, 0, 4,
2121  {0x00000002, 0x00000000, 0x00000001}},
2122  {SetMatrixArray},
2123  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4,
2124  {0x00000002, 0x00000000, 0x00000001}},
2125  {SetMatrixTranspose, 0, 0, 0, 4,
2126  {0x00000002, 0x00000000, 0x00000001}},
2129  {0x00000002, 0x00000000, 0x00000001}},
2132  {0x00000002, 0x00000000, 0x00000001}},
2135  {0x00000002, 0x00000000, 0x00000001}},
2136 };
2137 
2139 {
2140  {"nf", {"nf", D3DXRS_FLOAT4, 1, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 62},
2141 };
2142 
2144 {
2145  {SetFloat, 0, 0, 0, 4, {0x40000000}},
2146  {SetInt, 1, 0, 0, 4, {0x40000000}},
2147  {SetBool, 1, 0, 0, 4, {0x3f800000}},
2148  {SetIntArray},
2149  {SetIntArray, 1, 1, REGISTER_OUTPUT_SIZE, 4, {0x40000000}},
2150  {SetBoolArray},
2151  {SetBoolArray, 1, 1, REGISTER_OUTPUT_SIZE, 4, {0x3f800000}},
2152  {SetFloatArray},
2153  {SetFloatArray, 0, 1, REGISTER_OUTPUT_SIZE, 4, {0x40000000}},
2154  {SetValue, 1, 0, 3},
2155  {SetValue, 1, 4, REGISTER_OUTPUT_SIZE * 4, 4, {0x40000000}},
2156  {SetVector, 0, 0, 0, 4, {0x40000000}},
2157  {SetVectorArray},
2158  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x40000000}},
2159  {SetMatrix, 0, 0, 0, 4, {0x40000000}},
2160  {SetMatrixArray},
2161  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000}},
2162  {SetMatrixTranspose, 0, 0, 0, 4, {0x40000000}},
2164  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000}},
2166  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000}},
2168  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000}},
2169 };
2170 
2172 {
2173  {"bf", {"bf", D3DXRS_FLOAT4, 2, 1, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 1, 0, 4, NULL}, 39},
2174 };
2175 
2177 {
2178  {SetFloat, 0, 0, 0, 4, {0x3f800000}},
2179  {SetInt, 1, 0, 0, 4, {0x3f800000}},
2180  {SetBool, 1, 0, 0, 4, {0x3f800000}},
2181  {SetIntArray},
2182  {SetIntArray, 1, 1, REGISTER_OUTPUT_SIZE, 4, {0x3f800000}},
2183  {SetBoolArray},
2184  {SetBoolArray, 1, 1, REGISTER_OUTPUT_SIZE, 4, {0x3f800000}},
2185  {SetFloatArray},
2186  {SetFloatArray, 0, 1, REGISTER_OUTPUT_SIZE, 4, {0x3f800000}},
2187  {SetValue, 1, 0, 3},
2188  {SetValue, 1, 4, REGISTER_OUTPUT_SIZE * 4, 4, {0x3f800000}},
2189  {SetVector, 0, 0, 0, 4, {0x3f800000}},
2190  {SetVectorArray},
2191  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x3f800000}},
2192  {SetMatrix, 0, 0, 0, 4, {0x3f800000}},
2193  {SetMatrixArray},
2194  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000}},
2195  {SetMatrixTranspose, 0, 0, 0, 4, {0x3f800000}},
2197  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000}},
2199  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000}},
2201  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000}},
2202 };
2203 
2205 {
2206  {"b", {"b", D3DXRS_BOOL, 0, 1, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 1, 0, 4, NULL}, 37},
2207 };
2208 
2210 {
2211  {SetFloat, 0, 0, 0, 1, {0x00000001}},
2212  {SetInt, 1, 0, 0, 1, {0x00000001}},
2213  {SetBool, 1, 0, 0, 1, {0x00000002}},
2214  {SetIntArray},
2215  {SetIntArray, 1, 1, REGISTER_OUTPUT_SIZE, 1, {0x00000001}},
2216  {SetBoolArray},
2217  {SetBoolArray, 1, 1, REGISTER_OUTPUT_SIZE, 1, {0x00000002}},
2218  {SetFloatArray},
2219  {SetFloatArray, 0, 1, REGISTER_OUTPUT_SIZE, 1, {0x00000001}},
2220  {SetValue, 1, 0, 3},
2221  {SetValue, 1, 4, REGISTER_OUTPUT_SIZE * 4, 1, {0x00000002}},
2222  {SetVector, 0, 0, 0, 1, {0x00000001}},
2223  {SetVectorArray},
2224  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 1, {0x00000001}},
2225  {SetMatrix, 0, 0, 0, 1, {0x00000001}},
2226  {SetMatrixArray},
2227  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 1, {0x00000001}},
2228  {SetMatrixTranspose, 0, 0, 0, 1, {0x00000001}},
2230  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 1, {0x00000001}},
2232  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 1, {0x00000001}},
2234  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 1, {0x00000001}},
2235 };
2236 
2237 /*
2238  * fxc.exe /Tvs_3_0
2239  */
2240 #if 0
2241 bool ab[2] = {1, 0};
2242 int an[2] = {32, 33};
2243 float af[2] = {3.1, 3.2};
2244 int anf[2] = {14, 15};
2245 bool abf[2] = {1, 1};
2246 float4 main(float4 pos : POSITION) : POSITION
2247 {
2248  float4 tmp = 0;
2249  int i;
2250  if (ab[1]) for (i = 0; i < an[1]; i++) tmp.x += pos.z * af[0] * anf[1];
2251  else for (i = 0; i < an[0]; i++) tmp.y += pos.y * af[1] * abf[1];
2252  return tmp;
2253 }
2254 #endif
2256 {
2257 0xfffe0300, 0x006afffe, 0x42415443, 0x0000001c, 0x00000173, 0xfffe0300, 0x00000005, 0x0000001c,
2258 0x00000100, 0x0000016c, 0x00000080, 0x00000000, 0x00000002, 0x00000084, 0x00000094, 0x0000009c,
2259 0x00040002, 0x00000002, 0x000000a0, 0x000000b0, 0x000000d0, 0x00000002, 0x00000002, 0x000000d4,
2260 0x000000e4, 0x00000104, 0x00000001, 0x00000002, 0x00000108, 0x00000118, 0x00000138, 0x00020002,
2261 0x00000002, 0x0000013c, 0x0000014c, 0xab006261, 0x00010000, 0x00010001, 0x00000002, 0x00000000,
2262 0xffffffff, 0x00000000, 0x00666261, 0x00010000, 0x00010001, 0x00000002, 0x00000000, 0x3f800000,
2263 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0xab006661,
2264 0x00030000, 0x00010001, 0x00000002, 0x00000000, 0x40466666, 0x00000000, 0x00000000, 0x00000000,
2265 0x404ccccd, 0x00000000, 0x00000000, 0x00000000, 0xab006e61, 0x00020000, 0x00010001, 0x00000002,
2266 0x00000000, 0x00000020, 0x00000000, 0x00000001, 0x00000000, 0x00000021, 0x00000000, 0x00000001,
2267 0x00000000, 0x00666e61, 0x00020000, 0x00010001, 0x00000002, 0x00000000, 0x41600000, 0x00000000,
2268 0x00000000, 0x00000000, 0x41700000, 0x00000000, 0x00000000, 0x00000000, 0x335f7376, 0x4d00305f,
2269 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
2270 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x05000051, 0xa00f0006, 0x00000000, 0x00000000,
2271 0x00000000, 0x00000000, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000,
2272 0x01000028, 0xe0e40801, 0x03000005, 0x80010000, 0xa0000000, 0x90aa0000, 0x02000001, 0x80010001,
2273 0xa0000006, 0x01000026, 0xf0e40001, 0x04000004, 0x80010001, 0x80000000, 0xa0000003, 0x80000001,
2274 0x00000027, 0x02000001, 0x80020001, 0xa0000006, 0x0000002a, 0x03000005, 0x80010000, 0xa0000001,
2275 0x90550000, 0x02000001, 0x80020001, 0xa0000006, 0x01000026, 0xf0e40000, 0x04000004, 0x80020001,
2276 0x80000000, 0xa0000005, 0x80550001, 0x00000027, 0x02000001, 0x80010001, 0xa0000006, 0x0000002b,
2277 0x02000001, 0xe0030000, 0x80e40001, 0x02000001, 0xe00c0000, 0xa0000006, 0x0000ffff,
2278 };
2279 
2281 {
2282  {"af", {"af", D3DXRS_FLOAT4, 0, 2, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 2, 0, 8, NULL}, 57},
2283  {"af[0]", {"af", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 57},
2284  {"af[1]", {"af", D3DXRS_FLOAT4, 1, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 61},
2285 };
2286 
2288 {
2289  {SetFloat, 0, 0, 0, 4, {0x40000123}},
2290  {SetInt, 1, 0, 0, 4, {0x40000000}},
2291  {SetBool, 1, 0, 0, 4, {0x3f800000}},
2292  {SetIntArray},
2293  {SetIntArray, 1, 1, 1, 4, {0x40000000}},
2294  {SetIntArray, 1, 2, REGISTER_OUTPUT_SIZE, 8,
2295  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40400000}},
2296  {SetBoolArray},
2297  {SetBoolArray, 1, 1, 1, 4, {0x3f800000}},
2299  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2300  {SetFloatArray},
2301  {SetFloatArray, 0, 1, 1, 4, {0x40000123}},
2303  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2304  {SetValue, 0, 0, 3},
2305  {SetValue, 0, 4, 7, 4, {0x40000123}},
2306  {SetValue, 0, 8, REGISTER_OUTPUT_SIZE * 4, 8,
2307  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2308  {SetVector, 0, 0, 0, 8,
2309  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2310  {SetVectorArray},
2311  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 8,
2312  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2313  {SetMatrix, 0, 0, 0, 8,
2314  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2315  {SetMatrixArray},
2316  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
2317  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2318  {SetMatrixTranspose, 0, 0, 0, 8,
2319  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x40c00123}},
2322  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x40c00123}},
2325  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2328  {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x40c00123}},
2329 };
2330 
2332 {
2333  {"an", {"an", D3DXRS_INT4, 0, 2, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 2, 0, 8, NULL}, 70},
2334  {"an[0]", {"an", D3DXRS_INT4, 0, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 70},
2335  {"an[1]", {"an", D3DXRS_INT4, 1, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 74},
2336 };
2337 
2339 {
2340  {SetFloat, 0, 0, 0, 4, {0x00000002, 0x00000000, 0x00000001}},
2341  {SetInt, 1, 0, 0, 4, {0x00000002, 0x00000000, 0x00000001}},
2342  {SetBool, 1, 0, 0, 4, {0x00000001, 0x00000000, 0x00000001}},
2343  {SetIntArray},
2344  {SetIntArray, 1, 1, 1, 4, {0x00000002, 0x00000000, 0x00000001}},
2345  {SetIntArray, 1, 2, REGISTER_OUTPUT_SIZE, 8,
2346  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000003, 0x00000000, 0x00000001}},
2347  {SetBoolArray},
2348  {SetBoolArray, 1, 1, 1, 4, {0x00000001, 0x00000000, 0x00000001}},
2350  {0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001}},
2351  {SetFloatArray},
2352  {SetFloatArray, 0, 1, 1, 4, {0x00000002, 0x00000000, 0x00000001}},
2354  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001}},
2355  {SetValue, 1, 0, 3},
2356  {SetValue, 1, 4, 7, 4, {0x00000002, 0x00000000, 0x00000001}},
2357  {SetValue, 1, 8, REGISTER_OUTPUT_SIZE * 4, 8,
2358  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000003, 0x00000000, 0x00000001}},
2359  {SetVector, 0, 0, 0, 8,
2360  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001}},
2361  {SetVectorArray},
2362  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 8,
2363  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001}},
2364  {SetMatrix, 0, 0, 0, 8,
2365  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001}},
2366  {SetMatrixArray},
2367  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
2368  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001}},
2369  {SetMatrixTranspose, 0, 0, 0, 8,
2370  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000006, 0x00000000, 0x00000001}},
2373  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000006, 0x00000000, 0x00000001}},
2376  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001}},
2379  {0x00000002, 0x00000000, 0x00000001, 0x00000000, 0x00000006, 0x00000000, 0x00000001}},
2380 };
2381 
2383 {
2384  {"ab", {"ab", D3DXRS_BOOL, 0, 2, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 2, 0, 8, NULL}, 37},
2385  {"ab[0]", {"ab", D3DXRS_BOOL, 0, 1, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 1, 0, 4, NULL}, 37},
2386  {"ab[1]", {"ab", D3DXRS_BOOL, 1, 1, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 1, 0, 4, NULL}, 38},
2387 };
2388 
2390 {
2391  {SetFloat, 0, 0, 0, 1, {0x00000001}},
2392  {SetInt, 1, 0, 0, 1, {0x00000001}},
2393  {SetBool, 1, 0, 0, 1, {0x00000002}},
2394  {SetIntArray},
2395  {SetIntArray, 1, 1, 1, 1, {0x00000001}},
2396  {SetIntArray, 1, 2, REGISTER_OUTPUT_SIZE, 2, {0x00000001, 0x00000001}},
2397  {SetBoolArray},
2398  {SetBoolArray, 1, 1, 1, 1, {0x00000002}},
2399  {SetBoolArray, 1, 2, REGISTER_OUTPUT_SIZE, 2, {0x00000002, 0x00000003}},
2400  {SetFloatArray},
2401  {SetFloatArray, 0, 1, 1, 1, {0x00000001}},
2402  {SetFloatArray, 0, 2, REGISTER_OUTPUT_SIZE, 2, {0x00000001, 0x00000000}},
2403  {SetValue, 1, 0, 3},
2404  {SetValue, 1, 4, 7, 1, {0x00000002}},
2405  {SetValue, 1, 8, REGISTER_OUTPUT_SIZE * 4, 2, {0x00000002, 0x00000003}},
2406  {SetVector, 0, 0, 0, 2, {0x00000001, 0x00000000}},
2407  {SetVectorArray},
2408  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 2, {0x00000001, 0x00000000}},
2409  {SetMatrix, 0, 0, 0, 2, {0x00000001, 0x00000000}},
2410  {SetMatrixArray},
2411  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 2, {0x00000001, 0x00000000}},
2412  {SetMatrixTranspose, 0, 0, 0, 2, {0x00000001, 0x00000001}},
2414  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 2, {0x00000001, 0x00000001}},
2416  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 2, {0x00000001, 0x00000000}},
2418  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 2, {0x00000001, 0x00000001}},
2419 };
2420 
2422 {
2423  {"abf", {"abf", D3DXRS_FLOAT4, 4, 2, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 2, 0, 8, NULL}, 44},
2424  {"abf[0]", {"abf", D3DXRS_FLOAT4, 4, 1, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 1, 0, 4, NULL}, 44},
2425  {"abf[1]", {"abf", D3DXRS_FLOAT4, 5, 1, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 1, 0, 4, NULL}, 48},
2426 };
2427 
2429 {
2430  {SetFloat, 0, 0, 0, 4, {0x3f800000}},
2431  {SetInt, 1, 0, 0, 4, {0x3f800000}},
2432  {SetBool, 1, 0, 0, 4, {0x3f800000}},
2433  {SetIntArray},
2434  {SetIntArray, 1, 1, 1, 4, {0x3f800000}},
2435  {SetIntArray, 1, 2, REGISTER_OUTPUT_SIZE, 8,
2436  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2437  {SetBoolArray},
2438  {SetBoolArray, 1, 1, 1, 4, {0x3f800000}},
2440  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2441  {SetFloatArray},
2442  {SetFloatArray, 0, 1, 1, 4, {0x3f800000}},
2444  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2445  {SetValue, 1, 0, 3},
2446  {SetValue, 1, 4, 7, 4, {0x3f800000}},
2447  {SetValue, 1, 8, REGISTER_OUTPUT_SIZE * 4, 8,
2448  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2449  {SetVector, 0, 0, 0, 8,
2450  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2451  {SetVectorArray},
2452  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 8,
2453  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2454  {SetMatrix, 0, 0, 0, 8,
2455  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2456  {SetVectorArray},
2457  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
2458  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2459  {SetMatrixTranspose, 0, 0, 0, 8,
2460  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2463  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2466  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2469  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2470 };
2471 
2473 {
2474  {"anf", {"anf", D3DXRS_FLOAT4, 2, 2, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 2, 0, 8, NULL}, 83},
2475  {"anf[0]", {"anf", D3DXRS_FLOAT4, 2, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 83},
2476  {"anf[1]", {"anf", D3DXRS_FLOAT4, 3, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 87},
2477 };
2478 
2480 {
2481  {SetFloat, 0, 0, 0, 4, {0x40000000}},
2482  {SetInt, 1, 0, 0, 4, {0x40000000}},
2483  {SetBool, 1, 0, 0, 4, {0x3f800000}},
2484  {SetIntArray},
2485  {SetIntArray, 1, 1, 1, 4, {0x40000000}},
2486  {SetIntArray, 1, 2, REGISTER_OUTPUT_SIZE, 8,
2487  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40400000}},
2488  {SetBoolArray},
2489  {SetBoolArray, 1, 1, 1, 4, {0x3f800000}},
2491  {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000}},
2492  {SetFloatArray},
2493  {SetFloatArray, 0, 1, 1, 4, {0x40000000}},
2495  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2496  {SetValue, 1, 0, 3},
2497  {SetValue, 1, 4, 7, 4, {0x40000000}},
2498  {SetValue, 1, 8, REGISTER_OUTPUT_SIZE * 4, 8,
2499  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40400000}},
2500  {SetVector, 0, 0, 0, 8,
2501  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2502  {SetVectorArray},
2503  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 8,
2504  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2505  {SetMatrix, 0, 0, 0, 8,
2506  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2507  {SetMatrixArray},
2508  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
2509  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2510  {SetMatrixTranspose, 0, 0, 0, 8,
2511  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40c00000}},
2514  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40c00000}},
2517  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
2520  {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40c00000}},
2521 };
2522 
2523 /*
2524  * fxc.exe /Tvs_3_0
2525  */
2526 #if 0
2527 bool3 vb = {1, 0, 1};
2528 int3 vn = {7, 8, 9};
2529 float3 vf = {5.1, 5.2, 5.3};
2530 int3 vnf = {11, 85, 62};
2531 bool3 vbf = {1, 1, 1};
2532 float4 main(float4 pos : POSITION) : POSITION
2533 {
2534  float4 tmp = 0;
2535  int i;
2536  if (vb.z) for (i = 0; i < vn.z; i++) tmp.x += pos.z * vf.z * vnf.z;
2537  else for (i = 0; i < vn.y; i++) tmp.y += pos.y * vf.y * vbf.z;
2538  return tmp;
2539 }
2540 #endif
2542 {
2543 0xfffe0300, 0x0053fffe, 0x42415443, 0x0000001c, 0x00000117, 0xfffe0300, 0x00000005, 0x0000001c,
2544 0x00000100, 0x00000110, 0x00000080, 0x00000000, 0x00000003, 0x00000084, 0x00000094, 0x000000a0,
2545 0x00020002, 0x00000001, 0x00000084, 0x000000a4, 0x000000b4, 0x00000002, 0x00000001, 0x000000b8,
2546 0x000000c8, 0x000000d8, 0x00000001, 0x00000003, 0x000000dc, 0x000000ec, 0x000000fc, 0x00010002,
2547 0x00000001, 0x000000dc, 0x00000100, 0xab006276, 0x00010001, 0x00030001, 0x00000001, 0x00000000,
2548 0xffffffff, 0x00000000, 0xffffffff, 0x00666276, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000,
2549 0xab006676, 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0x40a33333, 0x40a66666, 0x40a9999a,
2550 0x00000000, 0xab006e76, 0x00020001, 0x00030001, 0x00000001, 0x00000000, 0x00000007, 0x00000008,
2551 0x00000009, 0x00000000, 0x00666e76, 0x41300000, 0x42aa0000, 0x42780000, 0x00000000, 0x335f7376,
2552 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
2553 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x05000051, 0xa00f0003, 0x00000000,
2554 0x00000000, 0x00000000, 0x00000000, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000,
2555 0xe00f0000, 0x01000028, 0xe0e40802, 0x03000005, 0x80010000, 0xa0aa0000, 0x90aa0000, 0x02000001,
2556 0x80010001, 0xa0000003, 0x01000026, 0xf0e40002, 0x04000004, 0x80010001, 0x80000000, 0xa0aa0001,
2557 0x80000001, 0x00000027, 0x02000001, 0x80020001, 0xa0000003, 0x0000002a, 0x03000005, 0x80010000,
2558 0xa0550000, 0x90550000, 0x02000001, 0x80020001, 0xa0000003, 0x01000026, 0xf0e40001, 0x04000004,
2559 0x80020001, 0x80000000, 0xa0aa0002, 0x80550001, 0x00000027, 0x02000001, 0x80010001, 0xa0000003,
2560 0x0000002b, 0x02000001, 0xe0030000, 0x80e40001, 0x02000001, 0xe00c0000, 0xa0000003, 0x0000ffff,
2561 };
2562 
2564 {
2565  {"vf", {"vf", D3DXRS_FLOAT4, 0, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 50},
2566 };
2567 
2569 {
2570  {SetInt},
2571  {SetBool},
2572  {SetFloat},
2573  {SetIntArray, 1, 0, 2},
2574  {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x40000000, 0x40400000, 0x40800000}},
2575  {SetBoolArray, 1, 0, 2},
2576  {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2577  {SetFloatArray, 0, 0, 2},
2578  {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 4, {0x40000123, 0x00000000, 0x40800123}},
2579  {SetValue, 0, 0, 11},
2580  {SetValue, 0, 12, REGISTER_OUTPUT_SIZE * 4, 4, {0x40000123, 0x00000000, 0x40800123}},
2581  {SetVector, 0, 0, 0, 4, {0x40000123, 0x00000000, 0x40800123}},
2582  {SetVectorArray},
2583  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x40000123, 0x00000000, 0x40800123}},
2584  {SetMatrix, 0, 0, 0, 4, {0x40000123, 0x00000000, 0x40800123}},
2585  {SetMatrixArray},
2586  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123, 0x00000000, 0x40800123}},
2587  {SetMatrixTranspose, 0, 0, 0, 4, {0x40000123, 0x40c00123, 0x41200123}},
2589  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123, 0x40c00123, 0x41200123}},
2591  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123, 0x00000000, 0x40800123}},
2593  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000123, 0x40c00123, 0x41200123}},
2594 };
2595 
2597 {
2598  {"vn", {"vn", D3DXRS_INT4, 0, 3, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 1, 0, 12, NULL}, 59},
2599 };
2600 
2602 {
2603  {SetInt},
2604  {SetBool},
2605  {SetFloat},
2606  {SetIntArray, 1, 0, 2},
2607  {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x00000002, 0x00000003, 0x00000004}},
2608  {SetBoolArray, 1, 0, 2},
2609  {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x00000001, 0x00000001, 0x00000001}},
2610  {SetFloatArray, 0, 0, 2},
2611  {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 4, {0x00000002, 0x00000000, 0x00000004}},
2612  {SetValue, 1, 0, 11},
2613  {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 4, {0x00000002, 0x00000003, 0x00000004}},
2614  {SetVector, 0, 0, 0, 4, {0x00000002, 0x00000000, 0x00000004}},
2615  {SetVectorArray},
2616  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x00000002, 0x00000000, 0x00000004}},
2617  {SetMatrix, 0, 0, 0, 4, {0x00000002, 0x00000000, 0x00000004}},
2618  {SetMatrixArray},
2619  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x00000002, 0x00000000, 0x00000004}},
2620  {SetMatrixTranspose, 0, 0, 0, 4, {0x00000002, 0x00000006, 0x0000000a}},
2622  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x00000002, 0x00000006, 0x0000000a}},
2624  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x00000002, 0x00000000, 0x00000004}},
2626  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x00000002, 0x00000006, 0x0000000a}},
2627 };
2628 
2630 {
2631  {"vb", {"vb", D3DXRS_BOOL, 0, 3, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 1, 0, 12, NULL}, 37},
2632 };
2633 
2635 {
2636  {SetInt},
2637  {SetBool},
2638  {SetFloat},
2639  {SetIntArray, 1, 0, 2},
2640  {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 3, {0x00000001, 0x00000001, 0x00000001}},
2641  {SetBoolArray, 1, 0, 2},
2642  {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 3, {0x00000002, 0x00000003, 0x00000004}},
2643  {SetFloatArray, 0, 0, 2},
2644  {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 3, {0x00000001, 0x00000000, 0x00000001}},
2645  {SetValue, 1, 0, 11},
2646  {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 3, {0x00000002, 0x00000003, 0x00000004}},
2647  {SetVector, 0, 0, 0, 3, {0x00000001, 0x00000000, 0x00000001}},
2648  {SetVectorArray},
2649  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 3, {0x00000001, 0x00000000, 0x00000001}},
2650  {SetMatrix, 0, 0, 0, 3, {0x00000001, 0x00000000, 0x00000001}},
2651  {SetMatrixArray},
2652  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000000, 0x00000001}},
2653  {SetMatrixTranspose, 0, 0, 0, 3, {0x00000001, 0x00000001, 0x00000001}},
2655  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000001, 0x00000001}},
2657  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000000, 0x00000001}},
2659  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000001, 0x00000001}},
2660 };
2661 
2663 {
2664  {"vbf", {"vbf", D3DXRS_FLOAT4, 2, 1, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 1, 0, 12, NULL}, 41},
2665 };
2666 
2668 {
2669  {SetInt},
2670  {SetBool},
2671  {SetFloat},
2672  {SetIntArray, 1, 0, 2},
2673  {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2674  {SetBoolArray, 1, 0, 2},
2675  {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2676  {SetFloatArray, 0, 0, 2},
2677  {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 4, {0x3f800000, 0x00000000, 0x3f800000}},
2678  {SetValue, 1, 0, 11},
2679  {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2680  {SetVector, 0, 0, 0, 4, {0x3f800000, 0x00000000, 0x3f800000}},
2681  {SetVectorArray},
2682  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x3f800000, 0x00000000, 0x3f800000}},
2683  {SetMatrix, 0, 0, 0, 4, {0x3f800000, 0x00000000, 0x3f800000}},
2684  {SetMatrixArray},
2685  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000, 0x00000000, 0x3f800000}},
2686  {SetMatrixTranspose, 0, 0, 0, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2688  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2690  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000, 0x00000000, 0x3f800000}},
2692  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2693 };
2694 
2696 {
2697  {"vnf", {"vnf", D3DXRS_FLOAT4, 1, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 1, 0, 12, NULL}, 64},
2698 };
2699 
2701 {
2702  {SetInt},
2703  {SetBool},
2704  {SetFloat},
2705  {SetIntArray, 1, 0, 2},
2706  {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x40000000, 0x40400000, 0x40800000}},
2707  {SetBoolArray, 1, 0, 2},
2708  {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2709  {SetFloatArray, 0, 0, 2},
2710  {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 4, {0x40000000, 0x00000000, 0x40800000}},
2711  {SetValue, 1, 0, 11},
2712  {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 4, {0x40000000, 0x40400000, 0x40800000}},
2713  {SetVector, 0, 0, 0, 4, {0x40000000, 0x00000000, 0x40800000}},
2714  {SetVectorArray},
2715  {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 4, {0x40000000, 0x00000000, 0x40800000}},
2716  {SetMatrix, 0, 0, 0, 4, {0x40000000, 0x00000000, 0x40800000}},
2717  {SetMatrixArray},
2718  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000, 0x00000000, 0x40800000}},
2719  {SetMatrixTranspose, 0, 0, 0, 4, {0x40000000, 0x40c00000, 0x41200000}},
2721  {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000, 0x40c00000, 0x41200000}},
2723  {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000, 0x00000000, 0x40800000}},
2725  {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 4, {0x40000000, 0x40c00000, 0x41200000}},
2726 };
2727 
2728 /*
2729  * fxc.exe /Tvs_3_0
2730  */
2731 #if 0
2732 bool3 vab[2] = {1, 0, 1, 1, 0, 1};
2733 int3 van[2] = {70, 80, 90, 100, 110, 120};
2734 float3 vaf[2] = {55.1, 55.2, 55.3, 55.4, 55.5, 55.6};
2735 int3 vanf[2] = {130, 140, 150, 160, 170, 180};
2736 bool3 vabf[2] = {1, 1, 1, 1, 1, 1};
2737 float4 main(float4 pos : POSITION) : POSITION
2738 {
2739  float4 tmp = 0;
2740  int i;
2741  if (vab[1].z) for (i = 0; i < van[1].z; i++) tmp.x += pos.z * vaf[1].z * vanf[1].z;
2742  else for (i = 0; i < van[1].y; i++) tmp.y += pos.y * vaf[0].y * vabf[1].z;
2743  return tmp;
2744 }
2745 #endif
2747 {
2748 0xfffe0300, 0x0070fffe, 0x42415443, 0x0000001c, 0x0000018b, 0xfffe0300, 0x00000005, 0x0000001c,
2749 0x00000100, 0x00000184, 0x00000080, 0x00000000, 0x00000006, 0x00000084, 0x00000094, 0x000000ac,
2750 0x00040002, 0x00000002, 0x000000b4, 0x000000c4, 0x000000e4, 0x00000002, 0x00000002, 0x000000e8,
2751 0x000000f8, 0x00000118, 0x00000001, 0x00000006, 0x0000011c, 0x0000012c, 0x0000014c, 0x00020002,
2752 0x00000002, 0x00000154, 0x00000164, 0x00626176, 0x00010001, 0x00030001, 0x00000002, 0x00000000,
2753 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0x66626176, 0xababab00,
2754 0x00010001, 0x00030001, 0x00000002, 0x00000000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000,
2755 0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x00666176, 0x00030001, 0x00030001, 0x00000002,
2756 0x00000000, 0x425c6666, 0x425ccccd, 0x425d3333, 0x00000000, 0x425d999a, 0x425e0000, 0x425e6666,
2757 0x00000000, 0x006e6176, 0x00020001, 0x00030001, 0x00000002, 0x00000000, 0x00000046, 0x00000050,
2758 0x0000005a, 0x00000000, 0x00000064, 0x0000006e, 0x00000078, 0x00000000, 0x666e6176, 0xababab00,
2759 0x00020001, 0x00030001, 0x00000002, 0x00000000, 0x43020000, 0x430c0000, 0x43160000, 0x00000000,
2760 0x43200000, 0x432a0000, 0x43340000, 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73,
2761 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
2762 0x332e3235, 0x00313131, 0x05000051, 0xa00f0006, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2763 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x01000028, 0xe0e40805,
2764 0x03000005, 0x80010000, 0xa0aa0001, 0x90aa0000, 0x02000001, 0x80010001, 0xa0000006, 0x01000026,
2765 0xf0e40005, 0x04000004, 0x80010001, 0x80000000, 0xa0aa0003, 0x80000001, 0x00000027, 0x02000001,
2766 0x80020001, 0xa0000006, 0x0000002a, 0x03000005, 0x80010000, 0xa0550000, 0x90550000, 0x02000001,
2767 0x80020001, 0xa0000006, 0x01000026, 0xf0e40004, 0x04000004, 0x80020001, 0x80000000, 0xa0aa0005,
2768 0x80550001, 0x00000027, 0x02000001, 0x80010001, 0xa0000006, 0x0000002b, 0x02000001, 0xe0030000,
2769 0x80e40001, 0x02000001, 0xe00c0000, 0xa0000006, 0x0000ffff,
2770 };
2771 
2773 {
2774  {"vaf", {"vaf", D3DXRS_FLOAT4, 0, 2, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 62},
2775  {"vaf[0]", {"vaf", D3DXRS_FLOAT4, 0, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 62},
2776  {"vaf[1]", {"vaf", D3DXRS_FLOAT4, 1, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 66},
2777 };
2778 
2780 {
2781  {SetInt},
2782  {SetBool},
2783  {SetFloat},
2784  {SetIntArray, 1, 0, 2},
2785  {SetIntArray, 1, 3, 5, 4, {0x40000000, 0x40400000, 0x40800000}},
2786  {SetIntArray, 1, 6, REGISTER_OUTPUT_SIZE, 8,
2787  {0x40000000, 0x40400000, 0x40800000, 0x00000000, 0x40a00000, 0x00000000, 0x40e00000}},
2788  {SetBoolArray, 1, 0, 2},
2789  {SetBoolArray, 1, 3, 5, 4, {0x3f800000, 0x3f800000, 0x3f800000}},
2791  {0x3f800000, 0x3f800000, 0x3f800000, 0x00000000, 0x3f800000, 0x00000000, 0x3f800000}},
2792  {SetFloatArray, 0, 0, 2},
2793  {SetFloatArray, 0, 3, 5, 4, {0x40000123, 0x00000000, 0x40800123}},
2795  {0x40000123, 0x00000000, 0x40800123, 0x00000000, 0x40a00123, 0x40c00123, 0x40e00123}},
2796  {SetValue, 0, 0, 11},
2797  {SetValue, 0, 12, 23, 4, {0x40000123, 0x00000000, 0x40800123}},
2798  {SetValue, 0, 24, REGISTER_OUTPUT_SIZE * 4, 8,
2799  {0x40000123, 0x00000000, 0x40800123, 0x00000000, 0x40a00123, 0x40c00123, 0x40e00123}},
2800  {SetVector, 0, 0, 0, 4, {0x40000123, 0x00000000, 0x40800123}},
2801  {SetVectorArray},
2802  {SetVectorArray, 0, 1, 1, 4, {0x40000123, 0x00000000, 0x40800123}},
2803  {SetVectorArray, 0, 2, REGISTER_OUTPUT_SIZE / 4, 8,
2804  {0x40000123, 0x00000000, 0x40800123, 0x00000000, 0x40c00123, 0x40e00123, 0x41000123}},
2805  {SetMatrix, 0, 0, 0, 8,
2806  {0x40000123, 0x00000000, 0x40800123, 0x00000000, 0x40c00123, 0x40e00123, 0x41000123}},
2807  {SetMatrixArray},
2808  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
2809  {0x40000123, 0x00000000, 0x40800123, 0x00000000, 0x40c00123, 0x40e00123, 0x41000123}},
2810  {SetMatrixTranspose, 0, 0, 0, 8,
2811  {0x40000123, 0x40c00123, 0x41200123, 0x00000000, 0x00000000, 0x40e00123, 0x41300123}},
2814  {0x40000123, 0x40c00123, 0x41200123, 0x00000000, 0x00000000, 0x40e00123, 0x41300123}},
2817  {0x40000123, 0x00000000, 0x40800123, 0x00000000, 0x40c00123, 0x40e00123, 0x41000123}},
2820  {0x40000123, 0x40c00123, 0x41200123, 0x00000000, 0x00000000, 0x40e00123, 0x41300123}},
2821 };
2822 
2824 {
2825  {"van", {"van", D3DXRS_INT4, 0, 6, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 2, 0, 24, NULL}, 75},
2826  {"van[0]", {"van", D3DXRS_INT4, 0, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 1, 0, 12, NULL}, 75},
2827  {"van[1]", {"van", D3DXRS_INT4, 1, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 1, 0, 12, NULL}, 79},
2828 };
2829 
2831 {
2832  {SetInt},
2833  {SetBool},
2834  {SetFloat},
2835  {SetIntArray, 1, 0, 2},
2836  {SetIntArray, 1, 3, 5, 4, {0x00000002, 0x00000003, 0x00000004}},
2837  {SetIntArray, 1, 6, REGISTER_OUTPUT_SIZE, 8,
2838  {0x00000002, 0x00000003, 0x00000004, 0x00000000, 0x00000005, 0x00000000, 0x00000007}},
2839  {SetBoolArray, 1, 0, 2},
2840  {SetBoolArray, 1, 3, 5, 4, {0x00000001, 0x00000001, 0x00000001}},
2842  {0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001}},
2843  {SetFloatArray, 0, 0, 2},
2844  {SetFloatArray, 0, 3, 5, 4, {0x00000002, 0x00000000, 0x00000004}},
2846  {0x00000002, 0x00000000, 0x00000004, 0x00000000, 0x00000005, 0x00000006, 0x00000007}},
2847  {SetValue, 1, 0, 11},
2848  {SetValue, 1, 12, 23, 4, {0x00000002, 0x00000003, 0x00000004}},
2849  {SetValue, 1, 24, REGISTER_OUTPUT_SIZE * 4, 8,
2850  {0x00000002, 0x00000003, 0x00000004, 0x00000000, 0x00000005, 0x00000000, 0x00000007}},
2851  {SetVector, 0, 0, 0, 4, {0x00000002, 0x00000000, 0x00000004}},
2852  {SetVectorArray, 0, 0, 0},
2853  {SetVectorArray, 0, 1, 1, 4, {0x00000002, 0x00000000, 0x00000004}},
2854  {SetVectorArray, 0, 2, REGISTER_OUTPUT_SIZE / 4, 8,
2855  {0x00000002, 0x00000000, 0x00000004, 0x00000000, 0x00000006, 0x00000007, 0x00000008}},
2856  {SetMatrix, 0, 0, 0, 8,
2857  {0x00000002, 0x00000000, 0x00000004, 0x00000000, 0x00000006, 0x00000007, 0x00000008}},
2858  {SetMatrixArray},
2859  {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
2860  {0x00000002, 0x00000000, 0x00000004, 0x00000000, 0x00000006, 0x00000007, 0x00000008}},
2861  {SetMatrixTranspose, 0, 0, 0, 8,
2862  {0x00000002, 0x00000006, 0x0000000a, 0x00000000, 0x00000000, 0x00000007, 0x0000000b}},
2865  {0x00000002, 0x00000006, 0x0000000a, 0x00000000, 0x00000000, 0x00000007, 0x0000000b}},
2868  {0x00000002, 0x00000000, 0x00000004, 0x00000000, 0x00000006, 0x00000007, 0x00000008}},
2871  {0x00000002, 0x00000006, 0x0000000a, 0x00000000, 0x00000000, 0x00000007, 0x0000000b}},
2872 };
2873 
2875 {
2876  {"vab", {"vab", D3DXRS_BOOL, 0, 6, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 2, 0, 24, NULL}, 37},
2877  {"vab[0]", {"vab", D3DXRS_BOOL, 0, 3, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 1, 0, 12, NULL}, 37},
2878  {"vab[1]", {"vab", D3DXRS_BOOL, 3, 3, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 1, 0, 12, NULL}, 40},
2879 };
2880 
2882 {
2883  {SetInt},
2884  {SetBool},
2885  {SetFloat},
2886  {SetIntArray, 1, 0, 2},
2887  {SetIntArray, 1, 3, 5, 3, {0x00000001, 0x00000001, 0x00000001}},
2888  {SetIntArray, 1, 6, REGISTER_OUTPUT_SIZE, 6,
2889