d3dx9: Always set the table = NULL in D3DXGetShaderConstantTableEx().
[wine.git] / dlls / d3dx9_36 / tests / shader.c
blobfb8f270b074b63417a1634f57f0a11e5922f69cf
1 /*
2 * Copyright 2008 Luis Busquets
3 * Copyright 2011 Travis Athougies
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.
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.
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
20 #include "wine/test.h"
21 #include "d3dx9.h"
23 static const DWORD shader_zero[] = {0x0};
25 static const DWORD shader_invalid[] = {0xeeee0100};
27 static const DWORD shader_empty[] = {0xfffeffff, 0x0000ffff};
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 */
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 */
47 #define FCC_TEXT MAKEFOURCC('T','E','X','T')
48 #define FCC_CTAB MAKEFOURCC('C','T','A','B')
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 */
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 */
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 */
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 */
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}};
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 */
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}};
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 */
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}};
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 */
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}};
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 */
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};
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}};
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 */
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}};
274 static void test_get_shader_size(void)
276 UINT shader_size, expected;
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);
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);
286 shader_size = D3DXGetShaderSize(NULL);
287 ok(shader_size == 0, "Got shader size %u, expected 0\n", shader_size);
290 static void test_get_shader_version(void)
292 DWORD shader_version;
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));
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));
302 shader_version = D3DXGetShaderVersion(NULL);
303 ok(shader_version == 0, "Got shader version 0x%08x, expected 0\n", shader_version);
306 static void test_find_shader_comment(void)
308 HRESULT hr;
309 LPCVOID data = (LPVOID)0xdeadbeef;
310 UINT size = 100;
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);
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);
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);
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);
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);
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);
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);
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);
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);
356 static void test_get_shader_constant_table_ex(void)
358 ID3DXConstantTable *constant_table;
359 HRESULT hr;
360 LPVOID data;
361 DWORD size;
362 D3DXCONSTANTTABLE_DESC desc;
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);
369 /* No CTAB data */
370 constant_table = (ID3DXConstantTable *)0xdeadbeef;
371 hr = D3DXGetShaderConstantTableEx(simple_ps, 0, &constant_table);
372 ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
373 ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
375 /* With invalid CTAB data */
376 hr = D3DXGetShaderConstantTableEx(shader_with_invalid_ctab, 0, &constant_table);
377 ok(hr == D3DXERR_INVALIDDATA || broken(hr == D3D_OK), /* winxp 64-bit, w2k3 64-bit */
378 "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
379 if (constant_table) ID3DXConstantTable_Release(constant_table);
381 hr = D3DXGetShaderConstantTableEx(shader_with_ctab, 0, &constant_table);
382 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
383 ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
385 if (constant_table)
387 size = ID3DXConstantTable_GetBufferSize(constant_table);
388 ok(size == 28, "Got result %x, expected 28\n", size);
390 data = ID3DXConstantTable_GetBufferPointer(constant_table);
391 ok(!memcmp(data, shader_with_ctab + 6, size), "Retrieved wrong CTAB data\n");
393 hr = ID3DXConstantTable_GetDesc(constant_table, NULL);
394 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
396 hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
397 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
398 ok(desc.Creator == (LPCSTR)data + 0x10, "Got result %p, expected %p\n", desc.Creator, (LPCSTR)data + 0x10);
399 ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
400 ok(desc.Constants == 0, "Got result %x, expected 0\n", desc.Constants);
402 ID3DXConstantTable_Release(constant_table);
405 hr = D3DXGetShaderConstantTableEx(shader_with_ctab_constants, 0, &constant_table);
406 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
407 ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
409 if (constant_table)
411 D3DXHANDLE constant;
412 D3DXCONSTANT_DESC constant_desc;
413 D3DXCONSTANT_DESC constant_desc_save;
414 UINT nb;
416 /* Test GetDesc */
417 hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
418 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
419 ok(!strcmp(desc.Creator, "Wine project"), "Got result '%s', expected 'Wine project'\n", desc.Creator);
420 ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
421 ok(desc.Constants == 3, "Got result %x, expected 3\n", desc.Constants);
423 /* Test GetConstant */
424 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
425 ok(constant != NULL, "No constant found\n");
426 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
427 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
428 ok(!strcmp(constant_desc.Name, "Constant1"), "Got result '%s', expected 'Constant1'\n",
429 constant_desc.Name);
430 ok(constant_desc.Class == D3DXPC_VECTOR, "Got result %x, expected %u (D3DXPC_VECTOR)\n",
431 constant_desc.Class, D3DXPC_VECTOR);
432 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
433 constant_desc.Type, D3DXPT_FLOAT);
434 ok(constant_desc.Rows == 1, "Got result %x, expected 1\n", constant_desc.Rows);
435 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
437 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 1);
438 ok(constant != NULL, "No constant found\n");
439 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
440 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
441 ok(!strcmp(constant_desc.Name, "Constant2"), "Got result '%s', expected 'Constant2'\n",
442 constant_desc.Name);
443 ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
444 constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
445 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
446 constant_desc.Type, D3DXPT_FLOAT);
447 ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
448 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
450 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 2);
451 ok(constant != NULL, "No constant found\n");
452 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
453 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
454 ok(!strcmp(constant_desc.Name, "Constant3"), "Got result '%s', expected 'Constant3'\n",
455 constant_desc.Name);
456 ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
457 constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
458 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
459 constant_desc.Type, D3DXPT_FLOAT);
460 ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
461 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
462 constant_desc_save = constant_desc; /* For GetConstantDesc test */
464 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 3);
465 ok(constant == NULL, "Got result %p, expected NULL\n", constant);
467 /* Test GetConstantByName */
468 constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant unknown");
469 ok(constant == NULL, "Got result %p, expected NULL\n", constant);
470 constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant3");
471 ok(constant != NULL, "No constant found\n");
472 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
473 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
474 ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
476 /* Test GetConstantDesc */
477 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
478 ok(constant != NULL, "No constant found\n");
479 hr = ID3DXConstantTable_GetConstantDesc(constant_table, NULL, &constant_desc, &nb);
480 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
481 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, NULL, &nb);
482 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
483 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, NULL);
484 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
485 hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant unknow", &constant_desc, &nb);
486 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
487 hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant3", &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");
491 ID3DXConstantTable_Release(constant_table);
495 static void test_constant_table(const char *test_name, const DWORD *ctable_fn,
496 const D3DXCONSTANT_DESC *expecteds, UINT count)
498 UINT i;
499 ID3DXConstantTable *ctable;
501 HRESULT res;
503 /* Get the constant table from the shader itself */
504 res = D3DXGetShaderConstantTable(ctable_fn, &ctable);
505 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on %s: got %08x\n", test_name, res);
507 for (i = 0; i < count; i++)
509 const D3DXCONSTANT_DESC *expected = &expecteds[i];
510 D3DXHANDLE const_handle;
511 D3DXCONSTANT_DESC actual;
512 UINT pCount = 1;
514 const_handle = ID3DXConstantTable_GetConstantByName(ctable, NULL, expected->Name);
516 res = ID3DXConstantTable_GetConstantDesc(ctable, const_handle, &actual, &pCount);
517 ok(SUCCEEDED(res), "%s in %s: ID3DXConstantTable_GetConstantDesc returned %08x\n", expected->Name,
518 test_name, res);
519 ok(pCount == 1, "%s in %s: Got more or less descriptions: %d\n", expected->Name, test_name, pCount);
521 ok(strcmp(actual.Name, expected->Name) == 0,
522 "%s in %s: Got different names: Got %s, expected %s\n", expected->Name,
523 test_name, actual.Name, expected->Name);
524 ok(actual.RegisterSet == expected->RegisterSet,
525 "%s in %s: Got different register sets: Got %d, expected %d\n",
526 expected->Name, test_name, actual.RegisterSet, expected->RegisterSet);
527 ok(actual.RegisterIndex == expected->RegisterIndex,
528 "%s in %s: Got different register indices: Got %d, expected %d\n",
529 expected->Name, test_name, actual.RegisterIndex, expected->RegisterIndex);
530 ok(actual.RegisterCount == expected->RegisterCount,
531 "%s in %s: Got different register counts: Got %d, expected %d\n",
532 expected->Name, test_name, actual.RegisterCount, expected->RegisterCount);
533 ok(actual.Class == expected->Class,
534 "%s in %s: Got different classes: Got %d, expected %d\n", expected->Name,
535 test_name, actual.Class, expected->Class);
536 ok(actual.Type == expected->Type,
537 "%s in %s: Got different types: Got %d, expected %d\n", expected->Name,
538 test_name, actual.Type, expected->Type);
539 ok(actual.Rows == expected->Rows && actual.Columns == expected->Columns,
540 "%s in %s: Got different dimensions: Got (%d, %d), expected (%d, %d)\n",
541 expected->Name, test_name, actual.Rows, actual.Columns, expected->Rows,
542 expected->Columns);
543 ok(actual.Elements == expected->Elements,
544 "%s in %s: Got different element count: Got %d, expected %d\n",
545 expected->Name, test_name, actual.Elements, expected->Elements);
546 ok(actual.StructMembers == expected->StructMembers,
547 "%s in %s: Got different struct member count: Got %d, expected %d\n",
548 expected->Name, test_name, actual.StructMembers, expected->StructMembers);
549 ok(actual.Bytes == expected->Bytes,
550 "%s in %s: Got different byte count: Got %d, expected %d\n",
551 expected->Name, test_name, actual.Bytes, expected->Bytes);
553 if (!expected->DefaultValue)
555 ok(actual.DefaultValue == NULL,
556 "%s in %s: Got different default value: expected NULL\n",
557 expected->Name, test_name);
559 else
561 ok(actual.DefaultValue != NULL,
562 "%s in %s: Got different default value: expected non-NULL\n",
563 expected->Name, test_name);
564 ok(memcmp(actual.DefaultValue, expected->DefaultValue, expected->Bytes) == 0,
565 "%s in %s: Got different default value\n", expected->Name, test_name);
569 /* Finally, release the constant table */
570 ID3DXConstantTable_Release(ctable);
573 static void test_constant_tables(void)
575 test_constant_table("test_basic", ctab_basic, ctab_basic_expected,
576 sizeof(ctab_basic_expected)/sizeof(*ctab_basic_expected));
577 test_constant_table("test_matrices", ctab_matrices, ctab_matrices_expected,
578 sizeof(ctab_matrices_expected)/sizeof(*ctab_matrices_expected));
579 test_constant_table("test_matrices2", ctab_matrices2, ctab_matrices2_expected,
580 sizeof(ctab_matrices2_expected)/sizeof(*ctab_matrices2_expected));
581 test_constant_table("test_arrays", ctab_arrays, ctab_arrays_expected,
582 sizeof(ctab_arrays_expected)/sizeof(*ctab_arrays_expected));
583 test_constant_table("test_default_values", ctab_with_default_values, ctab_with_default_values_expected,
584 sizeof(ctab_with_default_values_expected)/sizeof(*ctab_with_default_values_expected));
585 test_constant_table("test_samplers", ctab_samplers, ctab_samplers_expected,
586 sizeof(ctab_samplers_expected)/sizeof(*ctab_samplers_expected));
589 static void test_setting_basic_table(IDirect3DDevice9 *device)
591 static const D3DXMATRIX mvp = {{{
592 0.514f, 0.626f, 0.804f, 0.786f,
593 0.238f, 0.956f, 0.374f, 0.483f,
594 0.109f, 0.586f, 0.900f, 0.255f,
595 0.898f, 0.411f, 0.932f, 0.275f}}};
596 static const D3DXVECTOR4 f4 = {0.350f, 0.526f, 0.925f, 0.021f};
597 static const float f = 0.12543f;
598 static const int i = 321;
599 static const D3DXMATRIX *matrix_pointer[] = {&mvp};
601 ID3DXConstantTable *ctable;
603 HRESULT res;
604 float out[16];
605 ULONG refcnt;
607 /* Get the constant table from the shader itself */
608 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
609 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
611 /* Set constants */
612 res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
613 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable mvp: got 0x%08x\n", res);
615 res = ID3DXConstantTable_SetInt(ctable, device, "i", i + 1);
616 ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
618 /* Check that setting i again will overwrite the previous value */
619 res = ID3DXConstantTable_SetInt(ctable, device, "i", i);
620 ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
622 res = ID3DXConstantTable_SetFloat(ctable, device, "f", f);
623 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f: got 0x%08x\n", res);
625 res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
626 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f4: got 0x%08x\n", res);
628 /* Get constants back and validate */
629 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
630 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,
631 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
632 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
633 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,
634 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
635 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
636 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,
637 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
638 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
639 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,
640 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
641 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
643 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 1);
644 ok(out[0] == (float)i && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
645 "The variable i was not set correctly, out={%f, %f, %f, %f}, should be {%d, 0.0, 0.0, 0.0}\n",
646 out[0], out[1], out[2], out[3], i);
648 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
649 ok(out[0] == f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
650 "The variable f was not set correctly, out={%f, %f, %f, %f}, should be {%f, 0.0, 0.0, 0.0}\n",
651 out[0], out[1], out[2], out[3], f);
653 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
654 ok(memcmp(out, &f4, sizeof(f4)) == 0,
655 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
656 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
658 /* Finally test using a set* function for one type to set a variable of another type (should succeed) */
659 res = ID3DXConstantTable_SetVector(ctable, device, "f", &f4);
660 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
662 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
663 ok(out[0] == f4.x && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
664 "The variable f was not set correctly by ID3DXConstantTable_SetVector, got %f, should be %f\n",
665 out[0], f4.x);
667 memset(out, 0, sizeof(out));
668 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
669 res = ID3DXConstantTable_SetMatrix(ctable, device, "f", &mvp);
670 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable f: 0x%08x\n", res);
672 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
673 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
674 "The variable f was not set correctly by ID3DXConstantTable_SetMatrix, got %f, should be %f\n",
675 out[0], S(U(mvp))._11);
677 /* Clear registers */
678 memset(out, 0, sizeof(out));
679 IDirect3DDevice9_SetVertexShaderConstantF(device, 0, out, 4);
680 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
681 IDirect3DDevice9_SetVertexShaderConstantF(device, 7, out, 1);
683 /* SetVector shouldn't change the value of a matrix constant */
684 res = ID3DXConstantTable_SetVector(ctable, device, "mvp", &f4);
685 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
687 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
688 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
689 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
690 && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
691 && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
692 "The variable mvp was not set correctly by ID3DXConstantTable_SetVector, "
693 "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
694 "should be all 0.0f\n",
695 out[0], out[1], out[2], out[3],
696 out[4], out[5], out[6], out[7],
697 out[8], out[9], out[10], out[11],
698 out[12], out[13], out[14], out[15]);
700 res = ID3DXConstantTable_SetFloat(ctable, device, "mvp", f);
701 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable mvp: 0x%08x\n", res);
703 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
704 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
705 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
706 && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
707 && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
708 "The variable mvp was not set correctly by ID3DXConstantTable_SetFloat, "
709 "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
710 "should be all 0.0f\n",
711 out[0], out[1], out[2], out[3],
712 out[4], out[5], out[6], out[7],
713 out[8], out[9], out[10], out[11],
714 out[12], out[13], out[14], out[15]);
716 res = ID3DXConstantTable_SetFloat(ctable, device, "f4", f);
717 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f4: 0x%08x\n", res);
719 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
720 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
721 "The variable f4 was not set correctly by ID3DXConstantTable_SetFloat, "
722 "got {%f, %f, %f, %f}, should be all 0.0f\n",
723 out[0], out[1], out[2], out[3]);
725 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "f", &mvp);
726 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f: 0x%08x\n", res);
728 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
729 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
730 "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTranspose, got %f, should be %f\n",
731 out[0], S(U(mvp))._11);
733 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "f4", &mvp);
734 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f4: 0x%08x\n", res);
736 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
737 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,
738 "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTranspose, "
739 "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
740 out[0], out[1], out[2], out[3],
741 S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
743 memset(out, 0, sizeof(out));
744 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
745 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f", matrix_pointer, 1);
746 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f: got %#x\n", res);
748 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
749 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
750 "The variable f was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
751 "got %f, should be %f\n",
752 out[0], S(U(mvp))._11);
754 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f4", matrix_pointer, 1);
755 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f4: got %#x\n", res);
757 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
758 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,
759 "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
760 "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
761 out[0], out[1], out[2], out[3],
762 S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
764 memset(out, 0, sizeof(out));
765 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
766 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "f", matrix_pointer, 1);
767 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f: got %#x\n", res);
769 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
770 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
771 "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
772 "got %f, should be %f\n",
773 out[0], S(U(mvp))._11);
775 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "f4", matrix_pointer, 1);
776 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f4: got %#x\n", res);
778 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
779 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,
780 "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
781 "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
782 out[0], out[1], out[2], out[3],
783 S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
785 refcnt = ID3DXConstantTable_Release(ctable);
786 ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
789 static void test_setting_matrices_table(IDirect3DDevice9 *device)
791 static const D3DXMATRIX fmatrix =
792 {{{2.001f, 1.502f, 9.003f, 1.004f,
793 5.005f, 3.006f, 3.007f, 6.008f,
794 9.009f, 5.010f, 7.011f, 1.012f,
795 5.013f, 5.014f, 5.015f, 9.016f}}};
796 static const D3DXMATRIX *matrix_pointer[] = {&fmatrix};
798 ID3DXConstantTable *ctable;
800 HRESULT res;
801 float out[32];
803 res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
804 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
806 res = ID3DXConstantTable_SetMatrix(ctable, device, "imatrix2x3", &fmatrix);
807 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable imatrix2x3: got %#x\n", res);
809 res = ID3DXConstantTable_SetMatrix(ctable, device, "fmatrix3x1", &fmatrix);
810 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix3x1: got %#x\n", res);
812 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
813 todo_wine ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
814 && out[3] == 0
815 && out[4] == (int)S(U(fmatrix))._21 && out[5] == (int)S(U(fmatrix))._22 && out[6] == (int)S(U(fmatrix))._23
816 && out[7] == 0,
817 "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
818 "should be {%d, %d, %d, %d; %d, %d, %d, %d}\n",
819 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
820 (int)S(U(fmatrix))._11, (int)S(U(fmatrix))._12, (int)S(U(fmatrix))._13, 0,
821 (int)S(U(fmatrix))._21, (int)S(U(fmatrix))._22, (int)S(U(fmatrix))._23, 0);
823 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
824 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f,
825 "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
826 out[0], out[1], out[2], out[3],
827 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f);
829 ID3DXConstantTable_Release(ctable);
831 res = D3DXGetShaderConstantTable(ctab_matrices2, &ctable);
832 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
834 /* SetMatrix */
835 res = ID3DXConstantTable_SetMatrix(ctable, device, "c2x3", &fmatrix);
836 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c2x3: got %#x\n", res);
838 res = ID3DXConstantTable_SetMatrix(ctable, device, "r2x3", &fmatrix);
839 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r2x3: got %#x\n", res);
841 res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x2", &fmatrix);
842 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x2: got %#x\n", res);
844 res = ID3DXConstantTable_SetMatrix(ctable, device, "r3x2", &fmatrix);
845 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r3x2: got %#x\n", res);
847 res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x3", &fmatrix);
848 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x3: got %#x\n", res);
850 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
851 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
852 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
853 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
854 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
855 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
856 out[0], out[1], out[2], out[3],
857 out[4], out[5], out[6], out[7],
858 out[8], out[9], out[10], out[11],
859 S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
860 S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
861 S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
863 res = ID3DXConstantTable_SetMatrix(ctable, device, "r4x4", &fmatrix);
864 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r4x4: got %#x\n", res);
866 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
867 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
868 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
869 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
870 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
871 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
872 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
873 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
875 IDirect3DDevice9_GetVertexShaderConstantF(device, 13, out, 2);
876 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
877 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
878 "The variable c3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
879 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
880 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
881 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
882 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
884 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 3);
885 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
886 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
887 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
888 "The variable r3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
889 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
890 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
891 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
892 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
893 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
895 IDirect3DDevice9_GetVertexShaderConstantF(device, 10, out, 3);
896 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
897 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f
898 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == S(U(fmatrix))._33 && out[11] == 0.0f,
899 "The variable c3x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
900 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
901 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
902 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
903 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f,
904 S(U(fmatrix))._13, S(U(fmatrix))._23, S(U(fmatrix))._33, 0.0f);
906 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
907 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
908 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == S(U(fmatrix))._24
909 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == S(U(fmatrix))._33 && out[11] == S(U(fmatrix))._34
910 && out[12] == S(U(fmatrix))._41 && out[13] == S(U(fmatrix))._42 && out[14] == S(U(fmatrix))._43 && out[15] == S(U(fmatrix))._44,
911 "The variable r4x4 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
912 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
913 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
914 out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
915 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, S(U(fmatrix))._14,
916 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, S(U(fmatrix))._24,
917 S(U(fmatrix))._31, S(U(fmatrix))._32, S(U(fmatrix))._33, S(U(fmatrix))._34,
918 S(U(fmatrix))._41, S(U(fmatrix))._42, S(U(fmatrix))._43, S(U(fmatrix))._44);
920 /* SetMatrixTranspose */
921 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "c2x3", &fmatrix);
922 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable c2x3: got %#x\n", res);
924 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "r2x3", &fmatrix);
925 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable r2x3: got %#x\n", res);
927 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
928 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
929 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
930 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
931 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
932 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
933 out[0], out[1], out[2], out[3],
934 out[4], out[5], out[6], out[7],
935 out[8], out[9], out[10], out[11],
936 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
937 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
938 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
940 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
941 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
942 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
943 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
944 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
945 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
946 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
947 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
949 /* SetMatrixPointerArray */
950 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "c2x3", matrix_pointer, 1);
951 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable c2x3: got %#x\n", res);
953 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "r2x3", matrix_pointer, 1);
954 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable r2x3: got %#x\n", res);
956 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
957 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
958 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
959 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
960 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
961 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
962 out[0], out[1], out[2], out[3],
963 out[4], out[5], out[6], out[7],
964 out[8], out[9], out[10], out[11],
965 S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
966 S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
967 S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
969 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
970 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
971 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
972 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
973 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
974 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
975 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
976 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
978 /* SetMatrixTransposePointerArray */
979 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "c2x3", matrix_pointer, 1);
980 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable c2x3: got %#x\n", res);
982 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "r2x3", matrix_pointer, 1);
983 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable r2x3: got %#x\n", res);
985 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
986 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
987 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
988 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
989 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
990 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
991 out[0], out[1], out[2], out[3],
992 out[4], out[5], out[6], out[7],
993 out[8], out[9], out[10], out[11],
994 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
995 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
996 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
998 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
999 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
1000 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
1001 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
1002 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1003 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1004 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
1005 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
1007 ID3DXConstantTable_Release(ctable);
1010 static void test_setting_arrays_table(IDirect3DDevice9 *device)
1012 static const float farray[8] = {
1013 0.005f, 0.745f, 0.973f, 0.264f,
1014 0.010f, 0.020f, 0.030f, 0.040f};
1015 static const D3DXMATRIX fmtxarray[2] = {
1016 {{{0.001f, 0.002f, 0.003f, 0.004f,
1017 0.005f, 0.006f, 0.007f, 0.008f,
1018 0.009f, 0.010f, 0.011f, 0.012f,
1019 0.013f, 0.014f, 0.015f, 0.016f}}},
1020 {{{0.010f, 0.020f, 0.030f, 0.040f,
1021 0.050f, 0.060f, 0.070f, 0.080f,
1022 0.090f, 0.100f, 0.110f, 0.120f,
1023 0.130f, 0.140f, 0.150f, 0.160f}}}};
1024 static const int iarray[4] = {1, 2, 3, 4};
1025 static const D3DXVECTOR4 fvecarray[2] = {
1026 {0.745f, 0.997f, 0.353f, 0.237f},
1027 {0.060f, 0.455f, 0.333f, 0.983f}};
1028 static BOOL barray[4] = {FALSE, 100, TRUE, TRUE};
1030 ID3DXConstantTable *ctable;
1032 HRESULT res;
1033 float out[32];
1034 ULONG refcnt;
1036 /* Clear registers */
1037 memset(out, 0, sizeof(out));
1038 IDirect3DDevice9_SetVertexShaderConstantF(device, 8, out, 4);
1039 IDirect3DDevice9_SetVertexShaderConstantF(device, 12, out, 4);
1041 /* Get the constant table from the shader */
1042 res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1043 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
1045 /* Set constants */
1047 /* Make sure that we cannot set registers that do not belong to this constant */
1048 res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 8);
1049 ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got 0x%08x\n", res);
1051 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 8);
1052 ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1053 "The in-bounds elements of the array were not set, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1054 out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1055 ok(out[16] == 0.0f && out[20] == 0.0f && out[24] == 0.0f && out[28] == 0.0f,
1056 "The excess elements of the array were set, out={%f, %f, %f, %f}, should be all 0.0f\n",
1057 out[16], out[20], out[24], out[28]);
1059 /* ivecarray takes up only 1 register, but a matrix takes up 4, so no elements should be set */
1060 res = ID3DXConstantTable_SetMatrix(ctable, device, "ivecarray", &fmtxarray[0]);
1061 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got 0x%08x\n", res);
1063 IDirect3DDevice9_GetVertexShaderConstantF(device, 18, out, 4);
1064 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
1065 "The array was set, out={%f, %f, %f, %f}, should be all 0.0f\n", out[0], out[1], out[2], out[3]);
1067 /* Try setting an integer array to an array declared as a float array */
1068 res = ID3DXConstantTable_SetIntArray(ctable, device, "farray", iarray, 4);
1069 ok(res == D3D_OK, "ID3DXConstantTable_SetIntArray failed: got 0x%08x\n", res);
1071 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1072 ok(out[0] == iarray[0] && out[4] == iarray[1] && out[8] == iarray[2] && out[12] == iarray[3],
1073 "SetIntArray did not properly set a float array: out={%f, %f, %f, %f}, should be {%d, %d, %d, %d}\n",
1074 out[0], out[4], out[8], out[12], iarray[0], iarray[1], iarray[2], iarray[3]);
1076 res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 4);
1077 ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got x0%08x\n", res);
1079 res = ID3DXConstantTable_SetVectorArray(ctable, device, "fvecarray", fvecarray, 2);
1080 ok(res == D3D_OK, "ID3DXConstantTable_SetVectorArray failed: got 0x%08x\n", res);
1082 res = ID3DXConstantTable_SetMatrixArray(ctable, device, "fmtxarray", fmtxarray, 2);
1083 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixArray failed: got 0x%08x\n", res);
1085 res = ID3DXConstantTable_SetBoolArray(ctable, device, "barray", barray, 2);
1086 ok(res == D3D_OK, "ID3DXConstantTable_SetBoolArray failed: got 0x%08x\n", res);
1088 /* Read back constants */
1089 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1090 ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1091 "The variable farray was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1092 out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1094 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1095 ok(out[0] == fvecarray[0].x && out[1] == fvecarray[0].y && out[2] == fvecarray[0].z && out[3] == fvecarray[0].w &&
1096 out[4] == fvecarray[1].x && out[5] == fvecarray[1].y && out[6] == fvecarray[1].z && out[7] == fvecarray[1].w,
1097 "The variable fvecarray was not set correctly, out={{%f, %f, %f, %f}, {%f, %f, %f, %f}}, should be "
1098 "{{%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],
1099 fvecarray[0].x, fvecarray[0].y, fvecarray[0].z, fvecarray[0].w, fvecarray[1].x, fvecarray[1].y,
1100 fvecarray[1].z, fvecarray[1].w);
1102 IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1103 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1104 && out[4] == 1.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1105 "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",
1106 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1107 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);
1109 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 8);
1110 /* Just check a few elements in each matrix to make sure fmtxarray was set row-major */
1111 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,
1112 "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1113 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);
1114 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,
1115 "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1116 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);
1118 refcnt = ID3DXConstantTable_Release(ctable);
1119 ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
1122 static void test_SetDefaults(IDirect3DDevice9 *device)
1124 static const D3DXMATRIX mvp = {{{
1125 0.51f, 0.62f, 0.80f, 0.78f,
1126 0.23f, 0.95f, 0.37f, 0.48f,
1127 0.10f, 0.58f, 0.90f, 0.25f,
1128 0.89f, 0.41f, 0.93f, 0.27f}}};
1129 static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1131 float out[16];
1133 HRESULT res;
1134 ID3DXConstantTable *ctable;
1136 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1137 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1139 res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
1140 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed: got %08x\n", res);
1142 res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
1143 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got %08x\n", res);
1145 res = ID3DXConstantTable_SetDefaults(ctable, device);
1146 ok(res == D3D_OK, "ID3dXConstantTable_SetDefaults failed: got %08x\n", res);
1148 /* SetDefaults doesn't change constants without default values */
1149 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1150 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,
1151 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1152 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1153 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,
1154 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1155 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1156 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,
1157 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1158 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1159 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,
1160 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1161 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1163 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1164 ok(memcmp(out, &f4, sizeof(f4)) == 0,
1165 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1166 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1168 ID3DXConstantTable_Release(ctable);
1170 res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1171 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1173 res = ID3DXConstantTable_SetDefaults(ctable, device);
1174 ok(res == D3D_OK, "ID3DXConstantTable_SetDefaults failed: got %08x\n", res);
1176 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1177 ok(memcmp(out, mat4_default_value, sizeof(mat4_default_value)) == 0,
1178 "The variable mat4 was not set correctly to default value\n");
1180 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 4);
1181 ok(memcmp(out, mat3_default_value, sizeof(mat3_default_value)) == 0,
1182 "The variable mat3 was not set correctly to default value\n");
1184 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1185 ok(memcmp(out, arr_default_value, sizeof(arr_default_value)) == 0,
1186 "The variable array was not set correctly to default value\n");
1188 IDirect3DDevice9_GetVertexShaderConstantF(device, 11, out, 1);
1189 ok(memcmp(out, vec4_default_value, sizeof(vec4_default_value)) == 0,
1190 "The variable vec4 was not set correctly to default value\n");
1192 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 1);
1193 ok(memcmp(out, flt_default_value, sizeof(flt_default_value)) == 0,
1194 "The variable flt was not set correctly to default value\n");
1196 ID3DXConstantTable_Release(ctable);
1199 static void test_SetValue(IDirect3DDevice9 *device)
1201 static const D3DXMATRIX mvp = {{{
1202 0.51f, 0.62f, 0.80f, 0.78f,
1203 0.23f, 0.95f, 0.37f, 0.48f,
1204 0.10f, 0.58f, 0.90f, 0.25f,
1205 0.89f, 0.41f, 0.93f, 0.27f}}};
1206 static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1207 static const FLOAT arr[] = {0.33f, 0.55f, 0.96f, 1.00f,
1208 1.00f, 1.00f, 1.00f, 1.00f,
1209 1.00f, 1.00f, 1.00f, 1.00f};
1210 static int imatrix[] = {1, 2, 3, 4, 5, 6};
1211 static float fmatrix[] = {1.1f, 2.2f, 3.3f, 4.4f};
1212 static BOOL barray[] = {TRUE, FALSE};
1213 static float fvecarray[] = {9.1f, 9.2f, 9.3f, 9.4f, 9.5f, 9.6f, 9.7f, 9.8f};
1214 static float farray[] = {2.2f, 3.3f};
1216 static const float def[16] = {5.5f, 5.5f, 5.5f, 5.5f,
1217 5.5f, 5.5f, 5.5f, 5.5f,
1218 5.5f, 5.5f, 5.5f, 5.5f,
1219 5.5f, 5.5f, 5.5f, 5.5f};
1220 float out[16];
1222 HRESULT res;
1223 ID3DXConstantTable *ctable;
1225 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1226 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1228 IDirect3DDevice9_SetVertexShaderConstantF(device, 7, def, 1);
1230 /* SetValue called with 0 bytes size doesn't change value */
1231 res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, 0);
1232 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1234 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1235 ok(memcmp(out, def, sizeof(f4)) == 0,
1236 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1237 out[0], out[1], out[2], out[3], def[0], def[1], def[2], def[3]);
1239 res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, sizeof(f4));
1240 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1242 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1243 ok(memcmp(out, &f4, sizeof(f4)) == 0,
1244 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1245 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1247 IDirect3DDevice9_SetVertexShaderConstantF(device, 0, def, 4);
1249 /* SetValue called with size smaller than constant size doesn't change value */
1250 res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp) / 2);
1251 ok(res == D3D_OK, "ID3DXConstantTable_SetValue returned %08x\n", res);
1253 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1254 ok(memcmp(out, def, sizeof(def)) == 0,
1255 "The variable mvp was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1256 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1257 out[0], out[4], out[ 8], out[12],
1258 out[1], out[5], out[ 9], out[13],
1259 out[2], out[6], out[10], out[14],
1260 out[3], out[7], out[11], out[15],
1261 def[0], def[4], def[ 8], def[12],
1262 def[1], def[5], def[ 9], def[13],
1263 def[2], def[6], def[10], def[14],
1264 def[3], def[7], def[11], def[15]);
1266 res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp));
1267 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1269 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1270 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,
1271 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1272 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1273 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,
1274 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1275 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1276 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,
1277 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1278 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1279 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,
1280 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1281 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1283 ID3DXConstantTable_Release(ctable);
1285 res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1286 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1288 res = ID3DXConstantTable_SetValue(ctable, device, "arr", arr, sizeof(arr));
1289 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1291 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1292 ok(out[0] == arr[0] && out[4] == arr[1] && out[8] == arr[2]
1293 && out[1] == 0 && out[2] == 0 && out[3] == 0 && out[5] == 0 && out[6] == 0 && out[7] == 0
1294 && out[9] == 0 && out[10] == 0 && out[11] == 0,
1295 "The variable arr was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f}, "
1296 "should be {0.33, 0, 0, 0, 0.55, 0, 0, 0, 0.96, 0, 0, 0}\n",
1297 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11]);
1299 ID3DXConstantTable_Release(ctable);
1301 res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
1302 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1304 res = ID3DXConstantTable_SetValue(ctable, device, "fmatrix3x1", fmatrix, sizeof(fmatrix));
1305 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1307 res = ID3DXConstantTable_SetValue(ctable, device, "imatrix2x3", imatrix, sizeof(imatrix));
1308 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1310 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
1311 ok(out[0] == imatrix[0] && out[1] == imatrix[1] && out[2] == imatrix[2] && out[3] == 0.0f
1312 && out[4] == imatrix[3] && out[5] == imatrix[4] && out[6] == imatrix[5] && out[7] == 0.0f,
1313 "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1314 "should be {%d, %d, %d, 0, %d, %d, %d, 0}\n",
1315 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1316 imatrix[0], imatrix[1], imatrix[2], imatrix[3], imatrix[4], imatrix[5]);
1318 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 2);
1319 ok(out[0] == fmatrix[0] && out[1] == fmatrix[1] && out[2] == fmatrix[2] && out[3] == 0.0f,
1320 "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1321 out[0], out[1] ,out[2], out[4],
1322 fmatrix[0], fmatrix[1], fmatrix[2], 0.0f);
1324 ID3DXConstantTable_Release(ctable);
1326 res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1327 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1329 res = ID3DXConstantTable_SetValue(ctable, device, "barray", barray, sizeof(barray));
1330 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1332 res = ID3DXConstantTable_SetValue(ctable, device, "fvecarray", fvecarray, sizeof(fvecarray));
1333 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1335 IDirect3DDevice9_SetVertexShaderConstantF(device, 8, def, 4);
1336 res = ID3DXConstantTable_SetValue(ctable, device, "farray", farray, sizeof(farray));
1337 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1339 /* 2 elements of farray were set */
1340 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1341 ok(out[0] == farray[0] && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1342 && out[4] == farray[1] && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
1343 && out[8] == def[8] && out[9] == def[9] && out[10] == def[10] && out[11] == def[11]
1344 && out[12] == def[12] && out[13] == def[13] && out[14] == def[14] && out[15] == def[15],
1345 "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}, "
1346 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1347 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1348 out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
1349 farray[0], 0.0f, 0.0f, 0.0f,
1350 farray[1], 0.0f, 0.0f, 0.0f,
1351 def[8], def[9], def[10], def[11],
1352 def[12], def[13], def[14], def[15]);
1354 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1355 ok(out[0] == fvecarray[0] && out[1] == fvecarray[1] && out[2] == fvecarray[2] && out[3] == fvecarray[3]
1356 && out[4] == fvecarray[4] && out[5] == fvecarray[5] && out[6] == fvecarray[6] && out[7] == fvecarray[7],
1357 "The variable fvecarray was not set correctly, out ={%f, %f, %f, %f, %f, %f, %f, %f}, "
1358 "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1359 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1360 fvecarray[0], fvecarray[1], fvecarray[2], fvecarray[3], fvecarray[4], fvecarray[5], fvecarray[6], fvecarray[7]);
1362 IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1363 ok(out[0] == 1.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1364 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1365 "The variable barray was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1366 "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1367 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1368 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
1370 ID3DXConstantTable_Release(ctable);
1373 static void test_setting_constants(void)
1375 HWND wnd;
1376 IDirect3D9 *d3d;
1377 IDirect3DDevice9 *device;
1378 D3DPRESENT_PARAMETERS d3dpp;
1379 HRESULT hr;
1380 ULONG refcnt;
1382 /* Create the device to use for our tests */
1383 wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
1384 d3d = Direct3DCreate9(D3D_SDK_VERSION);
1385 if (!wnd)
1387 skip("Couldn't create application window\n");
1388 return;
1390 if (!d3d)
1392 skip("Couldn't create IDirect3D9 object\n");
1393 DestroyWindow(wnd);
1394 return;
1397 ZeroMemory(&d3dpp, sizeof(d3dpp));
1398 d3dpp.Windowed = TRUE;
1399 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
1400 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device);
1401 if (FAILED(hr))
1403 skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1404 IDirect3D9_Release(d3d);
1405 DestroyWindow(wnd);
1406 return;
1409 test_setting_basic_table(device);
1410 test_setting_matrices_table(device);
1411 test_setting_arrays_table(device);
1412 test_SetDefaults(device);
1413 test_SetValue(device);
1415 /* Release resources */
1416 refcnt = IDirect3DDevice9_Release(device);
1417 ok(refcnt == 0, "The Direct3D device reference count was %u, should be 0\n", refcnt);
1419 refcnt = IDirect3D9_Release(d3d);
1420 ok(refcnt == 0, "The Direct3D object referenct count was %u, should be 0\n", refcnt);
1422 if (wnd) DestroyWindow(wnd);
1425 static void test_get_sampler_index(void)
1427 ID3DXConstantTable *ctable;
1429 HRESULT res;
1430 UINT index;
1432 ULONG refcnt;
1434 res = D3DXGetShaderConstantTable(ctab_samplers, &ctable);
1435 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on ctab_samplers: got %08x\n", res);
1437 index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler1");
1438 ok(index == 0, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 0\n", index);
1440 index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler2");
1441 ok(index == 3, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 3\n", index);
1443 index = ID3DXConstantTable_GetSamplerIndex(ctable, "nonexistent");
1444 ok(index == -1, "ID3DXConstantTable_GetSamplerIndex found nonexistent sampler: Got %d\n",
1445 index);
1447 index = ID3DXConstantTable_GetSamplerIndex(ctable, "notsampler");
1448 ok(index == -1, "ID3DXConstantTable_GetSamplerIndex succeeded on non-sampler constant: Got %d\n",
1449 index);
1451 refcnt = ID3DXConstantTable_Release(ctable);
1452 ok(refcnt == 0, "The ID3DXConstantTable reference count was %u, should be 0\n", refcnt);
1456 * fxc.exe /Tps_3_0
1458 #if 0
1459 sampler s;
1460 sampler1D s1D;
1461 sampler2D s2D;
1462 sampler3D s3D;
1463 samplerCUBE scube;
1464 float4 init;
1465 float4 main(float3 tex : TEXCOORD0) : COLOR
1467 float4 tmp = init;
1468 tmp = tmp + tex1D(s1D, tex.x);
1469 tmp = tmp + tex1D(s1D, tex.y);
1470 tmp = tmp + tex3D(s3D, tex.xyz);
1471 tmp = tmp + tex1D(s, tex.x);
1472 tmp = tmp + tex2D(s2D, tex.xy);
1473 tmp = tmp + texCUBE(scube, tex.xyz);
1474 return tmp;
1476 #endif
1477 static const DWORD get_shader_samplers_blob[] =
1479 0xffff0300, /* ps_3_0 */
1480 0x0054fffe, FCC_CTAB, /* CTAB comment */
1481 0x0000001c, 0x0000011b, 0xffff0300, 0x00000006, 0x0000001c, 0x00000100, /* Header */
1482 0x00000114,
1483 0x00000094, 0x00000002, 0x00000001, 0x0000009c, 0x00000000, /* Constant 1 desc (init) */
1484 0x000000ac, 0x00040003, 0x00000001, 0x000000b0, 0x00000000, /* Constant 2 desc (s) */
1485 0x000000c0, 0x00000003, 0x00000001, 0x000000c4, 0x00000000, /* Constant 3 desc (s1D) */
1486 0x000000d4, 0x00010003, 0x00000001, 0x000000d8, 0x00000000, /* Constant 4 desc (s2D) */
1487 0x000000e8, 0x00030003, 0x00000001, 0x000000ec, 0x00000000, /* Constant 5 desc (s3D) */
1488 0x000000fc, 0x00020003, 0x00000001, 0x00000104, 0x00000000, /* Constant 6 desc (scube) */
1489 0x74696e69, 0xababab00, /* Constant 1 name */
1490 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
1491 0xabab0073, /* Constant 2 name */
1492 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 2 type desc */
1493 0x00443173, /* Constant 3 name */
1494 0x000b0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 type desc */
1495 0x00443273, /* Constant 4 name */
1496 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 4 type desc */
1497 0x00443373, /* Constant 5 name */
1498 0x000d0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 5 type desc */
1499 0x62756373, 0xabab0065, /* Constant 6 name */
1500 0x000e0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 6 type desc */
1501 0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, /* Target/Creator name string */
1502 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
1503 0x332e3235, 0x00313131,
1504 0x0200001f, 0x80000005, 0x90070000, 0x0200001f, 0x90000000, 0xa00f0800, /* shader */
1505 0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f, 0x98000000, 0xa00f0802,
1506 0x0200001f, 0xa0000000, 0xa00f0803, 0x0200001f, 0x90000000, 0xa00f0804,
1507 0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000,
1508 0x80e40000, 0xa0e40000, 0x03000042, 0x800f0001, 0x90550000, 0xa0e40800,
1509 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1510 0x90e40000, 0xa0e40803, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001,
1511 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40804, 0x03000002, 0x800f0000,
1512 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801,
1513 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1514 0x90e40000, 0xa0e40802, 0x03000002, 0x800f0800, 0x80e40000, 0x80e40001,
1515 0x0000ffff, /* END */
1518 static void test_get_shader_samplers(void)
1520 LPCSTR samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
1521 LPCSTR sampler_orig;
1522 UINT count = 2;
1523 HRESULT hr;
1525 #if 0
1526 /* crashes if bytecode is NULL */
1527 hr = D3DXGetShaderSamplers(NULL, NULL, &count);
1528 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1529 #endif
1531 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, NULL);
1532 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1534 samplers[5] = "dummy";
1536 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, NULL);
1537 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1539 /* check that sampler points to shader blob */
1540 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1541 ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1543 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1544 ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1546 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1547 ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1549 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1550 ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1552 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1553 ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1555 ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1557 /* reset samplers */
1558 memset(samplers, 0, sizeof(samplers));
1559 samplers[5] = "dummy";
1561 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, &count);
1562 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1563 ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1565 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, &count);
1566 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1567 ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1569 /* check that sampler points to shader blob */
1570 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1571 ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1573 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1574 ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1576 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1577 ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1579 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1580 ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1582 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1583 ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1585 ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1587 /* check without ctab */
1588 hr = D3DXGetShaderSamplers(simple_vs, samplers, &count);
1589 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1590 ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1592 /* check invalid ctab */
1593 hr = D3DXGetShaderSamplers(shader_with_invalid_ctab, samplers, &count);
1594 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1595 ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1599 * fxc.exe /Tvs_3_0
1601 #if 0
1602 float f = {1.1f}, f_2[2] = {2.1f, 2.2f};
1603 struct {float f; int i;} s = {3.1f, 31},
1604 s_2[2] = {{4.1f, 41}, {4.2f, 42}},
1605 s_3[3] = {{5.1f, 51}, {5.2f, 52}, {5.3f, 53}};
1606 struct {int i1; int i2; float2 f_2; row_major float3x1 r[2];}
1607 p[2] = {{11, 12, {13.1, 14.1}, {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}}},
1608 {15, 16, {17.1, 18.1}, {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}}}};
1609 int i[1] = {6};
1610 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}};
1611 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}};
1612 float3 v[2] = {{2.11, 2.21, 2.31}, {2.41, 2.51, 2.61}};
1613 row_major float3x1 r31[2] = {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}};
1614 row_major float1x3 r13[2] = {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}};
1615 float4 main(float4 pos : POSITION) : POSITION
1617 float4 tmp = 0.0f;
1618 tmp.zyw = v[1] + r13[1] + r31[1] + p[1].r[1];
1619 tmp.x += f * f_2[1] * pos.x * p[1].f_2.y;
1620 tmp.y += s.f * pos.y * s_2[0].i;
1621 tmp.z += s_3[0].f * pos.z * s_3[2].f * i[0] * f23[1]._11 * f32[1]._32;
1622 return tmp;
1624 #endif
1625 static const DWORD test_get_shader_constant_variables_blob[] =
1627 0xfffe0300, 0x0185fffe, 0x42415443, 0x0000001c, 0x000005df, 0xfffe0300, 0x0000000c, 0x0000001c,
1628 0x00000100, 0x000005d8, 0x0000010c, 0x002d0002, 0x00000001, 0x00000110, 0x00000120, 0x00000130,
1629 0x001d0002, 0x00000004, 0x00000134, 0x00000144, 0x000001a4, 0x00210002, 0x00000004, 0x000001a8,
1630 0x000001b8, 0x000001f8, 0x00250002, 0x00000002, 0x000001fc, 0x0000020c, 0x0000022c, 0x002f0002,
1631 0x00000001, 0x00000230, 0x00000240, 0x00000250, 0x00000002, 0x00000012, 0x000002b0, 0x000002c0,
1632 0x000003e0, 0x002b0002, 0x00000002, 0x000003e4, 0x000003f4, 0x00000414, 0x00120002, 0x00000006,
1633 0x00000418, 0x00000428, 0x00000488, 0x002e0002, 0x00000001, 0x000004ac, 0x000004bc, 0x000004dc,
1634 0x00270002, 0x00000002, 0x000004e0, 0x000004f0, 0x00000530, 0x00180002, 0x00000005, 0x00000534,
1635 0x00000544, 0x000005a4, 0x00290002, 0x00000002, 0x000005a8, 0x000005b8, 0xabab0066, 0x00030000,
1636 0x00010001, 0x00000001, 0x00000000, 0x3f8ccccd, 0x00000000, 0x00000000, 0x00000000, 0x00333266,
1637 0x00030003, 0x00030002, 0x00000002, 0x00000000, 0x3de147ae, 0x3ed1eb85, 0x00000000, 0x00000000,
1638 0x3e570a3d, 0x3f028f5c, 0x00000000, 0x00000000, 0x3e9eb852, 0x3f1c28f6, 0x00000000, 0x00000000,
1639 0x3df5c28f, 0x3ed70a3d, 0x00000000, 0x00000000, 0x3e6147ae, 0x3f051eb8, 0x00000000, 0x00000000,
1640 0x3ea3d70a, 0x3f1eb852, 0x00000000, 0x00000000, 0x00323366, 0x00030003, 0x00020003, 0x00000002,
1641 0x00000000, 0x3f8e147b, 0x3fa7ae14, 0x3fc147ae, 0x00000000, 0x3f9ae148, 0x3fb47ae1, 0x3fce147b,
1642 0x00000000, 0x3f8f5c29, 0x3fa8f5c3, 0x3fc28f5c, 0x00000000, 0x3f9c28f6, 0x3fb5c28f, 0x3fcf5c29,
1643 0x00000000, 0x00325f66, 0x00030000, 0x00010001, 0x00000002, 0x00000000, 0x40066666, 0x00000000,
1644 0x00000000, 0x00000000, 0x400ccccd, 0x00000000, 0x00000000, 0x00000000, 0xabab0069, 0x00020000,
1645 0x00010001, 0x00000001, 0x00000000, 0x40c00000, 0x00000000, 0x00000000, 0x00000000, 0x31690070,
1646 0xababab00, 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0xab003269, 0x00030001, 0x00020001,
1647 0x00000001, 0x00000000, 0xabab0072, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x00000252,
1648 0x00000258, 0x00000268, 0x00000258, 0x000001f8, 0x0000026c, 0x0000027c, 0x00000280, 0x00000005,
1649 0x000a0001, 0x00040002, 0x00000290, 0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x41400000,
1650 0x00000000, 0x00000000, 0x00000000, 0x4151999a, 0x4161999a, 0x00000000, 0x00000000, 0x40470a3d,
1651 0x00000000, 0x00000000, 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a,
1652 0x00000000, 0x00000000, 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7,
1653 0x00000000, 0x00000000, 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0x41700000,
1654 0x00000000, 0x00000000, 0x00000000, 0x41800000, 0x00000000, 0x00000000, 0x00000000, 0x4188cccd,
1655 0x4190cccd, 0x00000000, 0x00000000, 0x4083851f, 0x00000000, 0x00000000, 0x00000000, 0x4086b852,
1656 0x00000000, 0x00000000, 0x00000000, 0x4089eb85, 0x00000000, 0x00000000, 0x00000000, 0x408d1eb8,
1657 0x00000000, 0x00000000, 0x00000000, 0x409051ec, 0x00000000, 0x00000000, 0x00000000, 0x4093851f,
1658 0x00000000, 0x00000000, 0x00000000, 0x00333172, 0x00030002, 0x00030001, 0x00000002, 0x00000000,
1659 0x4083851f, 0x4086b852, 0x4089eb85, 0x00000000, 0x408d1eb8, 0x409051ec, 0x4093851f, 0x00000000,
1660 0x00313372, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x40470a3d, 0x00000000, 0x00000000,
1661 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a, 0x00000000, 0x00000000,
1662 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7, 0x00000000, 0x00000000,
1663 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0xabab0073, 0x00030000, 0x00010001,
1664 0x00000001, 0x00000000, 0x0000010c, 0x0000048c, 0x0000022c, 0x00000258, 0x00000005, 0x00020001,
1665 0x00020001, 0x0000049c, 0x40466666, 0x00000000, 0x00000000, 0x00000000, 0x41f80000, 0x00000000,
1666 0x00000000, 0x00000000, 0x00325f73, 0x00000005, 0x00020001, 0x00020002, 0x0000049c, 0x40833333,
1667 0x00000000, 0x00000000, 0x00000000, 0x42240000, 0x00000000, 0x00000000, 0x00000000, 0x40866666,
1668 0x00000000, 0x00000000, 0x00000000, 0x42280000, 0x00000000, 0x00000000, 0x00000000, 0x00335f73,
1669 0x00000005, 0x00020001, 0x00020003, 0x0000049c, 0x40a33333, 0x00000000, 0x00000000, 0x00000000,
1670 0x424c0000, 0x00000000, 0x00000000, 0x00000000, 0x40a66666, 0x00000000, 0x00000000, 0x00000000,
1671 0x42500000, 0x00000000, 0x00000000, 0x00000000, 0x40a9999a, 0x00000000, 0x00000000, 0x00000000,
1672 0x42540000, 0x00000000, 0x00000000, 0x00000000, 0xabab0076, 0x00030001, 0x00030001, 0x00000002,
1673 0x00000000, 0x40070a3d, 0x400d70a4, 0x4013d70a, 0x00000000, 0x401a3d71, 0x4020a3d7, 0x40270a3d,
1674 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
1675 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f,
1676 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0x80070000, 0xa0e4002a,
1677 0x03000002, 0x80070000, 0x80e40000, 0xa0e4002c, 0x03000002, 0x80040000, 0x80aa0000, 0xa0000017,
1678 0x03000002, 0xe0080000, 0x80aa0000, 0xa0000011, 0x02000001, 0x80010001, 0xa000002d, 0x03000005,
1679 0x80040000, 0x80000001, 0xa0000026, 0x03000005, 0x80040000, 0x80aa0000, 0x90000000, 0x03000005,
1680 0xe0010000, 0x80aa0000, 0xa055000b, 0x03000002, 0x80020000, 0x80550000, 0xa0000016, 0x03000002,
1681 0x80010000, 0x80000000, 0xa0000015, 0x03000002, 0x80010000, 0x80000000, 0xa000000f, 0x03000002,
1682 0x80020000, 0x80550000, 0xa0000010, 0x03000005, 0x80040000, 0xa000002e, 0x90550000, 0x04000004,
1683 0xe0020000, 0x80aa0000, 0xa0000028, 0x80550000, 0x03000005, 0x80020000, 0xa0000018, 0x90aa0000,
1684 0x03000005, 0x80020000, 0x80550000, 0xa000001c, 0x03000005, 0x80020000, 0x80550000, 0xa000002f,
1685 0x03000005, 0x80020000, 0x80550000, 0xa0000020, 0x04000004, 0xe0040000, 0x80550000, 0xa0aa0024,
1686 0x80000000, 0x0000ffff,
1689 const struct {
1690 LPCSTR fullname;
1691 D3DXCONSTANT_DESC desc;
1692 UINT ctaboffset;
1694 test_get_shader_constant_variables_data[] =
1696 {"f", {"f", D3DXRS_FLOAT4, 45, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 72},
1697 {"f23", {"f23", D3DXRS_FLOAT4, 29, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 2, 0, 48, NULL}, 81},
1698 {"f23[0]", {"f23", D3DXRS_FLOAT4, 29, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL}, 81},
1699 {"f23[1]", {"f23", D3DXRS_FLOAT4, 32, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL}, 93},
1700 {"f32", {"f32", D3DXRS_FLOAT4, 33, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 2, 0, 48, NULL}, 110},
1701 {"f32[0]", {"f32", D3DXRS_FLOAT4, 33, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL}, 110},
1702 {"f32[1]", {"f32", D3DXRS_FLOAT4, 35, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL}, 118},
1703 {"f_2", {"f_2", D3DXRS_FLOAT4, 37, 2, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 2, 0, 8, NULL}, 131},
1704 {"f_2[0]", {"f_2", D3DXRS_FLOAT4, 37, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 131},
1705 {"f_2[1]", {"f_2", D3DXRS_FLOAT4, 38, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 135},
1706 {"i", {"i", D3DXRS_FLOAT4, 47, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 144},
1707 {"i[0]", {"i", D3DXRS_FLOAT4, 47, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 144},
1708 {"p", {"p", D3DXRS_FLOAT4, 0, 18, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 2, 4, 80, NULL}, 176},
1709 {"p[0]", {"p", D3DXRS_FLOAT4, 0, 9, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 1, 4, 40, NULL}, 176},
1710 {"p[0].i1", {"i1", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 176},
1711 {"p[0].i2", {"i2", D3DXRS_FLOAT4, 1, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 180},
1712 {"p[0].f_2", {"f_2", D3DXRS_FLOAT4, 2, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 1, 0, 8, NULL}, 184},
1713 {"p[0].r", {"r", D3DXRS_FLOAT4, 3, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 188},
1714 {"p[0].r[0]", {"r", D3DXRS_FLOAT4, 3, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 188},
1715 {"p[0].r[1]", {"r", D3DXRS_FLOAT4, 6, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 200},
1716 {"p[1]", {"p", D3DXRS_FLOAT4, 9, 9, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 1, 4, 40, NULL}, 212},
1717 {"p[1].i1", {"i1", D3DXRS_FLOAT4, 9, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 212},
1718 {"p[1].i2", {"i2", D3DXRS_FLOAT4, 10, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 216},
1719 {"p[1].f_2", {"f_2", D3DXRS_FLOAT4, 11, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 1, 0, 8, NULL}, 220},
1720 {"p[1].r", {"r", D3DXRS_FLOAT4, 12, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 224},
1721 {"p[1].r[0]", {"r", D3DXRS_FLOAT4, 12, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 224},
1722 {"p[1].r[1]", {"r", D3DXRS_FLOAT4, 15, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 236},
1723 {"r13", {"r13", D3DXRS_FLOAT4, 43, 2, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 253},
1724 {"r13[0]", {"r13", D3DXRS_FLOAT4, 43, 1, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 253},
1725 {"r13[1]", {"r13", D3DXRS_FLOAT4, 44, 1, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 257},
1726 {"r31", {"r31", D3DXRS_FLOAT4, 18, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 266},
1727 {"r31[0]", {"r31", D3DXRS_FLOAT4, 18, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 266},
1728 {"r31[1]", {"r31", D3DXRS_FLOAT4, 21, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 278},
1729 {"s", {"s", D3DXRS_FLOAT4, 46, 1, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 303},
1730 {"s.f", {"f", D3DXRS_FLOAT4, 46, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 303},
1731 {"s.i", {"i", D3DXRS_FLOAT4, 47, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 307},
1732 {"s_2", {"s_2", D3DXRS_FLOAT4, 39, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 2, 2, 16, NULL}, 316},
1733 {"s_2[0]", {"s_2", D3DXRS_FLOAT4, 39, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 316},
1734 {"s_2[0].f", {"f", D3DXRS_FLOAT4, 39, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 316},
1735 {"s_2[0].i", {"i", D3DXRS_FLOAT4, 40, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 320},
1736 {"s_2[1]", {"s_2", D3DXRS_FLOAT4, 41, 0, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 324},
1737 {"s_2[1].f", {"f", D3DXRS_FLOAT4, 41, 0, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 324},
1738 {"s_2[1].i", {"i", D3DXRS_FLOAT4, 41, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 328},
1739 {"s_3", {"s_3", D3DXRS_FLOAT4, 24, 5, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 3, 2, 24, NULL}, 337},
1740 {"s_3[0]", {"s_3", D3DXRS_FLOAT4, 24, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 337},
1741 {"s_3[0].f", {"f", D3DXRS_FLOAT4, 24, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 337},
1742 {"s_3[0].i", {"i", D3DXRS_FLOAT4, 25, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 341},
1743 {"s_3[1]", {"s_3", D3DXRS_FLOAT4, 26, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 345},
1744 {"s_3[1].f", {"f", D3DXRS_FLOAT4, 26, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 345},
1745 {"s_3[1].i", {"i", D3DXRS_FLOAT4, 27, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 349},
1746 {"s_3[2]", {"s_3", D3DXRS_FLOAT4, 28, 1, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 353},
1747 {"s_3[2].f", {"f", D3DXRS_FLOAT4, 28, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 353},
1748 {"s_3[2].i", {"i", D3DXRS_FLOAT4, 29, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 357},
1749 {"v", {"v", D3DXRS_FLOAT4, 41, 2, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 366},
1750 {"v[0]", {"v", D3DXRS_FLOAT4, 41, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 366},
1751 {"v[1]", {"v", D3DXRS_FLOAT4, 42, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 370},
1754 static void test_get_shader_constant_variables(void)
1756 ID3DXConstantTable *ctable;
1757 HRESULT hr;
1758 ULONG count;
1759 UINT i;
1760 UINT nr = 1;
1761 D3DXHANDLE constant, element;
1762 D3DXCONSTANT_DESC desc;
1763 DWORD *ctab;
1765 hr = D3DXGetShaderConstantTable(test_get_shader_constant_variables_blob, &ctable);
1766 ok(hr == D3D_OK, "D3DXGetShaderConstantTable failed, got %08x, expected %08x\n", hr, D3D_OK);
1768 ctab = ID3DXConstantTable_GetBufferPointer(ctable);
1769 ok(ctab[0] == test_get_shader_constant_variables_blob[3], "ID3DXConstantTable_GetBufferPointer failed\n");
1771 for (i = 0; i < sizeof(test_get_shader_constant_variables_data) / sizeof(*test_get_shader_constant_variables_data); ++i)
1773 LPCSTR fullname = test_get_shader_constant_variables_data[i].fullname;
1774 const D3DXCONSTANT_DESC *expected_desc = &test_get_shader_constant_variables_data[i].desc;
1775 UINT ctaboffset = test_get_shader_constant_variables_data[i].ctaboffset;
1777 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, fullname);
1778 ok(constant != NULL, "GetConstantByName \"%s\" failed\n", fullname);
1780 hr = ID3DXConstantTable_GetConstantDesc(ctable, constant, &desc, &nr);
1781 ok(hr == D3D_OK, "GetConstantDesc \"%s\" failed, got %08x, expected %08x\n", fullname, hr, D3D_OK);
1783 ok(!strcmp(expected_desc->Name, desc.Name), "GetConstantDesc \"%s\" failed, got \"%s\", expected \"%s\"\n",
1784 fullname, desc.Name, expected_desc->Name);
1785 ok(expected_desc->RegisterSet == desc.RegisterSet, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1786 fullname, desc.RegisterSet, expected_desc->RegisterSet);
1787 ok(expected_desc->RegisterIndex == desc.RegisterIndex, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1788 fullname, desc.RegisterIndex, expected_desc->RegisterIndex);
1789 ok(expected_desc->RegisterCount == desc.RegisterCount, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1790 fullname, desc.RegisterCount, expected_desc->RegisterCount);
1791 ok(expected_desc->Class == desc.Class, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1792 fullname, desc.Class, expected_desc->Class);
1793 ok(expected_desc->Type == desc.Type, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1794 fullname, desc.Type, expected_desc->Type);
1795 ok(expected_desc->Rows == desc.Rows, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1796 fullname, desc.Rows, expected_desc->Rows);
1797 ok(expected_desc->Columns == desc.Columns, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1798 fullname, desc.Columns, expected_desc->Columns);
1799 ok(expected_desc->Elements == desc.Elements, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1800 fullname, desc.Elements, expected_desc->Elements);
1801 ok(expected_desc->StructMembers == desc.StructMembers, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1802 fullname, desc.StructMembers, expected_desc->StructMembers);
1803 ok(expected_desc->Bytes == desc.Bytes, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1804 fullname, desc.Bytes, expected_desc->Bytes);
1805 ok(ctaboffset == (DWORD *)desc.DefaultValue - ctab, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1806 fullname, (UINT)((DWORD *)desc.DefaultValue - ctab), ctaboffset);
1809 element = ID3DXConstantTable_GetConstantElement(ctable, NULL, 0);
1810 ok(element == NULL, "GetConstantElement failed\n");
1812 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "i");
1813 ok(constant != NULL, "GetConstantByName failed\n");
1815 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "i[0]");
1816 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1818 element = ID3DXConstantTable_GetConstantElement(ctable, "i", 0);
1819 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1821 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f");
1822 ok(constant != NULL, "GetConstantByName failed\n");
1824 element = ID3DXConstantTable_GetConstant(ctable, NULL, 0);
1825 ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1827 element = ID3DXConstantTable_GetConstant(ctable, "invalid", 0);
1828 ok(element == NULL, "GetConstant failed\n");
1830 element = ID3DXConstantTable_GetConstant(ctable, "f", 0);
1831 ok(element == NULL, "GetConstant failed\n");
1833 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[0]");
1834 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1836 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[1]");
1837 ok(NULL == element, "GetConstantByName failed\n");
1839 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[0][0]");
1840 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1842 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f.");
1843 ok(element == NULL, "GetConstantByName failed\n");
1845 element = ID3DXConstantTable_GetConstantElement(ctable, "f", 0);
1846 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1848 element = ID3DXConstantTable_GetConstantElement(ctable, "f", 1);
1849 ok(element == NULL, "GetConstantElement failed\n");
1851 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2[0]");
1852 ok(constant != NULL, "GetConstantByName failed\n");
1854 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2");
1855 ok(element != constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1857 element = ID3DXConstantTable_GetConstantElement(ctable, "f_2", 0);
1858 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1860 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2[1]");
1861 ok(constant != NULL, "GetConstantByName failed\n");
1863 element = ID3DXConstantTable_GetConstantElement(ctable, "f_2", 1);
1864 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1866 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "s_2[0].f");
1867 ok(constant != NULL, "GetConstantByName failed\n");
1869 element = ID3DXConstantTable_GetConstant(ctable, "s_2[0]", 0);
1870 ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1872 element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "f");
1873 ok(element == constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1875 element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "invalid");
1876 ok(element == NULL, "GetConstantByName failed\n");
1878 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "s_2[0]");
1879 ok(constant != NULL, "GetConstantByName failed\n");
1881 element = ID3DXConstantTable_GetConstantElement(ctable, "s_2[0]", 0);
1882 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1884 count = ID3DXConstantTable_Release(ctable);
1885 ok(count == 0, "Release failed, got %u, expected %u\n", count, 0);
1888 START_TEST(shader)
1890 test_get_shader_size();
1891 test_get_shader_version();
1892 test_find_shader_comment();
1893 test_get_shader_constant_table_ex();
1894 test_constant_tables();
1895 test_setting_constants();
1896 test_get_sampler_index();
1897 test_get_shader_samplers();
1898 test_get_shader_constant_variables();