Release 1.5.29.
[wine] / dlls / d3dx9_36 / tests / shader.c
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 static const DWORD shader_zero[] = {0x0};
24
25 static const DWORD shader_invalid[] = {0xeeee0100};
26
27 static const DWORD shader_empty[] = {0xfffeffff, 0x0000ffff};
28
29 static const DWORD simple_vs[] = {
30     0xfffe0101,                                                             /* vs_1_1                       */
31     0x0000001f, 0x80000000, 0x900f0000,                                     /* dcl_position0 v0             */
32     0x00000009, 0xc0010000, 0x90e40000, 0xa0e40000,                         /* dp4 oPos.x, v0, c0           */
33     0x00000009, 0xc0020000, 0x90e40000, 0xa0e40001,                         /* dp4 oPos.y, v0, c1           */
34     0x00000009, 0xc0040000, 0x90e40000, 0xa0e40002,                         /* dp4 oPos.z, v0, c2           */
35     0x00000009, 0xc0080000, 0x90e40000, 0xa0e40003,                         /* dp4 oPos.w, v0, c3           */
36     0x0000ffff};                                                            /* END                          */
37
38 static const DWORD simple_ps[] = {
39     0xffff0101,                                                             /* ps_1_1                       */
40     0x00000051, 0xa00f0001, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, /* def c1 = 1.0, 0.0, 0.0, 0.0  */
41     0x00000042, 0xb00f0000,                                                 /* tex t0                       */
42     0x00000008, 0x800f0000, 0xa0e40001, 0xa0e40000,                         /* dp3 r0, c1, c0               */
43     0x00000005, 0x800f0000, 0x90e40000, 0x80e40000,                         /* mul r0, v0, r0               */
44     0x00000005, 0x800f0000, 0xb0e40000, 0x80e40000,                         /* mul r0, t0, r0               */
45     0x0000ffff};                                                            /* END                          */
46
47 #define FCC_TEXT MAKEFOURCC('T','E','X','T')
48 #define FCC_CTAB MAKEFOURCC('C','T','A','B')
49
50 static const DWORD shader_with_ctab[] = {
51     0xfffe0300,                                                             /* vs_3_0                       */
52     0x0002fffe, FCC_TEXT,   0x00000000,                                     /* TEXT comment                 */
53     0x0008fffe, FCC_CTAB,   0x0000001c, 0x00000010, 0xfffe0300, 0x00000000, /* CTAB comment                 */
54                 0x00000000, 0x00000000, 0x00000000,
55     0x0004fffe, FCC_TEXT,   0x00000000, 0x00000000, 0x00000000,             /* TEXT comment                 */
56     0x0000ffff};                                                            /* END                          */
57
58 static const DWORD shader_with_invalid_ctab[] = {
59     0xfffe0300,                                                             /* vs_3_0                       */
60     0x0005fffe, FCC_CTAB,                                                   /* CTAB comment                 */
61                 0x0000001c, 0x000000a9, 0xfffe0300,
62                 0x00000000, 0x00000000,
63     0x0000ffff};                                                            /* END                          */
64
65 static const DWORD shader_with_ctab_constants[] = {
66     0xfffe0300,                                                             /* vs_3_0                       */
67     0x002efffe, FCC_CTAB,                                                   /* CTAB comment                 */
68     0x0000001c, 0x000000a4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header                       */
69     0x0000009c,
70     0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000,             /* Constant 1 desc              */
71     0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000,             /* Constant 2 desc              */
72     0x00000090, 0x00040002, 0x00000003, 0x00000080, 0x00000000,             /* Constant 3 desc              */
73     0x736e6f43, 0x746e6174, 0xabab0031,                                     /* Constant 1 name string       */
74     0x00030001, 0x00040001, 0x00000001, 0x00000000,                         /* Constant 1 type desc         */
75     0x736e6f43, 0x746e6174, 0xabab0032,                                     /* Constant 2 name string       */
76     0x00030003, 0x00040004, 0x00000001, 0x00000000,                         /* Constant 2 & 3 type desc     */
77     0x736e6f43, 0x746e6174, 0xabab0033,                                     /* Constant 3 name string       */
78     0x335f7376, 0xab00305f,                                                 /* Target name string           */
79     0x656e6957, 0x6f727020, 0x7463656a, 0xababab00,                         /* Creator name string          */
80     0x0000ffff};                                                            /* END                          */
81
82 static const DWORD ctab_basic[] = {
83     0xfffe0300,                                                             /* vs_3_0                       */
84     0x0040fffe, FCC_CTAB,                                                   /* CTAB comment                 */
85     0x0000001c, 0x000000ec, 0xfffe0300, 0x00000005, 0x0000001c, 0x20008100, /* Header                       */
86     0x000000e4,
87     0x00000080, 0x00060002, 0x00000001, 0x00000084, 0x00000000,             /* Constant 1 desc (f)          */
88     0x00000094, 0x00070002, 0x00000001, 0x00000098, 0x00000000,             /* Constant 2 desc (f4)         */
89     0x000000A8, 0x00040002, 0x00000001, 0x000000AC, 0x00000000,             /* Constant 3 desc (i)          */
90     0x000000BC, 0x00050002, 0x00000001, 0x000000C0, 0x00000000,             /* Constant 4 desc (i4)         */
91     0x000000D0, 0x00000002, 0x00000004, 0x000000D4, 0x00000000,             /* Constant 5 desc (mvp)        */
92     0xabab0066, 0x00030000, 0x00010001, 0x00000001, 0x00000000,             /* Constant 1 name/type desc    */
93     0xab003466, 0x00030001, 0x00040001, 0x00000001, 0x00000000,             /* Constant 2 name/type desc    */
94     0xabab0069, 0x00020000, 0x00010001, 0x00000001, 0x00000000,             /* Constant 3 name/type desc    */
95     0xab003469, 0x00020001, 0x00040001, 0x00000001, 0x00000000,             /* Constant 4 name/type desc    */
96     0x0070766d, 0x00030003, 0x00040004, 0x00000001, 0x00000000,             /* Constant 5 name/type desc    */
97     0x335f7376, 0xab00305f,                                                 /* Target name string           */
98     0x656e6957, 0x6f727020, 0x7463656a, 0xababab00,                         /* Creator name string          */
99     0x0000ffff};                                                            /* END                          */
100
101 static const D3DXCONSTANT_DESC ctab_basic_expected[] = {
102     {"mvp", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL},
103     {"i",   D3DXRS_FLOAT4, 4, 1, D3DXPC_SCALAR,         D3DXPT_INT,   1, 1, 1, 0,  4, NULL},
104     {"i4",  D3DXRS_FLOAT4, 5, 1, D3DXPC_VECTOR,         D3DXPT_INT,   1, 4, 1, 0, 16, NULL},
105     {"f",   D3DXRS_FLOAT4, 6, 1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL},
106     {"f4",  D3DXRS_FLOAT4, 7, 1, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1, 4, 1, 0, 16, NULL}};
107
108 static const DWORD ctab_matrices[] = {
109     0xfffe0300,                                                             /* vs_3_0                       */
110     0x0032fffe, FCC_CTAB,                                                   /* CTAB comment                 */
111     0x0000001c, 0x000000b4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header                       */
112     0x000000ac,
113     0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000,             /* Constant 1 desc (fmatrix3x1) */
114     0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000,             /* Constant 2 desc (fmatrix4x4) */
115     0x00000090, 0x00040002, 0x00000003, 0x0000009c, 0x00000000,             /* Constant 3 desc (imatrix2x3) */
116     0x74616D66, 0x33786972, 0xab003178,                                     /* Constant 1 name              */
117     0x00030003, 0x00010003, 0x00000001, 0x00000000,                         /* Constant 1 type desc         */
118     0x74616D66, 0x34786972, 0xab003478,                                     /* Constant 2 name              */
119     0x00030003, 0x00040004, 0x00000001, 0x00000000,                         /* Constant 2 type desc         */
120     0x74616D69, 0x32786972, 0xab003378,                                     /* Constant 3 name              */
121     0x00020002, 0x00030002, 0x00000001, 0x00000000,                         /* Constant 3 type desc         */
122     0x335f7376, 0xab00305f,                                                 /* Target name string           */
123     0x656e6957, 0x6f727020, 0x7463656a, 0xababab00,                         /* Creator name string          */
124     0x0000ffff};                                                            /* END                          */
125
126 static const D3DXCONSTANT_DESC ctab_matrices_expected[] = {
127     {"fmatrix4x4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL},
128     {"imatrix2x3", D3DXRS_FLOAT4, 4, 3, D3DXPC_MATRIX_ROWS,    D3DXPT_INT,   2, 3, 1, 0, 24, NULL},
129     {"fmatrix3x1", D3DXRS_FLOAT4, 7, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}};
130
131 static const DWORD ctab_matrices2[] = {
132     0xfffe0200,                                                             /* vs_2_0                        */
133     0x0058fffe, FCC_CTAB,                                                   /* CTAB comment                  */
134     0x0000001c, 0x0000012b, 0xfffe0200, 0x00000006, 0x0000001c, 0x00000100, /* Header                        */
135     0x00000124,
136     0x00000094, 0x00070002, 0x00000003, 0x0000009c, 0x00000000,             /* Constant 1 desc (c2x3)        */
137     0x000000ac, 0x000d0002, 0x00000002, 0x000000b4, 0x00000000,             /* Constant 2 desc (c3x2)        */
138     0x000000c4, 0x000a0002, 0x00000003, 0x000000cc, 0x00000000,             /* Constant 3 desc (c3x3)        */
139     0x000000dc, 0x000f0002, 0x00000002, 0x000000e4, 0x00000000,             /* Constant 4 desc (r2x3)        */
140     0x000000f4, 0x00040002, 0x00000003, 0x000000fc, 0x00000000,             /* Constant 5 desc (r3x2)        */
141     0x0000010c, 0x00000002, 0x00000004, 0x00000114, 0x00000000,             /* Constant 6 desc (r4x4)        */
142     0x33783263, 0xababab00,                                                 /* Constant 1 name               */
143     0x00030003, 0x00030002, 0x00000001, 0x00000000,                         /* Constant 1 type desc          */
144     0x32783363, 0xababab00,                                                 /* Constant 2 name               */
145     0x00030003, 0x00020003, 0x00000001, 0x00000000,                         /* Constant 2 type desc          */
146     0x33783363, 0xababab00,                                                 /* Constant 3 name               */
147     0x00030003, 0x00030003, 0x00000001, 0x00000000,                         /* Constant 3 type desc          */
148     0x33783272, 0xababab00,                                                 /* Constant 4 name               */
149     0x00030002, 0x00030002, 0x00000001, 0x00000000,                         /* Constant 4 type desc          */
150     0x32783372, 0xababab00,                                                 /* Constant 5 name               */
151     0x00030002, 0x00020003, 0x00000001, 0x00000000,                         /* Constant 5 type desc          */
152     0x34783472, 0xababab00,                                                 /* Constant 6 name               */
153     0x00030002, 0x00040004, 0x00000001, 0x00000000,                         /* Constant 6 type desc          */
154     0x325f7376, 0x4100305f, 0x41414141, 0x00414141,                         /* Target and Creator name       */
155     0x0000ffff};                                                            /* END                           */
156
157 static const D3DXCONSTANT_DESC ctab_matrices2_expected[] = {
158     {"c2x3", D3DXRS_FLOAT4,  7, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL},
159     {"c3x2", D3DXRS_FLOAT4, 13, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL},
160     {"c3x3", D3DXRS_FLOAT4, 10, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 3, 1, 0, 36, NULL},
161     {"r2x3", D3DXRS_FLOAT4, 15, 2, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL},
162     {"r3x2", D3DXRS_FLOAT4,  4, 3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL},
163     {"r4x4", D3DXRS_FLOAT4,  0, 4, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL}};
164
165 static const DWORD ctab_arrays[] = {
166     0xfffe0300,                                                             /* vs_3_0                       */
167     0x0052fffe, FCC_CTAB,                                                   /* CTAB comment                 */
168     0x0000001c, 0x0000013c, 0xfffe0300, 0x00000006, 0x0000001c, 0x20008100, /* Header                       */
169     0x00000134,
170     0x00000094, 0x000E0002, 0x00000002, 0x0000009c, 0x00000000,             /* Constant 1 desc (barray)     */
171     0x000000ac, 0x00100002, 0x00000002, 0x000000b8, 0x00000000,             /* Constant 2 desc (bvecarray)  */
172     0x000000c8, 0x00080002, 0x00000004, 0x000000d0, 0x00000000,             /* Constant 3 desc (farray)     */
173     0x000000e0, 0x00000002, 0x00000008, 0x000000ec, 0x00000000,             /* Constant 4 desc (fmtxarray)  */
174     0x000000fc, 0x000C0002, 0x00000002, 0x00000108, 0x00000000,             /* Constant 5 desc (fvecarray)  */
175     0x00000118, 0x00120002, 0x00000001, 0x00000124, 0x00000000,             /* Constant 6 desc (ivecarray)  */
176     0x72726162, 0xab007961,                                                 /* Constant 1 name              */
177     0x00010000, 0x00010001, 0x00000002, 0x00000000,                         /* Constant 1 type desc         */
178     0x63657662, 0x61727261, 0xabab0079,                                     /* Constant 2 name              */
179     0x00010001, 0x00030001, 0x00000003, 0x00000000,                         /* Constant 2 type desc         */
180     0x72726166, 0xab007961,                                                 /* Constant 3 name              */
181     0x00030000, 0x00010001, 0x00000004, 0x00000000,                         /* constant 3 type desc         */
182     0x78746d66, 0x61727261, 0xabab0079,                                     /* Constant 4 name              */
183     0x00030002, 0x00040004, 0x00000002, 0x00000000,                         /* Constant 4 type desc         */
184     0x63657666, 0x61727261, 0xabab0079,                                     /* Constant 5 name              */
185     0x00030001, 0x00040001, 0x00000002, 0x00000000,                         /* Constant 5 type desc         */
186     0x63657669, 0x61727261, 0xabab0079,                                     /* Constant 6 name              */
187     0x00020001, 0x00040001, 0x00000001, 0x00000000,                         /* Constant 6 type desc         */
188     0x335f7376, 0xab00305f,                                                 /* Target name string           */
189     0x656e6957, 0x6f727020, 0x7463656a, 0xababab00,                         /* Creator name string          */
190     0x0000ffff};                                                            /* END                          */
191
192 static const D3DXCONSTANT_DESC ctab_arrays_expected[] = {
193     {"fmtxarray", D3DXRS_FLOAT4,  0, 8, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 128, NULL},
194     {"farray",    D3DXRS_FLOAT4,  8, 4, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 4, 0,  16, NULL},
195     {"fvecarray", D3DXRS_FLOAT4, 12, 2, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 2, 0,  32, NULL},
196     {"barray",    D3DXRS_FLOAT4, 14, 2, D3DXPC_SCALAR,      D3DXPT_BOOL,  1, 1, 2, 0,   8, NULL},
197     {"bvecarray", D3DXRS_FLOAT4, 16, 2, D3DXPC_VECTOR,      D3DXPT_BOOL,  1, 3, 3, 0,  36, NULL},
198     {"ivecarray", D3DXRS_FLOAT4, 18, 1, D3DXPC_VECTOR,      D3DXPT_INT,   1, 4, 1, 0,  16, NULL}};
199
200 static const DWORD ctab_with_default_values[] = {
201     0xfffe0200,                                                 /* vs_2_0 */
202     0x007bfffe, FCC_CTAB,                                       /* CTAB comment */
203     0x0000001c, 0x000001b7, 0xfffe0200, 0x00000005, 0x0000001c, /* header */
204     0x00000100, 0x000001b0,
205     0x00000080, 0x00080002, 0x00000003, 0x00000084, 0x00000094, /* constant 1 desc (arr) */
206     0x000000c4, 0x000c0002, 0x00000001, 0x000000c8, 0x000000d8, /* constant 2 desc (flt) */
207     0x000000e8, 0x00040002, 0x00000004, 0x000000f0, 0x00000100, /* constant 3 desc (mat3) */
208     0x00000140, 0x00000002, 0x00000004, 0x000000f0, 0x00000148, /* constant 4 desc (mat4) */
209     0x00000188, 0x000b0002, 0x00000001, 0x00000190, 0x000001a0, /* constant 5 desc (vec4) */
210     0x00727261,                                                 /* constant 1 name */
211     0x00030000, 0x00010001, 0x00000003, 0x00000000,             /* constant 1 type desc */
212     0x42c80000, 0x00000000, 0x00000000, 0x00000000,             /* constant 1 default value */
213     0x43480000, 0x00000000, 0x00000000, 0x00000000,
214     0x43960000, 0x00000000, 0x00000000, 0x00000000,
215     0x00746c66,                                                 /* constant 2 name */
216     0x00030000, 0x00010001, 0x00000001, 0x00000000,             /* constant 2 type desc */
217     0x411fd70a, 0x00000000, 0x00000000, 0x00000000,             /* constant 2 default value */
218     0x3374616d,                                                 /* constant 3 name */
219     0xababab00,
220     0x00030003, 0x00040004, 0x00000001, 0x00000000,             /* constant 3 & 4 type desc */
221     0x41300000, 0x425c0000, 0x42c60000, 0x44a42000,             /* constat 3 default value */
222     0x41b00000, 0x42840000, 0x447c8000, 0x44b0c000,
223     0x42040000, 0x429a0000, 0x448ae000, 0x44bd6000,
224     0x42300000, 0x42b00000, 0x44978000, 0x44ca0000,
225     0x3474616d,                                                 /* constant 4 name */
226     0xababab00,
227     0x3f800000, 0x40a00000, 0x41100000, 0x41500000,             /* constant 4 default value */
228     0x40000000, 0x40c00000, 0x41200000, 0x41600000,
229     0x40400000, 0x40e00000, 0x41300000, 0x41700000,
230     0x40800000, 0x41000000, 0x41400000, 0x41800000,
231     0x34636576,                                                 /* constant 5 name */
232     0xababab00,
233     0x00030001, 0x00040001, 0x00000001, 0x00000000,             /* constant 5 type desc */
234     0x41200000, 0x41a00000, 0x41f00000, 0x42200000,             /* constant 5 default value */
235     0x325f7376, 0x4d004141, 0x41414141, 0x00000000,             /* target & creator string */
236     0x0000ffff};                                                /* END */
237
238 static const float mat4_default_value[] = {1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16};
239 static const float mat3_default_value[] = {11, 55, 99, 1313, 22, 66, 1010, 1414, 33, 77, 1111, 1515, 44, 88, 1212, 1616};
240 static const float arr_default_value[] = {100, 0, 0, 0, 200, 0, 0, 0, 300, 0, 0, 0};
241 static const float vec4_default_value[] = {10, 20, 30, 40};
242 static const float flt_default_value[] = {9.99, 0, 0, 0};
243
244 static const D3DXCONSTANT_DESC ctab_with_default_values_expected[] = {
245     {"mat4", D3DXRS_FLOAT4,  0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, mat4_default_value},
246     {"mat3", D3DXRS_FLOAT4,  4, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, mat3_default_value},
247     {"arr",  D3DXRS_FLOAT4,  8, 3, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1, 1, 3, 0, 12, arr_default_value},
248     {"vec4", D3DXRS_FLOAT4, 11, 1, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1, 4, 1, 0, 16, vec4_default_value},
249     {"flt",  D3DXRS_FLOAT4, 12, 1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1, 1, 1, 0,  4, flt_default_value}};
250
251 static const DWORD ctab_samplers[] = {
252     0xfffe0300,                                                             /* vs_3_0                        */
253     0x0032fffe, FCC_CTAB,                                                   /* CTAB comment                  */
254     0x0000001c, 0x000000b4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header                        */
255     0x000000ac,
256     0x00000058, 0x00020002, 0x00000001, 0x00000064, 0x00000000,             /* Constant 1 desc (notsampler)  */
257     0x00000074, 0x00000003, 0x00000001, 0x00000080, 0x00000000,             /* Constant 2 desc (sampler1)    */
258     0x00000090, 0x00030003, 0x00000001, 0x0000009c, 0x00000000,             /* Constant 3 desc (sampler2)    */
259     0x73746f6e, 0x6c706d61, 0xab007265,                                     /* Constant 1 name               */
260     0x00030001, 0x00040001, 0x00000001, 0x00000000,                         /* Constant 1 type desc          */
261     0x706d6173, 0x3172656c, 0xababab00,                                     /* Constant 2 name               */
262     0x000c0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 2 type desc          */
263     0x706d6173, 0x3272656c, 0xababab00,                                     /* Constant 3 name               */
264     0x000d0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 3 type desc          */
265     0x335f7376, 0xab00305f,                                                 /* Target name string            */
266     0x656e6957, 0x6f727020, 0x7463656a, 0xababab00,                         /* Creator name string           */
267     0x0000ffff};                                                            /* END                           */
268
269 static const D3DXCONSTANT_DESC ctab_samplers_expected[] = {
270     {"sampler1",   D3DXRS_SAMPLER, 0, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4,  NULL},
271     {"sampler2",   D3DXRS_SAMPLER, 3, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER3D, 1, 1, 1, 0, 4,  NULL},
272     {"notsampler", D3DXRS_FLOAT4,  2, 1, D3DXPC_VECTOR, D3DXPT_FLOAT,     1, 4, 1, 0, 16, NULL}};
273
274 static void test_get_shader_size(void)
275 {
276     UINT shader_size, expected;
277
278     shader_size = D3DXGetShaderSize(simple_vs);
279     expected = sizeof(simple_vs);
280     ok(shader_size == expected, "Got shader size %u, expected %u\n", shader_size, expected);
281
282     shader_size = D3DXGetShaderSize(simple_ps);
283     expected = sizeof(simple_ps);
284     ok(shader_size == expected, "Got shader size %u, expected %u\n", shader_size, expected);
285
286     shader_size = D3DXGetShaderSize(NULL);
287     ok(shader_size == 0, "Got shader size %u, expected 0\n", shader_size);
288 }
289
290 static void test_get_shader_version(void)
291 {
292     DWORD shader_version;
293
294     shader_version = D3DXGetShaderVersion(simple_vs);
295     ok(shader_version == D3DVS_VERSION(1, 1), "Got shader version 0x%08x, expected 0x%08x\n",
296             shader_version, D3DVS_VERSION(1, 1));
297
298     shader_version = D3DXGetShaderVersion(simple_ps);
299     ok(shader_version == D3DPS_VERSION(1, 1), "Got shader version 0x%08x, expected 0x%08x\n",
300             shader_version, D3DPS_VERSION(1, 1));
301
302     shader_version = D3DXGetShaderVersion(NULL);
303     ok(shader_version == 0, "Got shader version 0x%08x, expected 0\n", shader_version);
304 }
305
306 static void test_find_shader_comment(void)
307 {
308     HRESULT hr;
309     LPCVOID data = (LPVOID)0xdeadbeef;
310     UINT size = 100;
311
312     hr = D3DXFindShaderComment(NULL, MAKEFOURCC('C','T','A','B'), &data, &size);
313     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
314     ok(!data, "Got %p, expected NULL\n", data);
315     ok(!size, "Got %u, expected 0\n", size);
316
317     hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), NULL, &size);
318     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
319     ok(size == 28, "Got %u, expected 28\n", size);
320
321     hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, NULL);
322     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
323     ok(data == (LPCVOID)(shader_with_ctab + 6), "Got result %p, expected %p\n", data, shader_with_ctab + 6);
324
325     hr = D3DXFindShaderComment(shader_with_ctab, 0, &data, &size);
326     ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
327     ok(!data, "Got %p, expected NULL\n", data);
328     ok(!size, "Got %u, expected 0\n", size);
329
330     hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('X','X','X','X'), &data, &size);
331     ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
332     ok(!data, "Got %p, expected NULL\n", data);
333     ok(!size, "Got %u, expected 0\n", size);
334
335     hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, &size);
336     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
337     ok(data == (LPCVOID)(shader_with_ctab + 6), "Got result %p, expected %p\n", data, shader_with_ctab + 6);
338     ok(size == 28, "Got result %d, expected 28\n", size);
339
340     hr = D3DXFindShaderComment(shader_zero, MAKEFOURCC('C','T','A','B'), &data, &size);
341     ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
342     ok(!data, "Got %p, expected NULL\n", data);
343     ok(!size, "Got %u, expected 0\n", size);
344
345     hr = D3DXFindShaderComment(shader_invalid, MAKEFOURCC('C','T','A','B'), &data, &size);
346     ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
347     ok(!data, "Got %p, expected NULL\n", data);
348     ok(!size, "Got %u, expected 0\n", size);
349
350     hr = D3DXFindShaderComment(shader_empty, MAKEFOURCC('C','T','A','B'), &data, &size);
351     ok(hr == S_FALSE, "Got result %x, expected %x (S_FALSE)\n", hr, S_FALSE);
352     ok(!data, "Got %p, expected NULL\n", data);
353     ok(!size, "Got %u, expected 0\n", size);
354 }
355
356 static void test_get_shader_constant_table_ex(void)
357 {
358     ID3DXConstantTable *constant_table;
359     HRESULT hr;
360     LPVOID data;
361     DWORD size;
362     D3DXCONSTANTTABLE_DESC desc;
363
364     constant_table = (ID3DXConstantTable *)0xdeadbeef;
365     hr = D3DXGetShaderConstantTableEx(NULL, 0, &constant_table);
366     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
367     ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
368
369     constant_table = (ID3DXConstantTable *)0xdeadbeef;
370     hr = D3DXGetShaderConstantTableEx(shader_zero, 0, &constant_table);
371     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
372     ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
373
374     constant_table = (ID3DXConstantTable *)0xdeadbeef;
375     hr = D3DXGetShaderConstantTableEx(shader_invalid, 0, &constant_table);
376     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
377     ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
378
379     constant_table = (ID3DXConstantTable *)0xdeadbeef;
380     hr = D3DXGetShaderConstantTableEx(shader_empty, 0, &constant_table);
381     ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
382     ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
383
384     /* No CTAB data */
385     constant_table = (ID3DXConstantTable *)0xdeadbeef;
386     hr = D3DXGetShaderConstantTableEx(simple_ps, 0, &constant_table);
387     ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
388     ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
389
390     /* With invalid CTAB data */
391     hr = D3DXGetShaderConstantTableEx(shader_with_invalid_ctab, 0, &constant_table);
392     ok(hr == D3DXERR_INVALIDDATA || broken(hr == D3D_OK), /* winxp 64-bit, w2k3 64-bit */
393        "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
394     if (constant_table) ID3DXConstantTable_Release(constant_table);
395
396     hr = D3DXGetShaderConstantTableEx(shader_with_ctab, 0, &constant_table);
397     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
398     ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
399
400     if (constant_table)
401     {
402         size = ID3DXConstantTable_GetBufferSize(constant_table);
403         ok(size == 28, "Got result %x, expected 28\n", size);
404
405         data = ID3DXConstantTable_GetBufferPointer(constant_table);
406         ok(!memcmp(data, shader_with_ctab + 6, size), "Retrieved wrong CTAB data\n");
407
408         hr = ID3DXConstantTable_GetDesc(constant_table, NULL);
409         ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
410
411         hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
412         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
413         ok(desc.Creator == (LPCSTR)data + 0x10, "Got result %p, expected %p\n", desc.Creator, (LPCSTR)data + 0x10);
414         ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
415         ok(desc.Constants == 0, "Got result %x, expected 0\n", desc.Constants);
416
417         ID3DXConstantTable_Release(constant_table);
418     }
419
420     hr = D3DXGetShaderConstantTableEx(shader_with_ctab_constants, 0, &constant_table);
421     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
422     ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
423
424     if (constant_table)
425     {
426         D3DXHANDLE constant;
427         D3DXCONSTANT_DESC constant_desc;
428         D3DXCONSTANT_DESC constant_desc_save;
429         UINT nb;
430
431         /* Test GetDesc */
432         hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
433         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
434         ok(!strcmp(desc.Creator, "Wine project"), "Got result '%s', expected 'Wine project'\n", desc.Creator);
435         ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
436         ok(desc.Constants == 3, "Got result %x, expected 3\n", desc.Constants);
437
438         /* Test GetConstant */
439         constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
440         ok(constant != NULL, "No constant found\n");
441         hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
442         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
443         ok(!strcmp(constant_desc.Name, "Constant1"), "Got result '%s', expected 'Constant1'\n",
444             constant_desc.Name);
445         ok(constant_desc.Class == D3DXPC_VECTOR, "Got result %x, expected %u (D3DXPC_VECTOR)\n",
446             constant_desc.Class, D3DXPC_VECTOR);
447         ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
448             constant_desc.Type, D3DXPT_FLOAT);
449         ok(constant_desc.Rows == 1, "Got result %x, expected 1\n", constant_desc.Rows);
450         ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
451
452         constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 1);
453         ok(constant != NULL, "No constant found\n");
454         hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
455         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
456         ok(!strcmp(constant_desc.Name, "Constant2"), "Got result '%s', expected 'Constant2'\n",
457             constant_desc.Name);
458         ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
459             constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
460         ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
461             constant_desc.Type, D3DXPT_FLOAT);
462         ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
463         ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
464
465         constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 2);
466         ok(constant != NULL, "No constant found\n");
467         hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
468         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
469         ok(!strcmp(constant_desc.Name, "Constant3"), "Got result '%s', expected 'Constant3'\n",
470             constant_desc.Name);
471         ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
472             constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
473         ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
474             constant_desc.Type, D3DXPT_FLOAT);
475         ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
476         ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
477         constant_desc_save = constant_desc; /* For GetConstantDesc test */
478
479         constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 3);
480         ok(constant == NULL, "Got result %p, expected NULL\n", constant);
481
482         /* Test GetConstantByName */
483         constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant unknown");
484         ok(constant == NULL, "Got result %p, expected NULL\n", constant);
485         constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant3");
486         ok(constant != NULL, "No constant found\n");
487         hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
488         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
489         ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
490
491         /* Test GetConstantDesc */
492         constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
493         ok(constant != NULL, "No constant found\n");
494         hr = ID3DXConstantTable_GetConstantDesc(constant_table, NULL, &constant_desc, &nb);
495         ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
496         hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, NULL, &nb);
497         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
498         hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, NULL);
499         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
500         hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant unknow", &constant_desc, &nb);
501         ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
502         hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant3", &constant_desc, &nb);
503         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
504         ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
505
506         ID3DXConstantTable_Release(constant_table);
507     }
508 }
509
510 static void test_constant_table(const char *test_name, const DWORD *ctable_fn,
511         const D3DXCONSTANT_DESC *expecteds, UINT count)
512 {
513     UINT i;
514     ID3DXConstantTable *ctable;
515
516     HRESULT res;
517
518     /* Get the constant table from the shader itself */
519     res = D3DXGetShaderConstantTable(ctable_fn, &ctable);
520     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on %s: got %08x\n", test_name, res);
521
522     for (i = 0; i < count; i++)
523     {
524         const D3DXCONSTANT_DESC *expected = &expecteds[i];
525         D3DXHANDLE const_handle;
526         D3DXCONSTANT_DESC actual;
527         UINT pCount = 1;
528
529         const_handle = ID3DXConstantTable_GetConstantByName(ctable, NULL, expected->Name);
530
531         res = ID3DXConstantTable_GetConstantDesc(ctable, const_handle, &actual, &pCount);
532         ok(SUCCEEDED(res), "%s in %s: ID3DXConstantTable_GetConstantDesc returned %08x\n", expected->Name,
533                 test_name, res);
534         ok(pCount == 1, "%s in %s: Got more or less descriptions: %d\n", expected->Name, test_name, pCount);
535
536         ok(strcmp(actual.Name, expected->Name) == 0,
537            "%s in %s: Got different names: Got %s, expected %s\n", expected->Name,
538            test_name, actual.Name, expected->Name);
539         ok(actual.RegisterSet == expected->RegisterSet,
540            "%s in %s: Got different register sets: Got %d, expected %d\n",
541            expected->Name, test_name, actual.RegisterSet, expected->RegisterSet);
542         ok(actual.RegisterIndex == expected->RegisterIndex,
543            "%s in %s: Got different register indices: Got %d, expected %d\n",
544            expected->Name, test_name, actual.RegisterIndex, expected->RegisterIndex);
545         ok(actual.RegisterCount == expected->RegisterCount,
546            "%s in %s: Got different register counts: Got %d, expected %d\n",
547            expected->Name, test_name, actual.RegisterCount, expected->RegisterCount);
548         ok(actual.Class == expected->Class,
549            "%s in %s: Got different classes: Got %d, expected %d\n", expected->Name,
550            test_name, actual.Class, expected->Class);
551         ok(actual.Type == expected->Type,
552            "%s in %s: Got different types: Got %d, expected %d\n", expected->Name,
553            test_name, actual.Type, expected->Type);
554         ok(actual.Rows == expected->Rows && actual.Columns == expected->Columns,
555            "%s in %s: Got different dimensions: Got (%d, %d), expected (%d, %d)\n",
556            expected->Name, test_name, actual.Rows, actual.Columns, expected->Rows,
557            expected->Columns);
558         ok(actual.Elements == expected->Elements,
559            "%s in %s: Got different element count: Got %d, expected %d\n",
560            expected->Name, test_name, actual.Elements, expected->Elements);
561         ok(actual.StructMembers == expected->StructMembers,
562            "%s in %s: Got different struct member count: Got %d, expected %d\n",
563            expected->Name, test_name, actual.StructMembers, expected->StructMembers);
564         ok(actual.Bytes == expected->Bytes,
565            "%s in %s: Got different byte count: Got %d, expected %d\n",
566            expected->Name, test_name, actual.Bytes, expected->Bytes);
567
568         if (!expected->DefaultValue)
569         {
570             ok(actual.DefaultValue == NULL,
571                 "%s in %s: Got different default value: expected NULL\n",
572                 expected->Name, test_name);
573         }
574         else
575         {
576             ok(actual.DefaultValue != NULL,
577                 "%s in %s: Got different default value: expected non-NULL\n",
578                 expected->Name, test_name);
579             ok(memcmp(actual.DefaultValue, expected->DefaultValue, expected->Bytes) == 0,
580                 "%s in %s: Got different default value\n", expected->Name, test_name);
581         }
582     }
583
584     /* Finally, release the constant table */
585     ID3DXConstantTable_Release(ctable);
586 }
587
588 static void test_constant_tables(void)
589 {
590     test_constant_table("test_basic", ctab_basic, ctab_basic_expected,
591             sizeof(ctab_basic_expected)/sizeof(*ctab_basic_expected));
592     test_constant_table("test_matrices", ctab_matrices, ctab_matrices_expected,
593             sizeof(ctab_matrices_expected)/sizeof(*ctab_matrices_expected));
594     test_constant_table("test_matrices2", ctab_matrices2, ctab_matrices2_expected,
595             sizeof(ctab_matrices2_expected)/sizeof(*ctab_matrices2_expected));
596     test_constant_table("test_arrays", ctab_arrays, ctab_arrays_expected,
597             sizeof(ctab_arrays_expected)/sizeof(*ctab_arrays_expected));
598     test_constant_table("test_default_values", ctab_with_default_values, ctab_with_default_values_expected,
599             sizeof(ctab_with_default_values_expected)/sizeof(*ctab_with_default_values_expected));
600     test_constant_table("test_samplers", ctab_samplers, ctab_samplers_expected,
601             sizeof(ctab_samplers_expected)/sizeof(*ctab_samplers_expected));
602 }
603
604 static void test_setting_basic_table(IDirect3DDevice9 *device)
605 {
606     static const D3DXMATRIX mvp = {{{
607         0.514f, 0.626f, 0.804f, 0.786f,
608         0.238f, 0.956f, 0.374f, 0.483f,
609         0.109f, 0.586f, 0.900f, 0.255f,
610         0.898f, 0.411f, 0.932f, 0.275f}}};
611     static const D3DXVECTOR4 f4 = {0.350f, 0.526f, 0.925f, 0.021f};
612     static const float f = 0.12543f;
613     static const int i = 321;
614     static const D3DXMATRIX *matrix_pointer[] = {&mvp};
615
616     ID3DXConstantTable *ctable;
617
618     HRESULT res;
619     float out[16];
620     ULONG refcnt;
621
622     /* Get the constant table from the shader itself */
623     res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
624     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
625
626     /* Set constants */
627     res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
628     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable mvp: got 0x%08x\n", res);
629
630     res = ID3DXConstantTable_SetInt(ctable, device, "i", i + 1);
631     ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
632
633     /* Check that setting i again will overwrite the previous value */
634     res = ID3DXConstantTable_SetInt(ctable, device, "i", i);
635     ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
636
637     res = ID3DXConstantTable_SetFloat(ctable, device, "f", f);
638     ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f: got 0x%08x\n", res);
639
640     res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
641     ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f4: got 0x%08x\n", res);
642
643     /* Get constants back and validate */
644     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
645     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,
646             "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
647             out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
648     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,
649             "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
650             out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
651     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,
652             "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
653             out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
654     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,
655             "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
656             out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
657
658     IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 1);
659     ok(out[0] == (float)i && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
660             "The variable i was not set correctly, out={%f, %f, %f, %f}, should be {%d, 0.0, 0.0, 0.0}\n",
661             out[0], out[1], out[2], out[3], i);
662
663     IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
664     ok(out[0] == f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
665             "The variable f was not set correctly, out={%f, %f, %f, %f}, should be {%f, 0.0, 0.0, 0.0}\n",
666             out[0], out[1], out[2], out[3], f);
667
668     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
669     ok(memcmp(out, &f4, sizeof(f4)) == 0,
670             "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
671             out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
672
673     /* Finally test using a set* function for one type to set a variable of another type (should succeed) */
674     res = ID3DXConstantTable_SetVector(ctable, device, "f", &f4);
675     ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
676
677     IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
678     ok(out[0] == f4.x && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
679             "The variable f was not set correctly by ID3DXConstantTable_SetVector, got %f, should be %f\n",
680             out[0], f4.x);
681
682     memset(out, 0, sizeof(out));
683     IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
684     res = ID3DXConstantTable_SetMatrix(ctable, device, "f", &mvp);
685     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable f: 0x%08x\n", res);
686
687     IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
688     ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
689             "The variable f was not set correctly by ID3DXConstantTable_SetMatrix, got %f, should be %f\n",
690             out[0], S(U(mvp))._11);
691
692     /* Clear registers */
693     memset(out, 0, sizeof(out));
694     IDirect3DDevice9_SetVertexShaderConstantF(device, 0, out, 4);
695     IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
696     IDirect3DDevice9_SetVertexShaderConstantF(device, 7, out, 1);
697
698     /* SetVector shouldn't change the value of a matrix constant */
699     res = ID3DXConstantTable_SetVector(ctable, device, "mvp", &f4);
700     ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
701
702     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
703     ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
704             && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
705             && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
706             && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
707             "The variable mvp was not set correctly by ID3DXConstantTable_SetVector, "
708             "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
709             "should be all 0.0f\n",
710             out[0], out[1], out[2], out[3],
711             out[4], out[5], out[6], out[7],
712             out[8], out[9], out[10], out[11],
713             out[12], out[13], out[14], out[15]);
714
715     res = ID3DXConstantTable_SetFloat(ctable, device, "mvp", f);
716     ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable mvp: 0x%08x\n", res);
717
718     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
719     ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
720             && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
721             && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
722             && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
723             "The variable mvp was not set correctly by ID3DXConstantTable_SetFloat, "
724             "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
725             "should be all 0.0f\n",
726             out[0], out[1], out[2], out[3],
727             out[4], out[5], out[6], out[7],
728             out[8], out[9], out[10], out[11],
729             out[12], out[13], out[14], out[15]);
730
731     res = ID3DXConstantTable_SetFloat(ctable, device, "f4", f);
732     ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f4: 0x%08x\n", res);
733
734     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
735     ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
736             "The variable f4 was not set correctly by ID3DXConstantTable_SetFloat, "
737             "got {%f, %f, %f, %f}, should be all 0.0f\n",
738             out[0], out[1], out[2], out[3]);
739
740     res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "f", &mvp);
741     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f: 0x%08x\n", res);
742
743     IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
744     ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
745             "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTranspose, got %f, should be %f\n",
746             out[0], S(U(mvp))._11);
747
748     res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "f4", &mvp);
749     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f4: 0x%08x\n", res);
750
751     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
752     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,
753             "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTranspose, "
754             "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
755             out[0], out[1], out[2], out[3],
756             S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
757
758     memset(out, 0, sizeof(out));
759     IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
760     res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f", matrix_pointer, 1);
761     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f: got %#x\n", res);
762
763     IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
764     ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
765             "The variable f was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
766             "got %f, should be %f\n",
767             out[0], S(U(mvp))._11);
768
769     res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f4", matrix_pointer, 1);
770     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f4: got %#x\n", res);
771
772     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
773     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,
774             "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
775             "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
776             out[0], out[1], out[2], out[3],
777             S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
778
779     memset(out, 0, sizeof(out));
780     IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
781     res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "f", matrix_pointer, 1);
782     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f: got %#x\n", res);
783
784     IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
785     ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
786             "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
787             "got %f, should be %f\n",
788             out[0], S(U(mvp))._11);
789
790     res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "f4", matrix_pointer, 1);
791     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f4: got %#x\n", res);
792
793     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
794     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,
795             "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
796             "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
797             out[0], out[1], out[2], out[3],
798             S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
799
800     refcnt = ID3DXConstantTable_Release(ctable);
801     ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
802 }
803
804 static void test_setting_matrices_table(IDirect3DDevice9 *device)
805 {
806     static const D3DXMATRIX fmatrix =
807         {{{2.001f, 1.502f, 9.003f, 1.004f,
808            5.005f, 3.006f, 3.007f, 6.008f,
809            9.009f, 5.010f, 7.011f, 1.012f,
810            5.013f, 5.014f, 5.015f, 9.016f}}};
811     static const D3DXMATRIX *matrix_pointer[] = {&fmatrix};
812
813     ID3DXConstantTable *ctable;
814
815     HRESULT res;
816     float out[32];
817
818     res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
819     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
820
821     res = ID3DXConstantTable_SetMatrix(ctable, device, "imatrix2x3", &fmatrix);
822     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable imatrix2x3: got %#x\n", res);
823
824     res = ID3DXConstantTable_SetMatrix(ctable, device, "fmatrix3x1", &fmatrix);
825     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix3x1: got %#x\n", res);
826
827     IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
828     todo_wine ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
829             && out[3] == 0
830             && out[4] == (int)S(U(fmatrix))._21 && out[5] == (int)S(U(fmatrix))._22 && out[6] == (int)S(U(fmatrix))._23
831             && out[7] == 0,
832             "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
833             "should be {%d, %d, %d, %d; %d, %d, %d, %d}\n",
834             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
835             (int)S(U(fmatrix))._11, (int)S(U(fmatrix))._12, (int)S(U(fmatrix))._13, 0,
836             (int)S(U(fmatrix))._21, (int)S(U(fmatrix))._22, (int)S(U(fmatrix))._23, 0);
837
838     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
839     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f,
840             "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
841             out[0], out[1], out[2], out[3],
842             S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f);
843
844     ID3DXConstantTable_Release(ctable);
845
846     res = D3DXGetShaderConstantTable(ctab_matrices2, &ctable);
847     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
848
849     /* SetMatrix */
850     res = ID3DXConstantTable_SetMatrix(ctable, device, "c2x3", &fmatrix);
851     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c2x3: got %#x\n", res);
852
853     res = ID3DXConstantTable_SetMatrix(ctable, device, "r2x3", &fmatrix);
854     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r2x3: got %#x\n", res);
855
856     res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x2", &fmatrix);
857     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x2: got %#x\n", res);
858
859     res = ID3DXConstantTable_SetMatrix(ctable, device, "r3x2", &fmatrix);
860     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r3x2: got %#x\n", res);
861
862     res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x3", &fmatrix);
863     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x3: got %#x\n", res);
864
865     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
866     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
867             && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
868             && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
869             "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
870             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
871             out[0], out[1], out[2], out[3],
872             out[4], out[5], out[6], out[7],
873             out[8], out[9], out[10], out[11],
874             S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
875             S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
876             S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
877
878     res = ID3DXConstantTable_SetMatrix(ctable, device, "r4x4", &fmatrix);
879     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r4x4: got %#x\n", res);
880
881     IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
882     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
883             && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
884             "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
885             "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
886             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
887             S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
888             S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
889
890     IDirect3DDevice9_GetVertexShaderConstantF(device, 13, out, 2);
891     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
892             && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
893             "The variable c3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
894             "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
895             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
896             S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
897             S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
898
899     IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 3);
900     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
901             && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
902             && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
903             "The variable r3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
904             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
905             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
906             S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
907             S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
908             S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
909
910     IDirect3DDevice9_GetVertexShaderConstantF(device, 10, out, 3);
911     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
912             && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f
913             && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == S(U(fmatrix))._33 && out[11] == 0.0f,
914             "The variable c3x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
915             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
916             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
917             S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
918             S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f,
919             S(U(fmatrix))._13, S(U(fmatrix))._23, S(U(fmatrix))._33, 0.0f);
920
921     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
922     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
923             && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == S(U(fmatrix))._24
924             && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == S(U(fmatrix))._33 && out[11] == S(U(fmatrix))._34
925             && out[12] == S(U(fmatrix))._41 && out[13] == S(U(fmatrix))._42 && out[14] == S(U(fmatrix))._43 && out[15] == S(U(fmatrix))._44,
926             "The variable r4x4 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
927             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
928             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
929             out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
930             S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, S(U(fmatrix))._14,
931             S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, S(U(fmatrix))._24,
932             S(U(fmatrix))._31, S(U(fmatrix))._32, S(U(fmatrix))._33, S(U(fmatrix))._34,
933             S(U(fmatrix))._41, S(U(fmatrix))._42, S(U(fmatrix))._43, S(U(fmatrix))._44);
934
935     /* SetMatrixTranspose */
936     res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "c2x3", &fmatrix);
937     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable c2x3: got %#x\n", res);
938
939     res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "r2x3", &fmatrix);
940     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable r2x3: got %#x\n", res);
941
942     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
943     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
944             && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
945             && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
946             "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
947             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
948             out[0], out[1], out[2], out[3],
949             out[4], out[5], out[6], out[7],
950             out[8], out[9], out[10], out[11],
951             S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
952             S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
953             S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
954
955     IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
956     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
957             && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
958             "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
959             "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
960             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
961             S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
962             S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
963
964     /* SetMatrixPointerArray */
965     res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "c2x3", matrix_pointer, 1);
966     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable c2x3: got %#x\n", res);
967
968     res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "r2x3", matrix_pointer, 1);
969     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable r2x3: got %#x\n", res);
970
971     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
972     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
973             && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
974             && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
975             "The variable c2x3 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],
978             out[4], out[5], out[6], out[7],
979             out[8], out[9], out[10], out[11],
980             S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
981             S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
982             S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
983
984     IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
985     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
986             && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
987             "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
988             "should be {%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             S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
991             S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
992
993     /* SetMatrixTransposePointerArray */
994     res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "c2x3", matrix_pointer, 1);
995     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable c2x3: got %#x\n", res);
996
997     res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "r2x3", matrix_pointer, 1);
998     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable r2x3: got %#x\n", res);
999
1000     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
1001     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
1002             && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
1003             && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
1004             "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1005             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1006             out[0], out[1], out[2], out[3],
1007             out[4], out[5], out[6], out[7],
1008             out[8], out[9], out[10], out[11],
1009             S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
1010             S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
1011             S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
1012
1013     IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
1014     ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
1015             && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
1016             "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
1017             "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1018             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1019             S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
1020             S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
1021
1022     ID3DXConstantTable_Release(ctable);
1023 }
1024
1025 static void test_setting_arrays_table(IDirect3DDevice9 *device)
1026 {
1027     static const float farray[8] = {
1028         0.005f, 0.745f, 0.973f, 0.264f,
1029         0.010f, 0.020f, 0.030f, 0.040f};
1030     static const D3DXMATRIX fmtxarray[2] = {
1031         {{{0.001f, 0.002f, 0.003f, 0.004f,
1032            0.005f, 0.006f, 0.007f, 0.008f,
1033            0.009f, 0.010f, 0.011f, 0.012f,
1034            0.013f, 0.014f, 0.015f, 0.016f}}},
1035         {{{0.010f, 0.020f, 0.030f, 0.040f,
1036            0.050f, 0.060f, 0.070f, 0.080f,
1037            0.090f, 0.100f, 0.110f, 0.120f,
1038            0.130f, 0.140f, 0.150f, 0.160f}}}};
1039     static const int iarray[4] = {1, 2, 3, 4};
1040     static const D3DXVECTOR4 fvecarray[2] = {
1041         {0.745f, 0.997f, 0.353f, 0.237f},
1042         {0.060f, 0.455f, 0.333f, 0.983f}};
1043     static BOOL barray[4] = {FALSE, 100, TRUE, TRUE};
1044
1045     ID3DXConstantTable *ctable;
1046
1047     HRESULT res;
1048     float out[32];
1049     ULONG refcnt;
1050
1051     /* Clear registers */
1052     memset(out, 0, sizeof(out));
1053     IDirect3DDevice9_SetVertexShaderConstantF(device,  8, out, 4);
1054     IDirect3DDevice9_SetVertexShaderConstantF(device, 12, out, 4);
1055
1056     /* Get the constant table from the shader */
1057     res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1058     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
1059
1060     /* Set constants */
1061
1062     /* Make sure that we cannot set registers that do not belong to this constant */
1063     res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 8);
1064     ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got 0x%08x\n", res);
1065
1066     IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 8);
1067     ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1068             "The in-bounds elements of the array were not set, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1069             out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1070     ok(out[16] == 0.0f && out[20] == 0.0f && out[24] == 0.0f && out[28] == 0.0f,
1071             "The excess elements of the array were set, out={%f, %f, %f, %f}, should be all 0.0f\n",
1072             out[16], out[20], out[24], out[28]);
1073
1074     /* ivecarray takes up only 1 register, but a matrix takes up 4, so no elements should be set */
1075     res = ID3DXConstantTable_SetMatrix(ctable, device, "ivecarray", &fmtxarray[0]);
1076     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got 0x%08x\n", res);
1077
1078     IDirect3DDevice9_GetVertexShaderConstantF(device, 18, out, 4);
1079     ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
1080        "The array was set, out={%f, %f, %f, %f}, should be all 0.0f\n", out[0], out[1], out[2], out[3]);
1081
1082     /* Try setting an integer array to an array declared as a float array */
1083     res = ID3DXConstantTable_SetIntArray(ctable, device, "farray", iarray, 4);
1084     ok(res == D3D_OK, "ID3DXConstantTable_SetIntArray failed: got 0x%08x\n", res);
1085
1086     IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1087     ok(out[0] == iarray[0] && out[4] == iarray[1] && out[8] == iarray[2] && out[12] == iarray[3],
1088            "SetIntArray did not properly set a float array: out={%f, %f, %f, %f}, should be {%d, %d, %d, %d}\n",
1089             out[0], out[4], out[8], out[12], iarray[0], iarray[1], iarray[2], iarray[3]);
1090
1091     res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 4);
1092     ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got x0%08x\n", res);
1093
1094     res = ID3DXConstantTable_SetVectorArray(ctable, device, "fvecarray", fvecarray, 2);
1095     ok(res == D3D_OK, "ID3DXConstantTable_SetVectorArray failed: got 0x%08x\n", res);
1096
1097     res = ID3DXConstantTable_SetMatrixArray(ctable, device, "fmtxarray", fmtxarray, 2);
1098     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixArray failed: got 0x%08x\n", res);
1099
1100     res = ID3DXConstantTable_SetBoolArray(ctable, device, "barray", barray, 2);
1101     ok(res == D3D_OK, "ID3DXConstantTable_SetBoolArray failed: got 0x%08x\n", res);
1102
1103     /* Read back constants */
1104     IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1105     ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1106             "The variable farray was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1107             out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1108
1109     IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1110     ok(out[0] == fvecarray[0].x && out[1] == fvecarray[0].y && out[2] == fvecarray[0].z && out[3] == fvecarray[0].w &&
1111             out[4] == fvecarray[1].x && out[5] == fvecarray[1].y && out[6] == fvecarray[1].z && out[7] == fvecarray[1].w,
1112             "The variable fvecarray was not set correctly, out={{%f, %f, %f, %f}, {%f, %f, %f, %f}}, should be "
1113             "{{%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],
1114             fvecarray[0].x, fvecarray[0].y, fvecarray[0].z, fvecarray[0].w, fvecarray[1].x, fvecarray[1].y,
1115             fvecarray[1].z, fvecarray[1].w);
1116
1117     IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1118     ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1119             && out[4] == 1.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1120             "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",
1121             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1122             0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);
1123
1124     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 8);
1125     /* Just check a few elements in each matrix to make sure fmtxarray was set row-major */
1126     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,
1127            "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1128            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);
1129     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,
1130            "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1131            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);
1132
1133     refcnt = ID3DXConstantTable_Release(ctable);
1134     ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
1135 }
1136
1137 static void test_SetDefaults(IDirect3DDevice9 *device)
1138 {
1139     static const D3DXMATRIX mvp = {{{
1140         0.51f, 0.62f, 0.80f, 0.78f,
1141         0.23f, 0.95f, 0.37f, 0.48f,
1142         0.10f, 0.58f, 0.90f, 0.25f,
1143         0.89f, 0.41f, 0.93f, 0.27f}}};
1144     static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1145
1146     float out[16];
1147
1148     HRESULT res;
1149     ID3DXConstantTable *ctable;
1150
1151     res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1152     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1153
1154     res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
1155     ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed: got %08x\n", res);
1156
1157     res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
1158     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got %08x\n", res);
1159
1160     res = ID3DXConstantTable_SetDefaults(ctable, device);
1161     ok(res == D3D_OK, "ID3dXConstantTable_SetDefaults failed: got %08x\n", res);
1162
1163     /* SetDefaults doesn't change constants without default values */
1164     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1165     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,
1166             "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1167             out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1168     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,
1169             "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1170             out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1171     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,
1172             "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1173             out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1174     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,
1175             "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1176             out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1177
1178     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1179     ok(memcmp(out, &f4, sizeof(f4)) == 0,
1180             "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1181             out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1182
1183     ID3DXConstantTable_Release(ctable);
1184
1185     res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1186     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1187
1188     res = ID3DXConstantTable_SetDefaults(ctable, device);
1189     ok(res == D3D_OK, "ID3DXConstantTable_SetDefaults failed: got %08x\n", res);
1190
1191     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1192     ok(memcmp(out, mat4_default_value, sizeof(mat4_default_value)) == 0,
1193             "The variable mat4 was not set correctly to default value\n");
1194
1195     IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 4);
1196     ok(memcmp(out, mat3_default_value, sizeof(mat3_default_value)) == 0,
1197             "The variable mat3 was not set correctly to default value\n");
1198
1199     IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1200     ok(memcmp(out, arr_default_value, sizeof(arr_default_value)) == 0,
1201         "The variable array was not set correctly to default value\n");
1202
1203     IDirect3DDevice9_GetVertexShaderConstantF(device, 11, out, 1);
1204     ok(memcmp(out, vec4_default_value, sizeof(vec4_default_value)) == 0,
1205         "The variable vec4 was not set correctly to default value\n");
1206
1207     IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 1);
1208     ok(memcmp(out, flt_default_value, sizeof(flt_default_value)) == 0,
1209         "The variable flt was not set correctly to default value\n");
1210
1211     ID3DXConstantTable_Release(ctable);
1212 }
1213
1214 static void test_SetValue(IDirect3DDevice9 *device)
1215 {
1216     static const D3DXMATRIX mvp = {{{
1217         0.51f, 0.62f, 0.80f, 0.78f,
1218         0.23f, 0.95f, 0.37f, 0.48f,
1219         0.10f, 0.58f, 0.90f, 0.25f,
1220         0.89f, 0.41f, 0.93f, 0.27f}}};
1221     static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1222     static const FLOAT arr[] = {0.33f, 0.55f, 0.96f, 1.00f,
1223                                 1.00f, 1.00f, 1.00f, 1.00f,
1224                                 1.00f, 1.00f, 1.00f, 1.00f};
1225     static int imatrix[] = {1, 2, 3, 4, 5, 6};
1226     static float fmatrix[] = {1.1f, 2.2f, 3.3f, 4.4f};
1227     static BOOL barray[] = {TRUE, FALSE};
1228     static float fvecarray[] = {9.1f, 9.2f, 9.3f, 9.4f, 9.5f, 9.6f, 9.7f, 9.8f};
1229     static float farray[] = {2.2f, 3.3f};
1230
1231     static const float def[16] = {5.5f, 5.5f, 5.5f, 5.5f,
1232                                   5.5f, 5.5f, 5.5f, 5.5f,
1233                                   5.5f, 5.5f, 5.5f, 5.5f,
1234                                   5.5f, 5.5f, 5.5f, 5.5f};
1235     float out[16];
1236
1237     HRESULT res;
1238     ID3DXConstantTable *ctable;
1239
1240     res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1241     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1242
1243     IDirect3DDevice9_SetVertexShaderConstantF(device, 7, def, 1);
1244
1245     /* SetValue called with 0 bytes size doesn't change value */
1246     res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, 0);
1247     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1248
1249     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1250     ok(memcmp(out, def, sizeof(f4)) == 0,
1251             "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1252             out[0], out[1], out[2], out[3], def[0], def[1], def[2], def[3]);
1253
1254     res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, sizeof(f4));
1255     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1256
1257     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1258     ok(memcmp(out, &f4, sizeof(f4)) == 0,
1259             "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1260             out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1261
1262     IDirect3DDevice9_SetVertexShaderConstantF(device, 0, def, 4);
1263
1264     /* SetValue called with size smaller than constant size doesn't change value */
1265     res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp) / 2);
1266     ok(res == D3D_OK, "ID3DXConstantTable_SetValue returned %08x\n", res);
1267
1268     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1269     ok(memcmp(out, def, sizeof(def)) == 0,
1270             "The variable mvp was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1271             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1272             out[0], out[4], out[ 8], out[12],
1273             out[1], out[5], out[ 9], out[13],
1274             out[2], out[6], out[10], out[14],
1275             out[3], out[7], out[11], out[15],
1276             def[0], def[4], def[ 8], def[12],
1277             def[1], def[5], def[ 9], def[13],
1278             def[2], def[6], def[10], def[14],
1279             def[3], def[7], def[11], def[15]);
1280
1281     res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp));
1282     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1283
1284     IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1285     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,
1286             "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1287             out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1288     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,
1289             "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1290             out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1291     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,
1292             "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1293             out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1294     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,
1295             "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1296             out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1297
1298     ID3DXConstantTable_Release(ctable);
1299
1300     res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1301     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1302
1303     res = ID3DXConstantTable_SetValue(ctable, device, "arr", arr, sizeof(arr));
1304     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1305
1306     IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1307     ok(out[0] == arr[0] && out[4] == arr[1] && out[8] == arr[2]
1308             && out[1] == 0 &&  out[2] == 0 && out[3] == 0 && out[5] == 0 && out[6] == 0 && out[7] == 0
1309             && out[9] == 0 && out[10] == 0 && out[11] == 0,
1310             "The variable arr was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f}, "
1311             "should be {0.33, 0, 0, 0, 0.55, 0, 0, 0, 0.96, 0, 0, 0}\n",
1312             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11]);
1313
1314     ID3DXConstantTable_Release(ctable);
1315
1316     res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
1317     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1318
1319     res = ID3DXConstantTable_SetValue(ctable, device, "fmatrix3x1", fmatrix, sizeof(fmatrix));
1320     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1321
1322     res = ID3DXConstantTable_SetValue(ctable, device, "imatrix2x3", imatrix, sizeof(imatrix));
1323     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1324
1325     IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
1326     ok(out[0] == imatrix[0] && out[1] == imatrix[1] && out[2] == imatrix[2] && out[3] == 0.0f
1327             && out[4] == imatrix[3] && out[5] == imatrix[4] && out[6] == imatrix[5] && out[7] == 0.0f,
1328             "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1329             "should be {%d, %d, %d, 0, %d, %d, %d, 0}\n",
1330             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1331             imatrix[0], imatrix[1], imatrix[2], imatrix[3], imatrix[4], imatrix[5]);
1332
1333     IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 2);
1334     ok(out[0] == fmatrix[0] && out[1] == fmatrix[1] && out[2] == fmatrix[2] && out[3] == 0.0f,
1335             "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1336             out[0], out[1] ,out[2], out[4],
1337             fmatrix[0], fmatrix[1], fmatrix[2], 0.0f);
1338
1339     ID3DXConstantTable_Release(ctable);
1340
1341     res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1342     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1343
1344     res = ID3DXConstantTable_SetValue(ctable, device, "barray", barray, sizeof(barray));
1345     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1346
1347     res = ID3DXConstantTable_SetValue(ctable, device, "fvecarray", fvecarray, sizeof(fvecarray));
1348     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1349
1350     IDirect3DDevice9_SetVertexShaderConstantF(device, 8, def, 4);
1351     res = ID3DXConstantTable_SetValue(ctable, device, "farray", farray, sizeof(farray));
1352     ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1353
1354     /* 2 elements of farray were set */
1355     IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1356     ok(out[0] == farray[0] && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1357             && out[4] == farray[1] && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
1358             && out[8] == def[8] && out[9] == def[9] && out[10] == def[10] && out[11] == def[11]
1359             && out[12] == def[12] && out[13] == def[13] && out[14] == def[14] && out[15] == def[15],
1360             "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}, "
1361             "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1362             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1363             out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
1364             farray[0], 0.0f, 0.0f, 0.0f,
1365             farray[1], 0.0f, 0.0f, 0.0f,
1366             def[8], def[9], def[10], def[11],
1367             def[12], def[13], def[14], def[15]);
1368
1369     IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1370     ok(out[0] == fvecarray[0] && out[1] == fvecarray[1] && out[2] == fvecarray[2] && out[3] == fvecarray[3]
1371             && out[4] == fvecarray[4] && out[5] == fvecarray[5] && out[6] == fvecarray[6] && out[7] == fvecarray[7],
1372             "The variable fvecarray was not set correctly, out ={%f, %f, %f, %f, %f, %f, %f, %f}, "
1373             "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1374             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1375             fvecarray[0], fvecarray[1], fvecarray[2], fvecarray[3], fvecarray[4], fvecarray[5], fvecarray[6], fvecarray[7]);
1376
1377     IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1378     ok(out[0] == 1.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1379             && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1380             "The variable barray was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1381             "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1382             out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1383             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
1384
1385     ID3DXConstantTable_Release(ctable);
1386 }
1387
1388 static void test_setting_constants(void)
1389 {
1390     HWND wnd;
1391     IDirect3D9 *d3d;
1392     IDirect3DDevice9 *device;
1393     D3DPRESENT_PARAMETERS d3dpp;
1394     HRESULT hr;
1395     ULONG refcnt;
1396
1397     /* Create the device to use for our tests */
1398     wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
1399     d3d = Direct3DCreate9(D3D_SDK_VERSION);
1400     if (!wnd)
1401     {
1402         skip("Couldn't create application window\n");
1403         return;
1404     }
1405     if (!d3d)
1406     {
1407         skip("Couldn't create IDirect3D9 object\n");
1408         DestroyWindow(wnd);
1409         return;
1410     }
1411
1412     ZeroMemory(&d3dpp, sizeof(d3dpp));
1413     d3dpp.Windowed   = TRUE;
1414     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
1415     hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device);
1416     if (FAILED(hr))
1417     {
1418         skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1419         IDirect3D9_Release(d3d);
1420         DestroyWindow(wnd);
1421         return;
1422     }
1423
1424     test_setting_basic_table(device);
1425     test_setting_matrices_table(device);
1426     test_setting_arrays_table(device);
1427     test_SetDefaults(device);
1428     test_SetValue(device);
1429
1430     /* Release resources */
1431     refcnt = IDirect3DDevice9_Release(device);
1432     ok(refcnt == 0, "The Direct3D device reference count was %u, should be 0\n", refcnt);
1433
1434     refcnt = IDirect3D9_Release(d3d);
1435     ok(refcnt == 0, "The Direct3D object referenct count was %u, should be 0\n", refcnt);
1436
1437     if (wnd) DestroyWindow(wnd);
1438 }
1439
1440 static void test_get_sampler_index(void)
1441 {
1442     ID3DXConstantTable *ctable;
1443
1444     HRESULT res;
1445     UINT index;
1446
1447     ULONG refcnt;
1448
1449     res = D3DXGetShaderConstantTable(ctab_samplers, &ctable);
1450     ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on ctab_samplers: got %08x\n", res);
1451
1452     index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler1");
1453     ok(index == 0, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 0\n", index);
1454
1455     index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler2");
1456     ok(index == 3, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 3\n", index);
1457
1458     index = ID3DXConstantTable_GetSamplerIndex(ctable, "nonexistent");
1459     ok(index == -1, "ID3DXConstantTable_GetSamplerIndex found nonexistent sampler: Got %d\n",
1460             index);
1461
1462     index = ID3DXConstantTable_GetSamplerIndex(ctable, "notsampler");
1463     ok(index == -1, "ID3DXConstantTable_GetSamplerIndex succeeded on non-sampler constant: Got %d\n",
1464             index);
1465
1466     refcnt = ID3DXConstantTable_Release(ctable);
1467     ok(refcnt == 0, "The ID3DXConstantTable reference count was %u, should be 0\n", refcnt);
1468 }
1469
1470 /*
1471  * fxc.exe /Tps_3_0
1472  */
1473 #if 0
1474 sampler s;
1475 sampler1D s1D;
1476 sampler2D s2D;
1477 sampler3D s3D;
1478 samplerCUBE scube;
1479 float4 init;
1480 float4 main(float3 tex : TEXCOORD0) : COLOR
1481 {
1482     float4 tmp = init;
1483     tmp = tmp + tex1D(s1D, tex.x);
1484     tmp = tmp + tex1D(s1D, tex.y);
1485     tmp = tmp + tex3D(s3D, tex.xyz);
1486     tmp = tmp + tex1D(s, tex.x);
1487     tmp = tmp + tex2D(s2D, tex.xy);
1488     tmp = tmp + texCUBE(scube, tex.xyz);
1489     return tmp;
1490 }
1491 #endif
1492 static const DWORD get_shader_samplers_blob[] =
1493 {
1494     0xffff0300,                                                             /* ps_3_0                        */
1495     0x0054fffe, FCC_CTAB,                                                   /* CTAB comment                  */
1496     0x0000001c, 0x0000011b, 0xffff0300, 0x00000006, 0x0000001c, 0x00000100, /* Header                        */
1497     0x00000114,
1498     0x00000094, 0x00000002, 0x00000001, 0x0000009c, 0x00000000,             /* Constant 1 desc (init)        */
1499     0x000000ac, 0x00040003, 0x00000001, 0x000000b0, 0x00000000,             /* Constant 2 desc (s)           */
1500     0x000000c0, 0x00000003, 0x00000001, 0x000000c4, 0x00000000,             /* Constant 3 desc (s1D)         */
1501     0x000000d4, 0x00010003, 0x00000001, 0x000000d8, 0x00000000,             /* Constant 4 desc (s2D)         */
1502     0x000000e8, 0x00030003, 0x00000001, 0x000000ec, 0x00000000,             /* Constant 5 desc (s3D)         */
1503     0x000000fc, 0x00020003, 0x00000001, 0x00000104, 0x00000000,             /* Constant 6 desc (scube)       */
1504     0x74696e69, 0xababab00,                                                 /* Constant 1 name               */
1505     0x00030001, 0x00040001, 0x00000001, 0x00000000,                         /* Constant 1 type desc          */
1506     0xabab0073,                                                             /* Constant 2 name               */
1507     0x000c0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 2 type desc          */
1508     0x00443173,                                                             /* Constant 3 name               */
1509     0x000b0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 3 type desc          */
1510     0x00443273,                                                             /* Constant 4 name               */
1511     0x000c0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 4 type desc          */
1512     0x00443373,                                                             /* Constant 5 name               */
1513     0x000d0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 5 type desc          */
1514     0x62756373, 0xabab0065,                                                 /* Constant 6 name               */
1515     0x000e0004, 0x00010001, 0x00000001, 0x00000000,                         /* Constant 6 type desc          */
1516     0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, /* Target/Creator name string    */
1517     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
1518     0x332e3235, 0x00313131,
1519     0x0200001f, 0x80000005, 0x90070000, 0x0200001f, 0x90000000, 0xa00f0800, /* shader                        */
1520     0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f, 0x98000000, 0xa00f0802,
1521     0x0200001f, 0xa0000000, 0xa00f0803, 0x0200001f, 0x90000000, 0xa00f0804,
1522     0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000,
1523     0x80e40000, 0xa0e40000, 0x03000042, 0x800f0001, 0x90550000, 0xa0e40800,
1524     0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1525     0x90e40000, 0xa0e40803, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001,
1526     0x03000042, 0x800f0001, 0x90e40000, 0xa0e40804, 0x03000002, 0x800f0000,
1527     0x80e40000, 0x80e40001, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801,
1528     0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1529     0x90e40000, 0xa0e40802, 0x03000002, 0x800f0800, 0x80e40000, 0x80e40001,
1530     0x0000ffff,                                                             /* END                           */
1531 };
1532
1533 static void test_get_shader_samplers(void)
1534 {
1535     LPCSTR samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
1536     LPCSTR sampler_orig;
1537     UINT count = 2;
1538     HRESULT hr;
1539
1540 #if 0
1541     /* crashes if bytecode is NULL */
1542     hr = D3DXGetShaderSamplers(NULL, NULL, &count);
1543     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1544 #endif
1545
1546     hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, NULL);
1547     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1548
1549     samplers[5] = "dummy";
1550
1551     hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, NULL);
1552     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1553
1554     /* check that sampler points to shader blob */
1555     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1556     ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1557
1558     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1559     ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1560
1561     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1562     ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1563
1564     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1565     ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1566
1567     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1568     ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1569
1570     ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1571
1572     /* reset samplers */
1573     memset(samplers, 0, sizeof(samplers));
1574     samplers[5] = "dummy";
1575
1576     hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, &count);
1577     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1578     ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1579
1580     hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, &count);
1581     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1582     ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1583
1584     /* check that sampler points to shader blob */
1585     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1586     ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1587
1588     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1589     ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1590
1591     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1592     ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1593
1594     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1595     ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1596
1597     sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1598     ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1599
1600     ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1601
1602     /* check without ctab */
1603     hr = D3DXGetShaderSamplers(simple_vs, samplers, &count);
1604     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1605     ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1606
1607     /* check invalid ctab */
1608     hr = D3DXGetShaderSamplers(shader_with_invalid_ctab, samplers, &count);
1609     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1610     ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1611 }
1612
1613 /*
1614  * fxc.exe /Tvs_3_0
1615  */
1616 #if 0
1617 float f = {1.1f}, f_2[2] = {2.1f, 2.2f};
1618 struct {float f; int i;} s = {3.1f, 31},
1619 s_2[2] = {{4.1f, 41}, {4.2f, 42}},
1620 s_3[3] = {{5.1f, 51}, {5.2f, 52}, {5.3f, 53}};
1621 struct {int i1; int i2; float2 f_2; row_major float3x1 r[2];}
1622 p[2] = {{11, 12, {13.1, 14.1}, {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}}},
1623         {15, 16, {17.1, 18.1}, {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}}}};
1624 int i[1] = {6};
1625 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}};
1626 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}};
1627 float3 v[2] = {{2.11, 2.21, 2.31}, {2.41, 2.51, 2.61}};
1628 row_major float3x1 r31[2] = {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}};
1629 row_major float1x3 r13[2] = {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}};
1630 float4 main(float4 pos : POSITION) : POSITION
1631 {
1632     float4 tmp = 0.0f;
1633     tmp.zyw = v[1] + r13[1] + r31[1] + p[1].r[1];
1634     tmp.x += f * f_2[1] * pos.x * p[1].f_2.y;
1635     tmp.y += s.f * pos.y * s_2[0].i;
1636     tmp.z += s_3[0].f * pos.z * s_3[2].f * i[0] * f23[1]._11 * f32[1]._32;
1637     return tmp;
1638 }
1639 #endif
1640 static const DWORD test_get_shader_constant_variables_blob[] =
1641 {
1642 0xfffe0300, 0x0185fffe, 0x42415443, 0x0000001c, 0x000005df, 0xfffe0300, 0x0000000c, 0x0000001c,
1643 0x00000100, 0x000005d8, 0x0000010c, 0x002d0002, 0x00000001, 0x00000110, 0x00000120, 0x00000130,
1644 0x001d0002, 0x00000004, 0x00000134, 0x00000144, 0x000001a4, 0x00210002, 0x00000004, 0x000001a8,
1645 0x000001b8, 0x000001f8, 0x00250002, 0x00000002, 0x000001fc, 0x0000020c, 0x0000022c, 0x002f0002,
1646 0x00000001, 0x00000230, 0x00000240, 0x00000250, 0x00000002, 0x00000012, 0x000002b0, 0x000002c0,
1647 0x000003e0, 0x002b0002, 0x00000002, 0x000003e4, 0x000003f4, 0x00000414, 0x00120002, 0x00000006,
1648 0x00000418, 0x00000428, 0x00000488, 0x002e0002, 0x00000001, 0x000004ac, 0x000004bc, 0x000004dc,
1649 0x00270002, 0x00000002, 0x000004e0, 0x000004f0, 0x00000530, 0x00180002, 0x00000005, 0x00000534,
1650 0x00000544, 0x000005a4, 0x00290002, 0x00000002, 0x000005a8, 0x000005b8, 0xabab0066, 0x00030000,
1651 0x00010001, 0x00000001, 0x00000000, 0x3f8ccccd, 0x00000000, 0x00000000, 0x00000000, 0x00333266,
1652 0x00030003, 0x00030002, 0x00000002, 0x00000000, 0x3de147ae, 0x3ed1eb85, 0x00000000, 0x00000000,
1653 0x3e570a3d, 0x3f028f5c, 0x00000000, 0x00000000, 0x3e9eb852, 0x3f1c28f6, 0x00000000, 0x00000000,
1654 0x3df5c28f, 0x3ed70a3d, 0x00000000, 0x00000000, 0x3e6147ae, 0x3f051eb8, 0x00000000, 0x00000000,
1655 0x3ea3d70a, 0x3f1eb852, 0x00000000, 0x00000000, 0x00323366, 0x00030003, 0x00020003, 0x00000002,
1656 0x00000000, 0x3f8e147b, 0x3fa7ae14, 0x3fc147ae, 0x00000000, 0x3f9ae148, 0x3fb47ae1, 0x3fce147b,
1657 0x00000000, 0x3f8f5c29, 0x3fa8f5c3, 0x3fc28f5c, 0x00000000, 0x3f9c28f6, 0x3fb5c28f, 0x3fcf5c29,
1658 0x00000000, 0x00325f66, 0x00030000, 0x00010001, 0x00000002, 0x00000000, 0x40066666, 0x00000000,
1659 0x00000000, 0x00000000, 0x400ccccd, 0x00000000, 0x00000000, 0x00000000, 0xabab0069, 0x00020000,
1660 0x00010001, 0x00000001, 0x00000000, 0x40c00000, 0x00000000, 0x00000000, 0x00000000, 0x31690070,
1661 0xababab00, 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0xab003269, 0x00030001, 0x00020001,
1662 0x00000001, 0x00000000, 0xabab0072, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x00000252,
1663 0x00000258, 0x00000268, 0x00000258, 0x000001f8, 0x0000026c, 0x0000027c, 0x00000280, 0x00000005,
1664 0x000a0001, 0x00040002, 0x00000290, 0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x41400000,
1665 0x00000000, 0x00000000, 0x00000000, 0x4151999a, 0x4161999a, 0x00000000, 0x00000000, 0x40470a3d,
1666 0x00000000, 0x00000000, 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a,
1667 0x00000000, 0x00000000, 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7,
1668 0x00000000, 0x00000000, 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0x41700000,
1669 0x00000000, 0x00000000, 0x00000000, 0x41800000, 0x00000000, 0x00000000, 0x00000000, 0x4188cccd,
1670 0x4190cccd, 0x00000000, 0x00000000, 0x4083851f, 0x00000000, 0x00000000, 0x00000000, 0x4086b852,
1671 0x00000000, 0x00000000, 0x00000000, 0x4089eb85, 0x00000000, 0x00000000, 0x00000000, 0x408d1eb8,
1672 0x00000000, 0x00000000, 0x00000000, 0x409051ec, 0x00000000, 0x00000000, 0x00000000, 0x4093851f,
1673 0x00000000, 0x00000000, 0x00000000, 0x00333172, 0x00030002, 0x00030001, 0x00000002, 0x00000000,
1674 0x4083851f, 0x4086b852, 0x4089eb85, 0x00000000, 0x408d1eb8, 0x409051ec, 0x4093851f, 0x00000000,
1675 0x00313372, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x40470a3d, 0x00000000, 0x00000000,
1676 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a, 0x00000000, 0x00000000,
1677 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7, 0x00000000, 0x00000000,
1678 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0xabab0073, 0x00030000, 0x00010001,
1679 0x00000001, 0x00000000, 0x0000010c, 0x0000048c, 0x0000022c, 0x00000258, 0x00000005, 0x00020001,
1680 0x00020001, 0x0000049c, 0x40466666, 0x00000000, 0x00000000, 0x00000000, 0x41f80000, 0x00000000,
1681 0x00000000, 0x00000000, 0x00325f73, 0x00000005, 0x00020001, 0x00020002, 0x0000049c, 0x40833333,
1682 0x00000000, 0x00000000, 0x00000000, 0x42240000, 0x00000000, 0x00000000, 0x00000000, 0x40866666,
1683 0x00000000, 0x00000000, 0x00000000, 0x42280000, 0x00000000, 0x00000000, 0x00000000, 0x00335f73,
1684 0x00000005, 0x00020001, 0x00020003, 0x0000049c, 0x40a33333, 0x00000000, 0x00000000, 0x00000000,
1685 0x424c0000, 0x00000000, 0x00000000, 0x00000000, 0x40a66666, 0x00000000, 0x00000000, 0x00000000,
1686 0x42500000, 0x00000000, 0x00000000, 0x00000000, 0x40a9999a, 0x00000000, 0x00000000, 0x00000000,
1687 0x42540000, 0x00000000, 0x00000000, 0x00000000, 0xabab0076, 0x00030001, 0x00030001, 0x00000002,
1688 0x00000000, 0x40070a3d, 0x400d70a4, 0x4013d70a, 0x00000000, 0x401a3d71, 0x4020a3d7, 0x40270a3d,
1689 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
1690 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f,
1691 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0x80070000, 0xa0e4002a,
1692 0x03000002, 0x80070000, 0x80e40000, 0xa0e4002c, 0x03000002, 0x80040000, 0x80aa0000, 0xa0000017,
1693 0x03000002, 0xe0080000, 0x80aa0000, 0xa0000011, 0x02000001, 0x80010001, 0xa000002d, 0x03000005,
1694 0x80040000, 0x80000001, 0xa0000026, 0x03000005, 0x80040000, 0x80aa0000, 0x90000000, 0x03000005,
1695 0xe0010000, 0x80aa0000, 0xa055000b, 0x03000002, 0x80020000, 0x80550000, 0xa0000016, 0x03000002,
1696 0x80010000, 0x80000000, 0xa0000015, 0x03000002, 0x80010000, 0x80000000, 0xa000000f, 0x03000002,
1697 0x80020000, 0x80550000, 0xa0000010, 0x03000005, 0x80040000, 0xa000002e, 0x90550000, 0x04000004,
1698 0xe0020000, 0x80aa0000, 0xa0000028, 0x80550000, 0x03000005, 0x80020000, 0xa0000018, 0x90aa0000,
1699 0x03000005, 0x80020000, 0x80550000, 0xa000001c, 0x03000005, 0x80020000, 0x80550000, 0xa000002f,
1700 0x03000005, 0x80020000, 0x80550000, 0xa0000020, 0x04000004, 0xe0040000, 0x80550000, 0xa0aa0024,
1701 0x80000000, 0x0000ffff,
1702 };
1703
1704 const struct {
1705     LPCSTR fullname;
1706     D3DXCONSTANT_DESC desc;
1707     UINT ctaboffset;
1708 }
1709 test_get_shader_constant_variables_data[] =
1710 {
1711     {"f",         {"f",   D3DXRS_FLOAT4, 45,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL},  72},
1712     {"f23",       {"f23", D3DXRS_FLOAT4, 29,  4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2,  3, 2, 0, 48, NULL},  81},
1713     {"f23[0]",    {"f23", D3DXRS_FLOAT4, 29,  3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2,  3, 1, 0, 24, NULL},  81},
1714     {"f23[1]",    {"f23", D3DXRS_FLOAT4, 32,  1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2,  3, 1, 0, 24, NULL},  93},
1715     {"f32",       {"f32", D3DXRS_FLOAT4, 33,  4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3,  2, 2, 0, 48, NULL}, 110},
1716     {"f32[0]",    {"f32", D3DXRS_FLOAT4, 33,  2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3,  2, 1, 0, 24, NULL}, 110},
1717     {"f32[1]",    {"f32", D3DXRS_FLOAT4, 35,  2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3,  2, 1, 0, 24, NULL}, 118},
1718     {"f_2",       {"f_2", D3DXRS_FLOAT4, 37,  2, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 2, 0,  8, NULL}, 131},
1719     {"f_2[0]",    {"f_2", D3DXRS_FLOAT4, 37,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 131},
1720     {"f_2[1]",    {"f_2", D3DXRS_FLOAT4, 38,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 135},
1721     {"i",         {"i",   D3DXRS_FLOAT4, 47,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 144},
1722     {"i[0]",      {"i",   D3DXRS_FLOAT4, 47,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 144},
1723     {"p",         {"p",   D3DXRS_FLOAT4,  0, 18, D3DXPC_STRUCT,         D3DXPT_VOID,  1, 10, 2, 4, 80, NULL}, 176},
1724     {"p[0]",      {"p",   D3DXRS_FLOAT4,  0,  9, D3DXPC_STRUCT,         D3DXPT_VOID,  1, 10, 1, 4, 40, NULL}, 176},
1725     {"p[0].i1",   {"i1",  D3DXRS_FLOAT4,  0,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 176},
1726     {"p[0].i2",   {"i2",  D3DXRS_FLOAT4,  1,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 180},
1727     {"p[0].f_2",  {"f_2", D3DXRS_FLOAT4,  2,  1, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1,  2, 1, 0,  8, NULL}, 184},
1728     {"p[0].r",    {"r",   D3DXRS_FLOAT4,  3,  6, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 2, 0, 24, NULL}, 188},
1729     {"p[0].r[0]", {"r",   D3DXRS_FLOAT4,  3,  3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 1, 0, 12, NULL}, 188},
1730     {"p[0].r[1]", {"r",   D3DXRS_FLOAT4,  6,  3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 1, 0, 12, NULL}, 200},
1731     {"p[1]",      {"p",   D3DXRS_FLOAT4,  9,  9, D3DXPC_STRUCT,         D3DXPT_VOID,  1, 10, 1, 4, 40, NULL}, 212},
1732     {"p[1].i1",   {"i1",  D3DXRS_FLOAT4,  9,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 212},
1733     {"p[1].i2",   {"i2",  D3DXRS_FLOAT4, 10,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 216},
1734     {"p[1].f_2",  {"f_2", D3DXRS_FLOAT4, 11,  1, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1,  2, 1, 0,  8, NULL}, 220},
1735     {"p[1].r",    {"r",   D3DXRS_FLOAT4, 12,  6, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 2, 0, 24, NULL}, 224},
1736     {"p[1].r[0]", {"r",   D3DXRS_FLOAT4, 12,  3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 1, 0, 12, NULL}, 224},
1737     {"p[1].r[1]", {"r",   D3DXRS_FLOAT4, 15,  3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 1, 0, 12, NULL}, 236},
1738     {"r13",       {"r13", D3DXRS_FLOAT4, 43,  2, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 1,  3, 2, 0, 24, NULL}, 253},
1739     {"r13[0]",    {"r13", D3DXRS_FLOAT4, 43,  1, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 1,  3, 1, 0, 12, NULL}, 253},
1740     {"r13[1]",    {"r13", D3DXRS_FLOAT4, 44,  1, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 1,  3, 1, 0, 12, NULL}, 257},
1741     {"r31",       {"r31", D3DXRS_FLOAT4, 18,  6, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 2, 0, 24, NULL}, 266},
1742     {"r31[0]",    {"r31", D3DXRS_FLOAT4, 18,  3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 1, 0, 12, NULL}, 266},
1743     {"r31[1]",    {"r31", D3DXRS_FLOAT4, 21,  3, D3DXPC_MATRIX_ROWS,    D3DXPT_FLOAT, 3,  1, 1, 0, 12, NULL}, 278},
1744     {"s",         {"s",   D3DXRS_FLOAT4, 46,  1, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 1, 2,  8, NULL}, 303},
1745     {"s.f",       {"f",   D3DXRS_FLOAT4, 46,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 303},
1746     {"s.i",       {"i",   D3DXRS_FLOAT4, 47,  0, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 307},
1747     {"s_2",       {"s_2", D3DXRS_FLOAT4, 39,  2, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 2, 2, 16, NULL}, 316},
1748     {"s_2[0]",    {"s_2", D3DXRS_FLOAT4, 39,  2, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 1, 2,  8, NULL}, 316},
1749     {"s_2[0].f",  {"f",   D3DXRS_FLOAT4, 39,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 316},
1750     {"s_2[0].i",  {"i",   D3DXRS_FLOAT4, 40,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 320},
1751     {"s_2[1]",    {"s_2", D3DXRS_FLOAT4, 41,  0, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 1, 2,  8, NULL}, 324},
1752     {"s_2[1].f",  {"f",   D3DXRS_FLOAT4, 41,  0, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 324},
1753     {"s_2[1].i",  {"i",   D3DXRS_FLOAT4, 41,  0, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 328},
1754     {"s_3",       {"s_3", D3DXRS_FLOAT4, 24,  5, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 3, 2, 24, NULL}, 337},
1755     {"s_3[0]",    {"s_3", D3DXRS_FLOAT4, 24,  2, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 1, 2,  8, NULL}, 337},
1756     {"s_3[0].f",  {"f",   D3DXRS_FLOAT4, 24,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 337},
1757     {"s_3[0].i",  {"i",   D3DXRS_FLOAT4, 25,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 341},
1758     {"s_3[1]",    {"s_3", D3DXRS_FLOAT4, 26,  2, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 1, 2,  8, NULL}, 345},
1759     {"s_3[1].f",  {"f",   D3DXRS_FLOAT4, 26,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 345},
1760     {"s_3[1].i",  {"i",   D3DXRS_FLOAT4, 27,  1, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 349},
1761     {"s_3[2]",    {"s_3", D3DXRS_FLOAT4, 28,  1, D3DXPC_STRUCT,         D3DXPT_VOID,  1,  2, 1, 2,  8, NULL}, 353},
1762     {"s_3[2].f",  {"f",   D3DXRS_FLOAT4, 28,  1, D3DXPC_SCALAR,         D3DXPT_FLOAT, 1,  1, 1, 0,  4, NULL}, 353},
1763     {"s_3[2].i",  {"i",   D3DXRS_FLOAT4, 29,  0, D3DXPC_SCALAR,         D3DXPT_INT,   1,  1, 1, 0,  4, NULL}, 357},
1764     {"v",         {"v",   D3DXRS_FLOAT4, 41,  2, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1,  3, 2, 0, 24, NULL}, 366},
1765     {"v[0]",      {"v",   D3DXRS_FLOAT4, 41,  1, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1,  3, 1, 0, 12, NULL}, 366},
1766     {"v[1]",      {"v",   D3DXRS_FLOAT4, 42,  1, D3DXPC_VECTOR,         D3DXPT_FLOAT, 1,  3, 1, 0, 12, NULL}, 370},
1767 };
1768
1769 static void test_get_shader_constant_variables(void)
1770 {
1771     ID3DXConstantTable *ctable;
1772     HRESULT hr;
1773     ULONG count;
1774     UINT i;
1775     UINT nr = 1;
1776     D3DXHANDLE constant, element;
1777     D3DXCONSTANT_DESC desc;
1778     DWORD *ctab;
1779
1780     hr = D3DXGetShaderConstantTable(test_get_shader_constant_variables_blob, &ctable);
1781     ok(hr == D3D_OK, "D3DXGetShaderConstantTable failed, got %08x, expected %08x\n", hr, D3D_OK);
1782
1783     ctab = ID3DXConstantTable_GetBufferPointer(ctable);
1784     ok(ctab[0] == test_get_shader_constant_variables_blob[3], "ID3DXConstantTable_GetBufferPointer failed\n");
1785
1786     for (i = 0; i < sizeof(test_get_shader_constant_variables_data) / sizeof(*test_get_shader_constant_variables_data); ++i)
1787     {
1788         LPCSTR fullname = test_get_shader_constant_variables_data[i].fullname;
1789         const D3DXCONSTANT_DESC *expected_desc = &test_get_shader_constant_variables_data[i].desc;
1790         UINT ctaboffset = test_get_shader_constant_variables_data[i].ctaboffset;
1791
1792         constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, fullname);
1793         ok(constant != NULL, "GetConstantByName \"%s\" failed\n", fullname);
1794
1795         hr = ID3DXConstantTable_GetConstantDesc(ctable, constant, &desc, &nr);
1796         ok(hr == D3D_OK, "GetConstantDesc \"%s\" failed, got %08x, expected %08x\n", fullname, hr, D3D_OK);
1797
1798         ok(!strcmp(expected_desc->Name, desc.Name), "GetConstantDesc \"%s\" failed, got \"%s\", expected \"%s\"\n",
1799                 fullname, desc.Name, expected_desc->Name);
1800         ok(expected_desc->RegisterSet == desc.RegisterSet, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1801                 fullname, desc.RegisterSet, expected_desc->RegisterSet);
1802         ok(expected_desc->RegisterIndex == desc.RegisterIndex, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1803                 fullname, desc.RegisterIndex, expected_desc->RegisterIndex);
1804         ok(expected_desc->RegisterCount == desc.RegisterCount, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1805                 fullname, desc.RegisterCount, expected_desc->RegisterCount);
1806         ok(expected_desc->Class == desc.Class, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1807                 fullname, desc.Class, expected_desc->Class);
1808         ok(expected_desc->Type == desc.Type, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1809                 fullname, desc.Type, expected_desc->Type);
1810         ok(expected_desc->Rows == desc.Rows, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1811                 fullname, desc.Rows, expected_desc->Rows);
1812         ok(expected_desc->Columns == desc.Columns, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1813                 fullname, desc.Columns, expected_desc->Columns);
1814         ok(expected_desc->Elements == desc.Elements, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1815                 fullname, desc.Elements, expected_desc->Elements);
1816         ok(expected_desc->StructMembers == desc.StructMembers, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1817                 fullname, desc.StructMembers, expected_desc->StructMembers);
1818         ok(expected_desc->Bytes == desc.Bytes, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1819                 fullname, desc.Bytes, expected_desc->Bytes);
1820         ok(ctaboffset == (DWORD *)desc.DefaultValue - ctab, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1821            fullname, (UINT)((DWORD *)desc.DefaultValue - ctab), ctaboffset);
1822     }
1823
1824     element = ID3DXConstantTable_GetConstantElement(ctable, NULL, 0);
1825     ok(element == NULL, "GetConstantElement failed\n");
1826
1827     constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "i");
1828     ok(constant != NULL, "GetConstantByName failed\n");
1829
1830     element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "i[0]");
1831     ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1832
1833     element = ID3DXConstantTable_GetConstantElement(ctable, "i", 0);
1834     ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1835
1836     constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f");
1837     ok(constant != NULL, "GetConstantByName failed\n");
1838
1839     element = ID3DXConstantTable_GetConstant(ctable, NULL, 0);
1840     ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1841
1842     element = ID3DXConstantTable_GetConstant(ctable, "invalid", 0);
1843     ok(element == NULL, "GetConstant failed\n");
1844
1845     element = ID3DXConstantTable_GetConstant(ctable, "f", 0);
1846     ok(element == NULL, "GetConstant failed\n");
1847
1848     element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[0]");
1849     ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1850
1851     element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[1]");
1852     ok(NULL == element, "GetConstantByName failed\n");
1853
1854     element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[0][0]");
1855     ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1856
1857     element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f.");
1858     ok(element == NULL, "GetConstantByName failed\n");
1859
1860     element = ID3DXConstantTable_GetConstantElement(ctable, "f", 0);
1861     ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1862
1863     element = ID3DXConstantTable_GetConstantElement(ctable, "f", 1);
1864     ok(element == NULL, "GetConstantElement failed\n");
1865
1866     constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2[0]");
1867     ok(constant != NULL, "GetConstantByName failed\n");
1868
1869     element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2");
1870     ok(element != constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1871
1872     element = ID3DXConstantTable_GetConstantElement(ctable, "f_2", 0);
1873     ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1874
1875     constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2[1]");
1876     ok(constant != NULL, "GetConstantByName failed\n");
1877
1878     element = ID3DXConstantTable_GetConstantElement(ctable, "f_2", 1);
1879     ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1880
1881     constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "s_2[0].f");
1882     ok(constant != NULL, "GetConstantByName failed\n");
1883
1884     element = ID3DXConstantTable_GetConstant(ctable, "s_2[0]", 0);
1885     ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1886
1887     element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "f");
1888     ok(element == constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1889
1890     element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "invalid");
1891     ok(element == NULL, "GetConstantByName failed\n");
1892
1893     constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "s_2[0]");
1894     ok(constant != NULL, "GetConstantByName failed\n");
1895
1896     element = ID3DXConstantTable_GetConstantElement(ctable, "s_2[0]", 0);
1897     ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1898
1899     count = ID3DXConstantTable_Release(ctable);
1900     ok(count == 0, "Release failed, got %u, expected %u\n", count, 0);
1901 }
1902
1903 START_TEST(shader)
1904 {
1905     test_get_shader_size();
1906     test_get_shader_version();
1907     test_find_shader_comment();
1908     test_get_shader_constant_table_ex();
1909     test_constant_tables();
1910     test_setting_constants();
1911     test_get_sampler_index();
1912     test_get_shader_samplers();
1913     test_get_shader_constant_variables();
1914 }