d3dx9: Handle invalid byte code in D3DXGetShaderConstantTableEx().
[wine.git] / dlls / d3dx9_36 / tests / shader.c
blobf7be1749f8c143e060281ec4126c43200b71dfd2
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 constant_table = (ID3DXConstantTable *)0xdeadbeef;
370 hr = D3DXGetShaderConstantTableEx(shader_zero, 0, &constant_table);
371 ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
372 ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
374 constant_table = (ID3DXConstantTable *)0xdeadbeef;
375 hr = D3DXGetShaderConstantTableEx(shader_invalid, 0, &constant_table);
376 ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
377 ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
379 constant_table = (ID3DXConstantTable *)0xdeadbeef;
380 hr = D3DXGetShaderConstantTableEx(shader_empty, 0, &constant_table);
381 ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
382 ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
384 /* No CTAB data */
385 constant_table = (ID3DXConstantTable *)0xdeadbeef;
386 hr = D3DXGetShaderConstantTableEx(simple_ps, 0, &constant_table);
387 ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
388 ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
390 /* With invalid CTAB data */
391 hr = D3DXGetShaderConstantTableEx(shader_with_invalid_ctab, 0, &constant_table);
392 ok(hr == D3DXERR_INVALIDDATA || broken(hr == D3D_OK), /* winxp 64-bit, w2k3 64-bit */
393 "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
394 if (constant_table) ID3DXConstantTable_Release(constant_table);
396 hr = D3DXGetShaderConstantTableEx(shader_with_ctab, 0, &constant_table);
397 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
398 ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
400 if (constant_table)
402 size = ID3DXConstantTable_GetBufferSize(constant_table);
403 ok(size == 28, "Got result %x, expected 28\n", size);
405 data = ID3DXConstantTable_GetBufferPointer(constant_table);
406 ok(!memcmp(data, shader_with_ctab + 6, size), "Retrieved wrong CTAB data\n");
408 hr = ID3DXConstantTable_GetDesc(constant_table, NULL);
409 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
411 hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
412 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
413 ok(desc.Creator == (LPCSTR)data + 0x10, "Got result %p, expected %p\n", desc.Creator, (LPCSTR)data + 0x10);
414 ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
415 ok(desc.Constants == 0, "Got result %x, expected 0\n", desc.Constants);
417 ID3DXConstantTable_Release(constant_table);
420 hr = D3DXGetShaderConstantTableEx(shader_with_ctab_constants, 0, &constant_table);
421 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
422 ok(constant_table != NULL, "D3DXGetShaderConstantTableEx() failed, got NULL\n");
424 if (constant_table)
426 D3DXHANDLE constant;
427 D3DXCONSTANT_DESC constant_desc;
428 D3DXCONSTANT_DESC constant_desc_save;
429 UINT nb;
431 /* Test GetDesc */
432 hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
433 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
434 ok(!strcmp(desc.Creator, "Wine project"), "Got result '%s', expected 'Wine project'\n", desc.Creator);
435 ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
436 ok(desc.Constants == 3, "Got result %x, expected 3\n", desc.Constants);
438 /* Test GetConstant */
439 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
440 ok(constant != NULL, "No constant found\n");
441 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
442 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
443 ok(!strcmp(constant_desc.Name, "Constant1"), "Got result '%s', expected 'Constant1'\n",
444 constant_desc.Name);
445 ok(constant_desc.Class == D3DXPC_VECTOR, "Got result %x, expected %u (D3DXPC_VECTOR)\n",
446 constant_desc.Class, D3DXPC_VECTOR);
447 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
448 constant_desc.Type, D3DXPT_FLOAT);
449 ok(constant_desc.Rows == 1, "Got result %x, expected 1\n", constant_desc.Rows);
450 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
452 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 1);
453 ok(constant != NULL, "No constant found\n");
454 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
455 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
456 ok(!strcmp(constant_desc.Name, "Constant2"), "Got result '%s', expected 'Constant2'\n",
457 constant_desc.Name);
458 ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
459 constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
460 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
461 constant_desc.Type, D3DXPT_FLOAT);
462 ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
463 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
465 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 2);
466 ok(constant != NULL, "No constant found\n");
467 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
468 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
469 ok(!strcmp(constant_desc.Name, "Constant3"), "Got result '%s', expected 'Constant3'\n",
470 constant_desc.Name);
471 ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
472 constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
473 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
474 constant_desc.Type, D3DXPT_FLOAT);
475 ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
476 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
477 constant_desc_save = constant_desc; /* For GetConstantDesc test */
479 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 3);
480 ok(constant == NULL, "Got result %p, expected NULL\n", constant);
482 /* Test GetConstantByName */
483 constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant unknown");
484 ok(constant == NULL, "Got result %p, expected NULL\n", constant);
485 constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant3");
486 ok(constant != NULL, "No constant found\n");
487 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
488 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
489 ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
491 /* Test GetConstantDesc */
492 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
493 ok(constant != NULL, "No constant found\n");
494 hr = ID3DXConstantTable_GetConstantDesc(constant_table, NULL, &constant_desc, &nb);
495 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
496 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, NULL, &nb);
497 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
498 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, NULL);
499 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
500 hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant unknow", &constant_desc, &nb);
501 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
502 hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant3", &constant_desc, &nb);
503 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
504 ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
506 ID3DXConstantTable_Release(constant_table);
510 static void test_constant_table(const char *test_name, const DWORD *ctable_fn,
511 const D3DXCONSTANT_DESC *expecteds, UINT count)
513 UINT i;
514 ID3DXConstantTable *ctable;
516 HRESULT res;
518 /* Get the constant table from the shader itself */
519 res = D3DXGetShaderConstantTable(ctable_fn, &ctable);
520 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on %s: got %08x\n", test_name, res);
522 for (i = 0; i < count; i++)
524 const D3DXCONSTANT_DESC *expected = &expecteds[i];
525 D3DXHANDLE const_handle;
526 D3DXCONSTANT_DESC actual;
527 UINT pCount = 1;
529 const_handle = ID3DXConstantTable_GetConstantByName(ctable, NULL, expected->Name);
531 res = ID3DXConstantTable_GetConstantDesc(ctable, const_handle, &actual, &pCount);
532 ok(SUCCEEDED(res), "%s in %s: ID3DXConstantTable_GetConstantDesc returned %08x\n", expected->Name,
533 test_name, res);
534 ok(pCount == 1, "%s in %s: Got more or less descriptions: %d\n", expected->Name, test_name, pCount);
536 ok(strcmp(actual.Name, expected->Name) == 0,
537 "%s in %s: Got different names: Got %s, expected %s\n", expected->Name,
538 test_name, actual.Name, expected->Name);
539 ok(actual.RegisterSet == expected->RegisterSet,
540 "%s in %s: Got different register sets: Got %d, expected %d\n",
541 expected->Name, test_name, actual.RegisterSet, expected->RegisterSet);
542 ok(actual.RegisterIndex == expected->RegisterIndex,
543 "%s in %s: Got different register indices: Got %d, expected %d\n",
544 expected->Name, test_name, actual.RegisterIndex, expected->RegisterIndex);
545 ok(actual.RegisterCount == expected->RegisterCount,
546 "%s in %s: Got different register counts: Got %d, expected %d\n",
547 expected->Name, test_name, actual.RegisterCount, expected->RegisterCount);
548 ok(actual.Class == expected->Class,
549 "%s in %s: Got different classes: Got %d, expected %d\n", expected->Name,
550 test_name, actual.Class, expected->Class);
551 ok(actual.Type == expected->Type,
552 "%s in %s: Got different types: Got %d, expected %d\n", expected->Name,
553 test_name, actual.Type, expected->Type);
554 ok(actual.Rows == expected->Rows && actual.Columns == expected->Columns,
555 "%s in %s: Got different dimensions: Got (%d, %d), expected (%d, %d)\n",
556 expected->Name, test_name, actual.Rows, actual.Columns, expected->Rows,
557 expected->Columns);
558 ok(actual.Elements == expected->Elements,
559 "%s in %s: Got different element count: Got %d, expected %d\n",
560 expected->Name, test_name, actual.Elements, expected->Elements);
561 ok(actual.StructMembers == expected->StructMembers,
562 "%s in %s: Got different struct member count: Got %d, expected %d\n",
563 expected->Name, test_name, actual.StructMembers, expected->StructMembers);
564 ok(actual.Bytes == expected->Bytes,
565 "%s in %s: Got different byte count: Got %d, expected %d\n",
566 expected->Name, test_name, actual.Bytes, expected->Bytes);
568 if (!expected->DefaultValue)
570 ok(actual.DefaultValue == NULL,
571 "%s in %s: Got different default value: expected NULL\n",
572 expected->Name, test_name);
574 else
576 ok(actual.DefaultValue != NULL,
577 "%s in %s: Got different default value: expected non-NULL\n",
578 expected->Name, test_name);
579 ok(memcmp(actual.DefaultValue, expected->DefaultValue, expected->Bytes) == 0,
580 "%s in %s: Got different default value\n", expected->Name, test_name);
584 /* Finally, release the constant table */
585 ID3DXConstantTable_Release(ctable);
588 static void test_constant_tables(void)
590 test_constant_table("test_basic", ctab_basic, ctab_basic_expected,
591 sizeof(ctab_basic_expected)/sizeof(*ctab_basic_expected));
592 test_constant_table("test_matrices", ctab_matrices, ctab_matrices_expected,
593 sizeof(ctab_matrices_expected)/sizeof(*ctab_matrices_expected));
594 test_constant_table("test_matrices2", ctab_matrices2, ctab_matrices2_expected,
595 sizeof(ctab_matrices2_expected)/sizeof(*ctab_matrices2_expected));
596 test_constant_table("test_arrays", ctab_arrays, ctab_arrays_expected,
597 sizeof(ctab_arrays_expected)/sizeof(*ctab_arrays_expected));
598 test_constant_table("test_default_values", ctab_with_default_values, ctab_with_default_values_expected,
599 sizeof(ctab_with_default_values_expected)/sizeof(*ctab_with_default_values_expected));
600 test_constant_table("test_samplers", ctab_samplers, ctab_samplers_expected,
601 sizeof(ctab_samplers_expected)/sizeof(*ctab_samplers_expected));
604 static void test_setting_basic_table(IDirect3DDevice9 *device)
606 static const D3DXMATRIX mvp = {{{
607 0.514f, 0.626f, 0.804f, 0.786f,
608 0.238f, 0.956f, 0.374f, 0.483f,
609 0.109f, 0.586f, 0.900f, 0.255f,
610 0.898f, 0.411f, 0.932f, 0.275f}}};
611 static const D3DXVECTOR4 f4 = {0.350f, 0.526f, 0.925f, 0.021f};
612 static const float f = 0.12543f;
613 static const int i = 321;
614 static const D3DXMATRIX *matrix_pointer[] = {&mvp};
616 ID3DXConstantTable *ctable;
618 HRESULT res;
619 float out[16];
620 ULONG refcnt;
622 /* Get the constant table from the shader itself */
623 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
624 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
626 /* Set constants */
627 res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
628 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable mvp: got 0x%08x\n", res);
630 res = ID3DXConstantTable_SetInt(ctable, device, "i", i + 1);
631 ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
633 /* Check that setting i again will overwrite the previous value */
634 res = ID3DXConstantTable_SetInt(ctable, device, "i", i);
635 ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
637 res = ID3DXConstantTable_SetFloat(ctable, device, "f", f);
638 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f: got 0x%08x\n", res);
640 res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
641 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f4: got 0x%08x\n", res);
643 /* Get constants back and validate */
644 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
645 ok(out[0] == S(U(mvp))._11 && out[4] == S(U(mvp))._12 && out[8] == S(U(mvp))._13 && out[12] == S(U(mvp))._14,
646 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
647 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
648 ok(out[1] == S(U(mvp))._21 && out[5] == S(U(mvp))._22 && out[9] == S(U(mvp))._23 && out[13] == S(U(mvp))._24,
649 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
650 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
651 ok(out[2] == S(U(mvp))._31 && out[6] == S(U(mvp))._32 && out[10] == S(U(mvp))._33 && out[14] == S(U(mvp))._34,
652 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
653 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
654 ok(out[3] == S(U(mvp))._41 && out[7] == S(U(mvp))._42 && out[11] == S(U(mvp))._43 && out[15] == S(U(mvp))._44,
655 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
656 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
658 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 1);
659 ok(out[0] == (float)i && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
660 "The variable i was not set correctly, out={%f, %f, %f, %f}, should be {%d, 0.0, 0.0, 0.0}\n",
661 out[0], out[1], out[2], out[3], i);
663 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
664 ok(out[0] == f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
665 "The variable f was not set correctly, out={%f, %f, %f, %f}, should be {%f, 0.0, 0.0, 0.0}\n",
666 out[0], out[1], out[2], out[3], f);
668 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
669 ok(memcmp(out, &f4, sizeof(f4)) == 0,
670 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
671 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
673 /* Finally test using a set* function for one type to set a variable of another type (should succeed) */
674 res = ID3DXConstantTable_SetVector(ctable, device, "f", &f4);
675 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
677 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
678 ok(out[0] == f4.x && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
679 "The variable f was not set correctly by ID3DXConstantTable_SetVector, got %f, should be %f\n",
680 out[0], f4.x);
682 memset(out, 0, sizeof(out));
683 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
684 res = ID3DXConstantTable_SetMatrix(ctable, device, "f", &mvp);
685 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable f: 0x%08x\n", res);
687 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
688 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
689 "The variable f was not set correctly by ID3DXConstantTable_SetMatrix, got %f, should be %f\n",
690 out[0], S(U(mvp))._11);
692 /* Clear registers */
693 memset(out, 0, sizeof(out));
694 IDirect3DDevice9_SetVertexShaderConstantF(device, 0, out, 4);
695 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
696 IDirect3DDevice9_SetVertexShaderConstantF(device, 7, out, 1);
698 /* SetVector shouldn't change the value of a matrix constant */
699 res = ID3DXConstantTable_SetVector(ctable, device, "mvp", &f4);
700 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
702 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
703 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
704 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
705 && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
706 && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
707 "The variable mvp was not set correctly by ID3DXConstantTable_SetVector, "
708 "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
709 "should be all 0.0f\n",
710 out[0], out[1], out[2], out[3],
711 out[4], out[5], out[6], out[7],
712 out[8], out[9], out[10], out[11],
713 out[12], out[13], out[14], out[15]);
715 res = ID3DXConstantTable_SetFloat(ctable, device, "mvp", f);
716 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable mvp: 0x%08x\n", res);
718 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
719 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
720 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
721 && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
722 && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
723 "The variable mvp was not set correctly by ID3DXConstantTable_SetFloat, "
724 "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
725 "should be all 0.0f\n",
726 out[0], out[1], out[2], out[3],
727 out[4], out[5], out[6], out[7],
728 out[8], out[9], out[10], out[11],
729 out[12], out[13], out[14], out[15]);
731 res = ID3DXConstantTable_SetFloat(ctable, device, "f4", f);
732 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f4: 0x%08x\n", res);
734 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
735 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
736 "The variable f4 was not set correctly by ID3DXConstantTable_SetFloat, "
737 "got {%f, %f, %f, %f}, should be all 0.0f\n",
738 out[0], out[1], out[2], out[3]);
740 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "f", &mvp);
741 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f: 0x%08x\n", res);
743 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
744 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
745 "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTranspose, got %f, should be %f\n",
746 out[0], S(U(mvp))._11);
748 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "f4", &mvp);
749 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable f4: 0x%08x\n", res);
751 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
752 ok(out[0] == S(U(mvp))._11 && out[1] == S(U(mvp))._21 && out[2] == S(U(mvp))._31 && out[3] == S(U(mvp))._41,
753 "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTranspose, "
754 "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
755 out[0], out[1], out[2], out[3],
756 S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
758 memset(out, 0, sizeof(out));
759 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
760 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f", matrix_pointer, 1);
761 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f: got %#x\n", res);
763 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
764 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
765 "The variable f was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
766 "got %f, should be %f\n",
767 out[0], S(U(mvp))._11);
769 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "f4", matrix_pointer, 1);
770 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable f4: got %#x\n", res);
772 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
773 ok(out[0] == S(U(mvp))._11 && out[1] == S(U(mvp))._12 && out[2] == S(U(mvp))._13 && out[3] == S(U(mvp))._14,
774 "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixPointerArray, "
775 "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
776 out[0], out[1], out[2], out[3],
777 S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
779 memset(out, 0, sizeof(out));
780 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
781 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "f", matrix_pointer, 1);
782 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f: got %#x\n", res);
784 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
785 ok(out[0] == S(U(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
786 "The variable f was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
787 "got %f, should be %f\n",
788 out[0], S(U(mvp))._11);
790 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "f4", matrix_pointer, 1);
791 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable f4: got %#x\n", res);
793 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
794 ok(out[0] == S(U(mvp))._11 && out[1] == S(U(mvp))._21 && out[2] == S(U(mvp))._31 && out[3] == S(U(mvp))._41,
795 "The variable f4 was not set correctly by ID3DXConstantTable_SetMatrixTransposePointerArray, "
796 "got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
797 out[0], out[1], out[2], out[3],
798 S(U(mvp))._11, S(U(mvp))._21, S(U(mvp))._31, S(U(mvp))._41);
800 refcnt = ID3DXConstantTable_Release(ctable);
801 ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
804 static void test_setting_matrices_table(IDirect3DDevice9 *device)
806 static const D3DXMATRIX fmatrix =
807 {{{2.001f, 1.502f, 9.003f, 1.004f,
808 5.005f, 3.006f, 3.007f, 6.008f,
809 9.009f, 5.010f, 7.011f, 1.012f,
810 5.013f, 5.014f, 5.015f, 9.016f}}};
811 static const D3DXMATRIX *matrix_pointer[] = {&fmatrix};
813 ID3DXConstantTable *ctable;
815 HRESULT res;
816 float out[32];
818 res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
819 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
821 res = ID3DXConstantTable_SetMatrix(ctable, device, "imatrix2x3", &fmatrix);
822 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable imatrix2x3: got %#x\n", res);
824 res = ID3DXConstantTable_SetMatrix(ctable, device, "fmatrix3x1", &fmatrix);
825 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix3x1: got %#x\n", res);
827 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
828 todo_wine ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
829 && out[3] == 0
830 && out[4] == (int)S(U(fmatrix))._21 && out[5] == (int)S(U(fmatrix))._22 && out[6] == (int)S(U(fmatrix))._23
831 && out[7] == 0,
832 "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
833 "should be {%d, %d, %d, %d; %d, %d, %d, %d}\n",
834 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
835 (int)S(U(fmatrix))._11, (int)S(U(fmatrix))._12, (int)S(U(fmatrix))._13, 0,
836 (int)S(U(fmatrix))._21, (int)S(U(fmatrix))._22, (int)S(U(fmatrix))._23, 0);
838 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
839 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f,
840 "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
841 out[0], out[1], out[2], out[3],
842 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f);
844 ID3DXConstantTable_Release(ctable);
846 res = D3DXGetShaderConstantTable(ctab_matrices2, &ctable);
847 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
849 /* SetMatrix */
850 res = ID3DXConstantTable_SetMatrix(ctable, device, "c2x3", &fmatrix);
851 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c2x3: got %#x\n", res);
853 res = ID3DXConstantTable_SetMatrix(ctable, device, "r2x3", &fmatrix);
854 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r2x3: got %#x\n", res);
856 res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x2", &fmatrix);
857 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x2: got %#x\n", res);
859 res = ID3DXConstantTable_SetMatrix(ctable, device, "r3x2", &fmatrix);
860 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r3x2: got %#x\n", res);
862 res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x3", &fmatrix);
863 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x3: got %#x\n", res);
865 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
866 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
867 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
868 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
869 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
870 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
871 out[0], out[1], out[2], out[3],
872 out[4], out[5], out[6], out[7],
873 out[8], out[9], out[10], out[11],
874 S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
875 S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
876 S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
878 res = ID3DXConstantTable_SetMatrix(ctable, device, "r4x4", &fmatrix);
879 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r4x4: got %#x\n", res);
881 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
882 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
883 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
884 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
885 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
886 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
887 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
888 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
890 IDirect3DDevice9_GetVertexShaderConstantF(device, 13, out, 2);
891 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
892 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
893 "The variable c3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
894 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
895 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
896 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
897 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
899 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 3);
900 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
901 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
902 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
903 "The variable r3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
904 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
905 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
906 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
907 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
908 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
910 IDirect3DDevice9_GetVertexShaderConstantF(device, 10, out, 3);
911 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
912 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f
913 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == S(U(fmatrix))._33 && out[11] == 0.0f,
914 "The variable c3x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
915 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
916 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
917 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
918 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f,
919 S(U(fmatrix))._13, S(U(fmatrix))._23, S(U(fmatrix))._33, 0.0f);
921 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
922 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == S(U(fmatrix))._14
923 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == S(U(fmatrix))._24
924 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == S(U(fmatrix))._33 && out[11] == S(U(fmatrix))._34
925 && out[12] == S(U(fmatrix))._41 && out[13] == S(U(fmatrix))._42 && out[14] == S(U(fmatrix))._43 && out[15] == S(U(fmatrix))._44,
926 "The variable r4x4 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
927 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
928 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
929 out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
930 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, S(U(fmatrix))._14,
931 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, S(U(fmatrix))._24,
932 S(U(fmatrix))._31, S(U(fmatrix))._32, S(U(fmatrix))._33, S(U(fmatrix))._34,
933 S(U(fmatrix))._41, S(U(fmatrix))._42, S(U(fmatrix))._43, S(U(fmatrix))._44);
935 /* SetMatrixTranspose */
936 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "c2x3", &fmatrix);
937 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable c2x3: got %#x\n", res);
939 res = ID3DXConstantTable_SetMatrixTranspose(ctable, device, "r2x3", &fmatrix);
940 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTranspose failed on variable r2x3: got %#x\n", res);
942 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
943 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
944 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
945 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
946 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
947 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
948 out[0], out[1], out[2], out[3],
949 out[4], out[5], out[6], out[7],
950 out[8], out[9], out[10], out[11],
951 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
952 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
953 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
955 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
956 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
957 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
958 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
959 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
960 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
961 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
962 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
964 /* SetMatrixPointerArray */
965 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "c2x3", matrix_pointer, 1);
966 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable c2x3: got %#x\n", res);
968 res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "r2x3", matrix_pointer, 1);
969 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable r2x3: got %#x\n", res);
971 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
972 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
973 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
974 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
975 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
976 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
977 out[0], out[1], out[2], out[3],
978 out[4], out[5], out[6], out[7],
979 out[8], out[9], out[10], out[11],
980 S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
981 S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
982 S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
984 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
985 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
986 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
987 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
988 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
989 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
990 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
991 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
993 /* SetMatrixTransposePointerArray */
994 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "c2x3", matrix_pointer, 1);
995 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable c2x3: got %#x\n", res);
997 res = ID3DXConstantTable_SetMatrixTransposePointerArray(ctable, device, "r2x3", matrix_pointer, 1);
998 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixTransposePointerArray failed on variable r2x3: got %#x\n", res);
1000 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
1001 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
1002 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
1003 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
1004 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1005 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1006 out[0], out[1], out[2], out[3],
1007 out[4], out[5], out[6], out[7],
1008 out[8], out[9], out[10], out[11],
1009 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
1010 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
1011 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
1013 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
1014 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
1015 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
1016 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
1017 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1018 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1019 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
1020 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
1022 ID3DXConstantTable_Release(ctable);
1025 static void test_setting_arrays_table(IDirect3DDevice9 *device)
1027 static const float farray[8] = {
1028 0.005f, 0.745f, 0.973f, 0.264f,
1029 0.010f, 0.020f, 0.030f, 0.040f};
1030 static const D3DXMATRIX fmtxarray[2] = {
1031 {{{0.001f, 0.002f, 0.003f, 0.004f,
1032 0.005f, 0.006f, 0.007f, 0.008f,
1033 0.009f, 0.010f, 0.011f, 0.012f,
1034 0.013f, 0.014f, 0.015f, 0.016f}}},
1035 {{{0.010f, 0.020f, 0.030f, 0.040f,
1036 0.050f, 0.060f, 0.070f, 0.080f,
1037 0.090f, 0.100f, 0.110f, 0.120f,
1038 0.130f, 0.140f, 0.150f, 0.160f}}}};
1039 static const int iarray[4] = {1, 2, 3, 4};
1040 static const D3DXVECTOR4 fvecarray[2] = {
1041 {0.745f, 0.997f, 0.353f, 0.237f},
1042 {0.060f, 0.455f, 0.333f, 0.983f}};
1043 static BOOL barray[4] = {FALSE, 100, TRUE, TRUE};
1045 ID3DXConstantTable *ctable;
1047 HRESULT res;
1048 float out[32];
1049 ULONG refcnt;
1051 /* Clear registers */
1052 memset(out, 0, sizeof(out));
1053 IDirect3DDevice9_SetVertexShaderConstantF(device, 8, out, 4);
1054 IDirect3DDevice9_SetVertexShaderConstantF(device, 12, out, 4);
1056 /* Get the constant table from the shader */
1057 res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1058 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
1060 /* Set constants */
1062 /* Make sure that we cannot set registers that do not belong to this constant */
1063 res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 8);
1064 ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got 0x%08x\n", res);
1066 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 8);
1067 ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1068 "The in-bounds elements of the array were not set, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1069 out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1070 ok(out[16] == 0.0f && out[20] == 0.0f && out[24] == 0.0f && out[28] == 0.0f,
1071 "The excess elements of the array were set, out={%f, %f, %f, %f}, should be all 0.0f\n",
1072 out[16], out[20], out[24], out[28]);
1074 /* ivecarray takes up only 1 register, but a matrix takes up 4, so no elements should be set */
1075 res = ID3DXConstantTable_SetMatrix(ctable, device, "ivecarray", &fmtxarray[0]);
1076 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got 0x%08x\n", res);
1078 IDirect3DDevice9_GetVertexShaderConstantF(device, 18, out, 4);
1079 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
1080 "The array was set, out={%f, %f, %f, %f}, should be all 0.0f\n", out[0], out[1], out[2], out[3]);
1082 /* Try setting an integer array to an array declared as a float array */
1083 res = ID3DXConstantTable_SetIntArray(ctable, device, "farray", iarray, 4);
1084 ok(res == D3D_OK, "ID3DXConstantTable_SetIntArray failed: got 0x%08x\n", res);
1086 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1087 ok(out[0] == iarray[0] && out[4] == iarray[1] && out[8] == iarray[2] && out[12] == iarray[3],
1088 "SetIntArray did not properly set a float array: out={%f, %f, %f, %f}, should be {%d, %d, %d, %d}\n",
1089 out[0], out[4], out[8], out[12], iarray[0], iarray[1], iarray[2], iarray[3]);
1091 res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 4);
1092 ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got x0%08x\n", res);
1094 res = ID3DXConstantTable_SetVectorArray(ctable, device, "fvecarray", fvecarray, 2);
1095 ok(res == D3D_OK, "ID3DXConstantTable_SetVectorArray failed: got 0x%08x\n", res);
1097 res = ID3DXConstantTable_SetMatrixArray(ctable, device, "fmtxarray", fmtxarray, 2);
1098 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixArray failed: got 0x%08x\n", res);
1100 res = ID3DXConstantTable_SetBoolArray(ctable, device, "barray", barray, 2);
1101 ok(res == D3D_OK, "ID3DXConstantTable_SetBoolArray failed: got 0x%08x\n", res);
1103 /* Read back constants */
1104 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1105 ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
1106 "The variable farray was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1107 out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
1109 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1110 ok(out[0] == fvecarray[0].x && out[1] == fvecarray[0].y && out[2] == fvecarray[0].z && out[3] == fvecarray[0].w &&
1111 out[4] == fvecarray[1].x && out[5] == fvecarray[1].y && out[6] == fvecarray[1].z && out[7] == fvecarray[1].w,
1112 "The variable fvecarray was not set correctly, out={{%f, %f, %f, %f}, {%f, %f, %f, %f}}, should be "
1113 "{{%f, %f, %f, %f}, {%f, %f, %f, %f}}\n", out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1114 fvecarray[0].x, fvecarray[0].y, fvecarray[0].z, fvecarray[0].w, fvecarray[1].x, fvecarray[1].y,
1115 fvecarray[1].z, fvecarray[1].w);
1117 IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1118 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1119 && out[4] == 1.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1120 "The variable barray was not set correctly, out={%f, %f %f, %f; %f, %f, %f, %f}, should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
1121 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1122 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);
1124 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 8);
1125 /* Just check a few elements in each matrix to make sure fmtxarray was set row-major */
1126 ok(out[0] == S(U(fmtxarray[0]))._11 && out[1] == S(U(fmtxarray[0]))._12 && out[2] == S(U(fmtxarray[0]))._13 && out[3] == S(U(fmtxarray[0]))._14,
1127 "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1128 out[0], out[1], out[2], out[3], S(U(fmtxarray[0]))._11, S(U(fmtxarray[0]))._12, S(U(fmtxarray[0]))._13, S(U(fmtxarray[0]))._14);
1129 ok(out[16] == S(U(fmtxarray[1]))._11 && out[17] == S(U(fmtxarray[1]))._12 && out[18] == S(U(fmtxarray[1]))._13 && out[19] == S(U(fmtxarray[1]))._14,
1130 "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1131 out[16], out[17], out[18], out[19], S(U(fmtxarray[1]))._11, S(U(fmtxarray[1]))._12, S(U(fmtxarray[1]))._13, S(U(fmtxarray[1]))._14);
1133 refcnt = ID3DXConstantTable_Release(ctable);
1134 ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
1137 static void test_SetDefaults(IDirect3DDevice9 *device)
1139 static const D3DXMATRIX mvp = {{{
1140 0.51f, 0.62f, 0.80f, 0.78f,
1141 0.23f, 0.95f, 0.37f, 0.48f,
1142 0.10f, 0.58f, 0.90f, 0.25f,
1143 0.89f, 0.41f, 0.93f, 0.27f}}};
1144 static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1146 float out[16];
1148 HRESULT res;
1149 ID3DXConstantTable *ctable;
1151 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1152 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1154 res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
1155 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed: got %08x\n", res);
1157 res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
1158 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got %08x\n", res);
1160 res = ID3DXConstantTable_SetDefaults(ctable, device);
1161 ok(res == D3D_OK, "ID3dXConstantTable_SetDefaults failed: got %08x\n", res);
1163 /* SetDefaults doesn't change constants without default values */
1164 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1165 ok(out[0] == S(U(mvp))._11 && out[4] == S(U(mvp))._12 && out[8] == S(U(mvp))._13 && out[12] == S(U(mvp))._14,
1166 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1167 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1168 ok(out[1] == S(U(mvp))._21 && out[5] == S(U(mvp))._22 && out[9] == S(U(mvp))._23 && out[13] == S(U(mvp))._24,
1169 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1170 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1171 ok(out[2] == S(U(mvp))._31 && out[6] == S(U(mvp))._32 && out[10] == S(U(mvp))._33 && out[14] == S(U(mvp))._34,
1172 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1173 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1174 ok(out[3] == S(U(mvp))._41 && out[7] == S(U(mvp))._42 && out[11] == S(U(mvp))._43 && out[15] == S(U(mvp))._44,
1175 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1176 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1178 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1179 ok(memcmp(out, &f4, sizeof(f4)) == 0,
1180 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1181 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1183 ID3DXConstantTable_Release(ctable);
1185 res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1186 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1188 res = ID3DXConstantTable_SetDefaults(ctable, device);
1189 ok(res == D3D_OK, "ID3DXConstantTable_SetDefaults failed: got %08x\n", res);
1191 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1192 ok(memcmp(out, mat4_default_value, sizeof(mat4_default_value)) == 0,
1193 "The variable mat4 was not set correctly to default value\n");
1195 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 4);
1196 ok(memcmp(out, mat3_default_value, sizeof(mat3_default_value)) == 0,
1197 "The variable mat3 was not set correctly to default value\n");
1199 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1200 ok(memcmp(out, arr_default_value, sizeof(arr_default_value)) == 0,
1201 "The variable array was not set correctly to default value\n");
1203 IDirect3DDevice9_GetVertexShaderConstantF(device, 11, out, 1);
1204 ok(memcmp(out, vec4_default_value, sizeof(vec4_default_value)) == 0,
1205 "The variable vec4 was not set correctly to default value\n");
1207 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 1);
1208 ok(memcmp(out, flt_default_value, sizeof(flt_default_value)) == 0,
1209 "The variable flt was not set correctly to default value\n");
1211 ID3DXConstantTable_Release(ctable);
1214 static void test_SetValue(IDirect3DDevice9 *device)
1216 static const D3DXMATRIX mvp = {{{
1217 0.51f, 0.62f, 0.80f, 0.78f,
1218 0.23f, 0.95f, 0.37f, 0.48f,
1219 0.10f, 0.58f, 0.90f, 0.25f,
1220 0.89f, 0.41f, 0.93f, 0.27f}}};
1221 static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1222 static const FLOAT arr[] = {0.33f, 0.55f, 0.96f, 1.00f,
1223 1.00f, 1.00f, 1.00f, 1.00f,
1224 1.00f, 1.00f, 1.00f, 1.00f};
1225 static int imatrix[] = {1, 2, 3, 4, 5, 6};
1226 static float fmatrix[] = {1.1f, 2.2f, 3.3f, 4.4f};
1227 static BOOL barray[] = {TRUE, FALSE};
1228 static float fvecarray[] = {9.1f, 9.2f, 9.3f, 9.4f, 9.5f, 9.6f, 9.7f, 9.8f};
1229 static float farray[] = {2.2f, 3.3f};
1231 static const float def[16] = {5.5f, 5.5f, 5.5f, 5.5f,
1232 5.5f, 5.5f, 5.5f, 5.5f,
1233 5.5f, 5.5f, 5.5f, 5.5f,
1234 5.5f, 5.5f, 5.5f, 5.5f};
1235 float out[16];
1237 HRESULT res;
1238 ID3DXConstantTable *ctable;
1240 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1241 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1243 IDirect3DDevice9_SetVertexShaderConstantF(device, 7, def, 1);
1245 /* SetValue called with 0 bytes size doesn't change value */
1246 res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, 0);
1247 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1249 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1250 ok(memcmp(out, def, sizeof(f4)) == 0,
1251 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1252 out[0], out[1], out[2], out[3], def[0], def[1], def[2], def[3]);
1254 res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, sizeof(f4));
1255 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1257 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1258 ok(memcmp(out, &f4, sizeof(f4)) == 0,
1259 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1260 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1262 IDirect3DDevice9_SetVertexShaderConstantF(device, 0, def, 4);
1264 /* SetValue called with size smaller than constant size doesn't change value */
1265 res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp) / 2);
1266 ok(res == D3D_OK, "ID3DXConstantTable_SetValue returned %08x\n", res);
1268 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1269 ok(memcmp(out, def, sizeof(def)) == 0,
1270 "The variable mvp was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1271 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1272 out[0], out[4], out[ 8], out[12],
1273 out[1], out[5], out[ 9], out[13],
1274 out[2], out[6], out[10], out[14],
1275 out[3], out[7], out[11], out[15],
1276 def[0], def[4], def[ 8], def[12],
1277 def[1], def[5], def[ 9], def[13],
1278 def[2], def[6], def[10], def[14],
1279 def[3], def[7], def[11], def[15]);
1281 res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp));
1282 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1284 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1285 ok(out[0] == S(U(mvp))._11 && out[4] == S(U(mvp))._12 && out[8] == S(U(mvp))._13 && out[12] == S(U(mvp))._14,
1286 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1287 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1288 ok(out[1] == S(U(mvp))._21 && out[5] == S(U(mvp))._22 && out[9] == S(U(mvp))._23 && out[13] == S(U(mvp))._24,
1289 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1290 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1291 ok(out[2] == S(U(mvp))._31 && out[6] == S(U(mvp))._32 && out[10] == S(U(mvp))._33 && out[14] == S(U(mvp))._34,
1292 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1293 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1294 ok(out[3] == S(U(mvp))._41 && out[7] == S(U(mvp))._42 && out[11] == S(U(mvp))._43 && out[15] == S(U(mvp))._44,
1295 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1296 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1298 ID3DXConstantTable_Release(ctable);
1300 res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1301 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1303 res = ID3DXConstantTable_SetValue(ctable, device, "arr", arr, sizeof(arr));
1304 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1306 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1307 ok(out[0] == arr[0] && out[4] == arr[1] && out[8] == arr[2]
1308 && out[1] == 0 && out[2] == 0 && out[3] == 0 && out[5] == 0 && out[6] == 0 && out[7] == 0
1309 && out[9] == 0 && out[10] == 0 && out[11] == 0,
1310 "The variable arr was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f}, "
1311 "should be {0.33, 0, 0, 0, 0.55, 0, 0, 0, 0.96, 0, 0, 0}\n",
1312 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11]);
1314 ID3DXConstantTable_Release(ctable);
1316 res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
1317 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1319 res = ID3DXConstantTable_SetValue(ctable, device, "fmatrix3x1", fmatrix, sizeof(fmatrix));
1320 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1322 res = ID3DXConstantTable_SetValue(ctable, device, "imatrix2x3", imatrix, sizeof(imatrix));
1323 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1325 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
1326 ok(out[0] == imatrix[0] && out[1] == imatrix[1] && out[2] == imatrix[2] && out[3] == 0.0f
1327 && out[4] == imatrix[3] && out[5] == imatrix[4] && out[6] == imatrix[5] && out[7] == 0.0f,
1328 "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1329 "should be {%d, %d, %d, 0, %d, %d, %d, 0}\n",
1330 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1331 imatrix[0], imatrix[1], imatrix[2], imatrix[3], imatrix[4], imatrix[5]);
1333 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 2);
1334 ok(out[0] == fmatrix[0] && out[1] == fmatrix[1] && out[2] == fmatrix[2] && out[3] == 0.0f,
1335 "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1336 out[0], out[1] ,out[2], out[4],
1337 fmatrix[0], fmatrix[1], fmatrix[2], 0.0f);
1339 ID3DXConstantTable_Release(ctable);
1341 res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1342 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1344 res = ID3DXConstantTable_SetValue(ctable, device, "barray", barray, sizeof(barray));
1345 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1347 res = ID3DXConstantTable_SetValue(ctable, device, "fvecarray", fvecarray, sizeof(fvecarray));
1348 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1350 IDirect3DDevice9_SetVertexShaderConstantF(device, 8, def, 4);
1351 res = ID3DXConstantTable_SetValue(ctable, device, "farray", farray, sizeof(farray));
1352 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1354 /* 2 elements of farray were set */
1355 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1356 ok(out[0] == farray[0] && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1357 && out[4] == farray[1] && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
1358 && out[8] == def[8] && out[9] == def[9] && out[10] == def[10] && out[11] == def[11]
1359 && out[12] == def[12] && out[13] == def[13] && out[14] == def[14] && out[15] == def[15],
1360 "The variable farray was not set correctly, should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1361 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1362 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1363 out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
1364 farray[0], 0.0f, 0.0f, 0.0f,
1365 farray[1], 0.0f, 0.0f, 0.0f,
1366 def[8], def[9], def[10], def[11],
1367 def[12], def[13], def[14], def[15]);
1369 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1370 ok(out[0] == fvecarray[0] && out[1] == fvecarray[1] && out[2] == fvecarray[2] && out[3] == fvecarray[3]
1371 && out[4] == fvecarray[4] && out[5] == fvecarray[5] && out[6] == fvecarray[6] && out[7] == fvecarray[7],
1372 "The variable fvecarray was not set correctly, out ={%f, %f, %f, %f, %f, %f, %f, %f}, "
1373 "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1374 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1375 fvecarray[0], fvecarray[1], fvecarray[2], fvecarray[3], fvecarray[4], fvecarray[5], fvecarray[6], fvecarray[7]);
1377 IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1378 ok(out[0] == 1.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1379 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1380 "The variable barray was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1381 "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1382 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1383 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
1385 ID3DXConstantTable_Release(ctable);
1388 static void test_setting_constants(void)
1390 HWND wnd;
1391 IDirect3D9 *d3d;
1392 IDirect3DDevice9 *device;
1393 D3DPRESENT_PARAMETERS d3dpp;
1394 HRESULT hr;
1395 ULONG refcnt;
1397 /* Create the device to use for our tests */
1398 wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
1399 d3d = Direct3DCreate9(D3D_SDK_VERSION);
1400 if (!wnd)
1402 skip("Couldn't create application window\n");
1403 return;
1405 if (!d3d)
1407 skip("Couldn't create IDirect3D9 object\n");
1408 DestroyWindow(wnd);
1409 return;
1412 ZeroMemory(&d3dpp, sizeof(d3dpp));
1413 d3dpp.Windowed = TRUE;
1414 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
1415 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device);
1416 if (FAILED(hr))
1418 skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1419 IDirect3D9_Release(d3d);
1420 DestroyWindow(wnd);
1421 return;
1424 test_setting_basic_table(device);
1425 test_setting_matrices_table(device);
1426 test_setting_arrays_table(device);
1427 test_SetDefaults(device);
1428 test_SetValue(device);
1430 /* Release resources */
1431 refcnt = IDirect3DDevice9_Release(device);
1432 ok(refcnt == 0, "The Direct3D device reference count was %u, should be 0\n", refcnt);
1434 refcnt = IDirect3D9_Release(d3d);
1435 ok(refcnt == 0, "The Direct3D object referenct count was %u, should be 0\n", refcnt);
1437 if (wnd) DestroyWindow(wnd);
1440 static void test_get_sampler_index(void)
1442 ID3DXConstantTable *ctable;
1444 HRESULT res;
1445 UINT index;
1447 ULONG refcnt;
1449 res = D3DXGetShaderConstantTable(ctab_samplers, &ctable);
1450 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on ctab_samplers: got %08x\n", res);
1452 index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler1");
1453 ok(index == 0, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 0\n", index);
1455 index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler2");
1456 ok(index == 3, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 3\n", index);
1458 index = ID3DXConstantTable_GetSamplerIndex(ctable, "nonexistent");
1459 ok(index == -1, "ID3DXConstantTable_GetSamplerIndex found nonexistent sampler: Got %d\n",
1460 index);
1462 index = ID3DXConstantTable_GetSamplerIndex(ctable, "notsampler");
1463 ok(index == -1, "ID3DXConstantTable_GetSamplerIndex succeeded on non-sampler constant: Got %d\n",
1464 index);
1466 refcnt = ID3DXConstantTable_Release(ctable);
1467 ok(refcnt == 0, "The ID3DXConstantTable reference count was %u, should be 0\n", refcnt);
1471 * fxc.exe /Tps_3_0
1473 #if 0
1474 sampler s;
1475 sampler1D s1D;
1476 sampler2D s2D;
1477 sampler3D s3D;
1478 samplerCUBE scube;
1479 float4 init;
1480 float4 main(float3 tex : TEXCOORD0) : COLOR
1482 float4 tmp = init;
1483 tmp = tmp + tex1D(s1D, tex.x);
1484 tmp = tmp + tex1D(s1D, tex.y);
1485 tmp = tmp + tex3D(s3D, tex.xyz);
1486 tmp = tmp + tex1D(s, tex.x);
1487 tmp = tmp + tex2D(s2D, tex.xy);
1488 tmp = tmp + texCUBE(scube, tex.xyz);
1489 return tmp;
1491 #endif
1492 static const DWORD get_shader_samplers_blob[] =
1494 0xffff0300, /* ps_3_0 */
1495 0x0054fffe, FCC_CTAB, /* CTAB comment */
1496 0x0000001c, 0x0000011b, 0xffff0300, 0x00000006, 0x0000001c, 0x00000100, /* Header */
1497 0x00000114,
1498 0x00000094, 0x00000002, 0x00000001, 0x0000009c, 0x00000000, /* Constant 1 desc (init) */
1499 0x000000ac, 0x00040003, 0x00000001, 0x000000b0, 0x00000000, /* Constant 2 desc (s) */
1500 0x000000c0, 0x00000003, 0x00000001, 0x000000c4, 0x00000000, /* Constant 3 desc (s1D) */
1501 0x000000d4, 0x00010003, 0x00000001, 0x000000d8, 0x00000000, /* Constant 4 desc (s2D) */
1502 0x000000e8, 0x00030003, 0x00000001, 0x000000ec, 0x00000000, /* Constant 5 desc (s3D) */
1503 0x000000fc, 0x00020003, 0x00000001, 0x00000104, 0x00000000, /* Constant 6 desc (scube) */
1504 0x74696e69, 0xababab00, /* Constant 1 name */
1505 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
1506 0xabab0073, /* Constant 2 name */
1507 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 2 type desc */
1508 0x00443173, /* Constant 3 name */
1509 0x000b0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 type desc */
1510 0x00443273, /* Constant 4 name */
1511 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 4 type desc */
1512 0x00443373, /* Constant 5 name */
1513 0x000d0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 5 type desc */
1514 0x62756373, 0xabab0065, /* Constant 6 name */
1515 0x000e0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 6 type desc */
1516 0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, /* Target/Creator name string */
1517 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
1518 0x332e3235, 0x00313131,
1519 0x0200001f, 0x80000005, 0x90070000, 0x0200001f, 0x90000000, 0xa00f0800, /* shader */
1520 0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f, 0x98000000, 0xa00f0802,
1521 0x0200001f, 0xa0000000, 0xa00f0803, 0x0200001f, 0x90000000, 0xa00f0804,
1522 0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000,
1523 0x80e40000, 0xa0e40000, 0x03000042, 0x800f0001, 0x90550000, 0xa0e40800,
1524 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1525 0x90e40000, 0xa0e40803, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001,
1526 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40804, 0x03000002, 0x800f0000,
1527 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801,
1528 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1529 0x90e40000, 0xa0e40802, 0x03000002, 0x800f0800, 0x80e40000, 0x80e40001,
1530 0x0000ffff, /* END */
1533 static void test_get_shader_samplers(void)
1535 LPCSTR samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
1536 LPCSTR sampler_orig;
1537 UINT count = 2;
1538 HRESULT hr;
1540 #if 0
1541 /* crashes if bytecode is NULL */
1542 hr = D3DXGetShaderSamplers(NULL, NULL, &count);
1543 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1544 #endif
1546 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, NULL);
1547 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1549 samplers[5] = "dummy";
1551 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, NULL);
1552 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1554 /* check that sampler points to shader blob */
1555 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1556 ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1558 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1559 ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1561 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1562 ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1564 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1565 ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1567 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1568 ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1570 ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1572 /* reset samplers */
1573 memset(samplers, 0, sizeof(samplers));
1574 samplers[5] = "dummy";
1576 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, &count);
1577 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1578 ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1580 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, &count);
1581 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1582 ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1584 /* check that sampler points to shader blob */
1585 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1586 ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1588 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1589 ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1591 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1592 ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1594 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1595 ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1597 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1598 ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1600 ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1602 /* check without ctab */
1603 hr = D3DXGetShaderSamplers(simple_vs, samplers, &count);
1604 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1605 ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1607 /* check invalid ctab */
1608 hr = D3DXGetShaderSamplers(shader_with_invalid_ctab, samplers, &count);
1609 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1610 ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1614 * fxc.exe /Tvs_3_0
1616 #if 0
1617 float f = {1.1f}, f_2[2] = {2.1f, 2.2f};
1618 struct {float f; int i;} s = {3.1f, 31},
1619 s_2[2] = {{4.1f, 41}, {4.2f, 42}},
1620 s_3[3] = {{5.1f, 51}, {5.2f, 52}, {5.3f, 53}};
1621 struct {int i1; int i2; float2 f_2; row_major float3x1 r[2];}
1622 p[2] = {{11, 12, {13.1, 14.1}, {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}}},
1623 {15, 16, {17.1, 18.1}, {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}}}};
1624 int i[1] = {6};
1625 float2x3 f23[2] = {{0.11, 0.21, 0.31, 0.41, 0.51, 0.61}, {0.12, 0.22, 0.32, 0.42, 0.52, 0.62}};
1626 float3x2 f32[2] = {{1.11, 1.21, 1.31, 1.41, 1.51, 1.61}, {1.12, 1.22, 1.32, 1.42, 1.52, 1.62}};
1627 float3 v[2] = {{2.11, 2.21, 2.31}, {2.41, 2.51, 2.61}};
1628 row_major float3x1 r31[2] = {{3.11, 3.21, 3.31}, {3.41, 3.51, 3.61}};
1629 row_major float1x3 r13[2] = {{4.11, 4.21, 4.31}, {4.41, 4.51, 4.61}};
1630 float4 main(float4 pos : POSITION) : POSITION
1632 float4 tmp = 0.0f;
1633 tmp.zyw = v[1] + r13[1] + r31[1] + p[1].r[1];
1634 tmp.x += f * f_2[1] * pos.x * p[1].f_2.y;
1635 tmp.y += s.f * pos.y * s_2[0].i;
1636 tmp.z += s_3[0].f * pos.z * s_3[2].f * i[0] * f23[1]._11 * f32[1]._32;
1637 return tmp;
1639 #endif
1640 static const DWORD test_get_shader_constant_variables_blob[] =
1642 0xfffe0300, 0x0185fffe, 0x42415443, 0x0000001c, 0x000005df, 0xfffe0300, 0x0000000c, 0x0000001c,
1643 0x00000100, 0x000005d8, 0x0000010c, 0x002d0002, 0x00000001, 0x00000110, 0x00000120, 0x00000130,
1644 0x001d0002, 0x00000004, 0x00000134, 0x00000144, 0x000001a4, 0x00210002, 0x00000004, 0x000001a8,
1645 0x000001b8, 0x000001f8, 0x00250002, 0x00000002, 0x000001fc, 0x0000020c, 0x0000022c, 0x002f0002,
1646 0x00000001, 0x00000230, 0x00000240, 0x00000250, 0x00000002, 0x00000012, 0x000002b0, 0x000002c0,
1647 0x000003e0, 0x002b0002, 0x00000002, 0x000003e4, 0x000003f4, 0x00000414, 0x00120002, 0x00000006,
1648 0x00000418, 0x00000428, 0x00000488, 0x002e0002, 0x00000001, 0x000004ac, 0x000004bc, 0x000004dc,
1649 0x00270002, 0x00000002, 0x000004e0, 0x000004f0, 0x00000530, 0x00180002, 0x00000005, 0x00000534,
1650 0x00000544, 0x000005a4, 0x00290002, 0x00000002, 0x000005a8, 0x000005b8, 0xabab0066, 0x00030000,
1651 0x00010001, 0x00000001, 0x00000000, 0x3f8ccccd, 0x00000000, 0x00000000, 0x00000000, 0x00333266,
1652 0x00030003, 0x00030002, 0x00000002, 0x00000000, 0x3de147ae, 0x3ed1eb85, 0x00000000, 0x00000000,
1653 0x3e570a3d, 0x3f028f5c, 0x00000000, 0x00000000, 0x3e9eb852, 0x3f1c28f6, 0x00000000, 0x00000000,
1654 0x3df5c28f, 0x3ed70a3d, 0x00000000, 0x00000000, 0x3e6147ae, 0x3f051eb8, 0x00000000, 0x00000000,
1655 0x3ea3d70a, 0x3f1eb852, 0x00000000, 0x00000000, 0x00323366, 0x00030003, 0x00020003, 0x00000002,
1656 0x00000000, 0x3f8e147b, 0x3fa7ae14, 0x3fc147ae, 0x00000000, 0x3f9ae148, 0x3fb47ae1, 0x3fce147b,
1657 0x00000000, 0x3f8f5c29, 0x3fa8f5c3, 0x3fc28f5c, 0x00000000, 0x3f9c28f6, 0x3fb5c28f, 0x3fcf5c29,
1658 0x00000000, 0x00325f66, 0x00030000, 0x00010001, 0x00000002, 0x00000000, 0x40066666, 0x00000000,
1659 0x00000000, 0x00000000, 0x400ccccd, 0x00000000, 0x00000000, 0x00000000, 0xabab0069, 0x00020000,
1660 0x00010001, 0x00000001, 0x00000000, 0x40c00000, 0x00000000, 0x00000000, 0x00000000, 0x31690070,
1661 0xababab00, 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0xab003269, 0x00030001, 0x00020001,
1662 0x00000001, 0x00000000, 0xabab0072, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x00000252,
1663 0x00000258, 0x00000268, 0x00000258, 0x000001f8, 0x0000026c, 0x0000027c, 0x00000280, 0x00000005,
1664 0x000a0001, 0x00040002, 0x00000290, 0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x41400000,
1665 0x00000000, 0x00000000, 0x00000000, 0x4151999a, 0x4161999a, 0x00000000, 0x00000000, 0x40470a3d,
1666 0x00000000, 0x00000000, 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a,
1667 0x00000000, 0x00000000, 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7,
1668 0x00000000, 0x00000000, 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0x41700000,
1669 0x00000000, 0x00000000, 0x00000000, 0x41800000, 0x00000000, 0x00000000, 0x00000000, 0x4188cccd,
1670 0x4190cccd, 0x00000000, 0x00000000, 0x4083851f, 0x00000000, 0x00000000, 0x00000000, 0x4086b852,
1671 0x00000000, 0x00000000, 0x00000000, 0x4089eb85, 0x00000000, 0x00000000, 0x00000000, 0x408d1eb8,
1672 0x00000000, 0x00000000, 0x00000000, 0x409051ec, 0x00000000, 0x00000000, 0x00000000, 0x4093851f,
1673 0x00000000, 0x00000000, 0x00000000, 0x00333172, 0x00030002, 0x00030001, 0x00000002, 0x00000000,
1674 0x4083851f, 0x4086b852, 0x4089eb85, 0x00000000, 0x408d1eb8, 0x409051ec, 0x4093851f, 0x00000000,
1675 0x00313372, 0x00030002, 0x00010003, 0x00000002, 0x00000000, 0x40470a3d, 0x00000000, 0x00000000,
1676 0x00000000, 0x404d70a4, 0x00000000, 0x00000000, 0x00000000, 0x4053d70a, 0x00000000, 0x00000000,
1677 0x00000000, 0x405a3d71, 0x00000000, 0x00000000, 0x00000000, 0x4060a3d7, 0x00000000, 0x00000000,
1678 0x00000000, 0x40670a3d, 0x00000000, 0x00000000, 0x00000000, 0xabab0073, 0x00030000, 0x00010001,
1679 0x00000001, 0x00000000, 0x0000010c, 0x0000048c, 0x0000022c, 0x00000258, 0x00000005, 0x00020001,
1680 0x00020001, 0x0000049c, 0x40466666, 0x00000000, 0x00000000, 0x00000000, 0x41f80000, 0x00000000,
1681 0x00000000, 0x00000000, 0x00325f73, 0x00000005, 0x00020001, 0x00020002, 0x0000049c, 0x40833333,
1682 0x00000000, 0x00000000, 0x00000000, 0x42240000, 0x00000000, 0x00000000, 0x00000000, 0x40866666,
1683 0x00000000, 0x00000000, 0x00000000, 0x42280000, 0x00000000, 0x00000000, 0x00000000, 0x00335f73,
1684 0x00000005, 0x00020001, 0x00020003, 0x0000049c, 0x40a33333, 0x00000000, 0x00000000, 0x00000000,
1685 0x424c0000, 0x00000000, 0x00000000, 0x00000000, 0x40a66666, 0x00000000, 0x00000000, 0x00000000,
1686 0x42500000, 0x00000000, 0x00000000, 0x00000000, 0x40a9999a, 0x00000000, 0x00000000, 0x00000000,
1687 0x42540000, 0x00000000, 0x00000000, 0x00000000, 0xabab0076, 0x00030001, 0x00030001, 0x00000002,
1688 0x00000000, 0x40070a3d, 0x400d70a4, 0x4013d70a, 0x00000000, 0x401a3d71, 0x4020a3d7, 0x40270a3d,
1689 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
1690 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f,
1691 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0x80070000, 0xa0e4002a,
1692 0x03000002, 0x80070000, 0x80e40000, 0xa0e4002c, 0x03000002, 0x80040000, 0x80aa0000, 0xa0000017,
1693 0x03000002, 0xe0080000, 0x80aa0000, 0xa0000011, 0x02000001, 0x80010001, 0xa000002d, 0x03000005,
1694 0x80040000, 0x80000001, 0xa0000026, 0x03000005, 0x80040000, 0x80aa0000, 0x90000000, 0x03000005,
1695 0xe0010000, 0x80aa0000, 0xa055000b, 0x03000002, 0x80020000, 0x80550000, 0xa0000016, 0x03000002,
1696 0x80010000, 0x80000000, 0xa0000015, 0x03000002, 0x80010000, 0x80000000, 0xa000000f, 0x03000002,
1697 0x80020000, 0x80550000, 0xa0000010, 0x03000005, 0x80040000, 0xa000002e, 0x90550000, 0x04000004,
1698 0xe0020000, 0x80aa0000, 0xa0000028, 0x80550000, 0x03000005, 0x80020000, 0xa0000018, 0x90aa0000,
1699 0x03000005, 0x80020000, 0x80550000, 0xa000001c, 0x03000005, 0x80020000, 0x80550000, 0xa000002f,
1700 0x03000005, 0x80020000, 0x80550000, 0xa0000020, 0x04000004, 0xe0040000, 0x80550000, 0xa0aa0024,
1701 0x80000000, 0x0000ffff,
1704 const struct {
1705 LPCSTR fullname;
1706 D3DXCONSTANT_DESC desc;
1707 UINT ctaboffset;
1709 test_get_shader_constant_variables_data[] =
1711 {"f", {"f", D3DXRS_FLOAT4, 45, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 72},
1712 {"f23", {"f23", D3DXRS_FLOAT4, 29, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 2, 0, 48, NULL}, 81},
1713 {"f23[0]", {"f23", D3DXRS_FLOAT4, 29, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL}, 81},
1714 {"f23[1]", {"f23", D3DXRS_FLOAT4, 32, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL}, 93},
1715 {"f32", {"f32", D3DXRS_FLOAT4, 33, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 2, 0, 48, NULL}, 110},
1716 {"f32[0]", {"f32", D3DXRS_FLOAT4, 33, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL}, 110},
1717 {"f32[1]", {"f32", D3DXRS_FLOAT4, 35, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL}, 118},
1718 {"f_2", {"f_2", D3DXRS_FLOAT4, 37, 2, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 2, 0, 8, NULL}, 131},
1719 {"f_2[0]", {"f_2", D3DXRS_FLOAT4, 37, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 131},
1720 {"f_2[1]", {"f_2", D3DXRS_FLOAT4, 38, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 135},
1721 {"i", {"i", D3DXRS_FLOAT4, 47, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 144},
1722 {"i[0]", {"i", D3DXRS_FLOAT4, 47, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 144},
1723 {"p", {"p", D3DXRS_FLOAT4, 0, 18, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 2, 4, 80, NULL}, 176},
1724 {"p[0]", {"p", D3DXRS_FLOAT4, 0, 9, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 1, 4, 40, NULL}, 176},
1725 {"p[0].i1", {"i1", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 176},
1726 {"p[0].i2", {"i2", D3DXRS_FLOAT4, 1, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 180},
1727 {"p[0].f_2", {"f_2", D3DXRS_FLOAT4, 2, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 1, 0, 8, NULL}, 184},
1728 {"p[0].r", {"r", D3DXRS_FLOAT4, 3, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 188},
1729 {"p[0].r[0]", {"r", D3DXRS_FLOAT4, 3, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 188},
1730 {"p[0].r[1]", {"r", D3DXRS_FLOAT4, 6, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 200},
1731 {"p[1]", {"p", D3DXRS_FLOAT4, 9, 9, D3DXPC_STRUCT, D3DXPT_VOID, 1, 10, 1, 4, 40, NULL}, 212},
1732 {"p[1].i1", {"i1", D3DXRS_FLOAT4, 9, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 212},
1733 {"p[1].i2", {"i2", D3DXRS_FLOAT4, 10, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 216},
1734 {"p[1].f_2", {"f_2", D3DXRS_FLOAT4, 11, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 1, 0, 8, NULL}, 220},
1735 {"p[1].r", {"r", D3DXRS_FLOAT4, 12, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 224},
1736 {"p[1].r[0]", {"r", D3DXRS_FLOAT4, 12, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 224},
1737 {"p[1].r[1]", {"r", D3DXRS_FLOAT4, 15, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 236},
1738 {"r13", {"r13", D3DXRS_FLOAT4, 43, 2, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 253},
1739 {"r13[0]", {"r13", D3DXRS_FLOAT4, 43, 1, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 253},
1740 {"r13[1]", {"r13", D3DXRS_FLOAT4, 44, 1, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 257},
1741 {"r31", {"r31", D3DXRS_FLOAT4, 18, 6, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 24, NULL}, 266},
1742 {"r31[0]", {"r31", D3DXRS_FLOAT4, 18, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 266},
1743 {"r31[1]", {"r31", D3DXRS_FLOAT4, 21, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}, 278},
1744 {"s", {"s", D3DXRS_FLOAT4, 46, 1, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 303},
1745 {"s.f", {"f", D3DXRS_FLOAT4, 46, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 303},
1746 {"s.i", {"i", D3DXRS_FLOAT4, 47, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 307},
1747 {"s_2", {"s_2", D3DXRS_FLOAT4, 39, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 2, 2, 16, NULL}, 316},
1748 {"s_2[0]", {"s_2", D3DXRS_FLOAT4, 39, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 316},
1749 {"s_2[0].f", {"f", D3DXRS_FLOAT4, 39, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 316},
1750 {"s_2[0].i", {"i", D3DXRS_FLOAT4, 40, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 320},
1751 {"s_2[1]", {"s_2", D3DXRS_FLOAT4, 41, 0, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 324},
1752 {"s_2[1].f", {"f", D3DXRS_FLOAT4, 41, 0, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 324},
1753 {"s_2[1].i", {"i", D3DXRS_FLOAT4, 41, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 328},
1754 {"s_3", {"s_3", D3DXRS_FLOAT4, 24, 5, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 3, 2, 24, NULL}, 337},
1755 {"s_3[0]", {"s_3", D3DXRS_FLOAT4, 24, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 337},
1756 {"s_3[0].f", {"f", D3DXRS_FLOAT4, 24, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 337},
1757 {"s_3[0].i", {"i", D3DXRS_FLOAT4, 25, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 341},
1758 {"s_3[1]", {"s_3", D3DXRS_FLOAT4, 26, 2, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 345},
1759 {"s_3[1].f", {"f", D3DXRS_FLOAT4, 26, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 345},
1760 {"s_3[1].i", {"i", D3DXRS_FLOAT4, 27, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 349},
1761 {"s_3[2]", {"s_3", D3DXRS_FLOAT4, 28, 1, D3DXPC_STRUCT, D3DXPT_VOID, 1, 2, 1, 2, 8, NULL}, 353},
1762 {"s_3[2].f", {"f", D3DXRS_FLOAT4, 28, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL}, 353},
1763 {"s_3[2].i", {"i", D3DXRS_FLOAT4, 29, 0, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL}, 357},
1764 {"v", {"v", D3DXRS_FLOAT4, 41, 2, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 2, 0, 24, NULL}, 366},
1765 {"v[0]", {"v", D3DXRS_FLOAT4, 41, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 366},
1766 {"v[1]", {"v", D3DXRS_FLOAT4, 42, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 1, 0, 12, NULL}, 370},
1769 static void test_get_shader_constant_variables(void)
1771 ID3DXConstantTable *ctable;
1772 HRESULT hr;
1773 ULONG count;
1774 UINT i;
1775 UINT nr = 1;
1776 D3DXHANDLE constant, element;
1777 D3DXCONSTANT_DESC desc;
1778 DWORD *ctab;
1780 hr = D3DXGetShaderConstantTable(test_get_shader_constant_variables_blob, &ctable);
1781 ok(hr == D3D_OK, "D3DXGetShaderConstantTable failed, got %08x, expected %08x\n", hr, D3D_OK);
1783 ctab = ID3DXConstantTable_GetBufferPointer(ctable);
1784 ok(ctab[0] == test_get_shader_constant_variables_blob[3], "ID3DXConstantTable_GetBufferPointer failed\n");
1786 for (i = 0; i < sizeof(test_get_shader_constant_variables_data) / sizeof(*test_get_shader_constant_variables_data); ++i)
1788 LPCSTR fullname = test_get_shader_constant_variables_data[i].fullname;
1789 const D3DXCONSTANT_DESC *expected_desc = &test_get_shader_constant_variables_data[i].desc;
1790 UINT ctaboffset = test_get_shader_constant_variables_data[i].ctaboffset;
1792 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, fullname);
1793 ok(constant != NULL, "GetConstantByName \"%s\" failed\n", fullname);
1795 hr = ID3DXConstantTable_GetConstantDesc(ctable, constant, &desc, &nr);
1796 ok(hr == D3D_OK, "GetConstantDesc \"%s\" failed, got %08x, expected %08x\n", fullname, hr, D3D_OK);
1798 ok(!strcmp(expected_desc->Name, desc.Name), "GetConstantDesc \"%s\" failed, got \"%s\", expected \"%s\"\n",
1799 fullname, desc.Name, expected_desc->Name);
1800 ok(expected_desc->RegisterSet == desc.RegisterSet, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1801 fullname, desc.RegisterSet, expected_desc->RegisterSet);
1802 ok(expected_desc->RegisterIndex == desc.RegisterIndex, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1803 fullname, desc.RegisterIndex, expected_desc->RegisterIndex);
1804 ok(expected_desc->RegisterCount == desc.RegisterCount, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1805 fullname, desc.RegisterCount, expected_desc->RegisterCount);
1806 ok(expected_desc->Class == desc.Class, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1807 fullname, desc.Class, expected_desc->Class);
1808 ok(expected_desc->Type == desc.Type, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1809 fullname, desc.Type, expected_desc->Type);
1810 ok(expected_desc->Rows == desc.Rows, "GetConstantDesc \"%s\" failed, got %#x, expected %#x\n",
1811 fullname, desc.Rows, expected_desc->Rows);
1812 ok(expected_desc->Columns == desc.Columns, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1813 fullname, desc.Columns, expected_desc->Columns);
1814 ok(expected_desc->Elements == desc.Elements, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1815 fullname, desc.Elements, expected_desc->Elements);
1816 ok(expected_desc->StructMembers == desc.StructMembers, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1817 fullname, desc.StructMembers, expected_desc->StructMembers);
1818 ok(expected_desc->Bytes == desc.Bytes, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1819 fullname, desc.Bytes, expected_desc->Bytes);
1820 ok(ctaboffset == (DWORD *)desc.DefaultValue - ctab, "GetConstantDesc \"%s\" failed, got %u, expected %u\n",
1821 fullname, (UINT)((DWORD *)desc.DefaultValue - ctab), ctaboffset);
1824 element = ID3DXConstantTable_GetConstantElement(ctable, NULL, 0);
1825 ok(element == NULL, "GetConstantElement failed\n");
1827 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "i");
1828 ok(constant != NULL, "GetConstantByName failed\n");
1830 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "i[0]");
1831 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1833 element = ID3DXConstantTable_GetConstantElement(ctable, "i", 0);
1834 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1836 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f");
1837 ok(constant != NULL, "GetConstantByName failed\n");
1839 element = ID3DXConstantTable_GetConstant(ctable, NULL, 0);
1840 ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1842 element = ID3DXConstantTable_GetConstant(ctable, "invalid", 0);
1843 ok(element == NULL, "GetConstant failed\n");
1845 element = ID3DXConstantTable_GetConstant(ctable, "f", 0);
1846 ok(element == NULL, "GetConstant failed\n");
1848 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[0]");
1849 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1851 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[1]");
1852 ok(NULL == element, "GetConstantByName failed\n");
1854 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f[0][0]");
1855 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1857 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f.");
1858 ok(element == NULL, "GetConstantByName failed\n");
1860 element = ID3DXConstantTable_GetConstantElement(ctable, "f", 0);
1861 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1863 element = ID3DXConstantTable_GetConstantElement(ctable, "f", 1);
1864 ok(element == NULL, "GetConstantElement failed\n");
1866 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2[0]");
1867 ok(constant != NULL, "GetConstantByName failed\n");
1869 element = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2");
1870 ok(element != constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1872 element = ID3DXConstantTable_GetConstantElement(ctable, "f_2", 0);
1873 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1875 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "f_2[1]");
1876 ok(constant != NULL, "GetConstantByName failed\n");
1878 element = ID3DXConstantTable_GetConstantElement(ctable, "f_2", 1);
1879 ok(element == constant, "GetConstantElement failed, got %p, expected %p\n", element, constant);
1881 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "s_2[0].f");
1882 ok(constant != NULL, "GetConstantByName failed\n");
1884 element = ID3DXConstantTable_GetConstant(ctable, "s_2[0]", 0);
1885 ok(element == constant, "GetConstant failed, got %p, expected %p\n", element, constant);
1887 element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "f");
1888 ok(element == constant, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1890 element = ID3DXConstantTable_GetConstantByName(ctable, "s_2[0]", "invalid");
1891 ok(element == NULL, "GetConstantByName failed\n");
1893 constant = ID3DXConstantTable_GetConstantByName(ctable, NULL, "s_2[0]");
1894 ok(constant != NULL, "GetConstantByName failed\n");
1896 element = ID3DXConstantTable_GetConstantElement(ctable, "s_2[0]", 0);
1897 ok(constant == element, "GetConstantByName failed, got %p, expected %p\n", element, constant);
1899 count = ID3DXConstantTable_Release(ctable);
1900 ok(count == 0, "Release failed, got %u, expected %u\n", count, 0);
1903 START_TEST(shader)
1905 test_get_shader_size();
1906 test_get_shader_version();
1907 test_find_shader_comment();
1908 test_get_shader_constant_table_ex();
1909 test_constant_tables();
1910 test_setting_constants();
1911 test_get_sampler_index();
1912 test_get_shader_samplers();
1913 test_get_shader_constant_variables();