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"
23 static const DWORD simple_vs[] = {
24 0xfffe0101, /* vs_1_1 */
25 0x0000001f, 0x80000000, 0x900f0000, /* dcl_position0 v0 */
26 0x00000009, 0xc0010000, 0x90e40000, 0xa0e40000, /* dp4 oPos.x, v0, c0 */
27 0x00000009, 0xc0020000, 0x90e40000, 0xa0e40001, /* dp4 oPos.y, v0, c1 */
28 0x00000009, 0xc0040000, 0x90e40000, 0xa0e40002, /* dp4 oPos.z, v0, c2 */
29 0x00000009, 0xc0080000, 0x90e40000, 0xa0e40003, /* dp4 oPos.w, v0, c3 */
30 0x0000ffff}; /* END */
32 static const DWORD simple_ps[] = {
33 0xffff0101, /* ps_1_1 */
34 0x00000051, 0xa00f0001, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, /* def c1 = 1.0, 0.0, 0.0, 0.0 */
35 0x00000042, 0xb00f0000, /* tex t0 */
36 0x00000008, 0x800f0000, 0xa0e40001, 0xa0e40000, /* dp3 r0, c1, c0 */
37 0x00000005, 0x800f0000, 0x90e40000, 0x80e40000, /* mul r0, v0, r0 */
38 0x00000005, 0x800f0000, 0xb0e40000, 0x80e40000, /* mul r0, t0, r0 */
39 0x0000ffff}; /* END */
41 #define FCC_TEXT MAKEFOURCC('T','E','X','T')
42 #define FCC_CTAB MAKEFOURCC('C','T','A','B')
44 static const DWORD shader_with_ctab[] = {
45 0xfffe0300, /* vs_3_0 */
46 0x0002fffe, FCC_TEXT, 0x00000000, /* TEXT comment */
47 0x0008fffe, FCC_CTAB, 0x0000001c, 0x00000010, 0xfffe0300, 0x00000000, /* CTAB comment */
48 0x00000000, 0x00000000, 0x00000000,
49 0x0004fffe, FCC_TEXT, 0x00000000, 0x00000000, 0x00000000, /* TEXT comment */
50 0x0000ffff}; /* END */
52 static const DWORD shader_with_invalid_ctab[] = {
53 0xfffe0300, /* vs_3_0 */
54 0x0005fffe, FCC_CTAB, /* CTAB comment */
55 0x0000001c, 0x000000a9, 0xfffe0300,
56 0x00000000, 0x00000000,
57 0x0000ffff}; /* END */
59 static const DWORD shader_with_ctab_constants[] = {
60 0xfffe0300, /* vs_3_0 */
61 0x002efffe, FCC_CTAB, /* CTAB comment */
62 0x0000001c, 0x000000a4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
64 0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc */
65 0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000, /* Constant 2 desc */
66 0x00000090, 0x00040002, 0x00000003, 0x00000080, 0x00000000, /* Constant 3 desc */
67 0x736e6f43, 0x746e6174, 0xabab0031, /* Constant 1 name string */
68 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
69 0x736e6f43, 0x746e6174, 0xabab0032, /* Constant 2 name string */
70 0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 2 & 3 type desc */
71 0x736e6f43, 0x746e6174, 0xabab0033, /* Constant 3 name string */
72 0x335f7376, 0xab00305f, /* Target name string */
73 0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
74 0x0000ffff}; /* END */
76 static const DWORD ctab_basic[] = {
77 0xfffe0300, /* vs_3_0 */
78 0x0040fffe, FCC_CTAB, /* CTAB comment */
79 0x0000001c, 0x000000ec, 0xfffe0300, 0x00000005, 0x0000001c, 0x20008100, /* Header */
81 0x00000080, 0x00060002, 0x00000001, 0x00000084, 0x00000000, /* Constant 1 desc (f) */
82 0x00000094, 0x00070002, 0x00000001, 0x00000098, 0x00000000, /* Constant 2 desc (f4) */
83 0x000000A8, 0x00040002, 0x00000001, 0x000000AC, 0x00000000, /* Constant 3 desc (i) */
84 0x000000BC, 0x00050002, 0x00000001, 0x000000C0, 0x00000000, /* Constant 4 desc (i4) */
85 0x000000D0, 0x00000002, 0x00000004, 0x000000D4, 0x00000000, /* Constant 5 desc (mvp) */
86 0xabab0066, 0x00030000, 0x00010001, 0x00000001, 0x00000000, /* Constant 1 name/type desc */
87 0xab003466, 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 2 name/type desc */
88 0xabab0069, 0x00020000, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 name/type desc */
89 0xab003469, 0x00020001, 0x00040001, 0x00000001, 0x00000000, /* Constant 4 name/type desc */
90 0x0070766d, 0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 5 name/type desc */
91 0x335f7376, 0xab00305f, /* Target name string */
92 0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
93 0x0000ffff}; /* END */
95 static const D3DXCONSTANT_DESC ctab_basic_expected[] = {
96 {"mvp", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL},
97 {"i", D3DXRS_FLOAT4, 4, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4, NULL},
98 {"i4", D3DXRS_FLOAT4, 5, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 1, 0, 16, NULL},
99 {"f", D3DXRS_FLOAT4, 6, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, NULL},
100 {"f4", D3DXRS_FLOAT4, 7, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16, NULL}};
102 static const DWORD ctab_matrices[] = {
103 0xfffe0300, /* vs_3_0 */
104 0x0032fffe, FCC_CTAB, /* CTAB comment */
105 0x0000001c, 0x000000b4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
107 0x00000058, 0x00070002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc (fmatrix3x1) */
108 0x00000074, 0x00000002, 0x00000004, 0x00000080, 0x00000000, /* Constant 2 desc (fmatrix4x4) */
109 0x00000090, 0x00040002, 0x00000003, 0x0000009c, 0x00000000, /* Constant 3 desc (imatrix2x3) */
110 0x74616D66, 0x33786972, 0xab003178, /* Constant 1 name */
111 0x00030003, 0x00010003, 0x00000001, 0x00000000, /* Constant 1 type desc */
112 0x74616D66, 0x34786972, 0xab003478, /* Constant 2 name */
113 0x00030003, 0x00040004, 0x00000001, 0x00000000, /* Constant 2 type desc */
114 0x74616D69, 0x32786972, 0xab003378, /* Constant 3 name */
115 0x00020002, 0x00030002, 0x00000001, 0x00000000, /* Constant 3 type desc */
116 0x335f7376, 0xab00305f, /* Target name string */
117 0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
118 0x0000ffff}; /* END */
120 static const D3DXCONSTANT_DESC ctab_matrices_expected[] = {
121 {"fmatrix4x4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL},
122 {"imatrix2x3", D3DXRS_FLOAT4, 4, 3, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 1, 0, 24, NULL},
123 {"fmatrix3x1", D3DXRS_FLOAT4, 7, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 1, 1, 0, 12, NULL}};
125 static const DWORD ctab_matrices2[] = {
126 0xfffe0200, /* vs_2_0 */
127 0x0058fffe, FCC_CTAB, /* CTAB comment */
128 0x0000001c, 0x0000012b, 0xfffe0200, 0x00000006, 0x0000001c, 0x00000100, /* Header */
130 0x00000094, 0x00070002, 0x00000003, 0x0000009c, 0x00000000, /* Constant 1 desc (c2x3) */
131 0x000000ac, 0x000d0002, 0x00000002, 0x000000b4, 0x00000000, /* Constant 2 desc (c3x2) */
132 0x000000c4, 0x000a0002, 0x00000003, 0x000000cc, 0x00000000, /* Constant 3 desc (c3x3) */
133 0x000000dc, 0x000f0002, 0x00000002, 0x000000e4, 0x00000000, /* Constant 4 desc (r2x3) */
134 0x000000f4, 0x00040002, 0x00000003, 0x000000fc, 0x00000000, /* Constant 5 desc (r3x2) */
135 0x0000010c, 0x00000002, 0x00000004, 0x00000114, 0x00000000, /* Constant 6 desc (r4x4) */
136 0x33783263, 0xababab00, /* Constant 1 name */
137 0x00030003, 0x00030002, 0x00000001, 0x00000000, /* Constant 1 type desc */
138 0x32783363, 0xababab00, /* Constant 2 name */
139 0x00030003, 0x00020003, 0x00000001, 0x00000000, /* Constant 2 type desc */
140 0x33783363, 0xababab00, /* Constant 3 name */
141 0x00030003, 0x00030003, 0x00000001, 0x00000000, /* Constant 3 type desc */
142 0x33783272, 0xababab00, /* Constant 4 name */
143 0x00030002, 0x00030002, 0x00000001, 0x00000000, /* Constant 4 type desc */
144 0x32783372, 0xababab00, /* Constant 5 name */
145 0x00030002, 0x00020003, 0x00000001, 0x00000000, /* Constant 5 type desc */
146 0x34783472, 0xababab00, /* Constant 6 name */
147 0x00030002, 0x00040004, 0x00000001, 0x00000000, /* Constant 6 type desc */
148 0x325f7376, 0x4100305f, 0x41414141, 0x00414141, /* Target and Creator name */
149 0x0000ffff}; /* END */
151 static const D3DXCONSTANT_DESC ctab_matrices2_expected[] = {
152 {"c2x3", D3DXRS_FLOAT4, 7, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL},
153 {"c3x2", D3DXRS_FLOAT4, 13, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL},
154 {"c3x3", D3DXRS_FLOAT4, 10, 3, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 3, 1, 0, 36, NULL},
155 {"r2x3", D3DXRS_FLOAT4, 15, 2, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 1, 0, 24, NULL},
156 {"r3x2", D3DXRS_FLOAT4, 4, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 1, 0, 24, NULL},
157 {"r4x4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, NULL}};
159 static const DWORD ctab_arrays[] = {
160 0xfffe0300, /* vs_3_0 */
161 0x0052fffe, FCC_CTAB, /* CTAB comment */
162 0x0000001c, 0x0000013c, 0xfffe0300, 0x00000006, 0x0000001c, 0x20008100, /* Header */
164 0x00000094, 0x000E0002, 0x00000002, 0x0000009c, 0x00000000, /* Constant 1 desc (barray) */
165 0x000000ac, 0x00100002, 0x00000002, 0x000000b8, 0x00000000, /* Constant 2 desc (bvecarray) */
166 0x000000c8, 0x00080002, 0x00000004, 0x000000d0, 0x00000000, /* Constant 3 desc (farray) */
167 0x000000e0, 0x00000002, 0x00000008, 0x000000ec, 0x00000000, /* Constant 4 desc (fmtxarray) */
168 0x000000fc, 0x000C0002, 0x00000002, 0x00000108, 0x00000000, /* Constant 5 desc (fvecarray) */
169 0x00000118, 0x00120002, 0x00000001, 0x00000124, 0x00000000, /* Constant 6 desc (ivecarray) */
170 0x72726162, 0xab007961, /* Constant 1 name */
171 0x00010000, 0x00010001, 0x00000002, 0x00000000, /* Constant 1 type desc */
172 0x63657662, 0x61727261, 0xabab0079, /* Constant 2 name */
173 0x00010001, 0x00030001, 0x00000003, 0x00000000, /* Constant 2 type desc */
174 0x72726166, 0xab007961, /* Constant 3 name */
175 0x00030000, 0x00010001, 0x00000004, 0x00000000, /* constant 3 type desc */
176 0x78746d66, 0x61727261, 0xabab0079, /* Constant 4 name */
177 0x00030002, 0x00040004, 0x00000002, 0x00000000, /* Constant 4 type desc */
178 0x63657666, 0x61727261, 0xabab0079, /* Constant 5 name */
179 0x00030001, 0x00040001, 0x00000002, 0x00000000, /* Constant 5 type desc */
180 0x63657669, 0x61727261, 0xabab0079, /* Constant 6 name */
181 0x00020001, 0x00040001, 0x00000001, 0x00000000, /* Constant 6 type desc */
182 0x335f7376, 0xab00305f, /* Target name string */
183 0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
184 0x0000ffff}; /* END */
186 static const D3DXCONSTANT_DESC ctab_arrays_expected[] = {
187 {"fmtxarray", D3DXRS_FLOAT4, 0, 8, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 128, NULL},
188 {"farray", D3DXRS_FLOAT4, 8, 4, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 4, 0, 16, NULL},
189 {"fvecarray", D3DXRS_FLOAT4, 12, 2, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 2, 0, 32, NULL},
190 {"barray", D3DXRS_FLOAT4, 14, 2, D3DXPC_SCALAR, D3DXPT_BOOL, 1, 1, 2, 0, 8, NULL},
191 {"bvecarray", D3DXRS_FLOAT4, 16, 2, D3DXPC_VECTOR, D3DXPT_BOOL, 1, 3, 3, 0, 36, NULL},
192 {"ivecarray", D3DXRS_FLOAT4, 18, 1, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 1, 0, 16, NULL}};
194 static const DWORD ctab_with_default_values[] = {
195 0xfffe0200, /* vs_2_0 */
196 0x007bfffe, FCC_CTAB, /* CTAB comment */
197 0x0000001c, 0x000001b7, 0xfffe0200, 0x00000005, 0x0000001c, /* header */
198 0x00000100, 0x000001b0,
199 0x00000080, 0x00080002, 0x00000003, 0x00000084, 0x00000094, /* constant 1 desc (arr) */
200 0x000000c4, 0x000c0002, 0x00000001, 0x000000c8, 0x000000d8, /* constant 2 desc (flt) */
201 0x000000e8, 0x00040002, 0x00000004, 0x000000f0, 0x00000100, /* constant 3 desc (mat3) */
202 0x00000140, 0x00000002, 0x00000004, 0x000000f0, 0x00000148, /* constant 4 desc (mat4) */
203 0x00000188, 0x000b0002, 0x00000001, 0x00000190, 0x000001a0, /* constant 5 desc (vec4) */
204 0x00727261, /* constant 1 name */
205 0x00030000, 0x00010001, 0x00000003, 0x00000000, /* constant 1 type desc */
206 0x42c80000, 0x00000000, 0x00000000, 0x00000000, /* constant 1 default value */
207 0x43480000, 0x00000000, 0x00000000, 0x00000000,
208 0x43960000, 0x00000000, 0x00000000, 0x00000000,
209 0x00746c66, /* constant 2 name */
210 0x00030000, 0x00010001, 0x00000001, 0x00000000, /* constant 2 type desc */
211 0x411fd70a, 0x00000000, 0x00000000, 0x00000000, /* constant 2 default value */
212 0x3374616d, /* constant 3 name */
214 0x00030003, 0x00040004, 0x00000001, 0x00000000, /* constant 3 & 4 type desc */
215 0x41300000, 0x425c0000, 0x42c60000, 0x44a42000, /* constat 3 default value */
216 0x41b00000, 0x42840000, 0x447c8000, 0x44b0c000,
217 0x42040000, 0x429a0000, 0x448ae000, 0x44bd6000,
218 0x42300000, 0x42b00000, 0x44978000, 0x44ca0000,
219 0x3474616d, /* constant 4 name */
221 0x3f800000, 0x40a00000, 0x41100000, 0x41500000, /* constant 4 default value */
222 0x40000000, 0x40c00000, 0x41200000, 0x41600000,
223 0x40400000, 0x40e00000, 0x41300000, 0x41700000,
224 0x40800000, 0x41000000, 0x41400000, 0x41800000,
225 0x34636576, /* constant 5 name */
227 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* constant 5 type desc */
228 0x41200000, 0x41a00000, 0x41f00000, 0x42200000, /* constant 5 default value */
229 0x325f7376, 0x4d004141, 0x41414141, 0x00000000, /* target & creator string */
230 0x0000ffff}; /* END */
232 static const float mat4_default_value[] = {1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16};
233 static const float mat3_default_value[] = {11, 55, 99, 1313, 22, 66, 1010, 1414, 33, 77, 1111, 1515, 44, 88, 1212, 1616};
234 static const float arr_default_value[] = {100, 0, 0, 0, 200, 0, 0, 0, 300, 0, 0, 0};
235 static const float vec4_default_value[] = {10, 20, 30, 40};
236 static const float flt_default_value[] = {9.99, 0, 0, 0};
238 static const D3DXCONSTANT_DESC ctab_with_default_values_expected[] = {
239 {"mat4", D3DXRS_FLOAT4, 0, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, mat4_default_value},
240 {"mat3", D3DXRS_FLOAT4, 4, 4, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 4, 4, 1, 0, 64, mat3_default_value},
241 {"arr", D3DXRS_FLOAT4, 8, 3, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 3, 0, 12, arr_default_value},
242 {"vec4", D3DXRS_FLOAT4, 11, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16, vec4_default_value},
243 {"flt", D3DXRS_FLOAT4, 12, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4, flt_default_value}};
245 static const DWORD ctab_samplers[] = {
246 0xfffe0300, /* vs_3_0 */
247 0x0032fffe, FCC_CTAB, /* CTAB comment */
248 0x0000001c, 0x000000b4, 0xfffe0300, 0x00000003, 0x0000001c, 0x20008100, /* Header */
250 0x00000058, 0x00020002, 0x00000001, 0x00000064, 0x00000000, /* Constant 1 desc (notsampler) */
251 0x00000074, 0x00000003, 0x00000001, 0x00000080, 0x00000000, /* Constant 2 desc (sampler1) */
252 0x00000090, 0x00030003, 0x00000001, 0x0000009c, 0x00000000, /* Constant 3 desc (sampler2) */
253 0x73746f6e, 0x6c706d61, 0xab007265, /* Constant 1 name */
254 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
255 0x706d6173, 0x3172656c, 0xababab00, /* Constant 2 name */
256 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 2 type desc */
257 0x706d6173, 0x3272656c, 0xababab00, /* Constant 3 name */
258 0x000d0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 type desc */
259 0x335f7376, 0xab00305f, /* Target name string */
260 0x656e6957, 0x6f727020, 0x7463656a, 0xababab00, /* Creator name string */
261 0x0000ffff}; /* END */
263 static const D3DXCONSTANT_DESC ctab_samplers_expected[] = {
264 {"sampler1", D3DXRS_SAMPLER, 0, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4, NULL},
265 {"sampler2", D3DXRS_SAMPLER, 3, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER3D, 1, 1, 1, 0, 4, NULL},
266 {"notsampler", D3DXRS_FLOAT4, 2, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16, NULL}};
268 static void test_get_shader_size(void)
270 UINT shader_size, expected;
272 shader_size = D3DXGetShaderSize(simple_vs);
273 expected = sizeof(simple_vs);
274 ok(shader_size == expected, "Got shader size %u, expected %u\n", shader_size, expected);
276 shader_size = D3DXGetShaderSize(simple_ps);
277 expected = sizeof(simple_ps);
278 ok(shader_size == expected, "Got shader size %u, expected %u\n", shader_size, expected);
280 shader_size = D3DXGetShaderSize(NULL);
281 ok(shader_size == 0, "Got shader size %u, expected 0\n", shader_size);
284 static void test_get_shader_version(void)
286 DWORD shader_version;
288 shader_version = D3DXGetShaderVersion(simple_vs);
289 ok(shader_version == D3DVS_VERSION(1, 1), "Got shader version 0x%08x, expected 0x%08x\n",
290 shader_version, D3DVS_VERSION(1, 1));
292 shader_version = D3DXGetShaderVersion(simple_ps);
293 ok(shader_version == D3DPS_VERSION(1, 1), "Got shader version 0x%08x, expected 0x%08x\n",
294 shader_version, D3DPS_VERSION(1, 1));
296 shader_version = D3DXGetShaderVersion(NULL);
297 ok(shader_version == 0, "Got shader version 0x%08x, expected 0\n", shader_version);
300 static void test_find_shader_comment(void)
303 LPCVOID data = (LPVOID)0xdeadbeef;
306 hr = D3DXFindShaderComment(NULL, MAKEFOURCC('C','T','A','B'), &data, &size);
307 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
308 ok(!data, "Got %p, expected NULL\n", data);
309 ok(!size, "Got %u, expected 0\n", size);
311 hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), NULL, &size);
312 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
313 ok(size == 28, "Got %u, expected 28\n", size);
315 hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, NULL);
316 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
317 ok(data == (LPCVOID)(shader_with_ctab + 6), "Got result %p, expected %p\n", data, shader_with_ctab + 6);
319 hr = D3DXFindShaderComment(shader_with_ctab, 0, &data, &size);
320 ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
321 ok(!data, "Got %p, expected NULL\n", data);
322 ok(!size, "Got %u, expected 0\n", size);
324 hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('X','X','X','X'), &data, &size);
325 ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
326 ok(!data, "Got %p, expected NULL\n", data);
327 ok(!size, "Got %u, expected 0\n", size);
329 hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, &size);
330 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
331 ok(data == (LPCVOID)(shader_with_ctab + 6), "Got result %p, expected %p\n", data, shader_with_ctab + 6);
332 ok(size == 28, "Got result %d, expected 28\n", size);
335 static void test_get_shader_constant_table_ex(void)
337 LPD3DXCONSTANTTABLE constant_table = NULL;
341 D3DXCONSTANTTABLE_DESC desc;
343 hr = D3DXGetShaderConstantTableEx(NULL, 0, &constant_table);
344 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
347 hr = D3DXGetShaderConstantTableEx(simple_ps, 0, &constant_table);
348 ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
350 /* With invalid CTAB data */
351 hr = D3DXGetShaderConstantTableEx(shader_with_invalid_ctab, 0, &constant_table);
352 ok(hr == D3DXERR_INVALIDDATA || broken(hr == D3D_OK), /* winxp 64-bit, w2k3 64-bit */
353 "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
354 if (constant_table) ID3DXConstantTable_Release(constant_table);
356 hr = D3DXGetShaderConstantTableEx(shader_with_ctab, 0, &constant_table);
357 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
361 size = ID3DXConstantTable_GetBufferSize(constant_table);
362 ok(size == 28, "Got result %x, expected 28\n", size);
364 data = ID3DXConstantTable_GetBufferPointer(constant_table);
365 ok(!memcmp(data, shader_with_ctab + 6, size), "Retrieved wrong CTAB data\n");
367 hr = ID3DXConstantTable_GetDesc(constant_table, NULL);
368 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
370 hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
371 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
372 ok(desc.Creator == (LPCSTR)data + 0x10, "Got result %p, expected %p\n", desc.Creator, (LPCSTR)data + 0x10);
373 ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
374 ok(desc.Constants == 0, "Got result %x, expected 0\n", desc.Constants);
376 ID3DXConstantTable_Release(constant_table);
379 hr = D3DXGetShaderConstantTableEx(shader_with_ctab_constants, 0, &constant_table);
380 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
385 D3DXCONSTANT_DESC constant_desc;
386 D3DXCONSTANT_DESC constant_desc_save;
390 hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
391 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
392 ok(!strcmp(desc.Creator, "Wine project"), "Got result '%s', expected 'Wine project'\n", desc.Creator);
393 ok(desc.Version == D3DVS_VERSION(3, 0), "Got result %x, expected %x\n", desc.Version, D3DVS_VERSION(3, 0));
394 ok(desc.Constants == 3, "Got result %x, expected 3\n", desc.Constants);
396 /* Test GetConstant */
397 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
398 ok(constant != NULL, "No constant found\n");
399 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
400 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
401 ok(!strcmp(constant_desc.Name, "Constant1"), "Got result '%s', expected 'Constant1'\n",
403 ok(constant_desc.Class == D3DXPC_VECTOR, "Got result %x, expected %u (D3DXPC_VECTOR)\n",
404 constant_desc.Class, D3DXPC_VECTOR);
405 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
406 constant_desc.Type, D3DXPT_FLOAT);
407 ok(constant_desc.Rows == 1, "Got result %x, expected 1\n", constant_desc.Rows);
408 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
410 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 1);
411 ok(constant != NULL, "No constant found\n");
412 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
413 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
414 ok(!strcmp(constant_desc.Name, "Constant2"), "Got result '%s', expected 'Constant2'\n",
416 ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
417 constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
418 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
419 constant_desc.Type, D3DXPT_FLOAT);
420 ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
421 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
423 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 2);
424 ok(constant != NULL, "No constant found\n");
425 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
426 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
427 ok(!strcmp(constant_desc.Name, "Constant3"), "Got result '%s', expected 'Constant3'\n",
429 ok(constant_desc.Class == D3DXPC_MATRIX_COLUMNS, "Got result %x, expected %u (D3DXPC_MATRIX_COLUMNS)\n",
430 constant_desc.Class, D3DXPC_MATRIX_COLUMNS);
431 ok(constant_desc.Type == D3DXPT_FLOAT, "Got result %x, expected %u (D3DXPT_FLOAT)\n",
432 constant_desc.Type, D3DXPT_FLOAT);
433 ok(constant_desc.Rows == 4, "Got result %x, expected 1\n", constant_desc.Rows);
434 ok(constant_desc.Columns == 4, "Got result %x, expected 4\n", constant_desc.Columns);
435 constant_desc_save = constant_desc; /* For GetConstantDesc test */
437 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 3);
438 ok(constant == NULL, "Got result %p, expected NULL\n", constant);
440 /* Test GetConstantByName */
441 constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant unknown");
442 ok(constant == NULL, "Got result %p, expected NULL\n", constant);
443 constant = ID3DXConstantTable_GetConstantByName(constant_table, NULL, "Constant3");
444 ok(constant != NULL, "No constant found\n");
445 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
446 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
447 ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
449 /* Test GetConstantDesc */
450 constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
451 ok(constant != NULL, "No constant found\n");
452 hr = ID3DXConstantTable_GetConstantDesc(constant_table, NULL, &constant_desc, &nb);
453 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
454 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, NULL, &nb);
455 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
456 hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, NULL);
457 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
458 hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant unknow", &constant_desc, &nb);
459 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
460 hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant3", &constant_desc, &nb);
461 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
462 ok(!memcmp(&constant_desc, &constant_desc_save, sizeof(D3DXCONSTANT_DESC)), "Got different constant data\n");
464 ID3DXConstantTable_Release(constant_table);
468 static void test_constant_table(const char *test_name, const DWORD *ctable_fn,
469 const D3DXCONSTANT_DESC *expecteds, UINT count)
472 ID3DXConstantTable *ctable;
476 /* Get the constant table from the shader itself */
477 res = D3DXGetShaderConstantTable(ctable_fn, &ctable);
478 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on %s: got %08x\n", test_name, res);
480 for (i = 0; i < count; i++)
482 const D3DXCONSTANT_DESC *expected = &expecteds[i];
483 D3DXHANDLE const_handle;
484 D3DXCONSTANT_DESC actual;
487 const_handle = ID3DXConstantTable_GetConstantByName(ctable, NULL, expected->Name);
489 res = ID3DXConstantTable_GetConstantDesc(ctable, const_handle, &actual, &pCount);
490 ok(SUCCEEDED(res), "%s in %s: ID3DXConstantTable_GetConstantDesc returned %08x\n", expected->Name,
492 ok(pCount == 1, "%s in %s: Got more or less descriptions: %d\n", expected->Name, test_name, pCount);
494 ok(strcmp(actual.Name, expected->Name) == 0,
495 "%s in %s: Got different names: Got %s, expected %s\n", expected->Name,
496 test_name, actual.Name, expected->Name);
497 ok(actual.RegisterSet == expected->RegisterSet,
498 "%s in %s: Got different register sets: Got %d, expected %d\n",
499 expected->Name, test_name, actual.RegisterSet, expected->RegisterSet);
500 ok(actual.RegisterIndex == expected->RegisterIndex,
501 "%s in %s: Got different register indices: Got %d, expected %d\n",
502 expected->Name, test_name, actual.RegisterIndex, expected->RegisterIndex);
503 ok(actual.RegisterCount == expected->RegisterCount,
504 "%s in %s: Got different register counts: Got %d, expected %d\n",
505 expected->Name, test_name, actual.RegisterCount, expected->RegisterCount);
506 ok(actual.Class == expected->Class,
507 "%s in %s: Got different classes: Got %d, expected %d\n", expected->Name,
508 test_name, actual.Class, expected->Class);
509 ok(actual.Type == expected->Type,
510 "%s in %s: Got different types: Got %d, expected %d\n", expected->Name,
511 test_name, actual.Type, expected->Type);
512 ok(actual.Rows == expected->Rows && actual.Columns == expected->Columns,
513 "%s in %s: Got different dimensions: Got (%d, %d), expected (%d, %d)\n",
514 expected->Name, test_name, actual.Rows, actual.Columns, expected->Rows,
516 ok(actual.Elements == expected->Elements,
517 "%s in %s: Got different element count: Got %d, expected %d\n",
518 expected->Name, test_name, actual.Elements, expected->Elements);
519 ok(actual.StructMembers == expected->StructMembers,
520 "%s in %s: Got different struct member count: Got %d, expected %d\n",
521 expected->Name, test_name, actual.StructMembers, expected->StructMembers);
522 ok(actual.Bytes == expected->Bytes,
523 "%s in %s: Got different byte count: Got %d, expected %d\n",
524 expected->Name, test_name, actual.Bytes, expected->Bytes);
526 if (!expected->DefaultValue)
528 ok(actual.DefaultValue == NULL,
529 "%s in %s: Got different default value: expected NULL\n",
530 expected->Name, test_name);
534 ok(actual.DefaultValue != NULL,
535 "%s in %s: Got different default value: expected non-NULL\n",
536 expected->Name, test_name);
537 ok(memcmp(actual.DefaultValue, expected->DefaultValue, expected->Bytes) == 0,
538 "%s in %s: Got different default value\n", expected->Name, test_name);
542 /* Finally, release the constant table */
543 ID3DXConstantTable_Release(ctable);
546 static void test_constant_tables(void)
548 test_constant_table("test_basic", ctab_basic, ctab_basic_expected,
549 sizeof(ctab_basic_expected)/sizeof(*ctab_basic_expected));
550 test_constant_table("test_matrices", ctab_matrices, ctab_matrices_expected,
551 sizeof(ctab_matrices_expected)/sizeof(*ctab_matrices_expected));
552 test_constant_table("test_matrices2", ctab_matrices2, ctab_matrices2_expected,
553 sizeof(ctab_matrices2_expected)/sizeof(*ctab_matrices2_expected));
554 test_constant_table("test_arrays", ctab_arrays, ctab_arrays_expected,
555 sizeof(ctab_arrays_expected)/sizeof(*ctab_arrays_expected));
556 test_constant_table("test_default_values", ctab_with_default_values, ctab_with_default_values_expected,
557 sizeof(ctab_with_default_values_expected)/sizeof(*ctab_with_default_values_expected));
558 test_constant_table("test_samplers", ctab_samplers, ctab_samplers_expected,
559 sizeof(ctab_samplers_expected)/sizeof(*ctab_samplers_expected));
562 static void test_setting_basic_table(IDirect3DDevice9 *device)
564 static const D3DXMATRIX mvp = {{{
565 0.514f, 0.626f, 0.804f, 0.786f,
566 0.238f, 0.956f, 0.374f, 0.483f,
567 0.109f, 0.586f, 0.900f, 0.255f,
568 0.898f, 0.411f, 0.932f, 0.275f}}};
569 static const D3DXVECTOR4 f4 = {0.350f, 0.526f, 0.925f, 0.021f};
570 static const float f = 0.12543f;
571 static const int i = 321;
573 ID3DXConstantTable *ctable;
579 /* Get the constant table from the shader itself */
580 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
581 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
584 res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
585 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable mvp: got 0x%08x\n", res);
587 res = ID3DXConstantTable_SetInt(ctable, device, "i", i + 1);
588 ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
590 /* Check that setting i again will overwrite the previous value */
591 res = ID3DXConstantTable_SetInt(ctable, device, "i", i);
592 ok(res == D3D_OK, "ID3DXConstantTable_SetInt failed on variable i: got 0x%08x\n", res);
594 res = ID3DXConstantTable_SetFloat(ctable, device, "f", f);
595 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f: got 0x%08x\n", res);
597 res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
598 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f4: got 0x%08x\n", res);
600 /* Get constants back and validate */
601 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
602 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,
603 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
604 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
605 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,
606 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
607 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
608 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,
609 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
610 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
611 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,
612 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
613 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
615 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 1);
616 ok(out[0] == (float)i && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
617 "The variable i was not set correctly, out={%f, %f, %f, %f}, should be {%d, 0.0, 0.0, 0.0}\n",
618 out[0], out[1], out[2], out[3], i);
620 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
621 ok(out[0] == f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
622 "The variable f was not set correctly, out={%f, %f, %f, %f}, should be {%f, 0.0, 0.0, 0.0}\n",
623 out[0], out[1], out[2], out[3], f);
625 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
626 ok(memcmp(out, &f4, sizeof(f4)) == 0,
627 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
628 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
630 /* Finally test using a set* function for one type to set a variable of another type (should succeed) */
631 res = ID3DXConstantTable_SetVector(ctable, device, "f", &f4);
632 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
634 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
635 ok(out[0] == f4.x && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
636 "The variable f was not set correctly by ID3DXConstantTable_SetVector, got %f, should be %f\n",
639 memset(out, 0, sizeof(out));
640 IDirect3DDevice9_SetVertexShaderConstantF(device, 6, out, 1);
641 res = ID3DXConstantTable_SetMatrix(ctable, device, "f", &mvp);
642 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable f: 0x%08x\n", res);
644 IDirect3DDevice9_GetVertexShaderConstantF(device, 6, out, 1);
645 ok(out[0] == U(S(mvp))._11 && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
646 "The variable f was not set correctly by ID3DXConstantTable_SetMatrix, got %f, should be %f\n",
647 out[0], U(S(mvp))._11);
649 /* Clear registers */
650 memset(out, 0, sizeof(out));
651 IDirect3DDevice9_SetVertexShaderConstantF(device, 0, out, 4);
652 IDirect3DDevice9_SetVertexShaderConstantF(device, 7, out, 1);
654 /* SetVector shouldn't change the value of a matrix constant */
655 res = ID3DXConstantTable_SetVector(ctable, device, "mvp", &f4);
656 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed on variable f: 0x%08x\n", res);
658 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
659 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
660 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
661 && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
662 && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
663 "The variable mvp was not set correctly by ID3DXConstantTable_SetVector, "
664 "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
665 "should be all 0.0f\n",
666 out[0], out[1], out[2], out[3],
667 out[4], out[5], out[6], out[7],
668 out[8], out[9], out[10], out[11],
669 out[12], out[13], out[14], out[15]);
671 res = ID3DXConstantTable_SetFloat(ctable, device, "mvp", f);
672 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable mvp: 0x%08x\n", res);
674 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
675 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
676 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
677 && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f
678 && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f,
679 "The variable mvp was not set correctly by ID3DXConstantTable_SetFloat, "
680 "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, "
681 "should be all 0.0f\n",
682 out[0], out[1], out[2], out[3],
683 out[4], out[5], out[6], out[7],
684 out[8], out[9], out[10], out[11],
685 out[12], out[13], out[14], out[15]);
687 res = ID3DXConstantTable_SetFloat(ctable, device, "f4", f);
688 ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f4: 0x%08x\n", res);
690 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
691 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
692 "The variable f4 was not set correctly by ID3DXConstantTable_SetFloat, "
693 "got {%f, %f, %f, %f}, should be all 0.0f\n",
694 out[0], out[1], out[2], out[3]);
696 refcnt = ID3DXConstantTable_Release(ctable);
697 ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
700 static void test_setting_matrices_table(IDirect3DDevice9 *device)
702 static const D3DXMATRIX fmatrix =
703 {{{2.001f, 1.502f, 9.003f, 1.004f,
704 5.005f, 3.006f, 3.007f, 6.008f,
705 9.009f, 5.010f, 7.011f, 1.012f,
706 5.013f, 5.014f, 5.015f, 9.016f}}};
708 ID3DXConstantTable *ctable;
713 res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
714 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
716 res = ID3DXConstantTable_SetMatrix(ctable, device, "imatrix2x3", &fmatrix);
717 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix2x3: got %#x\n", res);
719 res = ID3DXConstantTable_SetMatrix(ctable, device, "fmatrix3x1", &fmatrix);
720 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix3x1: got %#x\n", res);
722 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
723 todo_wine ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
725 && out[4] == (int)S(U(fmatrix))._21 && out[5] == (int)S(U(fmatrix))._22 && out[6] == (int)S(U(fmatrix))._23
727 "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
728 "should be {%d, %d, %d, %d; %d, %d, %d, %d}\n",
729 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
730 (int)S(U(fmatrix))._11, (int)S(U(fmatrix))._12, (int)S(U(fmatrix))._13, 0,
731 (int)S(U(fmatrix))._21, (int)S(U(fmatrix))._22, (int)S(U(fmatrix))._23, 0);
733 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
734 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f,
735 "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
736 out[0], out[1], out[2], out[3],
737 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f);
739 ID3DXConstantTable_Release(ctable);
741 res = D3DXGetShaderConstantTable(ctab_matrices2, &ctable);
742 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %#x\n", res);
744 res = ID3DXConstantTable_SetMatrix(ctable, device, "c2x3", &fmatrix);
745 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c2x3: got %#x\n", res);
747 res = ID3DXConstantTable_SetMatrix(ctable, device, "r2x3", &fmatrix);
748 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r2x3: got %#x\n", res);
750 res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x2", &fmatrix);
751 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x2: got %#x\n", res);
753 res = ID3DXConstantTable_SetMatrix(ctable, device, "r3x2", &fmatrix);
754 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r3x2: got %#x\n", res);
756 res = ID3DXConstantTable_SetMatrix(ctable, device, "c3x3", &fmatrix);
757 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable c3x3: got %#x\n", res);
759 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
760 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
761 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
762 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
763 "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
764 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
765 out[0], out[1], out[2], out[3],
766 out[4], out[5], out[6], out[7],
767 out[8], out[9], out[10], out[11],
768 S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
769 S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
770 S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
772 res = ID3DXConstantTable_SetMatrix(ctable, device, "r4x4", &fmatrix);
773 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable r4x4: got %#x\n", res);
775 IDirect3DDevice9_GetVertexShaderConstantF(device, 15, out, 2);
776 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == S(U(fmatrix))._13 && out[3] == 0.0f
777 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == 0.0f,
778 "The variable r2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
779 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
780 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
781 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, 0.0f,
782 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, 0.0f);
784 IDirect3DDevice9_GetVertexShaderConstantF(device, 13, out, 2);
785 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
786 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f,
787 "The variable c3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f}, "
788 "should be {%f, %f, %f, %f; %f, %f, %f, %f}\n",
789 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
790 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
791 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
793 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 3);
794 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._12 && out[2] == 0.0f && out[3] == 0.0f
795 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
796 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == 0.0f && out[11] == 0.0f,
797 "The variable r3x2 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
798 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
799 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
800 S(U(fmatrix))._11, S(U(fmatrix))._12, 0.0f, 0.0f,
801 S(U(fmatrix))._21, S(U(fmatrix))._22, 0.0f, 0.0f,
802 S(U(fmatrix))._31, S(U(fmatrix))._32, 0.0f, 0.0f);
804 IDirect3DDevice9_GetVertexShaderConstantF(device, 10, out, 3);
805 ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == S(U(fmatrix))._31 && out[3] == 0.0f
806 && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._32 && out[7] == 0.0f
807 && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == S(U(fmatrix))._33 && out[11] == 0.0f,
808 "The variable c3x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
809 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
810 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11],
811 S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
812 S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f,
813 S(U(fmatrix))._13, S(U(fmatrix))._23, S(U(fmatrix))._33, 0.0f);
815 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
816 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
817 && out[4] == S(U(fmatrix))._21 && out[5] == S(U(fmatrix))._22 && out[6] == S(U(fmatrix))._23 && out[7] == S(U(fmatrix))._24
818 && out[8] == S(U(fmatrix))._31 && out[9] == S(U(fmatrix))._32 && out[10] == S(U(fmatrix))._33 && out[11] == S(U(fmatrix))._34
819 && out[12] == S(U(fmatrix))._41 && out[13] == S(U(fmatrix))._42 && out[14] == S(U(fmatrix))._43 && out[15] == S(U(fmatrix))._44,
820 "The variable r4x4 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
821 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
822 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
823 out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
824 S(U(fmatrix))._11, S(U(fmatrix))._12, S(U(fmatrix))._13, S(U(fmatrix))._14,
825 S(U(fmatrix))._21, S(U(fmatrix))._22, S(U(fmatrix))._23, S(U(fmatrix))._24,
826 S(U(fmatrix))._31, S(U(fmatrix))._32, S(U(fmatrix))._33, S(U(fmatrix))._34,
827 S(U(fmatrix))._41, S(U(fmatrix))._42, S(U(fmatrix))._43, S(U(fmatrix))._44);
829 ID3DXConstantTable_Release(ctable);
832 static void test_setting_arrays_table(IDirect3DDevice9 *device)
834 static const float farray[8] = {
835 0.005f, 0.745f, 0.973f, 0.264f,
836 0.010f, 0.020f, 0.030f, 0.040f};
837 static const D3DXMATRIX fmtxarray[2] = {
838 {{{0.001f, 0.002f, 0.003f, 0.004f,
839 0.005f, 0.006f, 0.007f, 0.008f,
840 0.009f, 0.010f, 0.011f, 0.012f,
841 0.013f, 0.014f, 0.015f, 0.016f}}},
842 {{{0.010f, 0.020f, 0.030f, 0.040f,
843 0.050f, 0.060f, 0.070f, 0.080f,
844 0.090f, 0.100f, 0.110f, 0.120f,
845 0.130f, 0.140f, 0.150f, 0.160f}}}};
846 static const int iarray[4] = {1, 2, 3, 4};
847 static const D3DXVECTOR4 fvecarray[2] = {
848 {0.745f, 0.997f, 0.353f, 0.237f},
849 {0.060f, 0.455f, 0.333f, 0.983f}};
850 static BOOL barray[4] = {FALSE, 100, TRUE, TRUE};
852 ID3DXConstantTable *ctable;
858 /* Clear registers */
859 memset(out, 0, sizeof(out));
860 IDirect3DDevice9_SetVertexShaderConstantF(device, 8, out, 4);
861 IDirect3DDevice9_SetVertexShaderConstantF(device, 12, out, 4);
863 /* Get the constant table from the shader */
864 res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
865 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got 0x%08x\n", res);
869 /* Make sure that we cannot set registers that do not belong to this constant */
870 res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 8);
871 ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got 0x%08x\n", res);
873 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 8);
874 ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
875 "The in-bounds elements of the array were not set, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
876 out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
877 ok(out[16] == 0.0f && out[20] == 0.0f && out[24] == 0.0f && out[28] == 0.0f,
878 "The excess elements of the array were set, out={%f, %f, %f, %f}, should be all 0.0f\n",
879 out[16], out[20], out[24], out[28]);
881 /* ivecarray takes up only 1 register, but a matrix takes up 4, so no elements should be set */
882 res = ID3DXConstantTable_SetMatrix(ctable, device, "ivecarray", &fmtxarray[0]);
883 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got 0x%08x\n", res);
885 IDirect3DDevice9_GetVertexShaderConstantF(device, 18, out, 4);
886 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f,
887 "The array was set, out={%f, %f, %f, %f}, should be all 0.0f\n", out[0], out[1], out[2], out[3]);
889 /* Try setting an integer array to an array declared as a float array */
890 res = ID3DXConstantTable_SetIntArray(ctable, device, "farray", iarray, 4);
891 ok(res == D3D_OK, "ID3DXConstantTable_SetIntArray failed: got 0x%08x\n", res);
893 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
894 ok(out[0] == iarray[0] && out[4] == iarray[1] && out[8] == iarray[2] && out[12] == iarray[3],
895 "SetIntArray did not properly set a float array: out={%f, %f, %f, %f}, should be {%d, %d, %d, %d}\n",
896 out[0], out[4], out[8], out[12], iarray[0], iarray[1], iarray[2], iarray[3]);
898 res = ID3DXConstantTable_SetFloatArray(ctable, device, "farray", farray, 4);
899 ok(res == D3D_OK, "ID3DXConstantTable_SetFloatArray failed: got x0%08x\n", res);
901 res = ID3DXConstantTable_SetVectorArray(ctable, device, "fvecarray", fvecarray, 2);
902 ok(res == D3D_OK, "ID3DXConstantTable_SetVectorArray failed: got 0x%08x\n", res);
904 res = ID3DXConstantTable_SetMatrixArray(ctable, device, "fmtxarray", fmtxarray, 2);
905 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixArray failed: got 0x%08x\n", res);
907 res = ID3DXConstantTable_SetBoolArray(ctable, device, "barray", barray, 2);
908 ok(res == D3D_OK, "ID3DXConstantTable_SetBoolArray failed: got 0x%08x\n", res);
910 /* Read back constants */
911 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
912 ok(out[0] == farray[0] && out[4] == farray[1] && out[8] == farray[2] && out[12] == farray[3],
913 "The variable farray was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
914 out[0], out[4], out[8], out[12], farray[0], farray[1], farray[2], farray[3]);
916 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
917 ok(out[0] == fvecarray[0].x && out[1] == fvecarray[0].y && out[2] == fvecarray[0].z && out[3] == fvecarray[0].w &&
918 out[4] == fvecarray[1].x && out[5] == fvecarray[1].y && out[6] == fvecarray[1].z && out[7] == fvecarray[1].w,
919 "The variable fvecarray was not set correctly, out={{%f, %f, %f, %f}, {%f, %f, %f, %f}}, should be "
920 "{{%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],
921 fvecarray[0].x, fvecarray[0].y, fvecarray[0].z, fvecarray[0].w, fvecarray[1].x, fvecarray[1].y,
922 fvecarray[1].z, fvecarray[1].w);
924 IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
925 ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
926 && out[4] == 1.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
927 "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",
928 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
929 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);
931 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 8);
932 /* Just check a few elements in each matrix to make sure fmtxarray was set row-major */
933 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,
934 "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
935 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);
936 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,
937 "The variable fmtxarray was not set row-major, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
938 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);
940 refcnt = ID3DXConstantTable_Release(ctable);
941 ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt);
944 static void test_SetDefaults(IDirect3DDevice9 *device)
946 static const D3DXMATRIX mvp = {{{
947 0.51f, 0.62f, 0.80f, 0.78f,
948 0.23f, 0.95f, 0.37f, 0.48f,
949 0.10f, 0.58f, 0.90f, 0.25f,
950 0.89f, 0.41f, 0.93f, 0.27f}}};
951 static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
956 ID3DXConstantTable *ctable;
958 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
959 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
961 res = ID3DXConstantTable_SetVector(ctable, device, "f4", &f4);
962 ok(res == D3D_OK, "ID3DXConstantTable_SetVector failed: got %08x\n", res);
964 res = ID3DXConstantTable_SetMatrix(ctable, device, "mvp", &mvp);
965 ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed: got %08x\n", res);
967 res = ID3DXConstantTable_SetDefaults(ctable, device);
968 ok(res == D3D_OK, "ID3dXConstantTable_SetDefaults failed: got %08x\n", res);
970 /* SetDefaults doesn't change constants without default values */
971 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
972 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,
973 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
974 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
975 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,
976 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
977 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
978 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,
979 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
980 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
981 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,
982 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
983 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
985 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
986 ok(memcmp(out, &f4, sizeof(f4)) == 0,
987 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
988 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
990 ID3DXConstantTable_Release(ctable);
992 res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
993 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
995 res = ID3DXConstantTable_SetDefaults(ctable, device);
996 ok(res == D3D_OK, "ID3DXConstantTable_SetDefaults failed: got %08x\n", res);
998 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
999 ok(memcmp(out, mat4_default_value, sizeof(mat4_default_value)) == 0,
1000 "The variable mat4 was not set correctly to default value\n");
1002 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 4);
1003 ok(memcmp(out, mat3_default_value, sizeof(mat3_default_value)) == 0,
1004 "The variable mat3 was not set correctly to default value\n");
1006 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1007 ok(memcmp(out, arr_default_value, sizeof(arr_default_value)) == 0,
1008 "The variable array was not set correctly to default value\n");
1010 IDirect3DDevice9_GetVertexShaderConstantF(device, 11, out, 1);
1011 ok(memcmp(out, vec4_default_value, sizeof(vec4_default_value)) == 0,
1012 "The variable vec4 was not set correctly to default value\n");
1014 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 1);
1015 ok(memcmp(out, flt_default_value, sizeof(flt_default_value)) == 0,
1016 "The variable flt was not set correctly to default value\n");
1018 ID3DXConstantTable_Release(ctable);
1021 static void test_SetValue(IDirect3DDevice9 *device)
1023 static const D3DXMATRIX mvp = {{{
1024 0.51f, 0.62f, 0.80f, 0.78f,
1025 0.23f, 0.95f, 0.37f, 0.48f,
1026 0.10f, 0.58f, 0.90f, 0.25f,
1027 0.89f, 0.41f, 0.93f, 0.27f}}};
1028 static const D3DXVECTOR4 f4 = {0.2f, 0.4f, 0.8f, 1.2f};
1029 static const FLOAT arr[] = {0.33f, 0.55f, 0.96f, 1.00f,
1030 1.00f, 1.00f, 1.00f, 1.00f,
1031 1.00f, 1.00f, 1.00f, 1.00f};
1032 static int imatrix[] = {1, 2, 3, 4, 5, 6};
1033 static float fmatrix[] = {1.1f, 2.2f, 3.3f, 4.4f};
1034 static BOOL barray[] = {TRUE, FALSE};
1035 static float fvecarray[] = {9.1f, 9.2f, 9.3f, 9.4f, 9.5f, 9.6f, 9.7f, 9.8f};
1036 static float farray[] = {2.2f, 3.3f};
1038 static const float def[16] = {5.5f, 5.5f, 5.5f, 5.5f,
1039 5.5f, 5.5f, 5.5f, 5.5f,
1040 5.5f, 5.5f, 5.5f, 5.5f,
1041 5.5f, 5.5f, 5.5f, 5.5f};
1045 ID3DXConstantTable *ctable;
1047 res = D3DXGetShaderConstantTable(ctab_basic, &ctable);
1048 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1050 IDirect3DDevice9_SetVertexShaderConstantF(device, 7, def, 1);
1052 /* SetValue called with 0 bytes size doesn't change value */
1053 res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, 0);
1054 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1056 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1057 ok(memcmp(out, def, sizeof(f4)) == 0,
1058 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1059 out[0], out[1], out[2], out[3], def[0], def[1], def[2], def[3]);
1061 res = ID3DXConstantTable_SetValue(ctable, device, "f4", &f4, sizeof(f4));
1062 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1064 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1);
1065 ok(memcmp(out, &f4, sizeof(f4)) == 0,
1066 "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1067 out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w);
1069 IDirect3DDevice9_SetVertexShaderConstantF(device, 0, def, 4);
1071 /* SetValue called with size smaller than constant size doesn't change value */
1072 res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp) / 2);
1073 ok(res == D3D_OK, "ID3DXConstantTable_SetValue returned %08x\n", res);
1075 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1076 ok(memcmp(out, def, sizeof(def)) == 0,
1077 "The variable mvp was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
1078 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1079 out[0], out[4], out[ 8], out[12],
1080 out[1], out[5], out[ 9], out[13],
1081 out[2], out[6], out[10], out[14],
1082 out[3], out[7], out[11], out[15],
1083 def[0], def[4], def[ 8], def[12],
1084 def[1], def[5], def[ 9], def[13],
1085 def[2], def[6], def[10], def[14],
1086 def[3], def[7], def[11], def[15]);
1088 res = ID3DXConstantTable_SetValue(ctable, device, "mvp", &mvp, sizeof(mvp));
1089 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1091 IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4);
1092 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,
1093 "The first row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1094 out[0], out[4], out[8], out[12], S(U(mvp))._11, S(U(mvp))._12, S(U(mvp))._13, S(U(mvp))._14);
1095 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,
1096 "The second row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1097 out[1], out[5], out[9], out[13], S(U(mvp))._21, S(U(mvp))._22, S(U(mvp))._23, S(U(mvp))._24);
1098 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,
1099 "The third row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1100 out[2], out[6], out[10], out[14], S(U(mvp))._31, S(U(mvp))._32, S(U(mvp))._33, S(U(mvp))._34);
1101 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,
1102 "The fourth row of mvp was not set correctly, got {%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1103 out[3], out[7], out[11], out[15], S(U(mvp))._41, S(U(mvp))._42, S(U(mvp))._43, S(U(mvp))._44);
1105 ID3DXConstantTable_Release(ctable);
1107 res = D3DXGetShaderConstantTable(ctab_with_default_values, &ctable);
1108 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1110 res = ID3DXConstantTable_SetValue(ctable, device, "arr", arr, sizeof(arr));
1111 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1113 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 3);
1114 ok(out[0] == arr[0] && out[4] == arr[1] && out[8] == arr[2]
1115 && out[1] == 0 && out[2] == 0 && out[3] == 0 && out[5] == 0 && out[6] == 0 && out[7] == 0
1116 && out[9] == 0 && out[10] == 0 && out[11] == 0,
1117 "The variable arr was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f}, "
1118 "should be {0.33, 0, 0, 0, 0.55, 0, 0, 0, 0.96, 0, 0, 0}\n",
1119 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7], out[8], out[9], out[10], out[11]);
1121 ID3DXConstantTable_Release(ctable);
1123 res = D3DXGetShaderConstantTable(ctab_matrices, &ctable);
1124 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1126 res = ID3DXConstantTable_SetValue(ctable, device, "fmatrix3x1", fmatrix, sizeof(fmatrix));
1127 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1129 res = ID3DXConstantTable_SetValue(ctable, device, "imatrix2x3", imatrix, sizeof(imatrix));
1130 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1132 IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
1133 ok(out[0] == imatrix[0] && out[1] == imatrix[1] && out[2] == imatrix[2] && out[3] == 0.0f
1134 && out[4] == imatrix[3] && out[5] == imatrix[4] && out[6] == imatrix[5] && out[7] == 0.0f,
1135 "The variable imatrix2x3 was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1136 "should be {%d, %d, %d, 0, %d, %d, %d, 0}\n",
1137 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1138 imatrix[0], imatrix[1], imatrix[2], imatrix[3], imatrix[4], imatrix[5]);
1140 IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 2);
1141 ok(out[0] == fmatrix[0] && out[1] == fmatrix[1] && out[2] == fmatrix[2] && out[3] == 0.0f,
1142 "The variable fmatrix3x1 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n",
1143 out[0], out[1] ,out[2], out[4],
1144 fmatrix[0], fmatrix[1], fmatrix[2], 0.0f);
1146 ID3DXConstantTable_Release(ctable);
1148 res = D3DXGetShaderConstantTable(ctab_arrays, &ctable);
1149 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed: got %08x\n", res);
1151 res = ID3DXConstantTable_SetValue(ctable, device, "barray", barray, sizeof(barray));
1152 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1154 res = ID3DXConstantTable_SetValue(ctable, device, "fvecarray", fvecarray, sizeof(fvecarray));
1155 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1157 IDirect3DDevice9_SetVertexShaderConstantF(device, 8, def, 4);
1158 res = ID3DXConstantTable_SetValue(ctable, device, "farray", farray, sizeof(farray));
1159 ok(res == D3D_OK, "ID3DXConstantTable_SetValue failed: got %08x\n", res);
1161 /* 2 elements of farray were set */
1162 IDirect3DDevice9_GetVertexShaderConstantF(device, 8, out, 4);
1163 ok(out[0] == farray[0] && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1164 && out[4] == farray[1] && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f
1165 && out[8] == def[8] && out[9] == def[9] && out[10] == def[10] && out[11] == def[11]
1166 && out[12] == def[12] && out[13] == def[13] && out[14] == def[14] && out[15] == def[15],
1167 "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}, "
1168 "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
1169 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1170 out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15],
1171 farray[0], 0.0f, 0.0f, 0.0f,
1172 farray[1], 0.0f, 0.0f, 0.0f,
1173 def[8], def[9], def[10], def[11],
1174 def[12], def[13], def[14], def[15]);
1176 IDirect3DDevice9_GetVertexShaderConstantF(device, 12, out, 2);
1177 ok(out[0] == fvecarray[0] && out[1] == fvecarray[1] && out[2] == fvecarray[2] && out[3] == fvecarray[3]
1178 && out[4] == fvecarray[4] && out[5] == fvecarray[5] && out[6] == fvecarray[6] && out[7] == fvecarray[7],
1179 "The variable fvecarray was not set correctly, out ={%f, %f, %f, %f, %f, %f, %f, %f}, "
1180 "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1181 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1182 fvecarray[0], fvecarray[1], fvecarray[2], fvecarray[3], fvecarray[4], fvecarray[5], fvecarray[6], fvecarray[7]);
1184 IDirect3DDevice9_GetVertexShaderConstantF(device, 14, out, 2);
1185 ok(out[0] == 1.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f
1186 && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f,
1187 "The variable barray was not set correctly, out={%f, %f, %f, %f, %f, %f, %f, %f}, "
1188 "should be {%f, %f, %f, %f, %f, %f, %f, %f}\n",
1189 out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7],
1190 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
1192 ID3DXConstantTable_Release(ctable);
1195 static void test_setting_constants(void)
1199 IDirect3DDevice9 *device;
1200 D3DPRESENT_PARAMETERS d3dpp;
1204 /* Create the device to use for our tests */
1205 wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
1206 d3d = Direct3DCreate9(D3D_SDK_VERSION);
1209 skip("Couldn't create application window\n");
1214 skip("Couldn't create IDirect3D9 object\n");
1219 ZeroMemory(&d3dpp, sizeof(d3dpp));
1220 d3dpp.Windowed = TRUE;
1221 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
1222 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device);
1225 skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1226 IDirect3D9_Release(d3d);
1231 test_setting_basic_table(device);
1232 test_setting_matrices_table(device);
1233 test_setting_arrays_table(device);
1234 test_SetDefaults(device);
1235 test_SetValue(device);
1237 /* Release resources */
1238 refcnt = IDirect3DDevice9_Release(device);
1239 ok(refcnt == 0, "The Direct3D device reference count was %u, should be 0\n", refcnt);
1241 refcnt = IDirect3D9_Release(d3d);
1242 ok(refcnt == 0, "The Direct3D object referenct count was %u, should be 0\n", refcnt);
1244 if (wnd) DestroyWindow(wnd);
1247 static void test_get_sampler_index(void)
1249 ID3DXConstantTable *ctable;
1256 res = D3DXGetShaderConstantTable(ctab_samplers, &ctable);
1257 ok(res == D3D_OK, "D3DXGetShaderConstantTable failed on ctab_samplers: got %08x\n", res);
1259 index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler1");
1260 ok(index == 0, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 0\n", index);
1262 index = ID3DXConstantTable_GetSamplerIndex(ctable, "sampler2");
1263 ok(index == 3, "ID3DXConstantTable_GetSamplerIndex returned wrong index: Got %d, expected 3\n", index);
1265 index = ID3DXConstantTable_GetSamplerIndex(ctable, "nonexistent");
1266 ok(index == -1, "ID3DXConstantTable_GetSamplerIndex found nonexistent sampler: Got %d\n",
1269 index = ID3DXConstantTable_GetSamplerIndex(ctable, "notsampler");
1270 ok(index == -1, "ID3DXConstantTable_GetSamplerIndex succeeded on non-sampler constant: Got %d\n",
1273 refcnt = ID3DXConstantTable_Release(ctable);
1274 ok(refcnt == 0, "The ID3DXConstantTable reference count was %u, should be 0\n", refcnt);
1287 float4 main(float3 tex : TEXCOORD0) : COLOR
1290 tmp = tmp + tex1D(s1D, tex.x);
1291 tmp = tmp + tex1D(s1D, tex.y);
1292 tmp = tmp + tex3D(s3D, tex.xyz);
1293 tmp = tmp + tex1D(s, tex.x);
1294 tmp = tmp + tex2D(s2D, tex.xy);
1295 tmp = tmp + texCUBE(scube, tex.xyz);
1299 static const DWORD get_shader_samplers_blob[] =
1301 0xffff0300, /* ps_3_0 */
1302 0x0054fffe, FCC_CTAB, /* CTAB comment */
1303 0x0000001c, 0x0000011b, 0xffff0300, 0x00000006, 0x0000001c, 0x00000100, /* Header */
1305 0x00000094, 0x00000002, 0x00000001, 0x0000009c, 0x00000000, /* Constant 1 desc (init) */
1306 0x000000ac, 0x00040003, 0x00000001, 0x000000b0, 0x00000000, /* Constant 2 desc (s) */
1307 0x000000c0, 0x00000003, 0x00000001, 0x000000c4, 0x00000000, /* Constant 3 desc (s1D) */
1308 0x000000d4, 0x00010003, 0x00000001, 0x000000d8, 0x00000000, /* Constant 4 desc (s2D) */
1309 0x000000e8, 0x00030003, 0x00000001, 0x000000ec, 0x00000000, /* Constant 5 desc (s3D) */
1310 0x000000fc, 0x00020003, 0x00000001, 0x00000104, 0x00000000, /* Constant 6 desc (scube) */
1311 0x74696e69, 0xababab00, /* Constant 1 name */
1312 0x00030001, 0x00040001, 0x00000001, 0x00000000, /* Constant 1 type desc */
1313 0xabab0073, /* Constant 2 name */
1314 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 2 type desc */
1315 0x00443173, /* Constant 3 name */
1316 0x000b0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 3 type desc */
1317 0x00443273, /* Constant 4 name */
1318 0x000c0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 4 type desc */
1319 0x00443373, /* Constant 5 name */
1320 0x000d0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 5 type desc */
1321 0x62756373, 0xabab0065, /* Constant 6 name */
1322 0x000e0004, 0x00010001, 0x00000001, 0x00000000, /* Constant 6 type desc */
1323 0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, /* Target/Creator name string */
1324 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
1325 0x332e3235, 0x00313131,
1326 0x0200001f, 0x80000005, 0x90070000, 0x0200001f, 0x90000000, 0xa00f0800, /* shader */
1327 0x0200001f, 0x90000000, 0xa00f0801, 0x0200001f, 0x98000000, 0xa00f0802,
1328 0x0200001f, 0xa0000000, 0xa00f0803, 0x0200001f, 0x90000000, 0xa00f0804,
1329 0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000,
1330 0x80e40000, 0xa0e40000, 0x03000042, 0x800f0001, 0x90550000, 0xa0e40800,
1331 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1332 0x90e40000, 0xa0e40803, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001,
1333 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40804, 0x03000002, 0x800f0000,
1334 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801,
1335 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000042, 0x800f0001,
1336 0x90e40000, 0xa0e40802, 0x03000002, 0x800f0800, 0x80e40000, 0x80e40001,
1337 0x0000ffff, /* END */
1340 static void test_get_shader_samplers(void)
1342 LPCSTR samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
1343 LPCSTR sampler_orig;
1348 /* crashes if bytecode is NULL */
1349 hr = D3DXGetShaderSamplers(NULL, NULL, &count);
1350 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1353 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, NULL);
1354 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1356 samplers[5] = "dummy";
1358 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, NULL);
1359 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1361 /* check that sampler points to shader blob */
1362 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1363 ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1365 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1366 ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1368 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1369 ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1371 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1372 ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1374 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1375 ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1377 ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1379 /* reset samplers */
1380 memset(samplers, 0, sizeof(samplers));
1381 samplers[5] = "dummy";
1383 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, NULL, &count);
1384 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1385 ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1387 hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, &count);
1388 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1389 ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
1391 /* check that sampler points to shader blob */
1392 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
1393 ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
1395 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
1396 ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
1398 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
1399 ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
1401 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
1402 ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
1404 sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
1405 ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
1407 ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
1409 /* check without ctab */
1410 hr = D3DXGetShaderSamplers(simple_vs, samplers, &count);
1411 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1412 ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1414 /* check invalid ctab */
1415 hr = D3DXGetShaderSamplers(shader_with_invalid_ctab, samplers, &count);
1416 ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
1417 ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
1422 test_get_shader_size();
1423 test_get_shader_version();
1424 test_find_shader_comment();
1425 test_get_shader_constant_table_ex();
1426 test_constant_tables();
1427 test_setting_constants();
1428 test_get_sampler_index();
1429 test_get_shader_samplers();