1 /*
2  * Copyright 2010 Christian Costa
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #define COBJMACROS
20 #include "initguid.h"
21 #include <limits.h>
22 #include "wine/test.h"
23 #include "d3dx9.h"
24 
25 #ifndef INFINITY
26 static inline float __port_infinity(void)
27 {
28     static const unsigned __inf_bytes = 0x7f800000;
29     return *(const float *)&__inf_bytes;
30 }
31 #define INFINITY __port_infinity()
32 #endif /* INFINITY */
33 
34 #ifndef NAN
35 static float get_nan(void)
36 {
37     DWORD nan = 0x7fc00000;
38 
39     return *(float *)&nan;
40 }
41 #define NAN get_nan()
42 #endif
43 
44 /* helper functions */
45 static BOOL compare_float(FLOAT f, FLOAT g, UINT ulps)
46 {
47     INT x = *(INT *)&f;
48     INT y = *(INT *)&g;
49 
50     if (x < 0)
51         x = INT_MIN - x;
52     if (y < 0)
53         y = INT_MIN - y;
54 
55     if (abs(x - y) > ulps)
56         return FALSE;
57 
58     return TRUE;
59 }
60 
61 static inline INT get_int(D3DXPARAMETER_TYPE type, const void *data)
62 {
63     INT i;
64 
65     switch (type)
66     {
67         case D3DXPT_FLOAT:
68             i = *(FLOAT *)data;
69             break;
70 
71         case D3DXPT_INT:
72             i = *(INT *)data;
73             break;
74 
75         case D3DXPT_BOOL:
76             i = *(BOOL *)data;
77             break;
78 
79         default:
80             i = 0;
81             ok(0, "Unhandled type %x.\n", type);
82             break;
83     }
84 
85     return i;
86 }
87 
88 static inline float get_float(D3DXPARAMETER_TYPE type, const void *data)
89 {
90     float f;
91 
92     switch (type)
93     {
94         case D3DXPT_FLOAT:
95             f = *(FLOAT *)data;
96             break;
97 
98         case D3DXPT_INT:
99             f = *(INT *)data;
100             break;
101 
102         case D3DXPT_BOOL:
103             f = *(BOOL *)data;
104             break;
105 
106         default:
107             f = 0.0f;
108             ok(0, "Unhandled type %x.\n", type);
109             break;
110     }
111 
112     return f;
113 }
114 
115 static inline BOOL get_bool(const void *data)
116 {
117     return !!*(BOOL *)data;
118 }
119 
120 static void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype)
121 {
122     switch (outtype)
123     {
124         case D3DXPT_FLOAT:
125             *(FLOAT *)outdata = get_float(intype, indata);
126             break;
127 
128         case D3DXPT_BOOL:
129             *(BOOL *)outdata = get_bool(indata);
130             break;
131 
132         case D3DXPT_INT:
133             *(INT *)outdata = get_int(intype, indata);
134             break;
135 
136         case D3DXPT_PIXELSHADER:
137         case D3DXPT_VERTEXSHADER:
138         case D3DXPT_TEXTURE2D:
139         case D3DXPT_STRING:
140             *(INT *)outdata = 0x12345678;
141             break;
142 
143         default:
144             ok(0, "Unhandled type %x.\n", outtype);
145             *(INT *)outdata = 0;
146             break;
147     }
148 }
149 
150 static IDirect3DDevice9 *create_device(HWND *window)
151 {
152     D3DPRESENT_PARAMETERS present_parameters = { 0 };
153     IDirect3DDevice9 *device;
154     IDirect3D9 *d3d;
155     HRESULT hr;
156     HWND wnd;
157 
158     *window = NULL;
159 
160     if (!(wnd = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0,
161             640, 480, NULL, NULL, NULL, NULL)))
162     {
163         skip("Couldn't create application window.\n");
164         return NULL;
165     }
166 
167     if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION)))
168     {
169         skip("Couldn't create IDirect3D9 object.\n");
170         DestroyWindow(wnd);
171         return NULL;
172     }
173 
174     present_parameters.Windowed = TRUE;
175     present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
176     hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
177             &present_parameters, &device);
178     IDirect3D9_Release(d3d);
179     if (FAILED(hr))
180     {
181         skip("Failed to create IDirect3DDevice9 object %#x.\n", hr);
182         DestroyWindow(wnd);
183         return NULL;
184     }
185 
186     *window = wnd;
187     return device;
188 }
189 
190 static char temp_path[MAX_PATH];
191 
192 static BOOL create_file(const char *filename, const char *data, const unsigned int size, char *out_path)
193 {
194     DWORD written;
195     HANDLE hfile;
196     char path[MAX_PATH];
197 
198     if (!*temp_path)
199         GetTempPathA(sizeof(temp_path), temp_path);
200 
201     strcpy(path, temp_path);
202     strcat(path, filename);
203     hfile = CreateFileA(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
204     if (hfile == INVALID_HANDLE_VALUE)
205         return FALSE;
206 
207     if (WriteFile(hfile, data, size, &written, NULL))
208     {
209         CloseHandle(hfile);
210 
211         if (out_path)
212             strcpy(out_path, path);
213         return TRUE;
214     }
215 
216     CloseHandle(hfile);
217     return FALSE;
218 }
219 
220 static void delete_file(const char *filename)
221 {
222     char path[MAX_PATH];
223 
224     strcpy(path, temp_path);
225     strcat(path, filename);
226     DeleteFileA(path);
227 }
228 
229 static BOOL create_directory(const char *name)
230 {
231     char path[MAX_PATH];
232 
233     strcpy(path, temp_path);
234     strcat(path, name);
235     return CreateDirectoryA(path, NULL);
236 }
237 
238 static void delete_directory(const char *name)
239 {
240     char path[MAX_PATH];
241 
242     strcpy(path, temp_path);
243     strcat(path, name);
244     RemoveDirectoryA(path);
245 }
246 
247 static const char effect_desc[] =
248 "Technique\n"
249 "{\n"
250 "}\n";
251 
252 static void test_create_effect_and_pool(IDirect3DDevice9 *device)
253 {
254     HRESULT hr;
255     ID3DXEffect *effect;
256     ID3DXBaseEffect *base;
257     ULONG count;
258     IDirect3DDevice9 *device2;
259     ID3DXEffectStateManager *manager = (ID3DXEffectStateManager *)0xdeadbeef;
260     ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2;
261 
262     hr = D3DXCreateEffect(NULL, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
263     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
264 
265     hr = D3DXCreateEffect(device, NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
266     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
267 
268     hr = D3DXCreateEffect(device, effect_desc, 0, NULL, NULL, 0, NULL, NULL, NULL);
269     ok(hr == E_FAIL, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, E_FAIL);
270 
271     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
272     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
273 
274     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
275     todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
276     if (FAILED(hr))
277     {
278         skip("Failed to compile effect, skipping test.\n");
279         return;
280     }
281 
282     hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
283     ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
284 
285     hr = effect->lpVtbl->GetStateManager(effect, NULL);
286     ok(hr == D3DERR_INVALIDCALL, "GetStateManager failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
287 
288     hr = effect->lpVtbl->GetStateManager(effect, &manager);
289     ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
290     ok(!manager, "GetStateManager failed, got %p\n", manager);
291 
292     /* this works, but it is not recommended! */
293     hr = effect->lpVtbl->SetStateManager(effect, (ID3DXEffectStateManager *)device);
294     ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
295 
296     hr = effect->lpVtbl->GetStateManager(effect, &manager);
297     ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
298     ok(manager != NULL, "GetStateManager failed\n");
299 
300     IDirect3DDevice9_AddRef(device);
301     count = IDirect3DDevice9_Release(device);
302     ok(count == 4, "Release failed, got %u, expected 4\n", count);
303 
304     count = IUnknown_Release(manager);
305     ok(count == 3, "Release failed, got %u, expected 3\n", count);
306 
307     hr = effect->lpVtbl->SetStateManager(effect, NULL);
308     ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
309 
310     hr = effect->lpVtbl->GetPool(effect, &pool);
311     ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
312     ok(!pool, "GetPool failed, got %p\n", pool);
313 
314     hr = effect->lpVtbl->GetPool(effect, NULL);
315     ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
316 
317     hr = effect->lpVtbl->GetDevice(effect, &device2);
318     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
319 
320     hr = effect->lpVtbl->GetDevice(effect, NULL);
321     ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
322 
323     count = IDirect3DDevice9_Release(device2);
324     ok(count == 2, "Release failed, got %u, expected 2\n", count);
325 
326     count = effect->lpVtbl->Release(effect);
327     ok(count == 0, "Release failed %u\n", count);
328 
329     hr = D3DXCreateEffectPool(NULL);
330     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
331 
332     hr = D3DXCreateEffectPool(&pool);
333     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
334 
335     count = pool->lpVtbl->Release(pool);
336     ok(count == 0, "Release failed %u\n", count);
337 
338     hr = D3DXCreateEffectPool(&pool);
339     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
340 
341     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, NULL, NULL);
342     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
343 
344     hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3DXEffectPool, (void **)&pool2);
345     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
346     ok(pool == pool2, "Got effect pool %p, expected %p.\n", pool2, pool);
347 
348     count = pool2->lpVtbl->Release(pool2);
349     ok(count == 1, "Release failed, got %u, expected 1\n", count);
350 
351     hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2);
352     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
353 
354     count = IDirect3DDevice9_Release(device2);
355     ok(count == 1, "Release failed, got %u, expected 1\n", count);
356 
357     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, &effect, NULL);
358     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
359 
360     hr = effect->lpVtbl->GetPool(effect, &pool);
361     ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
362     ok(pool == pool2, "Got effect pool %p, expected %p.\n", pool2, pool);
363 
364     count = pool2->lpVtbl->Release(pool2);
365     ok(count == 2, "Release failed, got %u, expected 2\n", count);
366 
367     count = effect->lpVtbl->Release(effect);
368     ok(count == 0, "Release failed %u\n", count);
369 
370     count = pool->lpVtbl->Release(pool);
371     ok(count == 0, "Release failed %u\n", count);
372 }
373 
374 static void test_create_effect_compiler(void)
375 {
376     HRESULT hr;
377     ID3DXEffectCompiler *compiler, *compiler2;
378     ID3DXBaseEffect *base;
379     IUnknown *unknown;
380     ULONG count;
381 
382     hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, &compiler, NULL);
383     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
384 
385     hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, NULL, NULL);
386     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
387 
388     hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL);
389     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
390     if (FAILED(hr))
391     {
392         skip("D3DXCreateEffectCompiler failed, skipping test.\n");
393         return;
394     }
395 
396     count = compiler->lpVtbl->Release(compiler);
397     ok(count == 0, "Release failed %u\n", count);
398 
399     hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, NULL, NULL);
400     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
401 
402     hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
403     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
404 
405     hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
406     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
407 
408     hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
409     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
410 
411     hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
412     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
413 
414     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXBaseEffect, (void **)&base);
415     ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
416 
417     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXEffectCompiler, (void **)&compiler2);
418     ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
419 
420     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_IUnknown, (void **)&unknown);
421     ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
422 
423     count = unknown->lpVtbl->Release(unknown);
424     ok(count == 2, "Release failed, got %u, expected %u\n", count, 2);
425 
426     count = compiler2->lpVtbl->Release(compiler2);
427     ok(count == 1, "Release failed, got %u, expected %u\n", count, 1);
428 
429     count = compiler->lpVtbl->Release(compiler);
430     ok(count == 0, "Release failed %u\n", count);
431 }
432 
433 /*
434  * Parameter value test
435  */
436 struct test_effect_parameter_value_result
437 {
438     const char *full_name;
439     D3DXPARAMETER_DESC desc;
440     UINT value_offset; /* start position for the value in the blob */
441 };
442 
443 /*
444  * fxc.exe /Tfx_2_0
445  */
446 #if 0
447 float f = 0.1;
448 float1 f1 = {1.1};
449 float2 f2 = {2.1, 2.2};
450 float3 f3 = {3.1, 3.2, 3.3};
451 float4 f4 = {4.1, 4.2, 4.3, 4.4};
452 float1x1 f11 = {11.1};
453 float1x2 f12 = {12.1, 12.2};
454 float1x3 f13 = {13.1, 13.2, 13.3};
455 float1x4 f14 = {14.1, 14.2, 14.3, 14.4};
456 float2x1 f21 = {{21.11, 21.21}};
457 float2x2 f22 = {{22.11, 22.21}, {22.12, 22.22}};
458 float2x3 f23 = {{23.11, 23.21}, {23.12, 23.22}, {23.13, 23.23}};
459 float2x4 f24 = {{24.11, 24.21}, {24.12, 24.22}, {24.13, 24.23}, {24.14, 24.24}};
460 float3x1 f31 = {{31.11, 31.21, 31.31}};
461 float3x2 f32 = {{32.11, 32.21, 32.31}, {32.12, 32.22, 32.32}};
462 float3x3 f33 = {{33.11, 33.21, 33.31}, {33.12, 33.22, 33.32},
463         {33.13, 33.23, 33.33}};
464 float3x4 f34 = {{34.11, 34.21, 34.31}, {34.12, 34.22, 34.32},
465         {34.13, 34.23, 34.33}, {34.14, 34.24, 34.34}};
466 float4x1 f41 = {{41.11, 41.21, 41.31, 41.41}};
467 float4x2 f42 = {{42.11, 42.21, 42.31, 42.41}, {42.12, 42.22, 42.32, 42.42}};
468 float4x3 f43 = {{43.11, 43.21, 43.31, 43.41}, {43.12, 43.22, 43.32, 43.42},
469         {43.13, 43.23, 43.33, 43.43}};
470 float4x4 f44 = {{44.11, 44.21, 44.31, 44.41}, {44.12, 44.22, 44.32, 44.42},
471         {44.13, 44.23, 44.33, 44.43}, {44.14, 44.24, 44.34, 44.44}};
472 float f_2[2] = {0.101, 0.102};
473 float1 f1_2[2] = {{1.101}, {1.102}};
474 float2 f2_2[2] = {{2.101, 2.201}, {2.102, 2.202}};
475 float3 f3_2[2] = {{3.101, 3.201, 3.301}, {3.102, 3.202, 3.302}};
476 float4 f4_2[2] = {{4.101, 4.201, 4.301, 4.401}, {4.102, 4.202, 4.302, 4.402}};
477 float1x1 f11_2[2] = {{11.101}, {11.102}};
478 float1x2 f12_2[2] = {{12.101, 12.201}, {12.102, 12.202}};
479 float1x3 f13_2[2] = {{13.101, 13.201, 13.301}, {13.102, 13.202, 13.302}};
480 float1x4 f14_2[2] = {{14.101, 14.201, 14.301, 14.401}, {14.102, 14.202, 14.302, 14.402}};
481 float2x1 f21_2[2] = {{{21.1101, 21.2101}}, {{21.1102, 21.2102}}};
482 float2x2 f22_2[2] = {{{22.1101, 22.2101}, {22.1201, 22.2201}}, {{22.1102, 22.2102}, {22.1202, 22.2202}}};
483 float2x3 f23_2[2] = {{{23.1101, 23.2101}, {23.1201, 23.2201}, {23.1301, 23.2301}}, {{23.1102, 23.2102},
484         {23.1202, 23.2202}, {23.1302, 23.2302}}};
485 float2x4 f24_2[2] = {{{24.1101, 24.2101}, {24.1201, 24.2201}, {24.1301, 24.2301}, {24.1401, 24.2401}},
486         {{24.1102, 24.2102}, {24.1202, 24.2202}, {24.1302, 24.2302}, {24.1402, 24.2402}}};
487 float3x1 f31_2[2] = {{{31.1101, 31.2101, 31.3101}}, {{31.1102, 31.2102, 31.3102}}};
488 float3x2 f32_2[2] = {{{32.1101, 32.2101, 32.3101}, {32.1201, 32.2201, 32.3201}},
489         {{32.1102, 32.2102, 32.3102}, {32.1202, 32.2202, 32.3202}}};
490 float3x3 f33_2[2] = {{{33.1101, 33.2101, 33.3101}, {33.1201, 33.2201, 33.3201},
491         {33.1301, 33.2301, 33.3301}}, {{33.1102, 33.2102, 33.3102}, {33.1202, 33.2202, 33.3202},
492         {33.1302, 33.2302, 33.3302}}};
493 float3x4 f34_2[2] = {{{34.1101, 34.2101, 34.3101}, {34.1201, 34.2201, 34.3201},
494         {34.1301, 34.2301, 34.3301}, {34.1401, 34.2401, 34.3401}}, {{34.1102, 34.2102, 34.3102},
495         {34.1202, 34.2202, 34.3202}, {34.1302, 34.2302, 34.3302}, {34.1402, 34.2402, 34.3402}}};
496 float4x1 f41_2[2] = {{{41.1101, 41.2101, 41.3101, 41.4101}}, {{41.1102, 41.2102, 41.3102, 41.4102}}};
497 float4x2 f42_2[2] = {{{42.1101, 42.2101, 42.3101, 42.4101}, {42.1201, 42.2201, 42.3201, 42.4201}},
498         {{42.1102, 42.2102, 42.3102, 42.4102}, {42.1202, 42.2202, 42.3202, 42.4202}}};
499 float4x3 f43_2[2] = {{{43.1101, 43.2101, 43.3101, 43.4101}, {43.1201, 43.2201, 43.3201, 43.4201},
500         {43.1301, 43.2301, 43.3301, 43.4301}}, {{43.1102, 43.2102, 43.3102, 43.4102},
501         {43.1202, 43.2202, 43.3202, 43.4202}, {43.1302, 43.2302, 43.3302, 43.4302}}};
502 float4x4 f44_2[2] = {{{44.1101, 44.2101, 44.3101, 44.4101}, {44.1201, 44.2201, 44.3201, 44.4201},
503         {44.1301, 44.2301, 44.3301, 44.4301}, {44.1401, 44.2401, 44.3401, 44.4401}},
504         {{44.1102, 44.2102, 44.3102, 44.4102}, {44.1202, 44.2202, 44.3202, 44.4202},
505         {44.1302, 44.2302, 44.3302, 44.4302}, {44.1402, 44.2402, 44.3402, 44.4402}}};
506 technique t { pass p { } }
507 #endif
508 static const DWORD test_effect_parameter_value_blob_float[] =
509 {
510 0xfeff0901, 0x00000b80, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
511 0x00000001, 0x00000001, 0x3dcccccd, 0x00000002, 0x00000066, 0x00000003, 0x00000001, 0x0000004c,
512 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f8ccccd, 0x00000003, 0x00003166, 0x00000003,
513 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x40066666, 0x400ccccd,
514 0x00000003, 0x00003266, 0x00000003, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
515 0x00000001, 0x40466666, 0x404ccccd, 0x40533333, 0x00000003, 0x00003366, 0x00000003, 0x00000001,
516 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x40833333, 0x40866666, 0x4089999a,
517 0x408ccccd, 0x00000003, 0x00003466, 0x00000003, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
518 0x00000001, 0x00000001, 0x4131999a, 0x00000004, 0x00313166, 0x00000003, 0x00000002, 0x00000130,
519 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x4141999a, 0x41433333, 0x00000004, 0x00323166,
520 0x00000003, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x4151999a,
521 0x41533333, 0x4154cccd, 0x00000004, 0x00333166, 0x00000003, 0x00000002, 0x00000194, 0x00000000,
522 0x00000000, 0x00000001, 0x00000004, 0x4161999a, 0x41633333, 0x4164cccd, 0x41666666, 0x00000004,
523 0x00343166, 0x00000003, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
524 0x41a8e148, 0x41a9ae14, 0x00000004, 0x00313266, 0x00000003, 0x00000002, 0x000001f4, 0x00000000,
525 0x00000000, 0x00000002, 0x00000002, 0x41b0e148, 0x41b1ae14, 0x41b0f5c3, 0x41b1c28f, 0x00000004,
526 0x00323266, 0x00000003, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
527 0x41b8e148, 0x41b9ae14, 0x41b8f5c3, 0x41b9c28f, 0x41b90a3d, 0x41b9d70a, 0x00000004, 0x00333266,
528 0x00000003, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x41c0e148,
529 0x41c1ae14, 0x41c0f5c3, 0x41c1c28f, 0x41c10a3d, 0x41c1d70a, 0x41c11eb8, 0x41c1eb85, 0x00000004,
530 0x00343266, 0x00000003, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
531 0x41f8e148, 0x41f9ae14, 0x41fa7ae1, 0x00000004, 0x00313366, 0x00000003, 0x00000002, 0x000002e0,
532 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x420070a4, 0x4200d70a, 0x42013d71, 0x42007ae1,
533 0x4200e148, 0x420147ae, 0x00000004, 0x00323366, 0x00000003, 0x00000002, 0x00000328, 0x00000000,
534 0x00000000, 0x00000003, 0x00000003, 0x420470a4, 0x4204d70a, 0x42053d71, 0x42047ae1, 0x4204e148,
535 0x420547ae, 0x4204851f, 0x4204eb85, 0x420551ec, 0x00000004, 0x00333366, 0x00000003, 0x00000002,
536 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x420870a4, 0x4208d70a, 0x42093d71,
537 0x42087ae1, 0x4208e148, 0x420947ae, 0x4208851f, 0x4208eb85, 0x420951ec, 0x42088f5c, 0x4208f5c3,
538 0x42095c29, 0x00000004, 0x00343366, 0x00000003, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
539 0x00000004, 0x00000001, 0x422470a4, 0x4224d70a, 0x42253d71, 0x4225a3d7, 0x00000004, 0x00313466,
540 0x00000003, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x422870a4,
541 0x4228d70a, 0x42293d71, 0x4229a3d7, 0x42287ae1, 0x4228e148, 0x422947ae, 0x4229ae14, 0x00000004,
542 0x00323466, 0x00000003, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
543 0x422c70a4, 0x422cd70a, 0x422d3d71, 0x422da3d7, 0x422c7ae1, 0x422ce148, 0x422d47ae, 0x422dae14,
544 0x422c851f, 0x422ceb85, 0x422d51ec, 0x422db852, 0x00000004, 0x00333466, 0x00000003, 0x00000002,
545 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x423070a4, 0x4230d70a, 0x42313d71,
546 0x4231a3d7, 0x42307ae1, 0x4230e148, 0x423147ae, 0x4231ae14, 0x4230851f, 0x4230eb85, 0x423151ec,
547 0x4231b852, 0x42308f5c, 0x4230f5c3, 0x42315c29, 0x4231c28f, 0x00000004, 0x00343466, 0x00000003,
548 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x3dced917, 0x3dd0e560,
549 0x00000004, 0x00325f66, 0x00000003, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
550 0x00000001, 0x3f8ced91, 0x3f8d0e56, 0x00000005, 0x325f3166, 0x00000000, 0x00000003, 0x00000001,
551 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x400676c9, 0x400cdd2f, 0x4006872b,
552 0x400ced91, 0x00000005, 0x325f3266, 0x00000000, 0x00000003, 0x00000001, 0x0000057c, 0x00000000,
553 0x00000002, 0x00000003, 0x00000001, 0x404676c9, 0x404cdd2f, 0x40534396, 0x4046872b, 0x404ced91,
554 0x405353f8, 0x00000005, 0x325f3366, 0x00000000, 0x00000003, 0x00000001, 0x000005c4, 0x00000000,
555 0x00000002, 0x00000004, 0x00000001, 0x40833b64, 0x40866e98, 0x4089a1cb, 0x408cd4fe, 0x40834396,
556 0x408676c9, 0x4089a9fc, 0x408cdd2f, 0x00000005, 0x325f3466, 0x00000000, 0x00000003, 0x00000002,
557 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41319db2, 0x4131a1cb, 0x00000006,
558 0x5f313166, 0x00000032, 0x00000003, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
559 0x00000002, 0x41419db2, 0x4143374c, 0x4141a1cb, 0x41433b64, 0x00000006, 0x5f323166, 0x00000032,
560 0x00000003, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x41519db2,
561 0x4153374c, 0x4154d0e5, 0x4151a1cb, 0x41533b64, 0x4154d4fe, 0x00000006, 0x5f333166, 0x00000032,
562 0x00000003, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x41619db2,
563 0x4163374c, 0x4164d0e5, 0x41666a7f, 0x4161a1cb, 0x41633b64, 0x4164d4fe, 0x41666e98, 0x00000006,
564 0x5f343166, 0x00000032, 0x00000003, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
565 0x00000001, 0x41a8e17c, 0x41a9ae49, 0x41a8e1b1, 0x41a9ae7d, 0x00000006, 0x5f313266, 0x00000032,
566 0x00000003, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x41b0e17c,
567 0x41b1ae49, 0x41b0f5f7, 0x41b1c2c4, 0x41b0e1b1, 0x41b1ae7d, 0x41b0f62b, 0x41b1c2f8, 0x00000006,
568 0x5f323266, 0x00000032, 0x00000003, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
569 0x00000003, 0x41b8e17c, 0x41b9ae49, 0x41b8f5f7, 0x41b9c2c4, 0x41b90a72, 0x41b9d73f, 0x41b8e1b1,
570 0x41b9ae7d, 0x41b8f62b, 0x41b9c2f8, 0x41b90aa6, 0x41b9d773, 0x00000006, 0x5f333266, 0x00000032,
571 0x00000003, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x41c0e17c,
572 0x41c1ae49, 0x41c0f5f7, 0x41c1c2c4, 0x41c10a72, 0x41c1d73f, 0x41c11eed, 0x41c1ebba, 0x41c0e1b1,
573 0x41c1ae7d, 0x41c0f62b, 0x41c1c2f8, 0x41c10aa6, 0x41c1d773, 0x41c11f21, 0x41c1ebee, 0x00000006,
574 0x5f343266, 0x00000032, 0x00000003, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
575 0x00000001, 0x41f8e17c, 0x41f9ae49, 0x41fa7b16, 0x41f8e1b1, 0x41f9ae7d, 0x41fa7b4a, 0x00000006,
576 0x5f313366, 0x00000032, 0x00000003, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
577 0x00000002, 0x420070be, 0x4200d724, 0x42013d8b, 0x42007afb, 0x4200e162, 0x420147c8, 0x420070d8,
578 0x4200d73f, 0x42013da5, 0x42007b16, 0x4200e17c, 0x420147e3, 0x00000006, 0x5f323366, 0x00000032,
579 0x00000003, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x420470be,
580 0x4204d724, 0x42053d8b, 0x42047afb, 0x4204e162, 0x420547c8, 0x42048539, 0x4204eb9f, 0x42055206,
581 0x420470d8, 0x4204d73f, 0x42053da5, 0x42047b16, 0x4204e17c, 0x420547e3, 0x42048553, 0x4204ebba,
582 0x42055220, 0x00000006, 0x5f333366, 0x00000032, 0x00000003, 0x00000002, 0x00000984, 0x00000000,
583 0x00000002, 0x00000003, 0x00000004, 0x420870be, 0x4208d724, 0x42093d8b, 0x42087afb, 0x4208e162,
584 0x420947c8, 0x42088539, 0x4208eb9f, 0x42095206, 0x42088f76, 0x4208f5dd, 0x42095c43, 0x420870d8,
585 0x4208d73f, 0x42093da5, 0x42087b16, 0x4208e17c, 0x420947e3, 0x42088553, 0x4208ebba, 0x42095220,
586 0x42088f91, 0x4208f5f7, 0x42095c5d, 0x00000006, 0x5f343366, 0x00000032, 0x00000003, 0x00000002,
587 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x422470be, 0x4224d724, 0x42253d8b,
588 0x4225a3f1, 0x422470d8, 0x4224d73f, 0x42253da5, 0x4225a40b, 0x00000006, 0x5f313466, 0x00000032,
589 0x00000003, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x422870be,
590 0x4228d724, 0x42293d8b, 0x4229a3f1, 0x42287afb, 0x4228e162, 0x422947c8, 0x4229ae2f, 0x422870d8,
591 0x4228d73f, 0x42293da5, 0x4229a40b, 0x42287b16, 0x4228e17c, 0x422947e3, 0x4229ae49, 0x00000006,
592 0x5f323466, 0x00000032, 0x00000003, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
593 0x00000003, 0x422c70be, 0x422cd724, 0x422d3d8b, 0x422da3f1, 0x422c7afb, 0x422ce162, 0x422d47c8,
594 0x422dae2f, 0x422c8539, 0x422ceb9f, 0x422d5206, 0x422db86c, 0x422c70d8, 0x422cd73f, 0x422d3da5,
595 0x422da40b, 0x422c7b16, 0x422ce17c, 0x422d47e3, 0x422dae49, 0x422c8553, 0x422cebba, 0x422d5220,
596 0x422db886, 0x00000006, 0x5f333466, 0x00000032, 0x00000003, 0x00000002, 0x00000b64, 0x00000000,
597 0x00000002, 0x00000004, 0x00000004, 0x423070be, 0x4230d724, 0x42313d8b, 0x4231a3f1, 0x42307afb,
598 0x4230e162, 0x423147c8, 0x4231ae2f, 0x42308539, 0x4230eb9f, 0x42315206, 0x4231b86c, 0x42308f76,
599 0x4230f5dd, 0x42315c43, 0x4231c2aa, 0x423070d8, 0x4230d73f, 0x42313da5, 0x4231a40b, 0x42307b16,
600 0x4230e17c, 0x423147e3, 0x4231ae49, 0x42308553, 0x4230ebba, 0x42315220, 0x4231b886, 0x42308f91,
601 0x4230f5f7, 0x42315c5d, 0x4231c2c4, 0x00000006, 0x5f343466, 0x00000032, 0x00000002, 0x00000070,
602 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
603 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
604 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
605 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
606 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
607 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
608 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
609 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
610 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
611 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
612 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
613 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
614 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
615 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
616 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
617 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
618 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
619 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
620 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
621 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
622 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
623 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
624 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
625 };
626 
627 struct test_effect_parameter_value_result test_effect_parameter_value_result_float[] =
628 {
629     {"f",     {"f",     NULL, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  10},
630     {"f1",    {"f1",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  20},
631     {"f2",    {"f2",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0,   8},  30},
632     {"f3",    {"f3",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  41},
633     {"f4",    {"f4",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  53},
634     {"f11",   {"f11",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  66},
635     {"f12",   {"f12",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0,   8},  76},
636     {"f13",   {"f13",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  87},
637     {"f14",   {"f14",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  99},
638     {"f21",   {"f21",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 0, 0, 0, 0,   8}, 112},
639     {"f22",   {"f22",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 0, 0, 0, 0,  16}, 123},
640     {"f23",   {"f23",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 0, 0, 0, 0,  24}, 136},
641     {"f24",   {"f24",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 0, 0, 0, 0,  32}, 151},
642     {"f31",   {"f31",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 0, 0, 0, 0,  12}, 168},
643     {"f32",   {"f32",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 0, 0, 0, 0,  24}, 180},
644     {"f33",   {"f33",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 0, 0, 0, 0,  36}, 195},
645     {"f34",   {"f34",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 0, 0, 0, 0,  48}, 213},
646     {"f41",   {"f41",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 0, 0, 0, 0,  16}, 234},
647     {"f42",   {"f42",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 0, 0, 0, 0,  32}, 247},
648     {"f43",   {"f43",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 0, 0, 0, 0,  48}, 264},
649     {"f44",   {"f44",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 0, 0, 0, 0,  64}, 285},
650     {"f_2",   {"f_2",   NULL, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 310},
651     {"f1_2",  {"f1_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 321},
652     {"f2_2",  {"f2_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0,  16}, 333},
653     {"f3_2",  {"f3_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0,  24}, 347},
654     {"f4_2",  {"f4_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0,  32}, 363},
655     {"f11_2", {"f11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 381},
656     {"f12_2", {"f12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0,  16}, 393},
657     {"f13_2", {"f13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0,  24}, 407},
658     {"f14_2", {"f14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0,  32}, 423},
659     {"f21_2", {"f21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 2, 0, 0, 0,  16}, 441},
660     {"f22_2", {"f22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 2, 0, 0, 0,  32}, 455},
661     {"f23_2", {"f23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 2, 0, 0, 0,  48}, 473},
662     {"f24_2", {"f24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 2, 0, 0, 0,  64}, 495},
663     {"f31_2", {"f31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 0, 0,  24}, 521},
664     {"f32_2", {"f32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 2, 0, 0, 0,  48}, 537},
665     {"f33_2", {"f33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 2, 0, 0, 0,  72}, 559},
666     {"f34_2", {"f34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 2, 0, 0, 0,  96}, 587},
667     {"f41_2", {"f41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 2, 0, 0, 0,  32}, 621},
668     {"f42_2", {"f42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 2, 0, 0, 0,  64}, 639},
669     {"f43_2", {"f43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 2, 0, 0, 0,  96}, 665},
670     {"f44_2", {"f44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 0, 0, 128}, 699},
671 };
672 
673 /*
674  * fxc.exe /Tfx_2_0
675  */
676 #if 0
677 int i = 1;
678 int1 i1 = {11};
679 int2 i2 = {21, 22};
680 int3 i3 = {31, 32, 33};
681 int4 i4 = {41, 42, 43, 44};
682 int1x1 i11 = {111};
683 int1x2 i12 = {121, 122};
684 int1x3 i13 = {131, 132, 133};
685 int1x4 i14 = {141, 142, 143, 144};
686 int2x1 i21 = {{2111, 2121}};
687 int2x2 i22 = {{2211, 2221}, {2212, 2222}};
688 int2x3 i23 = {{2311, 2321}, {2312, 2322}, {2313, 2323}};
689 int2x4 i24 = {{2411, 2421}, {2412, 2422}, {2413, 2423}, {2414, 2424}};
690 int3x1 i31 = {{3111, 3121, 3131}};
691 int3x2 i32 = {{3211, 3221, 3231}, {3212, 3222, 3232}};
692 int3x3 i33 = {{3311, 3321, 3331}, {3312, 3322, 3332},
693         {3313, 3323, 3333}};
694 int3x4 i34 = {{3411, 3421, 3431}, {3412, 3422, 3432},
695         {3413, 3423, 3433}, {3414, 3424, 3434}};
696 int4x1 i41 = {{4111, 4121, 4131, 4141}};
697 int4x2 i42 = {{4211, 4221, 4231, 4241}, {4212, 4222, 4232, 4242}};
698 int4x3 i43 = {{4311, 4321, 4331, 4341}, {4312, 4322, 4332, 4342},
699         {4313, 4323, 4333, 4343}};
700 int4x4 i44 = {{4411, 4421, 4431, 4441}, {4412, 4422, 4432, 4442},
701         {4413, 4423, 4433, 4443}, {4414, 4424, 4434, 4444}};
702 int i_2[2] = {0101, 0102};
703 int1 i1_2[2] = {{1101}, {1102}};
704 int2 i2_2[2] = {{2101, 2201}, {2102, 2202}};
705 int3 i3_2[2] = {{3101, 3201, 3301}, {3102, 3202, 3302}};
706 int4 i4_2[2] = {{4101, 4201, 4301, 4401}, {4102, 4202, 4302, 4402}};
707 int1x1 i11_2[2] = {{11101}, {11102}};
708 int1x2 i12_2[2] = {{12101, 12201}, {12102, 12202}};
709 int1x3 i13_2[2] = {{13101, 13201, 13301}, {13102, 13202, 13302}};
710 int1x4 i14_2[2] = {{14101, 14201, 14301, 14401}, {14102, 14202, 14302, 14402}};
711 int2x1 i21_2[2] = {{{211101, 212101}}, {{211102, 212102}}};
712 int2x2 i22_2[2] = {{{221101, 222101}, {221201, 222201}}, {{221102, 222102}, {221202, 222202}}};
713 int2x3 i23_2[2] = {{{231101, 232101}, {231201, 232201}, {231301, 232301}}, {{231102, 232102},
714         {231202, 232202}, {231302, 232302}}};
715 int2x4 i24_2[2] = {{{241101, 242101}, {241201, 242201}, {241301, 242301}, {241401, 242401}},
716         {{241102, 242102}, {241202, 242202}, {241302, 242302}, {241402, 242402}}};
717 int3x1 i31_2[2] = {{{311101, 312101, 313101}}, {{311102, 312102, 313102}}};
718 int3x2 i32_2[2] = {{{321101, 322101, 323101}, {321201, 322201, 323201}},
719         {{321102, 322102, 323102}, {321202, 322202, 323202}}};
720 int3x3 i33_2[2] = {{{331101, 332101, 333101}, {331201, 332201, 333201},
721         {331301, 332301, 333301}}, {{331102, 332102, 333102}, {331202, 332202, 333202},
722         {331302, 332302, 333302}}};
723 int3x4 i34_2[2] = {{{341101, 342101, 343101}, {341201, 342201, 343201},
724         {341301, 342301, 343301}, {341401, 342401, 343401}}, {{341102, 342102, 343102},
725         {341202, 342202, 343202}, {341302, 342302, 343302}, {341402, 342402, 343402}}};
726 int4x1 i41_2[2] = {{{411101, 412101, 413101, 414101}}, {{411102, 412102, 413102, 414102}}};
727 int4x2 i42_2[2] = {{{421101, 422101, 423101, 424101}, {421201, 422201, 423201, 424201}},
728         {{421102, 422102, 423102, 424102}, {421202, 422202, 423202, 424202}}};
729 int4x3 i43_2[2] = {{{431101, 432101, 433101, 434101}, {431201, 432201, 433201, 434201},
730         {431301, 432301, 433301, 434301}}, {{431102, 432102, 433102, 434102},
731         {431202, 432202, 433202, 434202}, {431302, 432302, 433302, 434302}}};
732 int4x4 i44_2[2] = {{{441101, 442101, 443101, 444101}, {441201, 442201, 443201, 444201},
733         {441301, 442301, 443301, 444301}, {441401, 442401, 443401, 444401}},
734         {{441102, 442102, 443102, 444102}, {441202, 442202, 443202, 444202},
735         {441302, 442302, 443302, 444302}, {441402, 442402, 443402, 444402}}};
736 technique t { pass p { } }
737 #endif
738 static const DWORD test_effect_parameter_value_blob_int[] =
739 {
740 0xfeff0901, 0x00000b80, 0x00000000, 0x00000002, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
741 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000069, 0x00000002, 0x00000001, 0x0000004c,
742 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x0000000b, 0x00000003, 0x00003169, 0x00000002,
743 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x00000015, 0x00000016,
744 0x00000003, 0x00003269, 0x00000002, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
745 0x00000001, 0x0000001f, 0x00000020, 0x00000021, 0x00000003, 0x00003369, 0x00000002, 0x00000001,
746 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000029, 0x0000002a, 0x0000002b,
747 0x0000002c, 0x00000003, 0x00003469, 0x00000002, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
748 0x00000001, 0x00000001, 0x0000006f, 0x00000004, 0x00313169, 0x00000002, 0x00000002, 0x00000130,
749 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000079, 0x0000007a, 0x00000004, 0x00323169,
750 0x00000002, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x00000083,
751 0x00000084, 0x00000085, 0x00000004, 0x00333169, 0x00000002, 0x00000002, 0x00000194, 0x00000000,
752 0x00000000, 0x00000001, 0x00000004, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000004,
753 0x00343169, 0x00000002, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
754 0x0000083f, 0x00000849, 0x00000004, 0x00313269, 0x00000002, 0x00000002, 0x000001f4, 0x00000000,
755 0x00000000, 0x00000002, 0x00000002, 0x000008a3, 0x000008ad, 0x000008a4, 0x000008ae, 0x00000004,
756 0x00323269, 0x00000002, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
757 0x00000907, 0x00000911, 0x00000908, 0x00000912, 0x00000909, 0x00000913, 0x00000004, 0x00333269,
758 0x00000002, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x0000096b,
759 0x00000975, 0x0000096c, 0x00000976, 0x0000096d, 0x00000977, 0x0000096e, 0x00000978, 0x00000004,
760 0x00343269, 0x00000002, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
761 0x00000c27, 0x00000c31, 0x00000c3b, 0x00000004, 0x00313369, 0x00000002, 0x00000002, 0x000002e0,
762 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000c8b, 0x00000c95, 0x00000c9f, 0x00000c8c,
763 0x00000c96, 0x00000ca0, 0x00000004, 0x00323369, 0x00000002, 0x00000002, 0x00000328, 0x00000000,
764 0x00000000, 0x00000003, 0x00000003, 0x00000cef, 0x00000cf9, 0x00000d03, 0x00000cf0, 0x00000cfa,
765 0x00000d04, 0x00000cf1, 0x00000cfb, 0x00000d05, 0x00000004, 0x00333369, 0x00000002, 0x00000002,
766 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x00000d53, 0x00000d5d, 0x00000d67,
767 0x00000d54, 0x00000d5e, 0x00000d68, 0x00000d55, 0x00000d5f, 0x00000d69, 0x00000d56, 0x00000d60,
768 0x00000d6a, 0x00000004, 0x00343369, 0x00000002, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
769 0x00000004, 0x00000001, 0x0000100f, 0x00001019, 0x00001023, 0x0000102d, 0x00000004, 0x00313469,
770 0x00000002, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x00001073,
771 0x0000107d, 0x00001087, 0x00001091, 0x00001074, 0x0000107e, 0x00001088, 0x00001092, 0x00000004,
772 0x00323469, 0x00000002, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
773 0x000010d7, 0x000010e1, 0x000010eb, 0x000010f5, 0x000010d8, 0x000010e2, 0x000010ec, 0x000010f6,
774 0x000010d9, 0x000010e3, 0x000010ed, 0x000010f7, 0x00000004, 0x00333469, 0x00000002, 0x00000002,
775 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x0000113b, 0x00001145, 0x0000114f,
776 0x00001159, 0x0000113c, 0x00001146, 0x00001150, 0x0000115a, 0x0000113d, 0x00001147, 0x00001151,
777 0x0000115b, 0x0000113e, 0x00001148, 0x00001152, 0x0000115c, 0x00000004, 0x00343469, 0x00000002,
778 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00000041, 0x00000042,
779 0x00000004, 0x00325f69, 0x00000002, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
780 0x00000001, 0x0000044d, 0x0000044e, 0x00000005, 0x325f3169, 0x00000000, 0x00000002, 0x00000001,
781 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000835, 0x00000899, 0x00000836,
782 0x0000089a, 0x00000005, 0x325f3269, 0x00000000, 0x00000002, 0x00000001, 0x0000057c, 0x00000000,
783 0x00000002, 0x00000003, 0x00000001, 0x00000c1d, 0x00000c81, 0x00000ce5, 0x00000c1e, 0x00000c82,
784 0x00000ce6, 0x00000005, 0x325f3369, 0x00000000, 0x00000002, 0x00000001, 0x000005c4, 0x00000000,
785 0x00000002, 0x00000004, 0x00000001, 0x00001005, 0x00001069, 0x000010cd, 0x00001131, 0x00001006,
786 0x0000106a, 0x000010ce, 0x00001132, 0x00000005, 0x325f3469, 0x00000000, 0x00000002, 0x00000002,
787 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00002b5d, 0x00002b5e, 0x00000006,
788 0x5f313169, 0x00000032, 0x00000002, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
789 0x00000002, 0x00002f45, 0x00002fa9, 0x00002f46, 0x00002faa, 0x00000006, 0x5f323169, 0x00000032,
790 0x00000002, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0000332d,
791 0x00003391, 0x000033f5, 0x0000332e, 0x00003392, 0x000033f6, 0x00000006, 0x5f333169, 0x00000032,
792 0x00000002, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x00003715,
793 0x00003779, 0x000037dd, 0x00003841, 0x00003716, 0x0000377a, 0x000037de, 0x00003842, 0x00000006,
794 0x5f343169, 0x00000032, 0x00000002, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
795 0x00000001, 0x0003389d, 0x00033c85, 0x0003389e, 0x00033c86, 0x00000006, 0x5f313269, 0x00000032,
796 0x00000002, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00035fad,
797 0x00036395, 0x00036011, 0x000363f9, 0x00035fae, 0x00036396, 0x00036012, 0x000363fa, 0x00000006,
798 0x5f323269, 0x00000032, 0x00000002, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
799 0x00000003, 0x000386bd, 0x00038aa5, 0x00038721, 0x00038b09, 0x00038785, 0x00038b6d, 0x000386be,
800 0x00038aa6, 0x00038722, 0x00038b0a, 0x00038786, 0x00038b6e, 0x00000006, 0x5f333269, 0x00000032,
801 0x00000002, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x0003adcd,
802 0x0003b1b5, 0x0003ae31, 0x0003b219, 0x0003ae95, 0x0003b27d, 0x0003aef9, 0x0003b2e1, 0x0003adce,
803 0x0003b1b6, 0x0003ae32, 0x0003b21a, 0x0003ae96, 0x0003b27e, 0x0003aefa, 0x0003b2e2, 0x00000006,
804 0x5f343269, 0x00000032, 0x00000002, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
805 0x00000001, 0x0004bf3d, 0x0004c325, 0x0004c70d, 0x0004bf3e, 0x0004c326, 0x0004c70e, 0x00000006,
806 0x5f313369, 0x00000032, 0x00000002, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
807 0x00000002, 0x0004e64d, 0x0004ea35, 0x0004ee1d, 0x0004e6b1, 0x0004ea99, 0x0004ee81, 0x0004e64e,
808 0x0004ea36, 0x0004ee1e, 0x0004e6b2, 0x0004ea9a, 0x0004ee82, 0x00000006, 0x5f323369, 0x00000032,
809 0x00000002, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00050d5d,
810 0x00051145, 0x0005152d, 0x00050dc1, 0x000511a9, 0x00051591, 0x00050e25, 0x0005120d, 0x000515f5,
811 0x00050d5e, 0x00051146, 0x0005152e, 0x00050dc2, 0x000511aa, 0x00051592, 0x00050e26, 0x0005120e,
812 0x000515f6, 0x00000006, 0x5f333369, 0x00000032, 0x00000002, 0x00000002, 0x00000984, 0x00000000,
813 0x00000002, 0x00000003, 0x00000004, 0x0005346d, 0x00053855, 0x00053c3d, 0x000534d1, 0x000538b9,
814 0x00053ca1, 0x00053535, 0x0005391d, 0x00053d05, 0x00053599, 0x00053981, 0x00053d69, 0x0005346e,
815 0x00053856, 0x00053c3e, 0x000534d2, 0x000538ba, 0x00053ca2, 0x00053536, 0x0005391e, 0x00053d06,
816 0x0005359a, 0x00053982, 0x00053d6a, 0x00000006, 0x5f343369, 0x00000032, 0x00000002, 0x00000002,
817 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x000645dd, 0x000649c5, 0x00064dad,
818 0x00065195, 0x000645de, 0x000649c6, 0x00064dae, 0x00065196, 0x00000006, 0x5f313469, 0x00000032,
819 0x00000002, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x00066ced,
820 0x000670d5, 0x000674bd, 0x000678a5, 0x00066d51, 0x00067139, 0x00067521, 0x00067909, 0x00066cee,
821 0x000670d6, 0x000674be, 0x000678a6, 0x00066d52, 0x0006713a, 0x00067522, 0x0006790a, 0x00000006,
822 0x5f323469, 0x00000032, 0x00000002, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
823 0x00000003, 0x000693fd, 0x000697e5, 0x00069bcd, 0x00069fb5, 0x00069461, 0x00069849, 0x00069c31,
824 0x0006a019, 0x000694c5, 0x000698ad, 0x00069c95, 0x0006a07d, 0x000693fe, 0x000697e6, 0x00069bce,
825 0x00069fb6, 0x00069462, 0x0006984a, 0x00069c32, 0x0006a01a, 0x000694c6, 0x000698ae, 0x00069c96,
826 0x0006a07e, 0x00000006, 0x5f333469, 0x00000032, 0x00000002, 0x00000002, 0x00000b64, 0x00000000,
827 0x00000002, 0x00000004, 0x00000004, 0x0006bb0d, 0x0006bef5, 0x0006c2dd, 0x0006c6c5, 0x0006bb71,
828 0x0006bf59, 0x0006c341, 0x0006c729, 0x0006bbd5, 0x0006bfbd, 0x0006c3a5, 0x0006c78d, 0x0006bc39,
829 0x0006c021, 0x0006c409, 0x0006c7f1, 0x0006bb0e, 0x0006bef6, 0x0006c2de, 0x0006c6c6, 0x0006bb72,
830 0x0006bf5a, 0x0006c342, 0x0006c72a, 0x0006bbd6, 0x0006bfbe, 0x0006c3a6, 0x0006c78e, 0x0006bc3a,
831 0x0006c022, 0x0006c40a, 0x0006c7f2, 0x00000006, 0x5f343469, 0x00000032, 0x00000002, 0x00000070,
832 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
833 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
834 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
835 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
836 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
837 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
838 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
839 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
840 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
841 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
842 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
843 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
844 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
845 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
846 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
847 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
848 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
849 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
850 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
851 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
852 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
853 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
854 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
855 };
856 
857 struct test_effect_parameter_value_result test_effect_parameter_value_result_int[] =
858 {
859     {"i",     {"i",     NULL, D3DXPC_SCALAR,      D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  10},
860     {"i1",    {"i1",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  20},
861     {"i2",    {"i2",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 2, 0, 0, 0, 0,   8},  30},
862     {"i3",    {"i3",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 3, 0, 0, 0, 0,  12},  41},
863     {"i4",    {"i4",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 4, 0, 0, 0, 0,  16},  53},
864     {"i11",   {"i11",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  66},
865     {"i12",   {"i12",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 0, 0, 0, 0,   8},  76},
866     {"i13",   {"i13",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 0, 0, 0, 0,  12},  87},
867     {"i14",   {"i14",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 0, 0, 0, 0,  16},  99},
868     {"i21",   {"i21",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 0, 0, 0, 0,   8}, 112},
869     {"i22",   {"i22",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 0, 0, 0, 0,  16}, 123},
870     {"i23",   {"i23",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 0, 0, 0, 0,  24}, 136},
871     {"i24",   {"i24",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 0, 0, 0, 0,  32}, 151},
872     {"i31",   {"i31",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 0, 0, 0, 0,  12}, 168},
873     {"i32",   {"i32",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 0, 0, 0, 0,  24}, 180},
874     {"i33",   {"i33",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 0, 0, 0, 0,  36}, 195},
875     {"i34",   {"i34",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 0, 0, 0, 0,  48}, 213},
876     {"i41",   {"i41",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 0, 0, 0, 0,  16}, 234},
877     {"i42",   {"i42",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 0, 0, 0, 0,  32}, 247},
878     {"i43",   {"i43",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 0, 0, 0, 0,  48}, 264},
879     {"i44",   {"i44",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 0, 0, 0, 0,  64}, 285},
880     {"i_2",   {"i_2",   NULL, D3DXPC_SCALAR,      D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 310},
881     {"i1_2",  {"i1_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 321},
882     {"i2_2",  {"i2_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 2, 2, 0, 0, 0,  16}, 333},
883     {"i3_2",  {"i3_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 3, 2, 0, 0, 0,  24}, 347},
884     {"i4_2",  {"i4_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 4, 2, 0, 0, 0,  32}, 363},
885     {"i11_2", {"i11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 381},
886     {"i12_2", {"i12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 2, 0, 0, 0,  16}, 393},
887     {"i13_2", {"i13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 2, 0, 0, 0,  24}, 407},
888     {"i14_2", {"i14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 2, 0, 0, 0,  32}, 423},
889     {"i21_2", {"i21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 2, 0, 0, 0,  16}, 441},
890     {"i22_2", {"i22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 2, 0, 0, 0,  32}, 455},
891     {"i23_2", {"i23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 2, 0, 0, 0,  48}, 473},
892     {"i24_2", {"i24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 2, 0, 0, 0,  64}, 495},
893     {"i31_2", {"i31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 2, 0, 0, 0,  24}, 521},
894     {"i32_2", {"i32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 2, 0, 0, 0,  48}, 537},
895     {"i33_2", {"i33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 2, 0, 0, 0,  72}, 559},
896     {"i34_2", {"i34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 2, 0, 0, 0,  96}, 587},
897     {"i41_2", {"i41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 2, 0, 0, 0,  32}, 621},
898     {"i42_2", {"i42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 2, 0, 0, 0,  64}, 639},
899     {"i43_2", {"i43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 2, 0, 0, 0,  96}, 665},
900     {"i44_2", {"i44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 2, 0, 0, 0, 128}, 699},
901 };
902 
903 /*
904  * fxc.exe /Tfx_2_0
905  */
906 #if 0
907 string s = "test";
908 string s_2[2] = {"test1", "test2"};
909 texture2D tex;
910 Vertexshader v;
911 Vertexshader v_2[2];
912 Pixelshader p;
913 Pixelshader p_2[2];
914 technique t { pass p { } }
915 #endif
916 static const DWORD test_effect_parameter_value_blob_object[] =
917 {
918 0xfeff0901, 0x00000100, 0x00000000, 0x00000004, 0x00000004, 0x0000001c, 0x00000000, 0x00000000,
919 0x00000001, 0x00000002, 0x00000073, 0x00000004, 0x00000004, 0x00000040, 0x00000000, 0x00000002,
920 0x00000002, 0x00000003, 0x00000004, 0x00325f73, 0x00000007, 0x00000004, 0x00000060, 0x00000000,
921 0x00000000, 0x00000004, 0x00000004, 0x00786574, 0x00000010, 0x00000004, 0x00000080, 0x00000000,
922 0x00000000, 0x00000005, 0x00000002, 0x00000076, 0x00000010, 0x00000004, 0x000000a4, 0x00000000,
923 0x00000002, 0x00000006, 0x00000007, 0x00000004, 0x00325f76, 0x0000000f, 0x00000004, 0x000000c4,
924 0x00000000, 0x00000000, 0x00000008, 0x00000002, 0x00000070, 0x0000000f, 0x00000004, 0x000000e8,
925 0x00000000, 0x00000002, 0x00000009, 0x0000000a, 0x00000004, 0x00325f70, 0x00000002, 0x00000070,
926 0x00000002, 0x00000074, 0x00000007, 0x00000001, 0x00000007, 0x0000000b, 0x00000004, 0x00000018,
927 0x00000000, 0x00000000, 0x00000024, 0x00000038, 0x00000000, 0x00000000, 0x00000048, 0x0000005c,
928 0x00000000, 0x00000000, 0x00000068, 0x0000007c, 0x00000000, 0x00000000, 0x00000088, 0x0000009c,
929 0x00000000, 0x00000000, 0x000000ac, 0x000000c0, 0x00000000, 0x00000000, 0x000000cc, 0x000000e0,
930 0x00000000, 0x00000000, 0x000000f8, 0x00000000, 0x00000001, 0x000000f0, 0x00000000, 0x00000000,
931 0x0000000a, 0x00000000, 0x00000009, 0x00000000, 0x0000000a, 0x00000000, 0x00000008, 0x00000000,
932 0x00000006, 0x00000000, 0x00000007, 0x00000000, 0x00000005, 0x00000000, 0x00000004, 0x00000000,
933 0x00000002, 0x00000006, 0x74736574, 0x00000031, 0x00000003, 0x00000006, 0x74736574, 0x00000032,
934 0x00000001, 0x00000005, 0x74736574, 0x00000000,
935 };
936 
937 struct test_effect_parameter_value_result test_effect_parameter_value_result_object[] =
938 {
939     {"s",   {"s",   NULL, D3DXPC_OBJECT, D3DXPT_STRING,       0, 0, 0, 0, 0, 0, sizeof(void *)},     0},
940     {"s_2", {"s_2", NULL, D3DXPC_OBJECT, D3DXPT_STRING,       0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0},
941     {"tex", {"tex", NULL, D3DXPC_OBJECT, D3DXPT_TEXTURE2D,    0, 0, 0, 0, 0, 0, sizeof(void *)},     0},
942     {"v",   {"v",   NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 0, 0, 0, 0, sizeof(void *)},     0},
943     {"v_2", {"v_2", NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0},
944     {"p",   {"p",   NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER,  0, 0, 0, 0, 0, 0, sizeof(void *)},     0},
945     {"p_2", {"p_2", NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER,  0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0},
946 };
947 
948 /*
949  * fxc.exe /Tfx_2_0
950  */
951 #if 0
952 float3 f3 = {-3.1, 153.2, 283.3};
953 float3 f3min = {-31.1, -31.2, -31.3};
954 float3 f3max = {320.1, 320.2, 320.3};
955 float4 f4 = {-4.1, 154.2, 284.3, 34.4};
956 float4 f4min = {-41.1, -41.2, -41.3, -41.4};
957 float4 f4max = {420.1, 42.20, 420.3, 420.4};
958 technique t { pass p { } }
959 #endif
960 static const DWORD test_effect_parameter_value_blob_special[] =
961 {
962 0xfeff0901, 0x00000150, 0x00000000, 0x00000003, 0x00000001, 0x0000002c, 0x00000000, 0x00000000,
963 0x00000003, 0x00000001, 0xc0466666, 0x43193333, 0x438da666, 0x00000003, 0x00003366, 0x00000003,
964 0x00000001, 0x0000005c, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0xc1f8cccd, 0xc1f9999a,
965 0xc1fa6666, 0x00000006, 0x696d3366, 0x0000006e, 0x00000003, 0x00000001, 0x00000090, 0x00000000,
966 0x00000000, 0x00000003, 0x00000001, 0x43a00ccd, 0x43a0199a, 0x43a02666, 0x00000006, 0x616d3366,
967 0x00000078, 0x00000003, 0x00000001, 0x000000c8, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
968 0xc0833333, 0x431a3333, 0x438e2666, 0x4209999a, 0x00000003, 0x00003466, 0x00000003, 0x00000001,
969 0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0xc2246666, 0xc224cccd, 0xc2253333,
970 0xc225999a, 0x00000006, 0x696d3466, 0x0000006e, 0x00000003, 0x00000001, 0x00000134, 0x00000000,
971 0x00000000, 0x00000004, 0x00000001, 0x43d20ccd, 0x4228cccd, 0x43d22666, 0x43d23333, 0x00000006,
972 0x616d3466, 0x00000078, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001,
973 0x00000001, 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x00000034, 0x00000050,
974 0x00000000, 0x00000000, 0x00000068, 0x00000084, 0x00000000, 0x00000000, 0x0000009c, 0x000000b8,
975 0x00000000, 0x00000000, 0x000000d0, 0x000000ec, 0x00000000, 0x00000000, 0x00000108, 0x00000124,
976 0x00000000, 0x00000000, 0x00000148, 0x00000000, 0x00000001, 0x00000140, 0x00000000, 0x00000000,
977 0x00000000, 0x00000000,
978 };
979 
980 struct test_effect_parameter_value_result test_effect_parameter_value_result_special[] =
981 {
982     {"f3",    {"f3",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  10},
983     {"f3min", {"f3min", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  22},
984     {"f3max", {"f3max", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  35},
985     {"f4",    {"f4",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  48},
986     {"f4min", {"f4min", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  61},
987     {"f4max", {"f4max", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  75},
988 };
989 
990 #define ADD_PARAMETER_VALUE(x) {\
991     test_effect_parameter_value_blob_ ## x,\
992     sizeof(test_effect_parameter_value_blob_ ## x),\
993     test_effect_parameter_value_result_ ## x,\
994     ARRAY_SIZE(test_effect_parameter_value_result_ ## x),\
995 }
996 
997 static const struct
998 {
999     const DWORD *blob;
1000     UINT blob_size;
1001     const struct test_effect_parameter_value_result *res;
1002     UINT res_count;
1003 }
1004 test_effect_parameter_value_data[] =
1005 {
1006     ADD_PARAMETER_VALUE(float),
1007     ADD_PARAMETER_VALUE(int),
1008     ADD_PARAMETER_VALUE(object),
1009     ADD_PARAMETER_VALUE(special),
1010 };
1011 
1012 #undef ADD_PARAMETER_VALUE
1013 
1014 /* Multiple of 16 to cover complete matrices */
1015 #define EFFECT_PARAMETER_VALUE_ARRAY_SIZE 48
1016 /* Constants for special INT/FLOAT conversation */
1017 #define INT_FLOAT_MULTI 255.0f
1018 #define INT_FLOAT_MULTI_INVERSE (1/INT_FLOAT_MULTI)
1019 
1020 static void test_effect_parameter_value_GetValue(const struct test_effect_parameter_value_result *res,
1021         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1022 {
1023     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1024     const char *res_full_name = res->full_name;
1025     DWORD value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1026     HRESULT hr;
1027     UINT l;
1028 
1029     memset(value, 0xab, sizeof(value));
1030     hr = effect->lpVtbl->GetValue(effect, parameter, value, res_desc->Bytes);
1031     if (res_desc->Class == D3DXPC_SCALAR
1032             || res_desc->Class == D3DXPC_VECTOR
1033             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1034     {
1035         ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1036 
1037         for (l = 0; l < res_desc->Bytes / sizeof(*value); ++l)
1038         {
1039             ok(value[l] == res_value[l], "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
1040                     i, res_full_name, l, value[l], res_value[l]);
1041         }
1042 
1043         for (l = res_desc->Bytes / sizeof(*value); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1044         {
1045             ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
1046                     i, res_full_name, l, value[l], 0xabababab);
1047         }
1048     }
1049     else if (res_desc->Class == D3DXPC_OBJECT)
1050     {
1051         switch (res_desc->Type)
1052         {
1053             case D3DXPT_PIXELSHADER:
1054             case D3DXPT_VERTEXSHADER:
1055             case D3DXPT_TEXTURE2D:
1056                 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1057 
1058                 for (l = 0; l < (res_desc->Elements ? res_desc->Elements : 1); ++l)
1059                 {
1060                     IUnknown *unk = *((IUnknown **)value + l);
1061                     if (unk) IUnknown_Release(unk);
1062                 }
1063                 break;
1064 
1065             case D3DXPT_STRING:
1066                 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1067                 break;
1068 
1069             default:
1070                 ok(0, "Type is %u, this should not happen!\n", res_desc->Type);
1071                 break;
1072         }
1073     }
1074     else
1075     {
1076         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
1077                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1078 
1079         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1080         {
1081             ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
1082                     i, res_full_name, l, value[l], 0xabababab);
1083         }
1084     }
1085 }
1086 
1087 static void test_effect_parameter_value_GetBool(const struct test_effect_parameter_value_result *res,
1088         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1089 {
1090     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1091     const char *res_full_name = res->full_name;
1092     BOOL bvalue = 0xabababab;
1093     HRESULT hr;
1094 
1095     hr = effect->lpVtbl->GetBool(effect, parameter, &bvalue);
1096     if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
1097     {
1098         ok(hr == D3D_OK, "%u - %s: GetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1099         ok(bvalue == get_bool(res_value), "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
1100                 i, res_full_name, bvalue, get_bool(res_value));
1101     }
1102     else
1103     {
1104         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1105                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1106         ok(bvalue == 0xabababab, "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
1107                 i, res_full_name, bvalue, 0xabababab);
1108     }
1109 }
1110 
1111 static void test_effect_parameter_value_GetBoolArray(const struct test_effect_parameter_value_result *res,
1112         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1113 {
1114     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1115     const char *res_full_name = res->full_name;
1116     BOOL bavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1117     HRESULT hr;
1118     UINT l, err = 0;
1119 
1120     memset(bavalue, 0xab, sizeof(bavalue));
1121     hr = effect->lpVtbl->GetBoolArray(effect, parameter, bavalue, res_desc->Bytes / sizeof(*bavalue));
1122     if (res_desc->Class == D3DXPC_SCALAR
1123             || res_desc->Class == D3DXPC_VECTOR
1124             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1125     {
1126         ok(hr == D3D_OK, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1127 
1128         for (l = 0; l < res_desc->Bytes / sizeof(*bavalue); ++l)
1129         {
1130             if (bavalue[l] != get_bool(&res_value[l])) ++err;
1131         }
1132 
1133         for (l = res_desc->Bytes / sizeof(*bavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1134         {
1135             if (bavalue[l] != 0xabababab) ++err;
1136         }
1137     }
1138     else
1139     {
1140         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1141                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1142 
1143         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (bavalue[l] != 0xabababab) ++err;
1144     }
1145     ok(!err, "%u - %s: GetBoolArray failed with %u errors\n", i, res_full_name, err);
1146 }
1147 
1148 static void test_effect_parameter_value_GetInt(const struct test_effect_parameter_value_result *res,
1149         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1150 {
1151     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1152     const char *res_full_name = res->full_name;
1153     INT ivalue = 0xabababab;
1154     HRESULT hr;
1155 
1156     hr = effect->lpVtbl->GetInt(effect, parameter, &ivalue);
1157     if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
1158     {
1159         ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1160         ok(ivalue == get_int(res_desc->Type, res_value), "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
1161                 i, res_full_name, ivalue, get_int(res_desc->Type, res_value));
1162     }
1163     else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
1164             ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
1165             (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
1166     {
1167         INT tmp;
1168 
1169         ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1170 
1171         tmp = (INT)(min(max(0.0f, *((FLOAT *)res_value + 2)), 1.0f) * INT_FLOAT_MULTI);
1172         tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8;
1173         tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16;
1174         if (res_desc->Columns * res_desc->Rows > 3)
1175         {
1176             tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24;
1177         }
1178 
1179         ok(ivalue == tmp, "%u - %s: GetInt ivalue failed, got %x, expected %x\n",
1180                 i, res_full_name, ivalue, tmp);
1181     }
1182     else
1183     {
1184         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1185                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1186         ok(ivalue == 0xabababab, "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
1187                 i, res_full_name, ivalue, 0xabababab);
1188     }
1189 }
1190 
1191 static void test_effect_parameter_value_GetIntArray(const struct test_effect_parameter_value_result *res,
1192         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1193 {
1194     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1195     const char *res_full_name = res->full_name;
1196     INT iavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1197     HRESULT hr;
1198     UINT l, err = 0;
1199 
1200     memset(iavalue, 0xab, sizeof(iavalue));
1201     hr = effect->lpVtbl->GetIntArray(effect, parameter, iavalue, res_desc->Bytes / sizeof(*iavalue));
1202     if (res_desc->Class == D3DXPC_SCALAR
1203             || res_desc->Class == D3DXPC_VECTOR
1204             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1205     {
1206         ok(hr == D3D_OK, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1207 
1208         for (l = 0; l < res_desc->Bytes / sizeof(*iavalue); ++l)
1209         {
1210             if (iavalue[l] != get_int(res_desc->Type, &res_value[l])) ++err;
1211         }
1212 
1213         for (l = res_desc->Bytes / sizeof(*iavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1214         {
1215             if (iavalue[l] != 0xabababab) ++err;
1216         }
1217     }
1218     else
1219     {
1220         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1221                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1222 
1223         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (iavalue[l] != 0xabababab) ++err;
1224     }
1225     ok(!err, "%u - %s: GetIntArray failed with %u errors\n", i, res_full_name, err);
1226 }
1227 
1228 static void test_effect_parameter_value_GetFloat(const struct test_effect_parameter_value_result *res,
1229         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1230 {
1231     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1232     const char *res_full_name = res->full_name;
1233     HRESULT hr;
1234     DWORD cmp = 0xabababab;
1235     FLOAT fvalue = *(FLOAT *)&cmp;
1236 
1237     hr = effect->lpVtbl->GetFloat(effect, parameter, &fvalue);
1238     if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
1239     {
1240         ok(hr == D3D_OK, "%u - %s: GetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1241         ok(compare_float(fvalue, get_float(res_desc->Type, res_value), 512), "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
1242                 i, res_full_name, fvalue, get_float(res_desc->Type, res_value));
1243     }
1244     else
1245     {
1246         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1247                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1248         ok(fvalue == *(FLOAT *)&cmp, "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
1249                 i, res_full_name, fvalue, *(FLOAT *)&cmp);
1250     }
1251 }
1252 
1253 static void test_effect_parameter_value_GetFloatArray(const struct test_effect_parameter_value_result *res,
1254         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1255 {
1256     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1257     const char *res_full_name = res->full_name;
1258     FLOAT favalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1259     HRESULT hr;
1260     UINT l, err = 0;
1261     DWORD cmp = 0xabababab;
1262 
1263     memset(favalue, 0xab, sizeof(favalue));
1264     hr = effect->lpVtbl->GetFloatArray(effect, parameter, favalue, res_desc->Bytes / sizeof(*favalue));
1265     if (res_desc->Class == D3DXPC_SCALAR
1266             || res_desc->Class == D3DXPC_VECTOR
1267             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1268     {
1269         ok(hr == D3D_OK, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1270 
1271         for (l = 0; l < res_desc->Bytes / sizeof(*favalue); ++l)
1272         {
1273             if (!compare_float(favalue[l], get_float(res_desc->Type, &res_value[l]), 512)) ++err;
1274         }
1275 
1276         for (l = res_desc->Bytes / sizeof(*favalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1277         {
1278             if (favalue[l] != *(FLOAT *)&cmp) ++err;
1279         }
1280     }
1281     else
1282     {
1283         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1284                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1285 
1286         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (favalue[l] != *(FLOAT *)&cmp) ++err;
1287     }
1288     ok(!err, "%u - %s: GetFloatArray failed with %u errors\n", i, res_full_name, err);
1289 }
1290 
1291 static void test_effect_parameter_value_GetVector(const struct test_effect_parameter_value_result *res,
1292         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1293 {
1294     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1295     const char *res_full_name = res->full_name;
1296     HRESULT hr;
1297     DWORD cmp = 0xabababab;
1298     FLOAT fvalue[4];
1299     UINT l, err = 0;
1300 
1301     memset(fvalue, 0xab, sizeof(fvalue));
1302     hr = effect->lpVtbl->GetVector(effect, parameter, (D3DXVECTOR4 *)&fvalue);
1303     if (!res_desc->Elements &&
1304             (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR) &&
1305             res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
1306     {
1307         DWORD tmp;
1308 
1309         ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1310 
1311         tmp = (DWORD)(*(fvalue + 2) * INT_FLOAT_MULTI);
1312         tmp += ((DWORD)(*(fvalue + 1) * INT_FLOAT_MULTI)) << 8;
1313         tmp += ((DWORD)(*fvalue * INT_FLOAT_MULTI)) << 16;
1314         tmp += ((DWORD)(*(fvalue + 3) * INT_FLOAT_MULTI)) << 24;
1315 
1316         if (*res_value != tmp) ++err;
1317     }
1318     else if (!res_desc->Elements && (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR))
1319     {
1320         ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1321 
1322         for (l = 0; l < res_desc->Columns; ++l)
1323         {
1324             if (!compare_float(fvalue[l], get_float(res_desc->Type, &res_value[l]), 512)) ++err;
1325         }
1326 
1327         for (l = res_desc->Columns; l < 4; ++l) if (fvalue[l] != 0.0f) ++err;
1328     }
1329     else
1330     {
1331         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1332                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1333 
1334         for (l = 0; l < 4; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1335     }
1336     ok(!err, "%u - %s: GetVector failed with %u errors\n", i, res_full_name, err);
1337 }
1338 
1339 static void test_effect_parameter_value_GetVectorArray(const struct test_effect_parameter_value_result *res,
1340         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1341 {
1342     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1343     const char *res_full_name = res->full_name;
1344     HRESULT hr;
1345     DWORD cmp = 0xabababab;
1346     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1347     UINT l, k, element, err = 0;
1348 
1349     for (element = 0; element <= res_desc->Elements + 1; ++element)
1350     {
1351         memset(fvalue, 0xab, sizeof(fvalue));
1352         hr = effect->lpVtbl->GetVectorArray(effect, parameter, (D3DXVECTOR4 *)&fvalue, element);
1353         if (!element)
1354         {
1355             ok(hr == D3D_OK, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1356 
1357             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1358         }
1359         else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_VECTOR)
1360         {
1361             ok(hr == D3D_OK, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1362 
1363             for (k = 0; k < element; ++k)
1364             {
1365                 for (l = 0; l < res_desc->Columns; ++l)
1366                 {
1367                     if (!compare_float(fvalue[l + k * 4], get_float(res_desc->Type,
1368                             &res_value[l + k * res_desc->Columns]), 512))
1369                         ++err;
1370                 }
1371 
1372                 for (l = res_desc->Columns; l < 4; ++l) if (fvalue[l + k * 4] != 0.0f) ++err;
1373             }
1374 
1375             for (l = element * 4; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1376         }
1377         else
1378         {
1379             ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n",
1380                     i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1381 
1382             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1383         }
1384         ok(!err, "%u - %s[%u]: GetVectorArray failed with %u errors\n", i, res_full_name, element, err);
1385     }
1386 }
1387 
1388 static void test_effect_parameter_value_GetMatrix(const struct test_effect_parameter_value_result *res,
1389         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1390 {
1391     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1392     const char *res_full_name = res->full_name;
1393     HRESULT hr;
1394     union
1395     {
1396         DWORD d;
1397         float f;
1398     } cmp;
1399     float fvalue[16];
1400     UINT l, k, err = 0;
1401 
1402     cmp.d = 0xabababab;
1403     memset(fvalue, 0xab, sizeof(fvalue));
1404     hr = effect->lpVtbl->GetMatrix(effect, parameter, (D3DXMATRIX *)&fvalue);
1405     if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1406     {
1407         ok(hr == D3D_OK, "%u - %s: GetMatrix failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK);
1408 
1409         for (k = 0; k < 4; ++k)
1410         {
1411             for (l = 0; l < 4; ++l)
1412             {
1413                 if (k < res_desc->Columns && l < res_desc->Rows)
1414                 {
1415                     if (!compare_float(fvalue[l * 4 + k], get_float(res_desc->Type,
1416                             &res_value[l * res_desc->Columns + k]), 512))
1417                         ++err;
1418                 }
1419                 else if (fvalue[l * 4 + k] != 0.0f) ++err;
1420             }
1421         }
1422     }
1423     else
1424     {
1425         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x.\n",
1426                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1427 
1428         for (l = 0; l < ARRAY_SIZE(fvalue); ++l)
1429             if (fvalue[l] != cmp.f)
1430                 ++err;
1431     }
1432     ok(!err, "%u - %s: GetMatrix failed with %u errors.\n", i, res_full_name, err);
1433 }
1434 
1435 static void test_effect_parameter_value_GetMatrixArray(const struct test_effect_parameter_value_result *res,
1436         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1437 {
1438     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1439     const char *res_full_name = res->full_name;
1440     HRESULT hr;
1441     DWORD cmp = 0xabababab;
1442     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1443     UINT l, k, m, element, err = 0;
1444 
1445     for (element = 0; element <= res_desc->Elements + 1; ++element)
1446     {
1447         memset(fvalue, 0xab, sizeof(fvalue));
1448         hr = effect->lpVtbl->GetMatrixArray(effect, parameter, (D3DXMATRIX *)&fvalue, element);
1449         if (!element)
1450         {
1451             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1452 
1453             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1454         }
1455         else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1456         {
1457             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1458 
1459             for (m = 0; m < element; ++m)
1460             {
1461                 for (k = 0; k < 4; ++k)
1462                 {
1463                     for (l = 0; l < 4; ++l)
1464                     {
1465                         if (k < res_desc->Columns && l < res_desc->Rows)
1466                         {
1467                             if (!compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type,
1468                                     &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1469                                 ++err;
1470                         }
1471                         else if (fvalue[m * 16 + l * 4 + k] != 0.0f) ++err;
1472                     }
1473                 }
1474             }
1475 
1476             for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1477         }
1478         else
1479         {
1480             ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n",
1481                     i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1482 
1483             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1484         }
1485         ok(!err, "%u - %s[%u]: GetMatrixArray failed with %u errors\n", i, res_full_name, element, err);
1486     }
1487 }
1488 
1489 static void test_effect_parameter_value_GetMatrixPointerArray(const struct test_effect_parameter_value_result *res,
1490         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1491 {
1492     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1493     const char *res_full_name = res->full_name;
1494     HRESULT hr;
1495     DWORD cmp = 0xabababab;
1496     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1497     D3DXMATRIX *matrix_pointer_array[sizeof(fvalue)/sizeof(D3DXMATRIX)];
1498     UINT l, k, m, element, err = 0;
1499 
1500     for (element = 0; element <= res_desc->Elements + 1; ++element)
1501     {
1502         memset(fvalue, 0xab, sizeof(fvalue));
1503         for (l = 0; l < element; ++l)
1504         {
1505             matrix_pointer_array[l] = (D3DXMATRIX *)&fvalue[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
1506         }
1507         hr = effect->lpVtbl->GetMatrixPointerArray(effect, parameter, matrix_pointer_array, element);
1508         if (!element)
1509         {
1510             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1511                     i, res_full_name, element, hr, D3D_OK);
1512 
1513             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1514         }
1515         else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1516         {
1517             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1518                     i, res_full_name, element, hr, D3D_OK);
1519 
1520             for (m = 0; m < element; ++m)
1521             {
1522                 for (k = 0; k < 4; ++k)
1523                 {
1524                     for (l = 0; l < 4; ++l)
1525                     {
1526                         if (k < res_desc->Columns && l < res_desc->Rows)
1527                         {
1528                             if (!compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type,
1529                                     &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1530                                 ++err;
1531                         }
1532                         else if (fvalue[m * 16 + l * 4 + k] != 0.0f) ++err;
1533                     }
1534                 }
1535             }
1536 
1537             for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1538         }
1539         else
1540         {
1541             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1542 
1543             ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1544                     i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1545         }
1546         ok(!err, "%u - %s[%u]: GetMatrixPointerArray failed with %u errors\n", i, res_full_name, element, err);
1547     }
1548 }
1549 
1550 static void test_effect_parameter_value_GetMatrixTranspose(const struct test_effect_parameter_value_result *res,
1551         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1552 {
1553     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1554     const char *res_full_name = res->full_name;
1555     HRESULT hr;
1556     union
1557     {
1558         DWORD d;
1559         float f;
1560     } cmp;
1561     float fvalue[16];
1562     UINT l, k, err = 0;
1563 
1564     cmp.d = 0xabababab;
1565     memset(fvalue, 0xab, sizeof(fvalue));
1566     hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, (D3DXMATRIX *)&fvalue);
1567     if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1568     {
1569         ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK);
1570 
1571         for (k = 0; k < 4; ++k)
1572         {
1573             for (l = 0; l < 4; ++l)
1574             {
1575                 if (k < res_desc->Columns && l < res_desc->Rows)
1576                 {
1577                     if (!compare_float(fvalue[l + k * 4], get_float(res_desc->Type,
1578                             &res_value[l * res_desc->Columns + k]), 512))
1579                         ++err;
1580                 }
1581                 else if (fvalue[l + k * 4] != 0.0f) ++err;
1582             }
1583         }
1584     }
1585     else if (!res_desc->Elements && (res_desc->Class == D3DXPC_VECTOR || res_desc->Class == D3DXPC_SCALAR))
1586     {
1587         ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK);
1588 
1589         for (k = 0; k < 4; ++k)
1590         {
1591             for (l = 0; l < 4; ++l)
1592             {
1593                 if (k < res_desc->Columns && l < res_desc->Rows)
1594                 {
1595                     if (!compare_float(fvalue[l * 4 + k], get_float(res_desc->Type,
1596                             &res_value[l * res_desc->Columns + k]), 512))
1597                         ++err;
1598                 }
1599                 else if (fvalue[l * 4 + k] != 0.0f) ++err;
1600             }
1601         }
1602     }
1603     else
1604     {
1605         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n",
1606                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1607 
1608         for (l = 0; l < ARRAY_SIZE(fvalue); ++l)
1609             if (fvalue[l] != cmp.f)
1610                 ++err;
1611     }
1612     ok(!err, "%u - %s: GetMatrixTranspose failed with %u errors.\n", i, res_full_name, err);
1613 }
1614 
1615 static void test_effect_parameter_value_GetMatrixTransposeArray(const struct test_effect_parameter_value_result *res,
1616         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1617 {
1618     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1619     const char *res_full_name = res->full_name;
1620     HRESULT hr;
1621     DWORD cmp = 0xabababab;
1622     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1623     UINT l, k, m, element, err = 0;
1624 
1625     for (element = 0; element <= res_desc->Elements + 1; ++element)
1626     {
1627         memset(fvalue, 0xab, sizeof(fvalue));
1628         hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)&fvalue, element);
1629         if (!element)
1630         {
1631             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1632                     i, res_full_name, element, hr, D3D_OK);
1633 
1634             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1635         }
1636         else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1637         {
1638             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1639                     i, res_full_name, element, hr, D3D_OK);
1640 
1641             for (m = 0; m < element; ++m)
1642             {
1643                 for (k = 0; k < 4; ++k)
1644                 {
1645                     for (l = 0; l < 4; ++l)
1646                     {
1647                         if (k < res_desc->Columns && l < res_desc->Rows)
1648                         {
1649                             if (!compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type,
1650                                     &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1651                                 ++err;
1652                         }
1653                         else if (fvalue[m * 16 + l + k * 4] != 0.0f) ++err;
1654                     }
1655                 }
1656             }
1657 
1658             for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1659         }
1660         else
1661         {
1662             ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1663                     i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1664 
1665             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1666         }
1667         ok(!err, "%u - %s[%u]: GetMatrixTransposeArray failed with %u errors\n", i, res_full_name, element, err);
1668     }
1669 }
1670 
1671 static void test_effect_parameter_value_GetMatrixTransposePointerArray(const struct test_effect_parameter_value_result *res,
1672         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1673 {
1674     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1675     const char *res_full_name = res->full_name;
1676     HRESULT hr;
1677     DWORD cmp = 0xabababab;
1678     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1679     D3DXMATRIX *matrix_pointer_array[sizeof(fvalue)/sizeof(D3DXMATRIX)];
1680     UINT l, k, m, element, err = 0;
1681 
1682     for (element = 0; element <= res_desc->Elements + 1; ++element)
1683     {
1684         memset(fvalue, 0xab, sizeof(fvalue));
1685         for (l = 0; l < element; ++l)
1686         {
1687             matrix_pointer_array[l] = (D3DXMATRIX *)&fvalue[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
1688         }
1689         hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, parameter, matrix_pointer_array, element);
1690         if (!element)
1691         {
1692             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
1693                     i, res_full_name, element, hr, D3D_OK);
1694 
1695             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1696         }
1697         else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1698         {
1699             ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
1700                     i, res_full_name, element, hr, D3D_OK);
1701 
1702             for (m = 0; m < element; ++m)
1703             {
1704                 for (k = 0; k < 4; ++k)
1705                 {
1706                     for (l = 0; l < 4; ++l)
1707                     {
1708                         if (k < res_desc->Columns && l < res_desc->Rows)
1709                         {
1710                             if (!compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type,
1711                                     &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1712                                 ++err;
1713                         }
1714                         else if (fvalue[m * 16 + l + k * 4] != 0.0f) ++err;
1715                     }
1716                 }
1717             }
1718 
1719             for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1720         }
1721         else
1722         {
1723             ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
1724                     i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1725 
1726             for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1727         }
1728         ok(!err, "%u - %s[%u]: GetMatrixTransposePointerArray failed with %u errors\n", i, res_full_name, element, err);
1729     }
1730 }
1731 
1732 static void test_effect_parameter_value_GetTestGroup(const struct test_effect_parameter_value_result *res,
1733         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1734 {
1735     test_effect_parameter_value_GetValue(res, effect, res_value, parameter, i);
1736     test_effect_parameter_value_GetBool(res, effect, res_value, parameter, i);
1737     test_effect_parameter_value_GetBoolArray(res, effect, res_value, parameter, i);
1738     test_effect_parameter_value_GetInt(res, effect, res_value, parameter, i);
1739     test_effect_parameter_value_GetIntArray(res, effect, res_value, parameter, i);
1740     test_effect_parameter_value_GetFloat(res, effect, res_value, parameter, i);
1741     test_effect_parameter_value_GetFloatArray(res, effect, res_value, parameter, i);
1742     test_effect_parameter_value_GetVector(res, effect, res_value, parameter, i);
1743     test_effect_parameter_value_GetVectorArray(res, effect, res_value, parameter, i);
1744     test_effect_parameter_value_GetMatrix(res, effect, res_value, parameter, i);
1745     test_effect_parameter_value_GetMatrixArray(res, effect, res_value, parameter, i);
1746     test_effect_parameter_value_GetMatrixPointerArray(res, effect, res_value, parameter, i);
1747     test_effect_parameter_value_GetMatrixTranspose(res, effect, res_value, parameter, i);
1748     test_effect_parameter_value_GetMatrixTransposeArray(res, effect, res_value, parameter, i);
1749     test_effect_parameter_value_GetMatrixTransposePointerArray(res, effect, res_value, parameter, i);
1750 }
1751 
1752 static void test_effect_parameter_value_ResetValue(const struct test_effect_parameter_value_result *res,
1753         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1754 {
1755     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1756     const char *res_full_name = res->full_name;
1757     HRESULT hr;
1758 
1759     if (res_desc->Class == D3DXPC_SCALAR
1760             || res_desc->Class == D3DXPC_VECTOR
1761             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1762     {
1763         hr = effect->lpVtbl->SetValue(effect, parameter, res_value, res_desc->Bytes);
1764         ok(hr == D3D_OK, "%u - %s: SetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1765     }
1766     else
1767     {
1768         /* nothing to do */
1769         switch (res_desc->Type)
1770         {
1771             case D3DXPT_PIXELSHADER:
1772             case D3DXPT_VERTEXSHADER:
1773             case D3DXPT_TEXTURE2D:
1774             case D3DXPT_STRING:
1775                 break;
1776 
1777             default:
1778                 ok(0, "Type is %u, this should not happen!\n", res_desc->Type);
1779                 break;
1780         }
1781     }
1782 }
1783 
1784 static void test_effect_parameter_value(IDirect3DDevice9 *device)
1785 {
1786     unsigned int effect_count = ARRAY_SIZE(test_effect_parameter_value_data), i;
1787 
1788     for (i = 0; i < effect_count; ++i)
1789     {
1790         const struct test_effect_parameter_value_result *res = test_effect_parameter_value_data[i].res;
1791         UINT res_count = test_effect_parameter_value_data[i].res_count;
1792         const DWORD *blob = test_effect_parameter_value_data[i].blob;
1793         UINT blob_size = test_effect_parameter_value_data[i].blob_size;
1794         HRESULT hr;
1795         ID3DXEffect *effect;
1796         D3DXEFFECT_DESC edesc;
1797         ULONG count;
1798         UINT k;
1799 
1800         hr = D3DXCreateEffect(device, blob, blob_size, NULL, NULL, 0, NULL, &effect, NULL);
1801         ok(hr == D3D_OK, "%u: D3DXCreateEffect failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1802 
1803         hr = effect->lpVtbl->GetDesc(effect, &edesc);
1804         ok(hr == D3D_OK, "%u: GetDesc failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1805         ok(edesc.Parameters == res_count, "%u: Parameters failed, got %u, expected %u\n",
1806                 i, edesc.Parameters, res_count);
1807 
1808         for (k = 0; k < res_count; ++k)
1809         {
1810             const D3DXPARAMETER_DESC *res_desc = &res[k].desc;
1811             const char *res_full_name = res[k].full_name;
1812             UINT res_value_offset = res[k].value_offset;
1813             D3DXHANDLE parameter;
1814             D3DXPARAMETER_DESC pdesc;
1815             BOOL bvalue = TRUE;
1816             INT ivalue = 42;
1817             FLOAT fvalue = 2.71828f;
1818             DWORD input_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1819             DWORD expected_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1820             UINT l, n, m, element;
1821             const D3DXMATRIX *matrix_pointer_array[sizeof(input_value)/sizeof(D3DXMATRIX)];
1822 
1823             parameter = effect->lpVtbl->GetParameterByName(effect, NULL, res_full_name);
1824             ok(parameter != NULL, "%u - %s: GetParameterByName failed\n", i, res_full_name);
1825 
1826             hr = effect->lpVtbl->GetParameterDesc(effect, parameter, &pdesc);
1827             ok(hr == D3D_OK, "%u - %s: GetParameterDesc failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1828 
1829             ok(res_desc->Name ? !strcmp(pdesc.Name, res_desc->Name) : !pdesc.Name,
1830                     "%u - %s: GetParameterDesc Name failed, got \"%s\", expected \"%s\"\n",
1831                     i, res_full_name, pdesc.Name, res_desc->Name);
1832             ok(res_desc->Semantic ? !strcmp(pdesc.Semantic, res_desc->Semantic) : !pdesc.Semantic,
1833                     "%u - %s: GetParameterDesc Semantic failed, got \"%s\", expected \"%s\"\n",
1834                     i, res_full_name, pdesc.Semantic, res_desc->Semantic);
1835             ok(res_desc->Class == pdesc.Class, "%u - %s: GetParameterDesc Class failed, got %#x, expected %#x\n",
1836                     i, res_full_name, pdesc.Class, res_desc->Class);
1837             ok(res_desc->Type == pdesc.Type, "%u - %s: GetParameterDesc Type failed, got %#x, expected %#x\n",
1838                     i, res_full_name, pdesc.Type, res_desc->Type);
1839             ok(res_desc->Rows == pdesc.Rows, "%u - %s: GetParameterDesc Rows failed, got %u, expected %u\n",
1840                     i, res_full_name, pdesc.Rows, res_desc->Rows);
1841             ok(res_desc->Columns == pdesc.Columns, "%u - %s: GetParameterDesc Columns failed, got %u, expected %u\n",
1842                     i, res_full_name, pdesc.Columns, res_desc->Columns);
1843             ok(res_desc->Elements == pdesc.Elements, "%u - %s: GetParameterDesc Elements failed, got %u, expected %u\n",
1844                     i, res_full_name, pdesc.Elements, res_desc->Elements);
1845             ok(res_desc->Annotations == pdesc.Annotations, "%u - %s: GetParameterDesc Annotations failed, got %u, expected %u\n",
1846                     i, res_full_name, pdesc.Annotations, res_desc->Annotations);
1847             ok(res_desc->StructMembers == pdesc.StructMembers, "%u - %s: GetParameterDesc StructMembers failed, got %u, expected %u\n",
1848                     i, res_full_name, pdesc.StructMembers, res_desc->StructMembers);
1849             ok(res_desc->Flags == pdesc.Flags, "%u - %s: GetParameterDesc Flags failed, got %u, expected %u\n",
1850                     i, res_full_name, pdesc.Flags, res_desc->Flags);
1851             ok(res_desc->Bytes == pdesc.Bytes, "%u - %s: GetParameterDesc Bytes, got %u, expected %u\n",
1852                     i, res_full_name, pdesc.Bytes, res_desc->Bytes);
1853 
1854             /* check size */
1855             ok(EFFECT_PARAMETER_VALUE_ARRAY_SIZE >= res_desc->Bytes / 4 +
1856                     (res_desc->Elements ? res_desc->Bytes / 4 / res_desc->Elements : 0),
1857                     "%u - %s: Warning: Array size too small\n", i, res_full_name);
1858 
1859             test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1860             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1861             test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1862 
1863             /*
1864              * check invalid calls
1865              * These will crash:
1866              * effect->lpVtbl->SetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL));
1867              * effect->lpVtbl->SetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT));
1868              * effect->lpVtbl->SetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT));
1869              * effect->lpVtbl->SetVector(effect, parameter, NULL);
1870              * effect->lpVtbl->SetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1871              * effect->lpVtbl->SetMatrix(effect, parameter, NULL);
1872              * effect->lpVtbl->GetMatrix(effect, parameter, NULL);
1873              * effect->lpVtbl->SetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1874              * effect->lpVtbl->SetMatrixPointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1875              * effect->lpVtbl->SetMatrixTranspose(effect, parameter, NULL);
1876              * effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1877              * effect->lpVtbl->SetMatrixTransposePointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1878              * effect->lpVtbl->GetValue(effect, parameter, NULL, res_desc->Bytes);
1879              * effect->lpVtbl->SetValue(effect, parameter, NULL, res_desc->Bytes);
1880              */
1881             hr = effect->lpVtbl->SetBool(effect, NULL, bvalue);
1882             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n",
1883                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1884 
1885             hr = effect->lpVtbl->GetBool(effect, NULL, &bvalue);
1886             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1887                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1888 
1889             hr = effect->lpVtbl->GetBool(effect, parameter, NULL);
1890             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1891                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1892 
1893             hr = effect->lpVtbl->SetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL));
1894             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n",
1895                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1896 
1897             hr = effect->lpVtbl->GetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL));
1898             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1899                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1900 
1901             hr = effect->lpVtbl->GetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL));
1902             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1903                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1904 
1905             hr = effect->lpVtbl->SetInt(effect, NULL, ivalue);
1906             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n",
1907                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1908 
1909             hr = effect->lpVtbl->GetInt(effect, NULL, &ivalue);
1910             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1911                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1912 
1913             hr = effect->lpVtbl->GetInt(effect, parameter, NULL);
1914             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1915                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1916 
1917             hr = effect->lpVtbl->SetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT));
1918             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n",
1919                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1920 
1921             hr = effect->lpVtbl->GetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT));
1922             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1923                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1924 
1925             hr = effect->lpVtbl->GetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT));
1926             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1927                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1928 
1929             hr = effect->lpVtbl->SetFloat(effect, NULL, fvalue);
1930             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n",
1931                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1932 
1933             hr = effect->lpVtbl->GetFloat(effect, NULL, &fvalue);
1934             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1935                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1936 
1937             hr = effect->lpVtbl->GetFloat(effect, parameter, NULL);
1938             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1939                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1940 
1941             hr = effect->lpVtbl->SetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT));
1942             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n",
1943                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1944 
1945             hr = effect->lpVtbl->GetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT));
1946             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1947                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1948 
1949             hr = effect->lpVtbl->GetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT));
1950             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1951                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1952 
1953             hr = effect->lpVtbl->SetVector(effect, NULL, (D3DXVECTOR4 *)input_value);
1954             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n",
1955                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1956 
1957             hr = effect->lpVtbl->GetVector(effect, NULL, (D3DXVECTOR4 *)input_value);
1958             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1959                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1960 
1961             hr = effect->lpVtbl->GetVector(effect, parameter, NULL);
1962             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1963                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1964 
1965             hr = effect->lpVtbl->SetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1966             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n",
1967                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1968 
1969             hr = effect->lpVtbl->GetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1970             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1971                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1972 
1973             hr = effect->lpVtbl->GetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1974             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1975                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1976 
1977             hr = effect->lpVtbl->SetMatrix(effect, NULL, (D3DXMATRIX *)input_value);
1978             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n",
1979                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1980 
1981             hr = effect->lpVtbl->GetMatrix(effect, NULL, (D3DXMATRIX *)input_value);
1982             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x\n",
1983                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1984 
1985             hr = effect->lpVtbl->SetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1986             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n",
1987                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1988 
1989             hr = effect->lpVtbl->GetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1990             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1991                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1992 
1993             hr = effect->lpVtbl->GetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1994             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1995                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1996 
1997             hr = effect->lpVtbl->SetMatrixPointerArray(effect, NULL, matrix_pointer_array, res_desc->Elements ? res_desc->Elements : 1);
1998             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
1999                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2000 
2001             hr = effect->lpVtbl->SetMatrixPointerArray(effect, NULL, matrix_pointer_array, 0);
2002             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
2003                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2004 
2005             hr = effect->lpVtbl->GetMatrixPointerArray(effect, NULL, NULL, 0);
2006             ok(hr == D3D_OK, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n",
2007                     i, res_full_name, hr, D3D_OK);
2008 
2009             hr = effect->lpVtbl->GetMatrixPointerArray(effect, NULL, NULL, res_desc->Elements ? res_desc->Elements : 1);
2010             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n",
2011                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2012 
2013             hr = effect->lpVtbl->GetMatrixPointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
2014             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n",
2015                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2016 
2017             hr = effect->lpVtbl->SetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value);
2018             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n",
2019                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2020 
2021             hr = effect->lpVtbl->GetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value);
2022             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
2023                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2024 
2025             hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, NULL);
2026             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
2027                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2028 
2029             hr = effect->lpVtbl->SetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
2030             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n",
2031                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2032 
2033             hr = effect->lpVtbl->GetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
2034             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
2035                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2036 
2037             hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
2038             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
2039                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2040 
2041             hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, NULL, matrix_pointer_array, res_desc->Elements ? res_desc->Elements : 1);
2042             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2043                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2044 
2045             hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, NULL, matrix_pointer_array, 0);
2046             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2047                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2048 
2049             hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, NULL, NULL, 0);
2050             ok(hr == D3D_OK, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2051                     i, res_full_name, hr, D3D_OK);
2052 
2053             hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, NULL, NULL, res_desc->Elements ? res_desc->Elements : 1);
2054             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2055                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2056 
2057             hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
2058             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2059                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2060 
2061             hr = effect->lpVtbl->SetValue(effect, NULL, input_value, res_desc->Bytes);
2062             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n",
2063                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2064 
2065             hr = effect->lpVtbl->SetValue(effect, parameter, input_value, res_desc->Bytes - 1);
2066             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n",
2067                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2068 
2069             hr = effect->lpVtbl->GetValue(effect, NULL, input_value, res_desc->Bytes);
2070             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
2071                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2072 
2073             hr = effect->lpVtbl->GetValue(effect, parameter, input_value, res_desc->Bytes - 1);
2074             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
2075                     i, res_full_name, hr, D3DERR_INVALIDCALL);
2076 
2077             test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
2078 
2079             /* SetBool */
2080             bvalue = 5;
2081             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2082             hr = effect->lpVtbl->SetBool(effect, parameter, bvalue);
2083             if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
2084             {
2085                 bvalue = TRUE;
2086                 set_number(expected_value, res_desc->Type, &bvalue, D3DXPT_BOOL);
2087                 ok(hr == D3D_OK, "%u - %s: SetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2088             }
2089             else
2090             {
2091                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n",
2092                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2093             }
2094             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2095             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2096 
2097             /* SetBoolArray */
2098             *input_value = 1;
2099             for (l = 1; l < res_desc->Bytes / sizeof(*input_value); ++l)
2100             {
2101                 *(input_value + l) = *(input_value + l - 1) + 1;
2102             }
2103             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2104             hr = effect->lpVtbl->SetBoolArray(effect, parameter, (BOOL *)input_value, res_desc->Bytes / sizeof(*input_value));
2105             if (res_desc->Class == D3DXPC_SCALAR
2106                     || res_desc->Class == D3DXPC_VECTOR
2107                     || res_desc->Class == D3DXPC_MATRIX_ROWS)
2108             {
2109                 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2110                 {
2111                     set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_BOOL);
2112                 }
2113                 ok(hr == D3D_OK, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2114             }
2115             else
2116             {
2117                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n",
2118                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2119             }
2120             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2121             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2122 
2123             /* SetInt */
2124             ivalue = 0x1fbf02ff;
2125             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2126             hr = effect->lpVtbl->SetInt(effect, parameter, ivalue);
2127             if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
2128             {
2129                 set_number(expected_value, res_desc->Type, &ivalue, D3DXPT_INT);
2130                 ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2131             }
2132             else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
2133                     ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
2134                     (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
2135             {
2136                 FLOAT tmp = ((ivalue & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
2137                 set_number(expected_value, res_desc->Type, &tmp, D3DXPT_FLOAT);
2138                 tmp = ((ivalue & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
2139                 set_number(expected_value + 1, res_desc->Type, &tmp, D3DXPT_FLOAT);
2140                 tmp = (ivalue & 0xff) * INT_FLOAT_MULTI_INVERSE;
2141                 set_number(expected_value + 2, res_desc->Type, &tmp, D3DXPT_FLOAT);
2142                 tmp = ((ivalue & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
2143                 set_number(expected_value + 3, res_desc->Type, &tmp, D3DXPT_FLOAT);
2144 
2145                 ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n",
2146                         i, res_full_name, hr, D3D_OK);
2147             }
2148             else
2149             {
2150                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n",
2151                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2152             }
2153             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2154             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2155 
2156             /* SetIntArray */
2157             *input_value = 123456;
2158             for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2159             {
2160                 *(input_value + l) = *(input_value + l - 1) + 23;
2161             }
2162             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2163             hr = effect->lpVtbl->SetIntArray(effect, parameter, (INT *)input_value, res_desc->Bytes / sizeof(*input_value));
2164             if (res_desc->Class == D3DXPC_SCALAR
2165                     || res_desc->Class == D3DXPC_VECTOR
2166                     || res_desc->Class == D3DXPC_MATRIX_ROWS)
2167             {
2168                 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2169                 {
2170                     set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_INT);
2171                 }
2172                 ok(hr == D3D_OK, "%u - %s: SetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2173             }
2174             else
2175             {
2176                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n",
2177                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2178             }
2179             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2180             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2181 
2182             /* SetFloat */
2183             fvalue = 1.33;
2184             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2185             hr = effect->lpVtbl->SetFloat(effect, parameter, fvalue);
2186             if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
2187             {
2188                 set_number(expected_value, res_desc->Type, &fvalue, D3DXPT_FLOAT);
2189                 ok(hr == D3D_OK, "%u - %s: SetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2190             }
2191             else
2192             {
2193                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n",
2194                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2195             }
2196             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2197             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2198 
2199             /* SetFloatArray */
2200             fvalue = 1.33;
2201             for (l = 0; l < res_desc->Bytes / sizeof(fvalue); ++l)
2202             {
2203                 *(input_value + l) = *(DWORD *)&fvalue;
2204                 fvalue += 1.12;
2205             }
2206             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2207             hr = effect->lpVtbl->SetFloatArray(effect, parameter, (FLOAT *)input_value, res_desc->Bytes / sizeof(*input_value));
2208             if (res_desc->Class == D3DXPC_SCALAR
2209                     || res_desc->Class == D3DXPC_VECTOR
2210                     || res_desc->Class == D3DXPC_MATRIX_ROWS)
2211             {
2212                 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2213                 {
2214                     set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT);
2215                 }
2216                 ok(hr == D3D_OK, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2217             }
2218             else
2219             {
2220                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n",
2221                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2222             }
2223             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2224             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2225 
2226             /* SetVector */
2227             fvalue = -1.33;
2228             for (l = 0; l < 4; ++l)
2229             {
2230                 *(input_value + l) = *(DWORD *)&fvalue;
2231                 fvalue += 1.12;
2232             }
2233             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2234             hr = effect->lpVtbl->SetVector(effect, parameter, (D3DXVECTOR4 *)input_value);
2235             if (!res_desc->Elements &&
2236                     (res_desc->Class == D3DXPC_SCALAR
2237                     || res_desc->Class == D3DXPC_VECTOR))
2238             {
2239                 /* only values between 0 and INT_FLOAT_MULTI are valid */
2240                 if (res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
2241                 {
2242                     *expected_value = (DWORD)(max(min(*(FLOAT *)(input_value + 2), 1.0f), 0.0f) * INT_FLOAT_MULTI);
2243                     *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 1), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 8;
2244                     *expected_value += ((DWORD)(max(min(*(FLOAT *)input_value, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16;
2245                     *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 3), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24;
2246                 }
2247                 else
2248                 {
2249                     for (l = 0; l < 4; ++l)
2250                     {
2251                         set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT);
2252                     }
2253                 }
2254                 ok(hr == D3D_OK, "%u - %s: SetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2255             }
2256             else
2257             {
2258                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n",
2259                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2260             }
2261             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2262             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2263 
2264             /* SetVectorArray */
2265             for (element = 0; element < res_desc->Elements + 1; ++element)
2266             {
2267                 fvalue = 1.33;
2268                 for (l = 0; l < element * 4; ++l)
2269                 {
2270                     *(input_value + l) = *(DWORD *)&fvalue;
2271                     fvalue += 1.12;
2272                 }
2273                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2274                 hr = effect->lpVtbl->SetVectorArray(effect, parameter, (D3DXVECTOR4 *)input_value, element);
2275                 if (res_desc->Elements && res_desc->Class == D3DXPC_VECTOR && element <= res_desc->Elements)
2276                 {
2277                     for (m = 0; m < element; ++m)
2278                     {
2279                         for (l = 0; l < res_desc->Columns; ++l)
2280                         {
2281                             set_number(expected_value + m * res_desc->Columns + l, res_desc->Type, input_value + m * 4 + l, D3DXPT_FLOAT);
2282                         }
2283                     }
2284                     ok(hr == D3D_OK, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2285                 }
2286                 else
2287                 {
2288                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n",
2289                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2290                 }
2291                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2292                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2293             }
2294 
2295             /* SetMatrix */
2296             fvalue = 1.33;
2297             for (l = 0; l < 16; ++l)
2298             {
2299                 *(input_value + l) = *(DWORD *)&fvalue;
2300                 fvalue += 1.12;
2301             }
2302             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2303             hr = effect->lpVtbl->SetMatrix(effect, parameter, (D3DXMATRIX *)input_value);
2304             if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
2305             {
2306                 for (l = 0; l < 4; ++l)
2307                 {
2308                     for (m = 0; m < 4; ++m)
2309                     {
2310                         if (m < res_desc->Rows && l < res_desc->Columns)
2311                             set_number(expected_value + l + m * res_desc->Columns, res_desc->Type,
2312                                     input_value + l + m * 4, D3DXPT_FLOAT);
2313                     }
2314 
2315                 }
2316                 ok(hr == D3D_OK, "%u - %s: SetMatrix failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2317             }
2318             else
2319             {
2320                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n",
2321                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2322             }
2323             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2324             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2325 
2326             /* SetMatrixArray */
2327             for (element = 0; element < res_desc->Elements + 1; ++element)
2328             {
2329                 fvalue = 1.33;
2330                 for (l = 0; l < element * 16; ++l)
2331                 {
2332                     *(input_value + l) = *(DWORD *)&fvalue;
2333                     fvalue += 1.12;
2334                 }
2335                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2336                 hr = effect->lpVtbl->SetMatrixArray(effect, parameter, (D3DXMATRIX *)input_value, element);
2337                 if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements)
2338                 {
2339                     for (n = 0; n < element; ++n)
2340                     {
2341                         for (l = 0; l < 4; ++l)
2342                         {
2343                             for (m = 0; m < 4; ++m)
2344                             {
2345                                 if (m < res_desc->Rows && l < res_desc->Columns)
2346                                     set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2347                                             res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT);
2348                             }
2349 
2350                         }
2351                     }
2352                     ok(hr == D3D_OK, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2353                 }
2354                 else
2355                 {
2356                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n",
2357                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2358                 }
2359                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2360                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2361             }
2362 
2363             /* SetMatrixPointerArray */
2364             for (element = 0; element < res_desc->Elements + 1; ++element)
2365             {
2366                 fvalue = 1.33;
2367                 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
2368                 {
2369                     *(input_value + l) = *(DWORD *)&fvalue;
2370                     fvalue += 1.12;
2371                 }
2372                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2373                 for (l = 0; l < element; ++l)
2374                 {
2375                     matrix_pointer_array[l] = (D3DXMATRIX *)&input_value[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
2376                 }
2377                 hr = effect->lpVtbl->SetMatrixPointerArray(effect, parameter, matrix_pointer_array, element);
2378                 if (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Elements >= element)
2379                 {
2380                     for (n = 0; n < element; ++n)
2381                     {
2382                         for (l = 0; l < 4; ++l)
2383                         {
2384                             for (m = 0; m < 4; ++m)
2385                             {
2386                                 if (m < res_desc->Rows && l < res_desc->Columns)
2387                                     set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2388                                             res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT);
2389                             }
2390 
2391                         }
2392                     }
2393                     ok(hr == D3D_OK, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
2394                             i, res_full_name, hr, D3D_OK);
2395                 }
2396                 else
2397                 {
2398                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
2399                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2400                 }
2401                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2402                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2403             }
2404 
2405             /* SetMatrixTranspose */
2406             fvalue = 1.33;
2407             for (l = 0; l < 16; ++l)
2408             {
2409                 *(input_value + l) = *(DWORD *)&fvalue;
2410                 fvalue += 1.12;
2411             }
2412             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2413             hr = effect->lpVtbl->SetMatrixTranspose(effect, parameter, (D3DXMATRIX *)input_value);
2414             if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
2415             {
2416                 for (l = 0; l < 4; ++l)
2417                 {
2418                     for (m = 0; m < 4; ++m)
2419                     {
2420                         if (m < res_desc->Rows && l < res_desc->Columns)
2421                             set_number(expected_value + l + m * res_desc->Columns, res_desc->Type,
2422                                     input_value + l * 4 + m, D3DXPT_FLOAT);
2423                     }
2424 
2425                 }
2426                 ok(hr == D3D_OK, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2427             }
2428             else
2429             {
2430                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n",
2431                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2432             }
2433             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2434             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2435 
2436             /* SetMatrixTransposeArray */
2437             for (element = 0; element < res_desc->Elements + 1; ++element)
2438             {
2439                 fvalue = 1.33;
2440                 for (l = 0; l < element * 16; ++l)
2441                 {
2442                     *(input_value + l) = *(DWORD *)&fvalue;
2443                     fvalue += 1.12;
2444                 }
2445                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2446                 hr = effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)input_value, element);
2447                 if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements)
2448                 {
2449                     for (n = 0; n < element; ++n)
2450                     {
2451                         for (l = 0; l < 4; ++l)
2452                         {
2453                             for (m = 0; m < 4; ++m)
2454                             {
2455                                 if (m < res_desc->Rows && l < res_desc->Columns)
2456                                     set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2457                                             res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT);
2458                             }
2459 
2460                         }
2461                     }
2462                     ok(hr == D3D_OK, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2463                 }
2464                 else
2465                 {
2466                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n",
2467                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2468                 }
2469                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2470                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2471             }
2472 
2473             /* SetMatrixTransposePointerArray */
2474             for (element = 0; element < res_desc->Elements + 1; ++element)
2475             {
2476                 fvalue = 1.33;
2477                 for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
2478                 {
2479                     *(input_value + l) = *(DWORD *)&fvalue;
2480                     fvalue += 1.12;
2481                 }
2482                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2483                 for (l = 0; l < element; ++l)
2484                 {
2485                     matrix_pointer_array[l] = (D3DXMATRIX *)&input_value[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
2486                 }
2487                 hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, parameter, matrix_pointer_array, element);
2488                 if (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Elements >= element)
2489                 {
2490                     for (n = 0; n < element; ++n)
2491                     {
2492                         for (l = 0; l < 4; ++l)
2493                         {
2494                             for (m = 0; m < 4; ++m)
2495                             {
2496                                 if (m < res_desc->Rows && l < res_desc->Columns)
2497                                     set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2498                                             res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT);
2499                             }
2500 
2501                         }
2502                     }
2503                     ok(hr == D3D_OK, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2504                             i, res_full_name, hr, D3D_OK);
2505                 }
2506                 else
2507                 {
2508                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2509                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2510                 }
2511                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2512                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2513             }
2514         }
2515 
2516         count = effect->lpVtbl->Release(effect);
2517         ok(!count, "Release failed %u\n", count);
2518     }
2519 }
2520 
2521 static void test_effect_setvalue_object(IDirect3DDevice9 *device)
2522 {
2523     static const char expected_string[] = "test_string_1";
2524     static const char expected_string2[] = "test_longer_string_2";
2525     static const char *expected_string_array[] = {expected_string, expected_string2};
2526     const char *string_array[ARRAY_SIZE(expected_string_array)];
2527     const char *string, *string2;
2528     IDirect3DTexture9 *texture_set;
2529     IDirect3DTexture9 *texture;
2530     D3DXHANDLE parameter;
2531     ID3DXEffect *effect;
2532     unsigned int i;
2533     ULONG count;
2534     HRESULT hr;
2535 
2536     hr = D3DXCreateEffect(device, test_effect_parameter_value_blob_object,
2537             sizeof(test_effect_parameter_value_blob_object), NULL, NULL, 0, NULL, &effect, NULL);
2538     ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2539 
2540     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "tex");
2541     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2542 
2543     texture = NULL;
2544     hr = D3DXCreateTexture(device, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, 0, D3DPOOL_DEFAULT, &texture);
2545     ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2546     hr = effect->lpVtbl->SetValue(effect, parameter, &texture, sizeof(texture));
2547     ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2548     texture_set = NULL;
2549     hr = effect->lpVtbl->GetValue(effect, parameter, &texture_set, sizeof(texture_set));
2550     ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2551     ok(texture == texture_set, "Texture does not match.\n");
2552 
2553     count = IDirect3DTexture9_Release(texture_set);
2554     ok(count == 2, "Got reference count %u, expected 2.\n", count);
2555     texture_set = NULL;
2556     hr = effect->lpVtbl->SetValue(effect, parameter, &texture_set, sizeof(texture_set));
2557     ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2558     count = IDirect3DTexture9_Release(texture);
2559     ok(!count, "Got reference count %u, expected 0.\n", count);
2560 
2561     hr = effect->lpVtbl->SetString(effect, "s", expected_string);
2562     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2563     string = NULL;
2564     hr = effect->lpVtbl->GetString(effect, "s", &string);
2565     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2566     hr = effect->lpVtbl->GetString(effect, "s", &string2);
2567     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2568 
2569     ok(string != expected_string, "String pointers are the same.\n");
2570     ok(string == string2, "String pointers differ.\n");
2571     ok(!strcmp(string, expected_string), "Unexpected string '%s'.\n", string);
2572 
2573     string = expected_string2;
2574     hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string) - 1);
2575     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
2576     hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string));
2577     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2578     hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string) * 2);
2579     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2580     string = NULL;
2581     hr = effect->lpVtbl->GetValue(effect, "s", &string, sizeof(string));
2582     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2583 
2584     ok(string != expected_string2, "String pointers are the same.\n");
2585     ok(!strcmp(string, expected_string2), "Unexpected string '%s'.\n", string);
2586 
2587     hr = effect->lpVtbl->SetValue(effect, "s_2", expected_string_array,
2588             sizeof(expected_string_array));
2589     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2590     hr = effect->lpVtbl->GetValue(effect, "s_2", string_array,
2591             sizeof(string_array));
2592     ok(hr == D3D_OK, "Got result %#x.\n", hr);
2593     for (i = 0; i < ARRAY_SIZE(expected_string_array); ++i)
2594     {
2595         ok(!strcmp(string_array[i], expected_string_array[i]), "Unexpected string '%s', i %u.\n",
2596                 string_array[i], i);
2597     }
2598     effect->lpVtbl->Release(effect);
2599 }
2600 
2601 /*
2602  * fxc.exe /Tfx_2_0
2603  */
2604 #if 0
2605 float a = 2.1;
2606 float b[1];
2607 float c <float d = 3;>;
2608 struct {float e;} f;
2609 float g <float h[1] = {3};>;
2610 struct s {float j;};
2611 float i <s k[1] = {4};>;
2612 technique t <s l[1] = {5};> { pass p <s m[1] = {6};> { } }
2613 #endif
2614 static const DWORD test_effect_variable_names_blob[] =
2615 {
2616 0xfeff0901, 0x0000024c, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
2617 0x00000001, 0x00000001, 0x40066666, 0x00000002, 0x00000061, 0x00000003, 0x00000000, 0x0000004c,
2618 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000062, 0x00000003,
2619 0x00000000, 0x0000009c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x40400000,
2620 0x00000003, 0x00000000, 0x00000094, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002,
2621 0x00000064, 0x00000002, 0x00000063, 0x00000000, 0x00000005, 0x000000dc, 0x00000000, 0x00000000,
2622 0x00000001, 0x00000003, 0x00000000, 0x000000e4, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
2623 0x00000000, 0x00000002, 0x00000066, 0x00000002, 0x00000065, 0x00000003, 0x00000000, 0x00000134,
2624 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x40400000, 0x00000003, 0x00000000,
2625 0x0000012c, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000068, 0x00000002,
2626 0x00000067, 0x00000003, 0x00000000, 0x000001a4, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
2627 0x00000000, 0x40800000, 0x00000000, 0x00000005, 0x00000194, 0x00000000, 0x00000001, 0x00000001,
2628 0x00000003, 0x00000000, 0x0000019c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002,
2629 0x0000006b, 0x00000002, 0x0000006a, 0x00000002, 0x00000069, 0x40a00000, 0x00000000, 0x00000005,
2630 0x000001e4, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000000, 0x000001ec, 0x00000000,
2631 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x0000006c, 0x00000002, 0x0000006a, 0x40c00000,
2632 0x00000000, 0x00000005, 0x0000022c, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000000,
2633 0x00000234, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x0000006d, 0x00000002,
2634 0x0000006a, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001, 0x00000001,
2635 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000,
2636 0x00000000, 0x00000054, 0x00000070, 0x00000000, 0x00000001, 0x00000078, 0x00000074, 0x000000a4,
2637 0x000000d8, 0x00000000, 0x00000000, 0x000000ec, 0x00000108, 0x00000000, 0x00000001, 0x00000110,
2638 0x0000010c, 0x0000013c, 0x00000158, 0x00000000, 0x00000001, 0x00000160, 0x0000015c, 0x00000244,
2639 0x00000001, 0x00000001, 0x000001b0, 0x000001ac, 0x0000023c, 0x00000001, 0x00000000, 0x000001f8,
2640 0x000001f4, 0x00000000, 0x00000000,
2641 };
2642 
2643 static void test_effect_variable_names(IDirect3DDevice9 *device)
2644 {
2645     ID3DXEffect *effect;
2646     ULONG count;
2647     HRESULT hr;
2648     D3DXHANDLE parameter, p;
2649 
2650     hr = D3DXCreateEffect(device, test_effect_variable_names_blob,
2651             sizeof(test_effect_variable_names_blob), NULL, NULL, 0, NULL, &effect, NULL);
2652     ok(hr == D3D_OK, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3D_OK);
2653 
2654     /*
2655      * check invalid calls
2656      * This will crash:
2657      * effect->lpVtbl->GetAnnotationByName(effect, "invalid1", "invalid2");
2658      */
2659     p = effect->lpVtbl->GetParameterByName(effect, NULL, NULL);
2660     ok(p == NULL, "GetParameterByName failed, got %p, expected %p\n", p, NULL);
2661 
2662     p = effect->lpVtbl->GetParameterByName(effect, NULL, "invalid1");
2663     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2664 
2665     p = effect->lpVtbl->GetParameterByName(effect, "invalid1", NULL);
2666     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2667 
2668     p = effect->lpVtbl->GetParameterByName(effect, "invalid1", "invalid2");
2669     ok(p == NULL, "GetParameterByName failed, got %p, expected %p\n", p, NULL);
2670 
2671     /* float a; */
2672     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "a");
2673     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2674 
2675     p = effect->lpVtbl->GetParameterByName(effect, "a", NULL);
2676     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2677 
2678     /* members */
2679     p = effect->lpVtbl->GetParameterByName(effect, NULL, "a.");
2680     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2681 
2682     p = effect->lpVtbl->GetParameterByName(effect, "a.", NULL);
2683     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2684 
2685     p = effect->lpVtbl->GetParameterByName(effect, "a", ".");
2686     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2687 
2688     p = effect->lpVtbl->GetParameterByName(effect, NULL, "a.invalid");
2689     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2690 
2691     p = effect->lpVtbl->GetParameterByName(effect, "a.invalid", NULL);
2692     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2693 
2694     p = effect->lpVtbl->GetParameterByName(effect, "a", ".invalid");
2695     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2696 
2697     p = effect->lpVtbl->GetParameterByName(effect, "a.", "invalid");
2698     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2699 
2700     p = effect->lpVtbl->GetParameterByName(effect, "a", "invalid");
2701     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2702 
2703     /* elements */
2704     p = effect->lpVtbl->GetParameterByName(effect, NULL, "a[]");
2705     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2706 
2707     p = effect->lpVtbl->GetParameterByName(effect, "a[]", NULL);
2708     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2709 
2710     p = effect->lpVtbl->GetParameterByName(effect, NULL, "a[0]");
2711     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2712 
2713     p = effect->lpVtbl->GetParameterByName(effect, "a[0]", NULL);
2714     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2715 
2716     p = effect->lpVtbl->GetParameterByName(effect, "a", "[0]");
2717     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2718 
2719     p = effect->lpVtbl->GetParameterElement(effect, "a", 0);
2720     ok(p == NULL, "GetParameterElement failed, got %p\n", p);
2721 
2722     /* annotations */
2723     p = effect->lpVtbl->GetParameterByName(effect, NULL, "a@");
2724     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2725 
2726     p = effect->lpVtbl->GetParameterByName(effect, "a@", NULL);
2727     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2728 
2729     p = effect->lpVtbl->GetParameterByName(effect, "a", "@invalid");
2730     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2731 
2732     p = effect->lpVtbl->GetParameterByName(effect, "a@", "invalid");
2733     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2734 
2735     p = effect->lpVtbl->GetParameterByName(effect, NULL, "a@invalid");
2736     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2737 
2738     p = effect->lpVtbl->GetParameterByName(effect, "a@invalid", NULL);
2739     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2740 
2741     p = effect->lpVtbl->GetAnnotationByName(effect, "a", NULL);
2742     ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2743 
2744     p = effect->lpVtbl->GetAnnotationByName(effect, "a", "invalid");
2745     ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2746 
2747     p = effect->lpVtbl->GetAnnotation(effect, "a", 0);
2748     ok(p == NULL, "GetAnnotation failed, got %p\n", p);
2749 
2750     /* float b[1]; */
2751     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "b");
2752     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2753 
2754     p = effect->lpVtbl->GetParameterByName(effect, "b", NULL);
2755     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2756 
2757     /* elements */
2758     p = effect->lpVtbl->GetParameterByName(effect, NULL, "b[]");
2759     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2760 
2761     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "b[0]");
2762     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2763 
2764     p = effect->lpVtbl->GetParameterByName(effect, "b[0]", NULL);
2765     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2766 
2767     p = effect->lpVtbl->GetParameterElement(effect, "b", 0);
2768     ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2769 
2770     p = effect->lpVtbl->GetParameterByName(effect, "b", "[0]");
2771     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2772 
2773     p = effect->lpVtbl->GetParameterByName(effect, NULL, "b[1]");
2774     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2775 
2776     p = effect->lpVtbl->GetParameterElement(effect, "b", 1);
2777     ok(p == NULL, "GetParameterElement failed, got %p\n", p);
2778 
2779     /* float c <float d = 3;>; */
2780     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "c");
2781     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2782 
2783     p = effect->lpVtbl->GetParameterByName(effect, "c", NULL);
2784     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2785 
2786     /* annotations */
2787     p = effect->lpVtbl->GetParameterByName(effect, "c", "@d");
2788     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2789 
2790     p = effect->lpVtbl->GetParameterByName(effect, "c@", "d");
2791     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2792 
2793     p = effect->lpVtbl->GetParameterByName(effect, NULL, "c@invalid");
2794     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2795 
2796     p = effect->lpVtbl->GetParameterByName(effect, "c@invalid", NULL);
2797     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2798 
2799     p = effect->lpVtbl->GetAnnotationByName(effect, "c", NULL);
2800     ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2801 
2802     p = effect->lpVtbl->GetAnnotationByName(effect, "c", "invalid");
2803     ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2804 
2805     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "c@d");
2806     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2807 
2808     p = effect->lpVtbl->GetParameterByName(effect, "c@d", NULL);
2809     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2810 
2811     p = effect->lpVtbl->GetAnnotationByName(effect, "c", "d");
2812     ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter);
2813 
2814     p = effect->lpVtbl->GetAnnotation(effect, "c", 0);
2815     ok(parameter == p, "GetAnnotation failed, got %p, expected %p\n", p, parameter);
2816 
2817     p = effect->lpVtbl->GetAnnotation(effect, "c", 1);
2818     ok(p == NULL, "GetAnnotation failed, got %p\n", p);
2819 
2820     /* struct {float e;} f; */
2821     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "f");
2822     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2823 
2824     p = effect->lpVtbl->GetParameterByName(effect, "f", NULL);
2825     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2826 
2827     /* members */
2828     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "f.e");
2829     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2830 
2831     p = effect->lpVtbl->GetParameterByName(effect, "f.e", NULL);
2832     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2833 
2834     p = effect->lpVtbl->GetParameterByName(effect, "f", "e");
2835     ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2836 
2837     p = effect->lpVtbl->GetParameterByName(effect, "f", ".e");
2838     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2839 
2840     p = effect->lpVtbl->GetParameterByName(effect, "f.", "e");
2841     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2842 
2843     p = effect->lpVtbl->GetParameterByName(effect, "f.invalid", NULL);
2844     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2845 
2846     p = effect->lpVtbl->GetParameterByName(effect, NULL, "f.invalid");
2847     ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2848 
2849     /* float g <float h[1] = {3};>; */
2850     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "g@h[0]");
2851     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2852 
2853     p = effect->lpVtbl->GetAnnotationByName(effect, "g", "h[0]");
2854     ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter);
2855 
2856     p = effect->lpVtbl->GetParameterElement(effect, "g@h", 0);
2857     ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2858 
2859     p = effect->lpVtbl->GetParameterElement(effect, effect->lpVtbl->GetAnnotation(effect, "g", 0), 0);
2860     ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2861 
2862     /* struct s {float j;}; float i <s k[1] = {4};>; */
2863     parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "i@k[0].j");
2864     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2865 
2866     p = effect->lpVtbl->GetAnnotationByName(effect, "i", "k[0].j");
2867     ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter);
2868 
2869     p = effect->lpVtbl->GetParameterByName(effect, effect->lpVtbl->GetParameterElement(effect, "i@k", 0), "j");
2870     ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2871 
2872     /* technique t <s l[1] = {5};> */
2873     parameter = effect->lpVtbl->GetAnnotationByName(effect, "t", "l[0].j");
2874     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2875 
2876     /* pass p <s m[1] = {6};> */
2877     parameter = effect->lpVtbl->GetAnnotationByName(effect, effect->lpVtbl->GetPassByName(effect, "t", "p"), "m[0].j");
2878     ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2879 
2880     count = effect->lpVtbl->Release(effect);
2881     ok(!count, "Release failed %u\n", count);
2882 }
2883 
2884 static void test_effect_compilation_errors(IDirect3DDevice9 *device)
2885 {
2886     ID3DXEffect *effect;
2887     ID3DXBuffer *compilation_errors;
2888     HRESULT hr;
2889 
2890     /* Test binary effect */
2891     compilation_errors = (ID3DXBuffer*)0xdeadbeef;
2892     hr = D3DXCreateEffect(NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, &compilation_errors);
2893     ok(hr == D3DERR_INVALIDCALL, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
2894     ok(!compilation_errors, "Returned %p\n", compilation_errors);
2895 
2896     compilation_errors = (ID3DXBuffer*)0xdeadbeef;
2897     hr = D3DXCreateEffect(device, test_effect_variable_names_blob,
2898             sizeof(test_effect_variable_names_blob), NULL, NULL, 0, NULL, &effect, &compilation_errors);
2899     ok(hr == D3D_OK, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3D_OK);
2900     ok(!compilation_errors, "Returned %p\n", compilation_errors);
2901     effect->lpVtbl->Release(effect);
2902 }
2903 
2904 /*
2905  * fxc.exe /Tfx_2_0
2906  */
2907 #if 0
2908 vertexshader vs_arr1[2] =
2909 {
2910     asm
2911     {
2912         vs_1_1
2913         def c0, 1, 1, 1, 1
2914         mov oPos, c0
2915     },
2916     asm
2917     {
2918         vs_2_0
2919         def c0, 2, 2, 2, 2
2920         mov oPos, c0
2921     }
2922 };
2923 
2924 sampler sampler1 =
2925     sampler_state
2926     {
2927         MipFilter = LINEAR;
2928     };
2929 
2930 float4x4 camera : VIEW = {4.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,6.0};
2931 technique tech0
2932 {
2933    pass p0
2934    {
2935        vertexshader = vs_arr1[1];
2936        VertexShaderConstant1[1] = 3.0f;
2937        VertexShaderConstant4[2] = 1;
2938        VertexShaderConstant1[3] = {2, 2, 2, 2};
2939        VertexShaderConstant4[4] = {4, 4, 4, 4, 5, 5, 5, 5, 6};
2940        BlendOp = 2;
2941        AlphaOp[3] = 4;
2942        ZEnable = true;
2943        WorldTransform[1]={2.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0, 0.0,0.0,0.0,4.0};
2944        ViewTransform=(camera);
2945        LightEnable[2] = TRUE;
2946        LightType[2] = POINT;
2947        LightPosition[2] = {4.0f, 5.0f, 6.0f};
2948        Sampler[1] = sampler1;
2949    }
2950 }
2951 #endif
2952 static const DWORD test_effect_states_effect_blob[] =
2953 {
2954     0xfeff0901, 0x00000368, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002,
2955     0x00000001, 0x00000002, 0x00000008, 0x615f7376, 0x00317272, 0x0000000a, 0x00000004, 0x00000074,
2956     0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
2957     0x00000001, 0x00000001, 0x00000001, 0x000000ab, 0x00000100, 0x00000044, 0x00000040, 0x00000009,
2958     0x706d6173, 0x3172656c, 0x00000000, 0x00000003, 0x00000002, 0x000000e0, 0x000000ec, 0x00000000,
2959     0x00000004, 0x00000004, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2960     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2961     0x00000000, 0x40c00000, 0x00000007, 0x656d6163, 0x00006172, 0x00000005, 0x57454956, 0x00000000,
2962     0x00000003, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000003,
2963     0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f800000, 0x00000003,
2964     0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x40000000, 0x40000000,
2965     0x40000000, 0x40000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000004,
2966     0x00000001, 0x40800000, 0x40800000, 0x40800000, 0x40800000, 0x40a00000, 0x40a00000, 0x40a00000,
2967     0x40a00000, 0x40c00000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000009,
2968     0x00000001, 0x00000002, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
2969     0x00000001, 0x00000004, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
2970     0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
2971     0x00000001, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2972     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2973     0x40800000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0x00000001,
2974     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2975     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2976     0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000001,
2977     0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001,
2978     0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x40800000,
2979     0x40a00000, 0x40c00000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
2980     0x00000001, 0x00000000, 0x0000000a, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
2981     0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000001, 0x00000005, 0x00000004,
2982     0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c, 0x00000060, 0x00000000, 0x00000000,
2983     0x00000084, 0x000000a0, 0x00000000, 0x00000000, 0x0000035c, 0x00000000, 0x00000001, 0x00000354,
2984     0x00000000, 0x0000000e, 0x00000092, 0x00000000, 0x000000fc, 0x000000f8, 0x00000098, 0x00000001,
2985     0x00000114, 0x00000110, 0x0000009b, 0x00000002, 0x00000134, 0x00000130, 0x00000098, 0x00000003,
2986     0x00000160, 0x00000150, 0x0000009b, 0x00000004, 0x000001a0, 0x0000017c, 0x0000004b, 0x00000000,
2987     0x000001c0, 0x000001bc, 0x0000006b, 0x00000003, 0x000001e0, 0x000001dc, 0x00000000, 0x00000000,
2988     0x00000200, 0x000001fc, 0x0000007d, 0x00000001, 0x0000025c, 0x0000021c, 0x0000007c, 0x00000000,
2989     0x000002b8, 0x00000278, 0x00000091, 0x00000002, 0x000002d8, 0x000002d4, 0x00000084, 0x00000002,
2990     0x000002f8, 0x000002f4, 0x00000088, 0x00000002, 0x00000320, 0x00000314, 0x000000b2, 0x00000001,
2991     0x00000340, 0x0000033c, 0x00000002, 0x00000003, 0x00000001, 0x0000002c, 0xfffe0101, 0x00000051,
2992     0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000001, 0xc00f0000, 0xa0e40000,
2993     0x0000ffff, 0x00000002, 0x0000002c, 0xfffe0200, 0x05000051, 0xa00f0000, 0x40000000, 0x40000000,
2994     0x40000000, 0x40000000, 0x02000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000000, 0x00000000,
2995     0xffffffff, 0x0000000d, 0x00000001, 0x00000009, 0x706d6173, 0x3172656c, 0x00000000, 0x00000000,
2996     0x00000000, 0xffffffff, 0x00000009, 0x00000000, 0x0000016c, 0x46580200, 0x0030fffe, 0x42415443,
2997     0x0000001c, 0x0000008b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000088, 0x00000030,
2998     0x00000002, 0x00000004, 0x00000038, 0x00000048, 0x656d6163, 0xab006172, 0x00030003, 0x00040004,
2999     0x00000001, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3000     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3001     0x00000000, 0x40c00000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
3002     0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
3003     0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10000004, 0x00000001, 0x00000000,
3004     0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10000004, 0x00000001, 0x00000000,
3005     0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000004, 0x10000004, 0x00000001, 0x00000000,
3006     0x00000002, 0x00000008, 0x00000000, 0x00000004, 0x00000008, 0x10000004, 0x00000001, 0x00000000,
3007     0x00000002, 0x0000000c, 0x00000000, 0x00000004, 0x0000000c, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
3008     0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000001, 0x0000000b, 0x615f7376, 0x5b317272,
3009     0x00005d31,
3010 };
3011 #define TEST_EFFECT_STATES_VSHADER_POS 315
3012 
3013 static const D3DXVECTOR4 fvect_filler = {-9999.0f, -9999.0f, -9999.0f, -9999.0f};
3014 
3015 static void test_effect_clear_vconsts(IDirect3DDevice9 *device)
3016 {
3017     unsigned int i;
3018     HRESULT hr;
3019 
3020     for (i = 0; i < 256; ++i)
3021     {
3022         hr = IDirect3DDevice9_SetVertexShaderConstantF(device, i, &fvect_filler.x, 1);
3023         ok(hr == D3D_OK, "Got result %#x.\n", hr);
3024     }
3025 }
3026 
3027 static void test_effect_states(IDirect3DDevice9 *device)
3028 {
3029     static const D3DMATRIX test_mat =
3030     {{{
3031         -1.0f, 0.0f, 0.0f, 0.0f,
3032         0.0f, 0.0f, 0.0f, 0.0f,
3033         0.0f, 0.0f, 0.0f, 0.0f,
3034         0.0f, 0.0f, 0.0f, 0.0f
3035     }}};
3036     static const D3DMATRIX test_mat_camera =
3037     {{{
3038         4.0f, 0.0f, 0.0f, 0.0f,
3039         0.0f, 0.0f, 0.0f, 0.0f,
3040         0.0f, 0.0f, 0.0f, 0.0f,
3041         0.0f, 0.0f, 0.0f, 6.0f
3042     }}};
3043     static const D3DMATRIX test_mat_world1 =
3044     {{{
3045         2.0f, 0.0f, 0.0f, 0.0f,
3046         0.0f, 0.0f, 0.0f, 0.0f,
3047         0.0f, 0.0f, 0.0f, 0.0f,
3048         0.0f, 0.0f, 0.0f, 4.0f
3049     }}};
3050 
3051     IDirect3DVertexShader9 *vshader;
3052     ID3DXEffect *effect;
3053     UINT byte_code_size;
3054     D3DXVECTOR4 fvect;
3055     void *byte_code;
3056     D3DLIGHT9 light;
3057     D3DMATRIX mat;
3058     UINT npasses;
3059     DWORD value;
3060     HRESULT hr;
3061     BOOL bval;
3062 
3063     hr = D3DXCreateEffect(device, test_effect_states_effect_blob, sizeof(test_effect_states_effect_blob),
3064             NULL, NULL, 0, NULL, &effect, NULL);
3065     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3066 
3067     /* State affected in passes saved/restored even if no pass
3068        was performed. States not present in passes are not saved &
3069        restored */
3070     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 1);
3071     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3072     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ALPHAFUNC, 1);
3073     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3074 
3075     hr = effect->lpVtbl->Begin(effect, &npasses, 0);
3076     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3077     ok(npasses == 1, "Expected 1 pass, got %u\n", npasses);
3078 
3079     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 3);
3080     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3081     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ALPHAFUNC, 2);
3082     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3083 
3084     hr = effect->lpVtbl->End(effect);
3085     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3086 
3087     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value);
3088     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3089     ok(value == 1, "Got result %u, expected %u.\n", value, 1);
3090     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_ALPHAFUNC, &value);
3091     ok(value == 2, "Got result %u, expected %u.\n", value, 2);
3092 
3093     /* Test states application in BeginPass. No states are restored
3094        on EndPass. */
3095     hr = IDirect3DDevice9_SetSamplerState(device, 1, D3DSAMP_MIPFILTER, 0);
3096     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3097     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, 0);
3098     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3099 
3100     hr = IDirect3DDevice9_GetLightEnable(device, 2, &bval);
3101     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3102     if (hr == D3D_OK)
3103         ok(!bval, "Got result %u, expected 0.\n", bval);
3104 
3105     hr = IDirect3DDevice9_SetTransform(device, D3DTS_WORLDMATRIX(1), &test_mat);
3106     hr = effect->lpVtbl->Begin(effect, NULL, 0);
3107     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3108 
3109     hr = IDirect3DDevice9_GetTransform(device, D3DTS_WORLDMATRIX(1), &mat);
3110     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3111     ok(!memcmp(mat.m, test_mat.m, sizeof(mat)), "World matrix does not match.\n");
3112 
3113     test_effect_clear_vconsts(device);
3114 
3115     hr = effect->lpVtbl->BeginPass(effect, 0);
3116     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3117 
3118     hr = IDirect3DDevice9_GetTransform(device, D3DTS_WORLDMATRIX(1), &mat);
3119     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3120     ok(!memcmp(mat.m, test_mat_world1.m, sizeof(mat)), "World matrix does not match.\n");
3121 
3122     hr = IDirect3DDevice9_GetTransform(device, D3DTS_VIEW, &mat);
3123     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3124     ok(!memcmp(mat.m, test_mat_camera.m, sizeof(mat)), "View matrix does not match.\n");
3125 
3126     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value);
3127     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3128     ok(value == 2, "Got result %u, expected %u\n", value, 2);
3129 
3130     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
3131     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3132     ok(vshader != NULL, "Got NULL vshader.\n");
3133     if (vshader)
3134     {
3135         hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
3136         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3137         byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
3138         hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
3139         ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3140         ok(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size);
3141         ok(!memcmp(byte_code, &test_effect_states_effect_blob[TEST_EFFECT_STATES_VSHADER_POS], byte_code_size),
3142             "Incorrect shader selected.\n");
3143         HeapFree(GetProcessHeap(), 0, byte_code);
3144         IDirect3DVertexShader9_Release(vshader);
3145     }
3146 
3147     hr = IDirect3DDevice9_GetLightEnable(device, 2, &bval);
3148     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3149     if (hr == D3D_OK)
3150         ok(bval, "Got result %u, expected TRUE.\n", bval);
3151     hr = IDirect3DDevice9_GetLight(device, 2, &light);
3152     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3153     if (hr == D3D_OK)
3154         ok(light.Position.x == 4.0f && light.Position.y == 5.0f && light.Position.z == 6.0f,
3155                 "Got unexpected light position (%f, %f, %f).\n", light.Position.x, light.Position.y, light.Position.z);
3156 
3157     /* Testing first value only for constants 1, 2 as the rest of the vector seem to
3158      * contain garbage data on native. */
3159     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 1, &fvect.x, 1);
3160     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3161     ok(fvect.x == 3.0f, "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3162             fvect.x, fvect.y, fvect.z, fvect.w);
3163     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 2, &fvect.x, 1);
3164     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3165     ok(fvect.x == 1.0f, "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3166             fvect.x, fvect.y, fvect.z, fvect.w);
3167 
3168     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 3, &fvect.x, 1);
3169     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3170     ok(fvect.x == 2.0f && fvect.y == 2.0f && fvect.z == 2.0f && fvect.w == 2.0f,
3171             "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3172             fvect.x, fvect.y, fvect.z, fvect.w);
3173 
3174     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 4, &fvect.x, 1);
3175     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3176     ok(fvect.x == 4.0f && fvect.y == 4.0f && fvect.z == 4.0f && fvect.w == 4.0f,
3177             "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3178             fvect.x, fvect.y, fvect.z, fvect.w);
3179     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 5, &fvect.x, 1);
3180     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3181     ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f,
3182             "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3183             fvect.x, fvect.y, fvect.z, fvect.w);
3184     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 6, &fvect.x, 1);
3185     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3186     ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f,
3187             "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3188             fvect.x, fvect.y, fvect.z, fvect.w);
3189     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 7, &fvect.x, 1);
3190     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3191     ok(!memcmp(&fvect, &fvect_filler, sizeof(fvect_filler)),
3192             "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3193             fvect.x, fvect.y, fvect.z, fvect.w);
3194 
3195     hr = effect->lpVtbl->EndPass(effect);
3196     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3197     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value);
3198     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3199     ok(value == 2, "Got result %u, expected %u\n", value, 2);
3200 
3201     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_ZENABLE, &value);
3202     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3203     ok(value, "Got result %u, expected TRUE.\n", value);
3204 
3205     hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MIPFILTER, &value);
3206     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3207     ok(value == D3DTEXF_LINEAR, "Unexpected sampler 1 mipfilter %u.\n", value);
3208 
3209     hr = IDirect3DDevice9_GetTextureStageState(device, 3, D3DTSS_ALPHAOP, &value);
3210     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3211     ok(value == 4, "Unexpected texture stage 3 AlphaOp %u.\n", value);
3212 
3213     hr = effect->lpVtbl->End(effect);
3214     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3215 
3216     hr = IDirect3DDevice9_GetTransform(device, D3DTS_WORLDMATRIX(1), &mat);
3217     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3218     ok(!memcmp(mat.m, test_mat.m, sizeof(mat)), "World matrix not restored.\n");
3219 
3220     hr = IDirect3DDevice9_GetLightEnable(device, 2, &bval);
3221     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3222     if (hr == D3D_OK)
3223         ok(!bval, "Got result %u, expected 0.\n", bval);
3224 
3225     /* State is not restored if effect is released without End call */
3226     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 1);
3227     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3228 
3229     hr = effect->lpVtbl->Begin(effect, &npasses, 0);
3230     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3231 
3232     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_BLENDOP, 3);
3233     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3234 
3235     effect->lpVtbl->Release(effect);
3236 
3237     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_BLENDOP, &value);
3238     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3239     ok(value == 3, "Got result %u, expected %u.\n", value, 1);
3240 }
3241 
3242 /*
3243  * fxc.exe /Tfx_2_0
3244  */
3245 #if 0
3246 float4 g_Pos1;
3247 float4 g_Pos2;
3248 float4 g_Selector[3] = {{0, 0, 0, 0}, {10, 10, 10, 10}, {5001, 5002, 5003, 5004}};
3249 
3250 float4 opvect1 = {0.0, -0.0, -2.2, 3.402823466e+38F};
3251 float4 opvect2 = {1.0, 2.0, -3.0, 4.0};
3252 float4 opvect3 = {0.0, -0.0, -2.2, 3.402823466e+38F};
3253 
3254 float4 vect_sampler = {1, 2, 3, 4};
3255 
3256 float3 vec3 = {1001, 1002, 1003};
3257 
3258 int4 g_iVect = {4, 3, 2, 1};
3259 
3260 vertexshader vs_arr[3] =
3261 {
3262     asm
3263     {
3264         vs_1_0
3265         def c0, 1, 1, 1, 1
3266         mov oPos, c0
3267     },
3268     asm
3269     {
3270         vs_1_1
3271         def c0, 2, 2, 2, 2
3272         mov oPos, c0
3273     },
3274     asm
3275     {
3276         vs_2_0
3277         def c0, 3, 3, 3, 3
3278         mov oPos, c0
3279     }
3280 };
3281 
3282 float4x4 m4x4 = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}, {41, 42, 43, 44}};
3283 
3284 row_major float4x3 m4x3row = {{11, 12, 13}, {21, 22, 23}, {31, 32, 33}, {41, 42, 43}};
3285 row_major float3x4 m3x4row = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}};
3286 column_major float4x3 m4x3column = {{11, 12, 13},{21, 22, 23},{31, 32, 33},{41, 42, 43}};
3287 column_major float3x4 m3x4column = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}};
3288 row_major float2x2 m2x2row = {{11, 12}, {21, 22}};
3289 column_major float2x2 m2x2column = {{11, 12}, {21, 22}};
3290 row_major float2x3 m2x3row = {{11, 12, 13}, {21, 22, 23}};
3291 column_major float2x3 m2x3column = {{11, 12, 13}, {21, 22, 23}};
3292 row_major float3x2 m3x2row = {{11, 12}, {21, 22}, {31, 32}};
3293 column_major float3x2 m3x2column = {{11, 12}, {21, 22}, {31, 32}};
3294 
3295 row_major bool2x3 mb2x3row = {{true, false, true}, {false, true, true}};
3296 column_major bool2x3 mb2x3column = {{true, false, true}, {false, true, true}};
3297 
3298 struct test_struct
3299 {
3300     float3 v1;
3301     float fv;
3302     float4 v2;
3303 };
3304 
3305 struct struct_array
3306 {
3307     test_struct ts[2];
3308 };
3309 
3310 test_struct ts1[1] = {{{9, 10, 11}, 12, {13, 14, 15, 16}}};
3311 shared test_struct ts2[2] = {{{0, 0, 0}, 0, {0, 0, 0, 0}}, {{1, 2, 3}, 4, {5, 6, 7, 8}}};
3312 struct_array ts3 = {{{1, 2, 3}, 4, {5, 6, 7, 8}}, {{9, 10, 11}, 12, {13, 14, 15, 16}}};
3313 
3314 float arr1[1] = {91};
3315 shared float arr2[2] = {92, 93};
3316 
3317 Texture2D tex1;
3318 Texture2D tex2;
3319 sampler sampler1 =
3320 sampler_state
3321 {
3322     Texture = tex1;
3323     MinFilter = g_iVect.y;
3324     MagFilter = vect_sampler.x + vect_sampler.y;
3325 };
3326 
3327 sampler samplers_array[2] =
3328 {
3329     sampler_state
3330     {
3331         MinFilter = 1;
3332         MagFilter = vect_sampler.x;
3333     },
3334     sampler_state
3335     {
3336         MinFilter = 2;
3337         MagFilter = vect_sampler.y;
3338     }
3339 };
3340 
3341 struct VS_OUTPUT
3342 {
3343     float4 Position   : POSITION;
3344     float2 TextureUV  : TEXCOORD0;
3345     float4 Diffuse    : COLOR0;
3346 };
3347 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION,
3348                         float3 vNormal : NORMAL,
3349                         float2 vTexCoord0 : TEXCOORD0,
3350                         uniform int nNumLights,
3351                         uniform bool bTexture)
3352 {
3353     VS_OUTPUT Output;
3354 
3355     if (g_Selector[1].y > float4(0.5, 0.5, 0.5, 0.5).y)
3356         Output.Position = -g_Pos1 * 2 - float4(-4, -5, -6, -7);
3357     else
3358         Output.Position = -g_Pos2 * 3 - float4(-4, -5, -6, -7);
3359     Output.TextureUV = float2(0, 0);
3360     Output.Diffuse = 0;
3361     Output.Diffuse.xyz = mul(vPos, m4x3column);
3362     Output.Diffuse += mul(vPos, m3x4column);
3363     Output.Diffuse += mul(vPos, m3x4row);
3364     Output.Diffuse.xyz += mul(vPos, m4x3row);
3365     Output.Diffuse += mul(vPos, ts1[0].fv);
3366     Output.Diffuse += mul(vPos, ts1[0].v2);
3367     Output.Diffuse += mul(vPos, ts2[1].fv);
3368     Output.Diffuse += mul(vPos, ts2[1].v2);
3369     Output.Diffuse += mul(vPos, arr1[0]);
3370     Output.Diffuse += mul(vPos, arr2[1]);
3371     Output.Diffuse += mul(vPos, ts3.ts[1].fv);
3372     Output.Diffuse += mul(vPos, ts3.ts[1].v2);
3373     Output.Diffuse += tex2Dlod(sampler1, g_Pos1);
3374     Output.Diffuse += tex2Dlod(samplers_array[1], g_Pos1);
3375     return Output;
3376 }
3377 
3378 VS_OUTPUT RenderSceneVS2(float4 vPos : POSITION)
3379 {
3380     VS_OUTPUT Output;
3381 
3382     Output.Position = g_Pos1;
3383     Output.TextureUV = float2(0, 0);
3384     Output.Diffuse = 0;
3385     return Output;
3386 }
3387 
3388 struct PS_OUTPUT
3389 {
3390     float4 RGBColor : COLOR0;  /* Pixel color */
3391 };
3392 PS_OUTPUT RenderScenePS( VS_OUTPUT In, uniform bool2x3 mb)
3393 {
3394     PS_OUTPUT Output;
3395     int i;
3396 
3397     Output.RGBColor = In.Diffuse;
3398     Output.RGBColor.xy += mul(In.Diffuse, m2x2row);
3399     Output.RGBColor.xy += mul(In.Diffuse, m2x2column);
3400     Output.RGBColor.xy += mul(In.Diffuse, m3x2row);
3401     Output.RGBColor.xy += mul(In.Diffuse, m3x2column);
3402     Output.RGBColor.xyz += mul(In.Diffuse, m2x3row);
3403     Output.RGBColor.xyz += mul(In.Diffuse, m2x3column);
3404     for (i = 0; i < g_iVect.x; ++i)
3405         Output.RGBColor.xyz += mul(In.Diffuse, m2x3column);
3406     if (mb[1][1])
3407     {
3408         Output.RGBColor += sin(Output.RGBColor);
3409         Output.RGBColor += cos(Output.RGBColor);
3410         Output.RGBColor.xyz += mul(Output.RGBColor, m2x3column);
3411         Output.RGBColor.xyz += mul(Output.RGBColor, m2x3row);
3412         Output.RGBColor.xy += mul(Output.RGBColor, m3x2column);
3413         Output.RGBColor.xy += mul(Output.RGBColor, m3x2row);
3414     }
3415     if (mb2x3column[0][0])
3416     {
3417         Output.RGBColor += sin(Output.RGBColor);
3418         Output.RGBColor += cos(Output.RGBColor);
3419         Output.RGBColor.xyz += mul(Output.RGBColor, m2x3column);
3420         Output.RGBColor.xyz += mul(Output.RGBColor, m2x3row);
3421         Output.RGBColor.xy += mul(Output.RGBColor, m3x2column);
3422         Output.RGBColor.xy += mul(Output.RGBColor, m3x2row);
3423     }
3424     Output.RGBColor += tex2D(sampler1, In.TextureUV);
3425     Output.RGBColor += tex2D(samplers_array[0], In.TextureUV);
3426     return Output;
3427 }
3428 
3429 shared vertexshader vs_arr2[2] = {compile vs_3_0 RenderSceneVS(1, true), compile vs_3_0 RenderSceneVS2()};
3430 pixelshader ps_arr[1] = {compile ps_3_0 RenderScenePS(mb2x3row)};
3431 
3432 technique tech0
3433 {
3434     pass p0
3435     {
3436         VertexShader = vs_arr2[g_iVect.w - 1];
3437         PixelShader  = ps_arr[g_iVect.w - 1];
3438 
3439         LightEnable[0] = TRUE;
3440         LightEnable[1] = TRUE;
3441         LightEnable[2] = TRUE;
3442         LightEnable[3] = TRUE;
3443         LightEnable[4] = TRUE;
3444         LightEnable[5] = TRUE;
3445         LightEnable[6] = TRUE;
3446         LightEnable[7] = TRUE;
3447         LightType[0] = POINT;
3448         LightType[1] = POINT;
3449         LightType[2] = POINT;
3450         LightType[3] = POINT;
3451         LightType[4] = POINT;
3452         LightType[5] = POINT;
3453         LightType[6] = POINT;
3454         LightType[7] = POINT;
3455         LightDiffuse[0] = 1 / opvect1;
3456         LightDiffuse[1] = rsqrt(opvect1);
3457         LightDiffuse[2] = opvect1 * opvect2;
3458         LightDiffuse[3] = opvect1 + opvect2;
3459         LightDiffuse[4] = float4(opvect1 < opvect2);
3460         LightDiffuse[5] = float4(opvect1 >= opvect2);
3461         LightDiffuse[6] = -opvect1;
3462         LightDiffuse[7] = rcp(opvect1);
3463 
3464         LightAmbient[0] = frac(opvect1);
3465         LightAmbient[1] = min(opvect1, opvect2);
3466         LightAmbient[2] = max(opvect1, opvect2);
3467         LightAmbient[3] = sin(opvect1);
3468         LightAmbient[4] = cos(opvect1);
3469         LightAmbient[5] = 1e-2 / opvect1;
3470         LightAmbient[6] = float4(0, dot(opvect1, opvect2), dot(opvect2, opvect2), 0);
3471         LightAmbient[7] = opvect1 + 1e-12 * opvect2 - opvect3;
3472 
3473         LightSpecular[0] = float4(dot(opvect1.zx, opvect2.xy), dot(opvect1.zzx, opvect2.xyz),
3474                 dot(opvect1.zzzx, opvect2.xxyy), 0);
3475         LightSpecular[1] = float4(opvect1[g_iVect.z], g_iVect[opvect2.y + 1],
3476                 g_Selector[4 + g_iVect.w].x + g_Selector[7 + g_iVect.w].y,
3477                 g_Selector[g_iVect.w].x + g_Selector[g_iVect.x].y);
3478         LightSpecular[2] = float4(dot(m4x4[3 + g_iVect.z], m4x4[g_iVect.w * 2]), ts3.ts[g_iVect.x].fv,
3479                 vec3[g_iVect.z], float3(1, 2, 3)[g_iVect.w]);
3480 
3481         FogEnable = TRUE;
3482         FogDensity = ts2[0].fv;
3483         FogStart = ts2[1].fv;
3484         PointScale_A = ts3.ts[0].fv;
3485         PointScale_B = ts3.ts[1].fv;
3486     }
3487     pass p1
3488     {
3489         VertexShader = vs_arr[g_iVect.z];
3490     }
3491 }
3492 #endif
3493 static const DWORD test_effect_preshader_effect_blob[] =
3494 {
3495     0xfeff0901, 0x00001160, 0x00000000, 0x00000003, 0x00000001, 0x00000030, 0x00000000, 0x00000000,
3496     0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x6f505f67,
3497     0x00003173, 0x00000003, 0x00000001, 0x00000068, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
3498     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x6f505f67, 0x00003273, 0x00000003,
3499     0x00000001, 0x000000c0, 0x00000000, 0x00000003, 0x00000004, 0x00000001, 0x00000000, 0x00000000,
3500     0x00000000, 0x00000000, 0x41200000, 0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000,
3501     0x459c5800, 0x459c6000, 0x0000000b, 0x65535f67, 0x7463656c, 0x0000726f, 0x00000003, 0x00000001,
3502     0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x80000000, 0xc00ccccd,
3503     0x7f7fffff, 0x00000008, 0x6576706f, 0x00317463, 0x00000003, 0x00000001, 0x00000134, 0x00000000,
3504     0x00000000, 0x00000004, 0x00000001, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x00000008,
3505     0x6576706f, 0x00327463, 0x00000003, 0x00000001, 0x0000016c, 0x00000000, 0x00000000, 0x00000004,
3506     0x00000001, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x00000008, 0x6576706f, 0x00337463,
3507     0x00000003, 0x00000001, 0x000001a4, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x3f800000,
3508     0x40000000, 0x40400000, 0x40800000, 0x0000000d, 0x74636576, 0x6d61735f, 0x72656c70, 0x00000000,
3509     0x00000003, 0x00000001, 0x000001e0, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x447a4000,
3510     0x447a8000, 0x447ac000, 0x00000005, 0x33636576, 0x00000000, 0x00000002, 0x00000001, 0x00000218,
3511     0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000004, 0x00000003, 0x00000002, 0x00000001,
3512     0x00000008, 0x56695f67, 0x00746365, 0x00000010, 0x00000004, 0x00000244, 0x00000000, 0x00000003,
3513     0x00000001, 0x00000002, 0x00000003, 0x00000007, 0x615f7376, 0x00007272, 0x00000003, 0x00000002,
3514     0x000002ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x41300000, 0x41400000, 0x41500000,
3515     0x41600000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000,
3516     0x42080000, 0x42240000, 0x42280000, 0x422c0000, 0x42300000, 0x00000005, 0x3478346d, 0x00000000,
3517     0x00000003, 0x00000002, 0x00000304, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0x41300000,
3518     0x41400000, 0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41f80000, 0x42000000, 0x42040000,
3519     0x42240000, 0x42280000, 0x422c0000, 0x00000008, 0x3378346d, 0x00776f72, 0x00000003, 0x00000002,
3520     0x0000035c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x41300000, 0x41400000, 0x41500000,
3521     0x41600000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000,
3522     0x42080000, 0x00000008, 0x3478336d, 0x00776f72, 0x00000003, 0x00000002, 0x000003b4, 0x00000000,
3523     0x00000000, 0x00000004, 0x00000003, 0x41300000, 0x41400000, 0x41500000, 0x41a80000, 0x41b00000,
3524     0x41b80000, 0x41f80000, 0x42000000, 0x42040000, 0x42240000, 0x42280000, 0x422c0000, 0x0000000b,
3525     0x3378346d, 0x756c6f63, 0x00006e6d, 0x00000003, 0x00000002, 0x00000410, 0x00000000, 0x00000000,
3526     0x00000003, 0x00000004, 0x41300000, 0x41400000, 0x41500000, 0x41600000, 0x41a80000, 0x41b00000,
3527     0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000, 0x42080000, 0x0000000b, 0x3478336d,
3528     0x756c6f63, 0x00006e6d, 0x00000003, 0x00000002, 0x0000044c, 0x00000000, 0x00000000, 0x00000002,
3529     0x00000002, 0x41300000, 0x41400000, 0x41a80000, 0x41b00000, 0x00000008, 0x3278326d, 0x00776f72,
3530     0x00000003, 0x00000002, 0x00000484, 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x41300000,
3531     0x41400000, 0x41a80000, 0x41b00000, 0x0000000b, 0x3278326d, 0x756c6f63, 0x00006e6d, 0x00000003,
3532     0x00000002, 0x000004c8, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 0x41300000, 0x41400000,
3533     0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x00000008, 0x3378326d, 0x00776f72, 0x00000003,
3534     0x00000002, 0x00000508, 0x00000000, 0x00000000, 0x00000002, 0x00000003, 0x41300000, 0x41400000,
3535     0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x0000000b, 0x3378326d, 0x756c6f63, 0x00006e6d,
3536     0x00000003, 0x00000002, 0x0000054c, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x41300000,
3537     0x41400000, 0x41a80000, 0x41b00000, 0x41f80000, 0x42000000, 0x00000008, 0x3278336d, 0x00776f72,
3538     0x00000003, 0x00000002, 0x0000058c, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x41300000,
3539     0x41400000, 0x41a80000, 0x41b00000, 0x41f80000, 0x42000000, 0x0000000b, 0x3278336d, 0x756c6f63,
3540     0x00006e6d, 0x00000001, 0x00000002, 0x000005d0, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
3541     0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000009, 0x7832626d,
3542     0x776f7233, 0x00000000, 0x00000001, 0x00000002, 0x00000614, 0x00000000, 0x00000000, 0x00000002,
3543     0x00000003, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x0000000c,
3544     0x7832626d, 0x6c6f6333, 0x006e6d75, 0x00000000, 0x00000005, 0x000006b0, 0x00000000, 0x00000001,
3545     0x00000003, 0x00000003, 0x00000001, 0x000006b8, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
3546     0x00000003, 0x00000000, 0x000006c0, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003,
3547     0x00000001, 0x000006c8, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x41100000, 0x41200000,
3548     0x41300000, 0x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x00000004, 0x00317374,
3549     0x00000003, 0x00003176, 0x00000003, 0x00007666, 0x00000003, 0x00003276, 0x00000000, 0x00000005,
3550     0x0000077c, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00000001, 0x00000784, 0x00000000,
3551     0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x0000078c, 0x00000000, 0x00000000,
3552     0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x00000794, 0x00000000, 0x00000000, 0x00000004,
3553     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3554     0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000,
3555     0x41000000, 0x00000004, 0x00327374, 0x00000003, 0x00003176, 0x00000003, 0x00007666, 0x00000003,
3556     0x00003276, 0x00000000, 0x00000005, 0x00000860, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
3557     0x00000005, 0x00000868, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00000001, 0x00000870,
3558     0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x00000878, 0x00000000,
3559     0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x00000880, 0x00000000, 0x00000000,
3560     0x00000004, 0x00000001, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x40a00000, 0x40c00000,
3561     0x40e00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x41400000, 0x41500000, 0x41600000,
3562     0x41700000, 0x41800000, 0x00000004, 0x00337374, 0x00000003, 0x00007374, 0x00000003, 0x00003176,
3563     0x00000003, 0x00007666, 0x00000003, 0x00003276, 0x00000003, 0x00000000, 0x000008a8, 0x00000000,
3564     0x00000001, 0x00000001, 0x00000001, 0x42b60000, 0x00000005, 0x31727261, 0x00000000, 0x00000003,
3565     0x00000000, 0x000008d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x42b80000, 0x42ba0000,
3566     0x00000005, 0x32727261, 0x00000000, 0x00000007, 0x00000004, 0x000008fc, 0x00000000, 0x00000000,
3567     0x00000004, 0x00000005, 0x31786574, 0x00000000, 0x00000007, 0x00000004, 0x00000920, 0x00000000,
3568     0x00000000, 0x00000005, 0x00000005, 0x32786574, 0x00000000, 0x0000000a, 0x00000004, 0x000009cc,
3569     0x00000000, 0x00000000, 0x00000006, 0x00000007, 0x00000004, 0x00000000, 0x00000000, 0x00000000,
3570     0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
3571     0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
3572     0x00000003, 0x000000a4, 0x00000100, 0x00000944, 0x00000940, 0x000000aa, 0x00000100, 0x0000095c,
3573     0x00000958, 0x000000a9, 0x00000100, 0x0000097c, 0x00000978, 0x00000009, 0x706d6173, 0x3172656c,
3574     0x00000000, 0x0000000a, 0x00000004, 0x00000ab8, 0x00000000, 0x00000002, 0x00000001, 0x00000002,
3575     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003,
3576     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
3577     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003,
3578     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x000000aa,
3579     0x00000100, 0x000009f4, 0x000009f0, 0x000000a9, 0x00000100, 0x00000a14, 0x00000a10, 0x00000002,
3580     0x000000aa, 0x00000100, 0x00000a34, 0x00000a30, 0x000000a9, 0x00000100, 0x00000a54, 0x00000a50,
3581     0x0000000f, 0x706d6173, 0x7372656c, 0x7272615f, 0x00007961, 0x00000010, 0x00000004, 0x00000ae8,
3582     0x00000000, 0x00000002, 0x00000007, 0x00000008, 0x00000008, 0x615f7376, 0x00327272, 0x0000000f,
3583     0x00000004, 0x00000b0c, 0x00000000, 0x00000001, 0x00000009, 0x00000007, 0x615f7370, 0x00007272,
3584     0x0000000a, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x0000000b, 0x0000000f,
3585     0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3586     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3587     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3588     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3589     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3590     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3591     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3592     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3593     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3594     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3595     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3596     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3597     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3598     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3599     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3600     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000,
3601     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3602     0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000,
3603     0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
3604     0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002,
3605     0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
3606     0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
3607     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000,
3608     0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
3609     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000,
3610     0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004,
3611     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000,
3612     0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3613     0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000,
3614     0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
3615     0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002,
3616     0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
3617     0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
3618     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000,
3619     0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
3620     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000,
3621     0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004,
3622     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000,
3623     0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3624     0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000,
3625     0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
3626     0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002,
3627     0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
3628     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002,
3629     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002,
3630     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002,
3631     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00000002,
3632     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00003070, 0x0000000c,
3633     0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003170, 0x00000006,
3634     0x68636574, 0x00000030, 0x00000022, 0x00000001, 0x0000000e, 0x0000000d, 0x00000004, 0x00000020,
3635     0x00000000, 0x00000000, 0x0000003c, 0x00000058, 0x00000000, 0x00000000, 0x00000074, 0x00000090,
3636     0x00000000, 0x00000000, 0x000000d0, 0x000000ec, 0x00000000, 0x00000000, 0x00000108, 0x00000124,
3637     0x00000000, 0x00000000, 0x00000140, 0x0000015c, 0x00000000, 0x00000000, 0x00000178, 0x00000194,
3638     0x00000000, 0x00000000, 0x000001b8, 0x000001d4, 0x00000000, 0x00000000, 0x000001ec, 0x00000208,
3639     0x00000000, 0x00000000, 0x00000224, 0x00000238, 0x00000000, 0x00000000, 0x00000250, 0x0000026c,
3640     0x00000000, 0x00000000, 0x000002b8, 0x000002d4, 0x00000000, 0x00000000, 0x00000310, 0x0000032c,
3641     0x00000000, 0x00000000, 0x00000368, 0x00000384, 0x00000000, 0x00000000, 0x000003c4, 0x000003e0,
3642     0x00000000, 0x00000000, 0x00000420, 0x0000043c, 0x00000000, 0x00000000, 0x00000458, 0x00000474,
3643     0x00000000, 0x00000000, 0x00000494, 0x000004b0, 0x00000000, 0x00000000, 0x000004d4, 0x000004f0,
3644     0x00000000, 0x00000000, 0x00000518, 0x00000534, 0x00000000, 0x00000000, 0x00000558, 0x00000574,
3645     0x00000000, 0x00000000, 0x0000059c, 0x000005b8, 0x00000000, 0x00000000, 0x000005e0, 0x000005fc,
3646     0x00000000, 0x00000000, 0x00000624, 0x00000690, 0x00000000, 0x00000000, 0x000006d0, 0x0000073c,
3647     0x00000001, 0x00000000, 0x0000079c, 0x00000820, 0x00000000, 0x00000000, 0x00000888, 0x000008a4,
3648     0x00000000, 0x00000000, 0x000008b4, 0x000008d0, 0x00000001, 0x00000000, 0x000008e4, 0x000008f8,
3649     0x00000000, 0x00000000, 0x00000908, 0x0000091c, 0x00000000, 0x00000000, 0x0000092c, 0x00000998,
3650     0x00000000, 0x00000000, 0x000009dc, 0x00000a70, 0x00000000, 0x00000000, 0x00000acc, 0x00000ae0,
3651     0x00000001, 0x00000000, 0x00000af4, 0x00000b08, 0x00000000, 0x00000000, 0x00001154, 0x00000000,
3652     0x00000002, 0x0000112c, 0x00000000, 0x0000002a, 0x00000092, 0x00000000, 0x00000b1c, 0x00000b18,
3653     0x00000093, 0x00000000, 0x00000b34, 0x00000b30, 0x00000091, 0x00000000, 0x00000b4c, 0x00000b48,
3654     0x00000091, 0x00000001, 0x00000b6c, 0x00000b68, 0x00000091, 0x00000002, 0x00000b8c, 0x00000b88,
3655     0x00000091, 0x00000003, 0x00000bac, 0x00000ba8, 0x00000091, 0x00000004, 0x00000bcc, 0x00000bc8,
3656     0x00000091, 0x00000005, 0x00000bec, 0x00000be8, 0x00000091, 0x00000006, 0x00000c0c, 0x00000c08,
3657     0x00000091, 0x00000007, 0x00000c2c, 0x00000c28, 0x00000084, 0x00000000, 0x00000c4c, 0x00000c48,
3658     0x00000084, 0x00000001, 0x00000c6c, 0x00000c68, 0x00000084, 0x00000002, 0x00000c8c, 0x00000c88,
3659     0x00000084, 0x00000003, 0x00000cac, 0x00000ca8, 0x00000084, 0x00000004, 0x00000ccc, 0x00000cc8,
3660     0x00000084, 0x00000005, 0x00000cec, 0x00000ce8, 0x00000084, 0x00000006, 0x00000d0c, 0x00000d08,
3661     0x00000084, 0x00000007, 0x00000d2c, 0x00000d28, 0x00000085, 0x00000000, 0x00000d58, 0x00000d48,
3662     0x00000085, 0x00000001, 0x00000d84, 0x00000d74, 0x00000085, 0x00000002, 0x00000db0, 0x00000da0,
3663     0x00000085, 0x00000003, 0x00000ddc, 0x00000dcc, 0x00000085, 0x00000004, 0x00000e08, 0x00000df8,
3664     0x00000085, 0x00000005, 0x00000e34, 0x00000e24, 0x00000085, 0x00000006, 0x00000e60, 0x00000e50,
3665     0x00000085, 0x00000007, 0x00000e8c, 0x00000e7c, 0x00000087, 0x00000000, 0x00000eb8, 0x00000ea8,
3666     0x00000087, 0x00000001, 0x00000ee4, 0x00000ed4, 0x00000087, 0x00000002, 0x00000f10, 0x00000f00,
3667     0x00000087, 0x00000003, 0x00000f3c, 0x00000f2c, 0x00000087, 0x00000004, 0x00000f68, 0x00000f58,
3668     0x00000087, 0x00000005, 0x00000f94, 0x00000f84, 0x00000087, 0x00000006, 0x00000fc0, 0x00000fb0,
3669     0x00000087, 0x00000007, 0x00000fec, 0x00000fdc, 0x00000086, 0x00000000, 0x00001018, 0x00001008,
3670     0x00000086, 0x00000001, 0x00001044, 0x00001034, 0x00000086, 0x00000002, 0x00001070, 0x00001060,
3671     0x0000000e, 0x00000000, 0x00001090, 0x0000108c, 0x00000014, 0x00000000, 0x000010b0, 0x000010ac,
3672     0x00000012, 0x00000000, 0x000010d0, 0x000010cc, 0x00000041, 0x00000000, 0x000010f0, 0x000010ec,
3673     0x00000042, 0x00000000, 0x00001110, 0x0000110c, 0x0000114c, 0x00000000, 0x00000001, 0x00000092,
3674     0x00000000, 0x00001138, 0x00001134, 0x00000008, 0x0000001f, 0x00000009, 0x00000ad0, 0xffff0300,
3675     0x00d9fffe, 0x42415443, 0x0000001c, 0x0000032f, 0xffff0300, 0x0000000b, 0x0000001c, 0x00000000,
3676     0x00000328, 0x000000f8, 0x00000001, 0x00000001, 0x00000100, 0x00000110, 0x00000120, 0x00080002,
3677     0x00000002, 0x0000012c, 0x0000013c, 0x0000015c, 0x00060002, 0x00000002, 0x00000164, 0x00000174,
3678     0x00000194, 0x00000002, 0x00000003, 0x000001a0, 0x000001b0, 0x000001e0, 0x000a0002, 0x00000002,
3679     0x000001e8, 0x000001f8, 0x00000218, 0x000c0002, 0x00000002, 0x00000224, 0x00000234, 0x00000254,
3680     0x00030002, 0x00000003, 0x0000025c, 0x0000026c, 0x0000029c, 0x00050000, 0x00000001, 0x000002a8,
3681     0x000002b8, 0x000002d0, 0x00000000, 0x00000005, 0x000002dc, 0x000002b8, 0x000002ec, 0x00000003,
3682     0x00000001, 0x000002f8, 0x00000000, 0x00000308, 0x00010003, 0x00000001, 0x00000318, 0x00000000,
3683     0x56695f67, 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x00000004, 0x00000003,
3684     0x00000002, 0x00000001, 0x3278326d, 0x756c6f63, 0xab006e6d, 0x00030003, 0x00020002, 0x00000001,
3685     0x00000000, 0x41300000, 0x41a80000, 0x00000000, 0x00000000, 0x41400000, 0x41b00000, 0x00000000,
3686     0x00000000, 0x3278326d, 0x00776f72, 0x00030002, 0x00020002, 0x00000001, 0x00000000, 0x41300000,
3687     0x41400000, 0x00000000, 0x00000000, 0x41a80000, 0x41b00000, 0x00000000, 0x00000000, 0x3378326d,
3688     0x756c6f63, 0xab006e6d, 0x00030003, 0x00030002, 0x00000001, 0x00000000, 0x41300000, 0x41a80000,
3689     0x00000000, 0x00000000, 0x41400000, 0x41b00000, 0x00000000, 0x00000000, 0x41500000, 0x41b80000,
3690     0x00000000, 0x00000000, 0x3378326d, 0x00776f72, 0x00030002, 0x00030002, 0x00000001, 0x00000000,
3691     0x41300000, 0x41400000, 0x41500000, 0x00000000, 0x41a80000, 0x41b00000, 0x41b80000, 0x00000000,
3692     0x3278336d, 0x756c6f63, 0xab006e6d, 0x00030003, 0x00020003, 0x00000001, 0x00000000, 0x41300000,
3693     0x41a80000, 0x41f80000, 0x00000000, 0x41400000, 0x41b00000, 0x42000000, 0x00000000, 0x3278336d,
3694     0x00776f72, 0x00030002, 0x00020003, 0x00000001, 0x00000000, 0x41300000, 0x41400000, 0x00000000,
3695     0x00000000, 0x41a80000, 0x41b00000, 0x00000000, 0x00000000, 0x41f80000, 0x42000000, 0x00000000,
3696     0x00000000, 0x7832626d, 0x6c6f6333, 0x006e6d75, 0x00010003, 0x00030002, 0x00000001, 0x00000000,
3697     0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff, 0x7832626d, 0x776f7233,
3698     0xababab00, 0x00010002, 0x00030002, 0x00000001, 0x00000000, 0x706d6173, 0x3172656c, 0xababab00,
3699     0x000c0004, 0x00010001, 0x00000001, 0x00000000, 0x706d6173, 0x7372656c, 0x7272615f, 0xab007961,
3700     0x000c0004, 0x00010001, 0x00000002, 0x00000000, 0x335f7370, 0x4d00305f, 0x6f726369, 0x74666f73,
3701     0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
3702     0x332e3235, 0x00313131, 0x05000051, 0xa00f000e, 0x3d2aaaa4, 0xbf000000, 0x3f800000, 0xbe22f983,
3703     0x05000051, 0xa00f000f, 0x40c90fdb, 0xc0490fdb, 0xb4878163, 0x37cfb5a1, 0x05000051, 0xa00f0010,
3704     0x00000000, 0x3e22f983, 0x3e800000, 0xbab609ba, 0x0200001f, 0x80000005, 0x90030000, 0x0200001f,
3705     0x8000000a, 0x900f0001, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801,
3706     0x03000005, 0x80030000, 0xa0e40007, 0x90550001, 0x04000004, 0x80030000, 0x90000001, 0xa0e40006,
3707     0x80e40000, 0x03000002, 0x80030000, 0x80e40000, 0x90e40001, 0x02000001, 0x80010001, 0xa0000010,
3708     0x0400005a, 0x80010002, 0x90e40001, 0xa0e40008, 0x80000001, 0x0400005a, 0x80020002, 0x90e40001,
3709     0xa0e40009, 0x80000001, 0x03000002, 0x80030000, 0x80e40000, 0x80e40002, 0x03000005, 0x800c0000,
3710     0xa0440004, 0x90550001, 0x04000004, 0x800c0000, 0x90000001, 0xa0440003, 0x80e40000, 0x04000004,
3711     0x800c0000, 0x90aa0001, 0xa0440005, 0x80e40000, 0x03000002, 0x80030000, 0x80ee0000, 0x80e40000,
3712     0x03000008, 0x80010002, 0x90e40001, 0xa0e4000c, 0x03000008, 0x80020002, 0x90e40001, 0xa0e4000d,
3713     0x03000002, 0x80030000, 0x80e40000, 0x80e40002, 0x03000005, 0x800e0001, 0xa090000b, 0x90550001,
3714     0x04000004, 0x800e0001, 0x90000001, 0xa090000a, 0x80e40001, 0x02000001, 0x80040000, 0x90aa0001,
3715     0x03000002, 0x80070000, 0x80e40000, 0x80f90001, 0x0400005a, 0x80010002, 0x90e40001, 0xa0e40000,
3716     0x80000001, 0x0400005a, 0x80020002, 0x90e40001, 0xa0e40001, 0x80000001, 0x0400005a, 0x80040002,
3717     0x90e40001, 0xa0e40002, 0x80000001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40002, 0x02000001,
3718     0x80070003, 0x80e40000, 0x01000026, 0xf0e40000, 0x03000002, 0x80070003, 0x80e40002, 0x80e40003,
3719     0x00000027, 0x01000028, 0xe0e40804, 0x02000001, 0x80080003, 0x90ff0001, 0x04000004, 0x800f0000,
3720     0x80e40003, 0xa0550010, 0xa0aa0010, 0x02000013, 0x800f0000, 0x80e40000, 0x04000004, 0x800f0000,
3721     0x80e40000, 0xa000000f, 0xa055000f, 0x03000005, 0x800f0000, 0x80e40000, 0x80e40000, 0x04000004,
3722     0x800f0002, 0x80e40000, 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0002, 0x80e40000, 0x80e40002,
3723     0xa0ff0010, 0x04000004, 0x800f0002, 0x80e40000, 0x80e40002, 0xa000000e, 0x04000004, 0x800f0002,
3724     0x80e40000, 0x80e40002, 0xa055000e, 0x04000004, 0x800f0000, 0x80e40000, 0x80e40002, 0x80e40003,
3725     0x03000002, 0x800f0000, 0x80e40000, 0xa0aa000e, 0x04000004, 0x800f0002, 0x80e40000, 0xa1ff000e,
3726     0xa155000e, 0x02000013, 0x800f0002, 0x80e40002, 0x04000004, 0x800f0002, 0x80e40002, 0xa000000f,
3727     0xa055000f, 0x03000005, 0x800f0002, 0x80e40002, 0x80e40002, 0x04000004, 0x800f0004, 0x80e40002,
3728     0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 0xa0ff0010, 0x04000004,
3729     0x800f0004, 0x80e40002, 0x80e40004, 0xa000000e, 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004,
3730     0xa055000e, 0x04000004, 0x800f0000, 0x80e40002, 0x80e40004, 0x80e40000, 0x03000002, 0x800f0003,
3731     0x80e40000, 0xa0aa000e, 0x0400005a, 0x80010000, 0x80e40003, 0xa0e40000, 0x80000001, 0x0400005a,
3732     0x80020000, 0x80e40003, 0xa0e40001, 0x80000001, 0x0400005a, 0x80040000, 0x80e40003, 0xa0e40002,
3733     0x80000001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40003, 0x03000005, 0x800e0001, 0x80550000,
3734     0xa090000b, 0x04000004, 0x800e0001, 0x80000000, 0xa090000a, 0x80e40001, 0x03000002, 0x80070003,
3735     0x80e40000, 0x80f90001, 0x03000008, 0x80010000, 0x80e40003, 0xa0e4000c, 0x03000008, 0x80020000,
3736     0x80e40003, 0xa0e4000d, 0x03000002, 0x80030000, 0x80e40000, 0x80e40003, 0x03000005, 0x800c0000,
3737     0x80550000, 0xa0440004, 0x04000004, 0x800c0000, 0x80000000, 0xa0440003, 0x80e40000, 0x04000004,
3738     0x800c0000, 0x80aa0003, 0xa0440005, 0x80e40000, 0x03000002, 0x80030003, 0x80ee0000, 0x80e40000,
3739     0x0000002a, 0x02000001, 0x80080003, 0x90ff0001, 0x0000002b, 0x01000028, 0xe0e40805, 0x04000004,
3740     0x800f0000, 0x80e40003, 0xa0550010, 0xa0aa0010, 0x02000013, 0x800f0000, 0x80e40000, 0x04000004,
3741     0x800f0000, 0x80e40000, 0xa000000f, 0xa055000f, 0x03000005, 0x800f0000, 0x80e40000, 0x80e40000,
3742     0x04000004, 0x800f0002, 0x80e40000, 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0002, 0x80e40000,
3743     0x80e40002, 0xa0ff0010, 0x04000004, 0x800f0002, 0x80e40000, 0x80e40002, 0xa000000e, 0x04000004,
3744     0x800f0002, 0x80e40000, 0x80e40002, 0xa055000e, 0x04000004, 0x800f0000, 0x80e40000, 0x80e40002,
3745     0x80e40003, 0x03000002, 0x800f0000, 0x80e40000, 0xa0aa000e, 0x04000004, 0x800f0002, 0x80e40000,
3746     0xa1ff000e, 0xa155000e, 0x02000013, 0x800f0002, 0x80e40002, 0x04000004, 0x800f0002, 0x80e40002,
3747     0xa000000f, 0xa055000f, 0x03000005, 0x800f0002, 0x80e40002, 0x80e40002, 0x04000004, 0x800f0004,
3748     0x80e40002, 0xa0aa000f, 0xa0ff000f, 0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 0xa0ff0010,
3749     0x04000004, 0x800f0004, 0x80e40002, 0x80e40004, 0xa000000e, 0x04000004, 0x800f0004, 0x80e40002,
3750     0x80e40004, 0xa055000e, 0x04000004, 0x800f0000, 0x80e40002, 0x80e40004, 0x80e40000, 0x03000002,
3751     0x800f0003, 0x80e40000, 0xa0aa000e, 0x0400005a, 0x80010000, 0x80e40003, 0xa0e40000, 0x80000001,
3752     0x0400005a, 0x80020000, 0x80e40003, 0xa0e40001, 0x80000001, 0x0400005a, 0x80040000, 0x80e40003,
3753     0xa0e40002, 0x80000001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40003, 0x03000005, 0x80070001,
3754     0x80550000, 0xa0e4000b, 0x04000004, 0x80070001, 0x80000000, 0xa0e4000a, 0x80e40001, 0x03000002,
3755     0x80070003, 0x80e40000, 0x80e40001, 0x03000008, 0x80010000, 0x80e40003, 0xa0e4000c, 0x03000008,
3756     0x80020000, 0x80e40003, 0xa0e4000d, 0x03000002, 0x80030000, 0x80e40000, 0x80e40003, 0x03000005,
3757     0x800c0000, 0x80550000, 0xa0440004, 0x04000004, 0x800c0000, 0x80000000, 0xa0440003, 0x80e40000,
3758     0x04000004, 0x800c0000, 0x80aa0003, 0xa0440005, 0x80e40000, 0x03000002, 0x80030003, 0x80ee0000,
3759     0x80e40000, 0x0000002b, 0x03000042, 0x800f0000, 0x90e40000, 0xa0e40800, 0x03000002, 0x800f0000,
3760     0x80e40000, 0x80e40003, 0x03000042, 0x800f0001, 0x90e40000, 0xa0e40801, 0x03000002, 0x800f0800,
3761     0x80e40000, 0x80e40001, 0x0000ffff, 0x00000007, 0x00000b6c, 0xfffe0300, 0x013cfffe, 0x42415443,
3762     0x0000001c, 0x000004bb, 0xfffe0300, 0x0000000c, 0x0000001c, 0x00000000, 0x000004b4, 0x0000010c,
3763     0x00200002, 0x00000001, 0x00000114, 0x00000124, 0x00000134, 0x001d0002, 0x00000002, 0x0000013c,
3764     0x0000014c, 0x0000016c, 0x001f0002, 0x00000001, 0x00000174, 0x00000184, 0x00000194, 0x00100002,
3765     0x00000004, 0x000001a0, 0x000001b0, 0x000001f0, 0x00140002, 0x00000003, 0x000001f8, 0x00000208,
3766     0x00000238, 0x00170002, 0x00000003, 0x00000244, 0x00000254, 0x00000284, 0x000c0002, 0x00000004,
3767     0x0000028c, 0x0000029c, 0x000002dc, 0x00020003, 0x00000001, 0x000002e8, 0x00000000, 0x000002f8,
3768     0x00000003, 0x00000002, 0x00000308, 0x00000000, 0x00000318, 0x001a0002, 0x00000003, 0x00000370,
3769     0x00000380, 0x000003b0, 0x00000002, 0x00000006, 0x000003b4, 0x000003c4, 0x00000424, 0x00060002,
3770     0x00000006, 0x00000444, 0x00000454, 0x31727261, 0xababab00, 0x00030000, 0x00010001, 0x00000001,
3771     0x00000000, 0x42b60000, 0x00000000, 0x00000000, 0x00000000, 0x32727261, 0xababab00, 0x00030000,
3772     0x00010001, 0x00000002, 0x00000000, 0x42b80000, 0x00000000, 0x00000000, 0x00000000, 0x42ba0000,
3773     0x00000000, 0x00000000, 0x00000000, 0x6f505f67, 0xab003173, 0x00030001, 0x00040001, 0x00000001,
3774     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3478336d, 0x756c6f63, 0xab006e6d,
3775     0x00030003, 0x00040003, 0x00000001, 0x00000000, 0x41300000, 0x41a80000, 0x41f80000, 0x00000000,
3776     0x41400000, 0x41b00000, 0x42000000, 0x00000000, 0x41500000, 0x41b80000, 0x42040000, 0x00000000,
3777     0x41600000, 0x41c00000, 0x42080000, 0x00000000, 0x3478336d, 0x00776f72, 0x00030002, 0x00040003,
3778     0x00000001, 0x00000000, 0x41300000, 0x41400000, 0x41500000, 0x41600000, 0x41a80000, 0x41b00000,
3779     0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000, 0x42080000, 0x3378346d, 0x756c6f63,
3780     0xab006e6d, 0x00030003, 0x00030004, 0x00000001, 0x00000000, 0x41300000, 0x41a80000, 0x41f80000,
3781     0x42240000, 0x41400000, 0x41b00000, 0x42000000, 0x42280000, 0x41500000, 0x41b80000, 0x42040000,
3782     0x422c0000, 0x3378346d, 0x00776f72, 0x00030002, 0x00030004, 0x00000001, 0x00000000, 0x41300000,
3783     0x41400000, 0x41500000, 0x00000000, 0x41a80000, 0x41b00000, 0x41b80000, 0x00000000, 0x41f80000,
3784     0x42000000, 0x42040000, 0x00000000, 0x42240000, 0x42280000, 0x422c0000, 0x00000000, 0x706d6173,
3785     0x3172656c, 0xababab00, 0x000c0004, 0x00010001, 0x00000001, 0x00000000, 0x706d6173, 0x7372656c,
3786     0x7272615f, 0xab007961, 0x000c0004, 0x00010001, 0x00000002, 0x00000000, 0x00317374, 0xab003176,
3787     0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001,
3788     0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x0000031c, 0x00000320,
3789     0x00000330, 0x00000334, 0x00000344, 0x00000348, 0x00000005, 0x00080001, 0x00030001, 0x00000358,
3790     0x41100000, 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 0x00000000,
3791     0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x00327374, 0x00000005, 0x00080001, 0x00030002,
3792     0x00000358, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3793     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x40000000, 0x40400000,
3794     0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000,
3795     0x41000000, 0x00337374, 0xab007374, 0x00000005, 0x00080001, 0x00030002, 0x00000358, 0x00000428,
3796     0x0000042c, 0x00000005, 0x00100001, 0x00010001, 0x0000043c, 0x3f800000, 0x40000000, 0x40400000,
3797     0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000,
3798     0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000,
3799     0x00000000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x335f7376, 0x4d00305f, 0x6f726369,
3800     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
3801     0x392e3932, 0x332e3235, 0x00313131, 0x00f0fffe, 0x53455250, 0x46580201, 0x0047fffe, 0x42415443,
3802     0x0000001c, 0x000000e7, 0x46580201, 0x00000003, 0x0000001c, 0x00000100, 0x000000e4, 0x00000058,
3803     0x00020002, 0x00000001, 0x00000060, 0x00000070, 0x00000080, 0x00030002, 0x00000001, 0x00000088,
3804     0x00000070, 0x00000098, 0x00000002, 0x00000002, 0x000000a4, 0x000000b4, 0x6f505f67, 0xab003173,
3805     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3806     0x6f505f67, 0xab003273, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x65535f67, 0x7463656c,
3807     0xab00726f, 0x00030001, 0x00040001, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3808     0x00000000, 0x41200000, 0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000, 0x459c5800,
3809     0x459c6000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461,
3810     0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x000cfffe, 0x49535250,
3811     0x00000021, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000021,
3812     0x00000001, 0x00000000, 0x00000000, 0x0032fffe, 0x54494c43, 0x00000018, 0x00000000, 0x00000000,
3813     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3814     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3815     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3816     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3fe00000,
3817     0x00000000, 0xc0000000, 0x00000000, 0xc0080000, 0x00000000, 0x00000000, 0x00000000, 0x40100000,
3818     0x00000000, 0x40140000, 0x00000000, 0x40180000, 0x00000000, 0x401c0000, 0x0064fffe, 0x434c5846,
3819     0x00000009, 0xa0500004, 0x00000002, 0x00000000, 0x00000001, 0x00000011, 0x00000000, 0x00000002,
3820     0x00000008, 0x00000000, 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007,
3821     0x00000000, 0x00000000, 0x00000001, 0x00000014, 0x00000000, 0x00000007, 0x00000004, 0xa0500004,
3822     0x00000002, 0x00000000, 0x00000001, 0x00000012, 0x00000000, 0x00000002, 0x0000000c, 0x00000000,
3823     0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000,
3824     0x00000001, 0x00000014, 0x00000000, 0x00000007, 0x00000008, 0x10100004, 0x00000001, 0x00000000,
3825     0x00000007, 0x00000008, 0x00000000, 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000,
3826     0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000007, 0x0000000c,
3827     0xa0200001, 0x00000002, 0x00000000, 0x00000001, 0x00000010, 0x00000000, 0x00000002, 0x00000005,
3828     0x00000000, 0x00000007, 0x00000000, 0xa0500004, 0x00000002, 0x00000000, 0x00000007, 0x00000000,
3829     0x00000000, 0x00000007, 0x0000000c, 0x00000000, 0x00000007, 0x00000004, 0x20400004, 0x00000002,
3830     0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000007, 0x00000008, 0x00000000, 0x00000004,
3831     0x00000084, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x05000051, 0xa00f0022, 0x00000000, 0x00000000,
3832     0x00000000, 0x00000000, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x90000000, 0xa00f0801,
3833     0x0200001f, 0x90000000, 0xa00f0802, 0x0200001f, 0x80000000, 0xe00f0000, 0x0200001f, 0x80000005,
3834     0xe0030001, 0x0200001f, 0x8000000a, 0xe00f0002, 0x03000009, 0x80010000, 0x90e40000, 0xa0e40017,
3835     0x03000009, 0x80020000, 0x90e40000, 0xa0e40018, 0x03000009, 0x80040000, 0x90e40000, 0xa0e40019,
3836     0x03000008, 0x80010001, 0x90e40000, 0xa0e40010, 0x03000008, 0x80020001, 0x90e40000, 0xa0e40011,
3837     0x03000008, 0x80040001, 0x90e40000, 0xa0e40012, 0x03000008, 0x80080001, 0x90e40000, 0xa0e40013,
3838     0x02000001, 0x80080000, 0xa0000022, 0x03000002, 0x800f0000, 0x80e40000, 0x80e40001, 0x03000005,
3839     0x800f0001, 0xa0e40015, 0x90550000, 0x04000004, 0x800f0001, 0x90000000, 0xa0e40014, 0x80e40001,
3840     0x04000004, 0x800f0001, 0x90aa0000, 0xa0e40016, 0x80e40001, 0x03000002, 0x800f0000, 0x80e40000,
3841     0x80e40001, 0x03000005, 0x80070001, 0xa0e4000d, 0x90550000, 0x04000004, 0x80070001, 0x90000000,
3842     0xa0e4000c, 0x80e40001, 0x04000004, 0x80070001, 0x90aa0000, 0xa0e4000e, 0x80e40001, 0x04000004,
3843     0x80070001, 0x90ff0000, 0xa0e4000f, 0x80e40001, 0x03000002, 0x80070000, 0x80e40000, 0x80e40001,
3844     0x04000004, 0x800f0000, 0x90e40000, 0xa000001b, 0x80e40000, 0x03000009, 0x80010001, 0x90e40000,
3845     0xa0e4001c, 0x03000002, 0x800f0000, 0x80e40000, 0x80000001, 0x04000004, 0x800f0000, 0x90e40000,
3846     0xa0000004, 0x80e40000, 0x03000009, 0x80010001, 0x90e40000, 0xa0e40005, 0x03000002, 0x800f0000,
3847     0x80e40000, 0x80000001, 0x04000004, 0x800f0000, 0x90e40000, 0xa0000020, 0x80e40000, 0x04000004,
3848     0x800f0000, 0x90e40000, 0xa000001e, 0x80e40000, 0x04000004, 0x800f0000, 0x90e40000, 0xa000000a,
3849     0x80e40000, 0x03000009, 0x80010001, 0x90e40000, 0xa0e4000b, 0x03000002, 0x800f0000, 0x80e40000,
3850     0x80000001, 0x0300005f, 0x800f0001, 0xa0e4001f, 0xa0e40802, 0x03000002, 0x800f0000, 0x80e40000,
3851     0x80e40001, 0x0300005f, 0x800f0001, 0xa0e4001f, 0xa0e40801, 0x03000002, 0xe00f0002, 0x80e40000,
3852     0x80e40001, 0x02000001, 0xe00f0000, 0xa0e40021, 0x02000001, 0xe0030001, 0xa0000022, 0x0000ffff,
3853     0x00000008, 0x000001dc, 0xfffe0300, 0x0016fffe, 0x42415443, 0x0000001c, 0x00000023, 0xfffe0300,
3854     0x00000000, 0x00000000, 0x00000000, 0x0000001c, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73,
3855     0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
3856     0x332e3235, 0x00313131, 0x0045fffe, 0x53455250, 0x46580201, 0x0024fffe, 0x42415443, 0x0000001c,
3857     0x0000005b, 0x46580201, 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030, 0x00000002,
3858     0x00000001, 0x00000038, 0x00000048, 0x6f505f67, 0xab003173, 0x00030001, 0x00040001, 0x00000001,
3859     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73,
3860     0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
3861     0x332e3235, 0x00313131, 0x000cfffe, 0x49535250, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
3862     0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x0002fffe,
3863     0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000004, 0x00000001, 0x00000000,
3864     0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
3865     0x05000051, 0xa00f0001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, 0x80000000,
3866     0xe00f0000, 0x0200001f, 0x80000005, 0xe0030001, 0x0200001f, 0x8000000a, 0xe00f0002, 0x02000001,
3867     0xe00f0000, 0xa0e40000, 0x02000001, 0xe0030001, 0xa0000001, 0x02000001, 0xe00f0002, 0xa0000001,
3868     0x0000ffff, 0x00000005, 0x00000000, 0x00000004, 0x00000000, 0x00000001, 0x0000002c, 0xfffe0101,
3869     0x00000051, 0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000001, 0xc00f0000,
3870     0xa0e40000, 0x0000ffff, 0x00000002, 0x0000002c, 0xfffe0101, 0x00000051, 0xa00f0000, 0x40000000,
3871     0x40000000, 0x40000000, 0x40000000, 0x00000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000003,
3872     0x0000002c, 0xfffe0200, 0x05000051, 0xa00f0000, 0x40400000, 0x40400000, 0x40400000, 0x40400000,
3873     0x02000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000000, 0x00000001, 0xffffffff, 0x00000000,
3874     0x00000002, 0x000000e8, 0x00000008, 0x615f7376, 0x00007272, 0x46580200, 0x0024fffe, 0x42415443,
3875     0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030,
3876     0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001,
3877     0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369,
3878     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
3879     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846,
3880     0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004,
3881     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000029,
3882     0x00000000, 0x00000198, 0x46580200, 0x0053fffe, 0x42415443, 0x0000001c, 0x00000117, 0x46580200,
3883     0x00000001, 0x0000001c, 0x20000100, 0x00000114, 0x00000030, 0x00000002, 0x00000005, 0x000000a4,
3884     0x000000b4, 0x00337374, 0x76007374, 0xabab0031, 0x00030001, 0x00030001, 0x00000001, 0x00000000,
3885     0xab007666, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003276, 0x00030001, 0x00040001,
3886     0x00000001, 0x00000000, 0x00000037, 0x0000003c, 0x0000004c, 0x00000050, 0x00000060, 0x00000064,
3887     0x00000005, 0x00080001, 0x00030002, 0x00000074, 0x00000034, 0x0000008c, 0x00000005, 0x00100001,
3888     0x00010001, 0x0000009c, 0x3f800000, 0x40000000, 0x40400000, 0x00000000, 0x40800000, 0x00000000,
3889     0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 0x41000000, 0x41100000, 0x41200000,
3890     0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 0x00000000, 0x41500000, 0x41600000,
3891     0x41700000, 0x41800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
3892     0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
3893     0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000,
3894     0x00000002, 0x00000010, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
3895     0x00000000, 0x00000000, 0xffffffff, 0x00000028, 0x00000000, 0x00000198, 0x46580200, 0x0053fffe,
3896     0x42415443, 0x0000001c, 0x00000117, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000114,
3897     0x00000030, 0x00000002, 0x00000002, 0x000000a4, 0x000000b4, 0x00337374, 0x76007374, 0xabab0031,
3898     0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001,
3899     0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000037, 0x0000003c,
3900     0x0000004c, 0x00000050, 0x00000060, 0x00000064, 0x00000005, 0x00080001, 0x00030002, 0x00000074,
3901     0x00000034, 0x0000008c, 0x00000005, 0x00100001, 0x00010001, 0x0000009c, 0x3f800000, 0x40000000,
3902     0x40400000, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000,
3903     0x40e00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000,
3904     0x00000000, 0x00000000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x4d007874, 0x6f726369,
3905     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
3906     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846,
3907     0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004,
3908     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000027,
3909     0x00000000, 0x0000017c, 0x46580200, 0x004cfffe, 0x42415443, 0x0000001c, 0x000000fb, 0x46580200,
3910     0x00000001, 0x0000001c, 0x20000100, 0x000000f8, 0x00000030, 0x00000002, 0x00000005, 0x00000088,
3911     0x00000098, 0x00327374, 0xab003176, 0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666,
3912     0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001,
3913     0x00000000, 0x00000034, 0x00000038, 0x00000048, 0x0000004c, 0x0000005c, 0x00000060, 0x00000005,
3914     0x00080001, 0x00030002, 0x00000070, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3915     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000,
3916     0x40000000, 0x40400000, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000,
3917     0x40c00000, 0x40e00000, 0x41000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
3918     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
3919     0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001,
3920     0x00000000, 0x00000002, 0x00000010, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f,
3921     0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000026, 0x00000000, 0x0000017c, 0x46580200,
3922     0x004cfffe, 0x42415443, 0x0000001c, 0x000000fb, 0x46580200, 0x00000001, 0x0000001c, 0x20000100,
3923     0x000000f8, 0x00000030, 0x00000002, 0x00000002, 0x00000088, 0x00000098, 0x00327374, 0xab003176,
3924     0x00030001, 0x00030001, 0x00000001, 0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001,
3925     0x00000000, 0xab003276, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000034, 0x00000038,
3926     0x00000048, 0x0000004c, 0x0000005c, 0x00000060, 0x00000005, 0x00080001, 0x00030002, 0x00000070,
3927     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3928     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x00000000,
3929     0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 0x41000000,
3930     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
3931     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
3932     0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000004,
3933     0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000,
3934     0xffffffff, 0x00000024, 0x00000000, 0x00000770, 0x46580200, 0x008cfffe, 0x42415443, 0x0000001c,
3935     0x000001fb, 0x46580200, 0x00000004, 0x0000001c, 0x20000100, 0x000001f8, 0x0000006c, 0x000b0002,
3936     0x00000001, 0x00000074, 0x00000084, 0x00000094, 0x00060002, 0x00000004, 0x0000009c, 0x000000ac,
3937     0x000000ec, 0x00000002, 0x00000006, 0x00000160, 0x00000170, 0x000001d0, 0x000a0002, 0x00000001,
3938     0x000001d8, 0x000001e8, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000,
3939     0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x3478346d, 0xababab00, 0x00030003, 0x00040004,
3940     0x00000001, 0x00000000, 0x41300000, 0x41a80000, 0x41f80000, 0x42240000, 0x41400000, 0x41b00000,
3941     0x42000000, 0x42280000, 0x41500000, 0x41b80000, 0x42040000, 0x422c0000, 0x41600000, 0x41c00000,
3942     0x42080000, 0x42300000, 0x00337374, 0x76007374, 0xabab0031, 0x00030001, 0x00030001, 0x00000001,
3943     0x00000000, 0xab007666, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003276, 0x00030001,
3944     0x00040001, 0x00000001, 0x00000000, 0x000000f3, 0x000000f8, 0x00000108, 0x0000010c, 0x0000011c,
3945     0x00000120, 0x00000005, 0x00080001, 0x00030002, 0x00000130, 0x000000f0, 0x00000148, 0x00000005,
3946     0x00100001, 0x00010001, 0x00000158, 0x3f800000, 0x40000000, 0x40400000, 0x00000000, 0x40800000,
3947     0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000, 0x40e00000, 0x41000000, 0x41100000,
3948     0x41200000, 0x41300000, 0x00000000, 0x41400000, 0x00000000, 0x00000000, 0x00000000, 0x41500000,
3949     0x41600000, 0x41700000, 0x41800000, 0x33636576, 0xababab00, 0x00030001, 0x00030001, 0x00000001,
3950     0x00000000, 0x447a4000, 0x447a8000, 0x447ac000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73,
3951     0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
3952     0x332e3235, 0x00313131, 0x008afffe, 0x54494c43, 0x00000044, 0x00000000, 0x00000000, 0x00000000,
3953     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3954     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3955     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3956     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3957     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3958     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3959     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3960     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3961     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3962     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3963     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3964     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x00000000,
3965     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3966     0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3967     0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
3968     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 0x40080000, 0x00000000,
3969     0x3ff00000, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00c1fffe, 0x434c5846, 0x0000000e,
3970     0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000018, 0x00000001, 0x00000002, 0x0000002e,
3971     0x00000001, 0x0000003c, 0x00000000, 0x00000007, 0x00000000, 0x50000004, 0x00000002, 0x00000000,
3972     0x00000002, 0x0000001c, 0x00000001, 0x00000002, 0x0000002e, 0x00000001, 0x0000003c, 0x00000000,
3973     0x00000007, 0x00000001, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000020, 0x00000001,
3974     0x00000002, 0x0000002e, 0x00000001, 0x0000003c, 0x00000000, 0x00000007, 0x00000002, 0x50000004,
3975     0x00000002, 0x00000000, 0x00000002, 0x00000024, 0x00000001, 0x00000002, 0x0000002e, 0x00000001,
3976     0x0000003c, 0x00000000, 0x00000007, 0x00000003, 0xa0400001, 0x00000002, 0x00000000, 0x00000002,
3977     0x0000002f, 0x00000000, 0x00000002, 0x0000002f, 0x00000000, 0x00000007, 0x00000004, 0x50000004,
3978     0x00000002, 0x00000000, 0x00000002, 0x00000018, 0x00000001, 0x00000007, 0x00000004, 0x00000001,
3979     0x00000030, 0x00000000, 0x00000007, 0x00000008, 0x50000004, 0x00000002, 0x00000000, 0x00000002,
3980     0x0000001c, 0x00000001, 0x00000007, 0x00000004, 0x00000001, 0x00000030, 0x00000000, 0x00000007,
3981     0x00000009, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000020, 0x00000001, 0x00000007,
3982     0x00000004, 0x00000001, 0x00000030, 0x00000000, 0x00000007, 0x0000000a, 0x50000004, 0x00000002,
3983     0x00000000, 0x00000002, 0x00000024, 0x00000001, 0x00000007, 0x00000004, 0x00000001, 0x00000030,
3984     0x00000000, 0x00000007, 0x0000000b, 0x50000004, 0x00000002, 0x00000000, 0x00000007, 0x00000000,
3985     0x00000000, 0x00000007, 0x00000008, 0x00000000, 0x00000004, 0x00000000, 0x50000003, 0x00000002,
3986     0x00000000, 0x00000002, 0x00000028, 0x00000001, 0x00000002, 0x0000002e, 0x00000001, 0x00000030,
3987     0x00000000, 0x00000004, 0x00000002, 0x70e00001, 0x00000006, 0x00000000, 0x00000001, 0x00000041,
3988     0x00000000, 0x00000001, 0x00000042, 0x00000000, 0x00000001, 0x00000040, 0x00000001, 0x00000002,
3989     0x0000002f, 0x00000001, 0x00000030, 0x00000001, 0x00000002, 0x0000002f, 0x00000001, 0x00000031,
3990     0x00000001, 0x00000002, 0x0000002f, 0x00000001, 0x00000032, 0x00000000, 0x00000004, 0x00000003,
3991     0xa0500001, 0x00000002, 0x00000000, 0x00000002, 0x0000002c, 0x00000000, 0x00000001, 0x00000040,
3992     0x00000000, 0x00000007, 0x00000000, 0x10000001, 0x00000001, 0x00000001, 0x00000007, 0x00000000,
3993     0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000001, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
3994     0x00000000, 0x00000000, 0xffffffff, 0x00000023, 0x00000000, 0x000004ec, 0x46580200, 0x005afffe,
3995     0x42415443, 0x0000001c, 0x00000133, 0x46580200, 0x00000004, 0x0000001c, 0x20000100, 0x00000130,
3996     0x0000006c, 0x00000002, 0x00000003, 0x00000078, 0x00000088, 0x000000b8, 0x000a0002, 0x00000001,
3997     0x000000c0, 0x000000d0, 0x000000e0, 0x00080002, 0x00000001, 0x000000e8, 0x000000f8, 0x00000108,
3998     0x00090002, 0x00000001, 0x00000110, 0x00000120, 0x65535f67, 0x7463656c, 0xab00726f, 0x00030001,
3999     0x00040001, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x41200000,
4000     0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000, 0x459c5800, 0x459c6000, 0x56695f67,
4001     0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000,
4002     0x3f800000, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000,
4003     0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001,
4004     0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73,
4005     0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
4006     0x332e3235, 0x00313131, 0x007afffe, 0x54494c43, 0x0000003c, 0x00000000, 0x00000000, 0x00000000,
4007     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4008     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4009     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4010     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4011     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4012     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4013     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4014     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4015     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4016     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4017     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x00000000,
4018     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4019     0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4020     0x00000000, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4021     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3ff00000, 0x0062fffe, 0x434c5846, 0x00000008,
4022     0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000020, 0x00000001, 0x00000002, 0x0000002a,
4023     0x00000001, 0x0000002c, 0x00000000, 0x00000004, 0x00000000, 0x10400001, 0x00000001, 0x00000000,
4024     0x00000002, 0x00000025, 0x00000000, 0x00000007, 0x00000000, 0x10100001, 0x00000001, 0x00000000,
4025     0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0xa0400001, 0x00000002, 0x00000000,
4026     0x00000002, 0x00000025, 0x00000000, 0x00000001, 0x0000002c, 0x00000000, 0x00000007, 0x00000000,
4027     0xa0400001, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004,
4028     0x00000000, 0x00000007, 0x00000008, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000028,
4029     0x00000001, 0x00000007, 0x00000008, 0x00000001, 0x0000002c, 0x00000000, 0x00000004, 0x00000001,
4030     0xa0400001, 0x00000002, 0x00000001, 0x00000002, 0x0000002b, 0x00000002, 0x00000010, 0x00000001,
4031     0x00000002, 0x0000002b, 0x00000002, 0x0000001d, 0x00000000, 0x00000004, 0x00000002, 0xa0400001,
4032     0x00000002, 0x00000001, 0x00000002, 0x00000028, 0x00000002, 0x00000001, 0x00000001, 0x00000002,
4033     0x0000002b, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f,
4034     0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000022, 0x00000000, 0x000002cc, 0x46580200,
4035     0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100,
4036     0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002,
4037     0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001,
4038     0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001,
4039     0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874,
4040     0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
4041     0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x001afffe, 0x54494c43, 0x0000000c, 0x00000000,
4042     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4043     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4044     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0061fffe,
4045     0x434c5846, 0x00000006, 0xa0500001, 0x00000002, 0x00000000, 0x00000002, 0x00000002, 0x00000000,
4046     0x00000002, 0x00000004, 0x00000000, 0x00000007, 0x00000000, 0xa0500001, 0x00000002, 0x00000000,
4047     0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000005, 0x00000000, 0x00000007, 0x00000001,
4048     0xa0400001, 0x00000002, 0x00000000, 0x00000007, 0x00000001, 0x00000000, 0x00000007, 0x00000000,
4049     0x00000000, 0x00000004, 0x00000000, 0x70e00001, 0x00000006, 0x00000000, 0x00000002, 0x00000002,
4050     0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002,
4051     0x00000004, 0x00000000, 0x00000002, 0x00000005, 0x00000000, 0x00000002, 0x00000006, 0x00000000,
4052     0x00000004, 0x00000001, 0x70e00001, 0x00000008, 0x00000000, 0x00000002, 0x00000002, 0x00000000,
4053     0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000000,
4054     0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000002,
4055     0x00000005, 0x00000000, 0x00000002, 0x00000005, 0x00000000, 0x00000004, 0x00000002, 0x10000001,
4056     0x00000001, 0x00000000, 0x00000001, 0x00000008, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0,
4057     0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000021, 0x00000000, 0x00000248,
4058     0x46580200, 0x003efffe, 0x42415443, 0x0000001c, 0x000000c3, 0x46580200, 0x00000003, 0x0000001c,
4059     0x20000100, 0x000000c0, 0x00000058, 0x00000002, 0x00000001, 0x00000060, 0x00000070, 0x00000080,
4060     0x00010002, 0x00000001, 0x00000088, 0x00000098, 0x000000a8, 0x00020002, 0x00000001, 0x000000b0,
4061     0x00000070, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000,
4062     0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001,
4063     0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x6576706f, 0x00337463, 0x00030001,
4064     0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4065     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4066     0x0022fffe, 0x54494c43, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4067     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4068     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4069     0x00000000, 0x00000000, 0x00000000, 0x812dea11, 0x3d719799, 0x00000000, 0x00000000, 0x00000000,
4070     0x00000000, 0x00000000, 0x00000000, 0x002dfffe, 0x434c5846, 0x00000004, 0xa0500004, 0x00000002,
4071     0x00000000, 0x00000001, 0x0000000c, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000007,
4072     0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000002,
4073     0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x10100004, 0x00000001, 0x00000000, 0x00000002,
4074     0x00000008, 0x00000000, 0x00000007, 0x00000000, 0x20400004, 0x00000002, 0x00000000, 0x00000007,
4075     0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0,
4076     0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000020, 0x00000000, 0x000001f0,
4077     0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c,
4078     0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c,
4079     0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001,
4080     0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463,
4081     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000,
4082     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
4083     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x001afffe, 0x54494c43, 0x0000000c,
4084     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4085     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4086     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4087     0x002afffe, 0x434c5846, 0x00000004, 0x50000004, 0x00000002, 0x00000000, 0x00000002, 0x00000000,
4088     0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000001, 0x50000004, 0x00000002,
4089     0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004,
4090     0x00000002, 0x10000001, 0x00000001, 0x00000000, 0x00000001, 0x00000008, 0x00000000, 0x00000004,
4091     0x00000000, 0x10000001, 0x00000001, 0x00000000, 0x00000001, 0x00000008, 0x00000000, 0x00000004,
4092     0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001f,
4093     0x00000000, 0x000001a8, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200,
4094     0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038,
4095     0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000,
4096     0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4097     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4098     0x0012fffe, 0x54494c43, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4099     0x00000000, 0x00000000, 0x00000000, 0x47ae147b, 0x3f847ae1, 0x00000000, 0x00000000, 0x00000000,
4100     0x00000000, 0x00000000, 0x00000000, 0x002ffffe, 0x434c5846, 0x00000005, 0x10300001, 0x00000001,
4101     0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x10300001, 0x00000001,
4102     0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000007, 0x00000001, 0x10300001, 0x00000001,
4103     0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000007, 0x00000002, 0x10300001, 0x00000001,
4104     0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000007, 0x00000003, 0xa0500004, 0x00000002,
4105     0x00000000, 0x00000001, 0x00000004, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000004,
4106     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001e,
4107     0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200,
4108     0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038,
4109     0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000,
4110     0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4111     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4112     0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10900004, 0x00000001,
4113     0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f,
4114     0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001d, 0x00000000, 0x000000dc, 0x46580200,
4115     0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100,
4116     0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463,
4117     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff,
4118     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
4119     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
4120     0x000cfffe, 0x434c5846, 0x00000001, 0x10800004, 0x00000001, 0x00000000, 0x00000002, 0x00000000,
4121     0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000,
4122     0xffffffff, 0x0000001c, 0x00000000, 0x00000124, 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c,
4123     0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000094, 0x00000044, 0x00000002,
4124     0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x00000084,
4125     0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000,
4126     0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000,
4127     0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820,
4128     0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235,
4129     0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20100004,
4130     0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000,
4131     0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff,
4132     0x0000001b, 0x00000000, 0x00000124, 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097,
4133     0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001,
4134     0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f,
4135     0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd,
4136     0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000,
4137     0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4138     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4139     0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20000004, 0x00000002,
4140     0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004,
4141     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x0000001a,
4142     0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200,
4143     0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038,
4144     0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000,
4145     0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4146     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4147     0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10400004, 0x00000001,
4148     0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f,
4149     0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000019, 0x00000000, 0x0000013c, 0x46580200,
4150     0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100,
4151     0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463,
4152     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff,
4153     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
4154     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
4155     0x0024fffe, 0x434c5846, 0x00000004, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000000,
4156     0x00000000, 0x00000004, 0x00000000, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000001,
4157     0x00000000, 0x00000004, 0x00000001, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000002,
4158     0x00000000, 0x00000004, 0x00000002, 0x10300001, 0x00000001, 0x00000000, 0x00000002, 0x00000003,
4159     0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000,
4160     0xffffffff, 0x00000018, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c,
4161     0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002,
4162     0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001,
4163     0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73,
4164     0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932,
4165     0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001,
4166     0x10100004, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000,
4167     0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000017, 0x00000000,
4168     0x00000124, 0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002,
4169     0x0000001c, 0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c,
4170     0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001,
4171     0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f,
4172     0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000,
4173     0x40800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461,
4174     0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43,
4175     0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20300004, 0x00000002, 0x00000000, 0x00000002,
4176     0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0,
4177     0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000016, 0x00000000, 0x00000124,
4178     0x46580200, 0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c,
4179     0x20000100, 0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c,
4180     0x00010002, 0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001,
4181     0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463,
4182     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000,
4183     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
4184     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
4185     0x000ffffe, 0x434c5846, 0x00000001, 0x20200004, 0x00000002, 0x00000000, 0x00000002, 0x00000000,
4186     0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f,
4187     0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000015, 0x00000000, 0x00000124, 0x46580200,
4188     0x0033fffe, 0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100,
4189     0x00000094, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002,
4190     0x00000001, 0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001,
4191     0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001,
4192     0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874,
4193     0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
4194     0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe,
4195     0x434c5846, 0x00000001, 0x20400004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
4196     0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
4197     0x00000000, 0x00000000, 0xffffffff, 0x00000014, 0x00000000, 0x00000124, 0x46580200, 0x0033fffe,
4198     0x42415443, 0x0000001c, 0x00000097, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000094,
4199     0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001,
4200     0x00000074, 0x00000084, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000,
4201     0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x6576706f, 0x00327463, 0x00030001, 0x00040001,
4202     0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x4d007874, 0x6f726369,
4203     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
4204     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846,
4205     0x00000001, 0x20500004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002,
4206     0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000,
4207     0x00000000, 0xffffffff, 0x00000013, 0x00000000, 0x0000013c, 0x46580200, 0x0024fffe, 0x42415443,
4208     0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030,
4209     0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001,
4210     0x00000001, 0x00000000, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369,
4211     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
4212     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846,
4213     0x00000004, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004,
4214     0x00000000, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004,
4215     0x00000001, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004,
4216     0x00000002, 0x10700001, 0x00000001, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000004,
4217     0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000012,
4218     0x00000000, 0x0000013c, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200,
4219     0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038,
4220     0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000,
4221     0x80000000, 0xc00ccccd, 0x7f7fffff, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4222     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4223     0x0002fffe, 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10300001, 0x00000001,
4224     0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10300001, 0x00000001,
4225     0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004, 0x00000001, 0x10300001, 0x00000001,
4226     0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004, 0x00000002, 0x10300001, 0x00000001,
4227     0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f,
4228     0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000001, 0x00000002, 0x00000134, 0x00000008,
4229     0x615f7370, 0x00007272, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200,
4230     0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038,
4231     0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x40800000,
4232     0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
4233     0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131,
4234     0x0012fffe, 0x54494c43, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4235     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbff00000, 0x00000000, 0x00000000, 0x00000000,
4236     0x00000000, 0x00000000, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0xa0400001, 0x00000002,
4237     0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000001, 0x00000004, 0x00000000, 0x00000004,
4238     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
4239     0x00000002, 0x00000134, 0x00000008, 0x615f7376, 0x00327272, 0x46580200, 0x0024fffe, 0x42415443,
4240     0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x00000100, 0x00000058, 0x00000030,
4241     0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001,
4242     0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369,
4243     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
4244     0x392e3932, 0x332e3235, 0x00313131, 0x0012fffe, 0x54494c43, 0x00000008, 0x00000000, 0x00000000,
4245     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbff00000,
4246     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000ffffe, 0x434c5846,
4247     0x00000001, 0xa0400001, 0x00000002, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000001,
4248     0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff,
4249     0x0000001f, 0x00000001, 0x00000001, 0x00000000, 0x000000e4, 0x46580200, 0x0026fffe, 0x42415443,
4250     0x0000001c, 0x00000063, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000060, 0x00000030,
4251     0x00000002, 0x00000001, 0x00000040, 0x00000050, 0x74636576, 0x6d61735f, 0x72656c70, 0xababab00,
4252     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000,
4253     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
4254     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
4255     0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000001,
4256     0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 0x0000001f,
4257     0x00000000, 0x00000001, 0x00000000, 0x000000e4, 0x46580200, 0x0026fffe, 0x42415443, 0x0000001c,
4258     0x00000063, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000060, 0x00000030, 0x00000002,
4259     0x00000001, 0x00000040, 0x00000050, 0x74636576, 0x6d61735f, 0x72656c70, 0xababab00, 0x00030001,
4260     0x00040001, 0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x4d007874,
4261     0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
4262     0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe,
4263     0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
4264     0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 0x0000001e, 0x00000000,
4265     0x00000002, 0x00000000, 0x000000f0, 0x46580200, 0x0026fffe, 0x42415443, 0x0000001c, 0x00000063,
4266     0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000060, 0x00000030, 0x00000002, 0x00000001,
4267     0x00000040, 0x00000050, 0x74636576, 0x6d61735f, 0x72656c70, 0xababab00, 0x00030001, 0x00040001,
4268     0x00000001, 0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x4d007874, 0x6f726369,
4269     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
4270     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846,
4271     0x00000001, 0xa0400001, 0x00000002, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000002,
4272     0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff,
4273     0x0000001e, 0x00000000, 0x00000001, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443,
4274     0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030,
4275     0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x56695f67, 0x00746365, 0x00020001, 0x00040001,
4276     0x00000001, 0x00000000, 0x40800000, 0x40400000, 0x40000000, 0x3f800000, 0x4d007874, 0x6f726369,
4277     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
4278     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846,
4279     0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004,
4280     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0xffffffff, 0x0000001e, 0x00000000, 0x00000000,
4281     0x00000001, 0x00000005, 0x31786574, 0x00000000,
4282 };
4283 #define TEST_EFFECT_PRESHADER_VSHADER_POS 2991
4284 #define TEST_EFFECT_PRESHADER_VSHADER_LEN 13
4285 
4286 #define test_effect_preshader_compare_shader_bytecode(a, b, c, d) \
4287         test_effect_preshader_compare_shader_bytecode_(__LINE__, a, b, c, d)
4288 static void test_effect_preshader_compare_shader_bytecode_(unsigned int line,
4289         const DWORD *bytecode, unsigned int bytecode_size, int expected_shader_index, BOOL todo)
4290 {
4291     unsigned int i = 0;
4292 
4293     todo_wine_if(todo)
4294     ok_(__FILE__, line)(!!bytecode, "NULL shader bytecode.\n");
4295 
4296     if (!bytecode)
4297         return;
4298 
4299     while (bytecode[i++] != 0x0000ffff)
4300         ;
4301 
4302     if (!bytecode_size)
4303         bytecode_size = i * sizeof(*bytecode);
4304     else
4305         ok(i * sizeof(*bytecode) == bytecode_size, "Unexpected byte code size %u.\n", bytecode_size);
4306 
4307     todo_wine_if(todo)
4308     ok_(__FILE__, line)(!memcmp(bytecode, &test_effect_preshader_effect_blob[TEST_EFFECT_PRESHADER_VSHADER_POS
4309             + expected_shader_index * TEST_EFFECT_PRESHADER_VSHADER_LEN], bytecode_size),
4310             "Incorrect shader selected.\n");
4311 }
4312 
4313 #define test_effect_preshader_compare_shader(a, b, c) \
4314         test_effect_preshader_compare_shader_(__LINE__, a, b, c)
4315 static void test_effect_preshader_compare_shader_(unsigned int line, IDirect3DDevice9 *device,
4316         int expected_shader_index, BOOL todo)
4317 {
4318     IDirect3DVertexShader9 *vshader;
4319     void *byte_code;
4320     unsigned int byte_code_size;
4321     HRESULT hr;
4322 
4323     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
4324     ok_(__FILE__, line)(hr == D3D_OK, "IDirect3DDevice9_GetVertexShader result %#x.\n", hr);
4325 
4326     todo_wine_if(todo)
4327     ok_(__FILE__, line)(!!vshader, "Got NULL vshader.\n");
4328     if (!vshader)
4329         return;
4330 
4331     hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
4332     ok_(__FILE__, line)(hr == D3D_OK, "IDirect3DVertexShader9_GetFunction %#x.\n", hr);
4333     ok_(__FILE__, line)(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size);
4334 
4335     byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
4336     hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
4337     ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
4338 
4339     test_effect_preshader_compare_shader_bytecode_(line, byte_code,
4340             byte_code_size, expected_shader_index, todo);
4341 
4342     HeapFree(GetProcessHeap(), 0, byte_code);
4343     IDirect3DVertexShader9_Release(vshader);
4344  }
4345 
4346 static const struct
4347 {
4348     const char *comment;
4349     BOOL todo[4];
4350     unsigned int result[4];
4351     unsigned int ulps;
4352 }
4353 test_effect_preshader_op_expected[] =
4354 {
4355     {"1 / op", {FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbee8ba2e, 0x00200000}},
4356     {"rsq",    {FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0x7f800000, 0x3f2c985c, 0x1f800001}, 1},
4357     {"mul",    {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x80000000, 0x40d33334, 0x7f800000}},
4358     {"add",    {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x40000000, 0xc0a66666, 0x7f7fffff}},
4359     {"lt",     {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x3f800000, 0x00000000, 0x00000000}},
4360     {"ge",     {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x00000000, 0x3f800000, 0x3f800000}},
4361     {"neg",    {FALSE, FALSE, FALSE, FALSE}, {0x80000000, 0x00000000, 0x400ccccd, 0xff7fffff}},
4362     {"rcp",    {FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbee8ba2e, 0x00200000}},
4363 
4364     {"frac",   {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x00000000, 0x3f4ccccc, 0x00000000}},
4365     {"min",    {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x80000000, 0xc0400000, 0x40800000}},
4366     {"max",    {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x40000000, 0xc00ccccd, 0x7f7fffff}},
4367 #if __x86_64__
4368     {"sin",    {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x80000000, 0xbf4ef99e, 0xbf0599b3}},
4369     {"cos",    {FALSE, FALSE, FALSE, FALSE}, {0x3f800000, 0x3f800000, 0xbf16a803, 0x3f5a5f96}},
4370 #else
4371     {"sin",    {FALSE, FALSE, FALSE,  TRUE}, {0x00000000, 0x80000000, 0xbf4ef99e, 0x3f792dc4}},
4372     {"cos",    {FALSE, FALSE, FALSE,  TRUE}, {0x3f800000, 0x3f800000, 0xbf16a803, 0xbe6acefc}},
4373 #endif
4374     {"den mul",{FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbb94f209, 0x000051ec}},
4375     {"dot",    {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x7f800000, 0x41f00000, 0x00000000}},
4376     {"prec",   {FALSE, FALSE,  TRUE, FALSE}, {0x2b8cbccc, 0x2c0cbccc, 0xac531800, 0x00000000}},
4377 
4378     {"dotswiz", {FALSE, FALSE, FALSE, FALSE}, {0xc00ccccd, 0xc0d33334, 0xc10ccccd, 0}},
4379     {"reladdr", {FALSE, FALSE, FALSE, FALSE}, {0xc00ccccd, 0x3f800000, 0, 0x41200000}},
4380     {"reladdr2", {FALSE, FALSE, FALSE, FALSE}, {0, 0, 0x447ac000, 0x40000000}},
4381 };
4382 
4383 enum expected_state_update
4384 {
4385     EXPECTED_STATE_ZERO,
4386     EXPECTED_STATE_UPDATED,
4387     EXPECTED_STATE_ANYTHING
4388 };
4389 
4390 #define test_effect_preshader_op_results(a, b, c) test_effect_preshader_op_results_(__LINE__, a, b, c)
4391 static void test_effect_preshader_op_results_(unsigned int line, IDirect3DDevice9 *device,
4392         const enum expected_state_update *expected_state, const char *updated_param)
4393 {
4394     static const D3DCOLORVALUE black = {0.0f};
4395     unsigned int i, j;
4396     D3DLIGHT9 light;
4397     const float *v;
4398     HRESULT hr;
4399 
4400     for (i = 0; i < ARRAY_SIZE(test_effect_preshader_op_expected); ++i)
4401     {
4402         hr = IDirect3DDevice9_GetLight(device, i % 8, &light);
4403         ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
4404 
4405         v = i < 8 ? &light.Diffuse.r : (i < 16 ? &light.Ambient.r : &light.Specular.r);
4406         if (!expected_state || expected_state[i] == EXPECTED_STATE_UPDATED)
4407         {
4408             for (j = 0; j < 4; ++j)
4409             {
4410                 todo_wine_if(test_effect_preshader_op_expected[i].todo[j])
4411                 ok_(__FILE__, line)(compare_float(v[j],
4412                         ((const float *)test_effect_preshader_op_expected[i].result)[j],
4413                         test_effect_preshader_op_expected[i].ulps),
4414                         "Operation %s, component %u, expected %#x, got %#x (%g).\n",
4415                         test_effect_preshader_op_expected[i].comment, j,
4416                         test_effect_preshader_op_expected[i].result[j],
4417                         ((const unsigned int *)v)[j], v[j]);
4418             }
4419         }
4420         else if (expected_state[i] == EXPECTED_STATE_ZERO)
4421         {
4422             ok_(__FILE__, line)(!memcmp(v, &black, sizeof(black)),
4423                     "Parameter %s, test %d, operation %s, state updated unexpectedly.\n",
4424                     updated_param, i, test_effect_preshader_op_expected[i].comment);
4425         }
4426     }
4427 }
4428 
4429 static const D3DXVECTOR4 test_effect_preshader_fvect_v[] =
4430 {
4431     {0.0f,   0.0f,  0.0f,  0.0f},
4432     {0.0f,   0.0f,  0.0f,  0.0f},
4433     {0.0f,   0.0f,  0.0f,  0.0f},
4434     {1.0f,   2.0f,  3.0f,  0.0f},
4435     {4.0f,   0.0f,  0.0f,  0.0f},
4436     {5.0f,   6.0f,  7.0f,  8.0f},
4437     {1.0f,   2.0f,  3.0f,  0.0f},
4438     {4.0f,   0.0f,  0.0f,  0.0f},
4439     {5.0f,   6.0f,  7.0f,  8.0f},
4440     {9.0f,  10.0f, 11.0f,  0.0f},
4441     {12.0f,  0.0f,  0.0f,  0.0f},
4442     {13.0f, 14.0f, 15.0f, 16.0f},
4443     {11.0f, 12.0f, 13.0f,  0.0f},
4444     {21.0f, 22.0f, 23.0f,  0.0f},
4445     {31.0f, 32.0f, 33.0f,  0.0f},
4446     {41.0f, 42.0f, 43.0f,  0.0f},
4447     {11.0f, 21.0f, 31.0f,  0.0f},
4448     {12.0f, 22.0f, 32.0f,  0.0f},
4449     {13.0f, 23.0f, 33.0f,  0.0f},
4450     {14.0f, 24.0f, 34.0f,  0.0f},
4451     {11.0f, 12.0f, 13.0f, 14.0f},
4452     {21.0f, 22.0f, 23.0f, 24.0f},
4453     {31.0f, 32.0f, 33.0f, 34.0f},
4454     {11.0f, 21.0f, 31.0f, 41.0f},
4455     {12.0f, 22.0f, 32.0f, 42.0f},
4456     {13.0f, 23.0f, 33.0f, 43.0f},
4457     {9.0f,  10.0f, 11.0f,  0.0f},
4458     {12.0f,  0.0f,  0.0f,  0.0f},
4459     {13.0f, 14.0f, 15.0f, 16.0f},
4460     {92.0f,  0.0f,  0.0f,  0.0f},
4461     {93.0f,  0.0f,  0.0f,  0.0f},
4462     {0.0f,   0.0f,  0.0f,  0.0f},
4463     {91.0f,  0.0f,  0.0f,  0.0f},
4464     {4.0f,   5.0f,  6.0f,  7.0f},
4465 };
4466 #define TEST_EFFECT_BITMASK_BLOCK_SIZE (sizeof(unsigned int) * 8)
4467 
4468 #define test_effect_preshader_compare_vconsts(a, b, c) \
4469         test_effect_preshader_compare_vconsts_(__LINE__, a, b, c)
4470 static void test_effect_preshader_compare_vconsts_(unsigned int line, IDirect3DDevice9 *device,
4471         const unsigned int *const_updated_mask, const char *updated_param)
4472 {
4473     HRESULT hr;
4474     unsigned int i;
4475     D3DXVECTOR4 fdata[ARRAY_SIZE(test_effect_preshader_fvect_v)];
4476 
4477     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 0, &fdata[0].x,
4478             ARRAY_SIZE(test_effect_preshader_fvect_v));
4479     ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
4480 
4481     if (!const_updated_mask)
4482     {
4483         ok_(__FILE__, line)(!memcmp(fdata, test_effect_preshader_fvect_v, sizeof(test_effect_preshader_fvect_v)),
4484                 "Vertex shader float constants do not match.\n");
4485     }
4486     else
4487     {
4488         for (i = 0; i < ARRAY_SIZE(test_effect_preshader_fvect_v); ++i)
4489         {
4490             if (const_updated_mask[i / TEST_EFFECT_BITMASK_BLOCK_SIZE]
4491                     & (1u << (i % TEST_EFFECT_BITMASK_BLOCK_SIZE)))
4492             {
4493                 ok_(__FILE__, line)(!memcmp(&fdata[i], &test_effect_preshader_fvect_v[i], sizeof(fdata[i])),
4494                         "Vertex shader float constants do not match, expected (%g, %g, %g, %g), "
4495                         "got (%g, %g, %g, %g), parameter %s.\n",
4496                         test_effect_preshader_fvect_v[i].x, test_effect_preshader_fvect_v[i].y,
4497                         test_effect_preshader_fvect_v[i].z, test_effect_preshader_fvect_v[i].w,
4498                         fdata[i].x, fdata[i].y, fdata[i].z, fdata[i].w, updated_param);
4499             }
4500             else
4501             {
4502                 ok_(__FILE__, line)(!memcmp(&fdata[i], &fvect_filler, sizeof(fdata[i])),
4503                         "Vertex shader float constants updated unexpectedly, parameter %s.\n", updated_param);
4504             }
4505         }
4506     }
4507 
4508     for (i = ARRAY_SIZE(test_effect_preshader_fvect_v); i < 256; ++i)
4509     {
4510         hr = IDirect3DDevice9_GetVertexShaderConstantF(device, i, &fdata[0].x, 1);
4511         ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
4512         ok_(__FILE__, line)(!memcmp(fdata, &fvect_filler, sizeof(fvect_filler)),
4513                 "Vertex shader float constants do not match.\n");
4514     }
4515 }
4516 
4517 static const BOOL test_effect_preshader_bconsts[] =
4518 {
4519     TRUE, FALSE, TRUE, FALSE, TRUE, TRUE
4520 };
4521 
4522 static void test_effect_preshader_clear_pbool_consts(IDirect3DDevice9 *device)
4523 {
4524     BOOL bval;
4525     unsigned int i;
4526     HRESULT hr;
4527 
4528     for (i = 0; i < 16; ++i)
4529     {
4530         bval = i < ARRAY_SIZE(test_effect_preshader_bconsts) ? !test_effect_preshader_bconsts[i] : FALSE;
4531         hr = IDirect3DDevice9_SetPixelShaderConstantB(device, i, &bval, 1);
4532         ok(hr == D3D_OK, "Got result %#x.\n", hr);
4533     }
4534 }
4535 
4536 #define test_effect_preshader_compare_pbool_consts(a, b, c) \
4537         test_effect_preshader_compare_pbool_consts_(__LINE__, a, b, c)
4538 static void test_effect_preshader_compare_pbool_consts_(unsigned int line, IDirect3DDevice9 *device,
4539         const unsigned int *const_updated_mask, const char *updated_param)
4540 {
4541     unsigned int i;
4542     BOOL bdata[16];
4543     HRESULT hr;
4544 
4545     hr = IDirect3DDevice9_GetPixelShaderConstantB(device, 0, bdata, ARRAY_SIZE(bdata));
4546     ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
4547 
4548     if (!const_updated_mask)
4549     {
4550         for (i = 0; i < ARRAY_SIZE(test_effect_preshader_bconsts); ++i)
4551         {
4552             /* The negation on both sides is actually needed, sometimes you
4553              * get 0xffffffff instead of 1 on native. */
4554             ok_(__FILE__, line)(!bdata[i] == !test_effect_preshader_bconsts[i],
4555                     "Pixel shader boolean constants do not match, expected %#x, got %#x, i %u.\n",
4556                     test_effect_preshader_bconsts[i], bdata[i], i);
4557         }
4558     }
4559     else
4560     {
4561         for (i = 0; i < ARRAY_SIZE(test_effect_preshader_bconsts); ++i)
4562         {
4563             if (const_updated_mask[i / TEST_EFFECT_BITMASK_BLOCK_SIZE]
4564                     & (1u << (i % TEST_EFFECT_BITMASK_BLOCK_SIZE)))
4565             {
4566                 /* The negation on both sides is actually needed, sometimes
4567                  * you get 0xffffffff instead of 1 on native. */
4568                 ok_(__FILE__, line)(!bdata[i] == !test_effect_preshader_bconsts[i],
4569                         "Pixel shader boolean constants do not match, expected %#x, got %#x, i %u, parameter %s.\n",
4570                         test_effect_preshader_bconsts[i], bdata[i], i, updated_param);
4571             }
4572             else
4573             {
4574                 ok_(__FILE__, line)(bdata[i] == !test_effect_preshader_bconsts[i],
4575                         "Pixel shader boolean constants updated unexpectedly, parameter %s.\n", updated_param);
4576             }
4577         }
4578     }
4579 
4580     for (; i < 16; ++i)
4581     {
4582         ok_(__FILE__, line)(!bdata[i], "Got result %#x, boolean register value %u.\n", hr, bdata[i]);
4583     }
4584 }
4585 
4586 static void test_effect_preshader(IDirect3DDevice9 *device)
4587 {
4588     static const D3DXVECTOR4 test_effect_preshader_fvect_p[] =
4589     {
4590         {11.0f, 21.0f,  0.0f, 0.0f},
4591         {12.0f, 22.0f,  0.0f, 0.0f},
4592         {13.0f, 23.0f,  0.0f, 0.0f},
4593         {11.0f, 12.0f,  0.0f, 0.0f},
4594         {21.0f, 22.0f,  0.0f, 0.0f},
4595         {31.0f, 32.0f,  0.0f, 0.0f},
4596         {11.0f, 12.0f,  0.0f, 0.0f},
4597         {21.0f, 22.0f,  0.0f, 0.0f},
4598         {11.0f, 21.0f,  0.0f, 0.0f},
4599         {12.0f, 22.0f,  0.0f, 0.0f},
4600         {11.0f, 12.0f, 13.0f, 0.0f},
4601         {21.0f, 22.0f, 23.0f, 0.0f},
4602         {11.0f, 21.0f, 31.0f, 0.0f},
4603         {12.0f, 22.0f, 32.0f, 0.0f}
4604     };
4605     static const int test_effect_preshader_iconsts[][4] =
4606     {
4607         {4, 3, 2, 1}
4608     };
4609     static const D3DXVECTOR4 fvect1 = {28.0f, 29.0f, 30.0f, 31.0f};
4610     static const D3DXVECTOR4 fvect2 = {0.0f, 0.0f, 1.0f, 0.0f};
4611     static const int ivect_empty[4] = {-1, -1, -1, -1};
4612     HRESULT hr;
4613     ID3DXEffect *effect;
4614     D3DXHANDLE par;
4615     unsigned int npasses;
4616     DWORD value;
4617     D3DXVECTOR4 fdata[ARRAY_SIZE(test_effect_preshader_fvect_p)];
4618     int idata[ARRAY_SIZE(test_effect_preshader_iconsts)][4];
4619     IDirect3DVertexShader9 *vshader;
4620     unsigned int i;
4621     D3DCAPS9 caps;
4622 
4623     hr = IDirect3DDevice9_GetDeviceCaps(device, &caps);
4624     ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr);
4625     if (caps.VertexShaderVersion < D3DVS_VERSION(3, 0)
4626             || caps.PixelShaderVersion < D3DPS_VERSION(3, 0))
4627     {
4628         skip("Test requires VS >= 3 and PS >= 3, skipping.\n");
4629         return;
4630     }
4631 
4632     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
4633             NULL, NULL, 0, NULL, &effect, NULL);
4634     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4635 
4636     test_effect_clear_vconsts(device);
4637 
4638     for (i = 0; i < 224; ++i)
4639     {
4640         hr = IDirect3DDevice9_SetPixelShaderConstantF(device, i, &fvect_filler.x, 1);
4641         ok(hr == D3D_OK, "Got result %#x.\n", hr);
4642     }
4643 
4644     test_effect_preshader_clear_pbool_consts(device);
4645 
4646     for (i = 0; i < 16; ++i)
4647     {
4648         hr = IDirect3DDevice9_SetPixelShaderConstantI(device, i, ivect_empty, 1);
4649         ok(hr == D3D_OK, "Got result %#x.\n", hr);
4650     }
4651 
4652     hr = effect->lpVtbl->Begin(effect, &npasses, 0);
4653     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4654 
4655     par = effect->lpVtbl->GetParameterByName(effect, NULL, "g_Pos2");
4656     ok(par != NULL, "GetParameterByName failed.\n");
4657 
4658     hr = effect->lpVtbl->SetVector(effect, par, &fvect1);
4659     ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr);
4660 
4661     hr = effect->lpVtbl->BeginPass(effect, 0);
4662     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4663 
4664     hr = effect->lpVtbl->BeginPass(effect, 0);
4665     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
4666 
4667     hr = effect->lpVtbl->BeginPass(effect, 1);
4668     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
4669 
4670     test_effect_preshader_compare_vconsts(device, NULL, NULL);
4671 
4672     hr = IDirect3DDevice9_GetPixelShaderConstantF(device, 0, &fdata[0].x,
4673             ARRAY_SIZE(test_effect_preshader_fvect_p));
4674     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4675     ok(!memcmp(fdata, test_effect_preshader_fvect_p, sizeof(test_effect_preshader_fvect_p)),
4676             "Pixel shader float constants do not match.\n");
4677     for (i = ARRAY_SIZE(test_effect_preshader_fvect_p); i < 224; ++i)
4678     {
4679         hr = IDirect3DDevice9_GetPixelShaderConstantF(device, i, &fdata[0].x, 1);
4680         ok(hr == D3D_OK, "Got result %#x.\n", hr);
4681         ok(!memcmp(fdata, &fvect_filler, sizeof(fvect_filler)),
4682                 "Pixel shader float constants do not match.\n");
4683     }
4684     hr = IDirect3DDevice9_GetPixelShaderConstantI(device, 0, idata[0],
4685             ARRAY_SIZE(test_effect_preshader_iconsts));
4686     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4687     ok(!memcmp(idata, test_effect_preshader_iconsts, sizeof(test_effect_preshader_iconsts)),
4688             "Pixel shader integer constants do not match.\n");
4689     for (i = ARRAY_SIZE(test_effect_preshader_iconsts); i < 16; ++i)
4690     {
4691         hr = IDirect3DDevice9_GetPixelShaderConstantI(device, i, idata[0], 1);
4692         ok(hr == D3D_OK, "Got result %#x.\n", hr);
4693         ok(!memcmp(idata[0], ivect_empty, sizeof(ivect_empty)),
4694                 "Pixel shader integer constants do not match.\n");
4695     }
4696 
4697     test_effect_preshader_compare_pbool_consts(device, NULL, NULL);
4698 
4699     test_effect_preshader_op_results(device, NULL, NULL);
4700 
4701     hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MINFILTER, &value);
4702     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4703     ok(value == 3, "Unexpected sampler 0 minfilter %u.\n", value);
4704     hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MAGFILTER, &value);
4705     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4706     todo_wine ok(value == 3, "Unexpected sampler 0 magfilter %u.\n", value);
4707 
4708     hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MINFILTER, &value);
4709     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4710     ok(value == 1, "Unexpected sampler 1 minfilter %u.\n", value);
4711     hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MAGFILTER, &value);
4712     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4713     todo_wine
4714     ok(value == 1, "Unexpected sampler 1 magfilter %u.\n", value);
4715 
4716     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value);
4717     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4718     ok(value == 1, "Unexpected vertex sampler 0 minfilter %u.\n", value);
4719     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MAGFILTER, &value);
4720     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4721     todo_wine
4722     ok(value == 1, "Unexpected vertex sampler 0 magfilter %u.\n", value);
4723 
4724     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value);
4725     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4726     todo_wine
4727     ok(value == 0, "Unexpected vertex sampler 1 minfilter %u.\n", value);
4728     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MAGFILTER, &value);
4729     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4730     todo_wine
4731     ok(value == 0, "Unexpected vertex sampler 1 magfilter %u.\n", value);
4732 
4733     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value);
4734     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4735     ok(value == 3, "Unexpected vertex sampler 2 minfilter %u.\n", value);
4736     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MAGFILTER, &value);
4737     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4738     todo_wine ok(value == 3, "Unexpected vertex sampler 2 magfilter %u.\n", value);
4739 
4740     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGDENSITY, &value);
4741     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4742     ok(value == 0, "Unexpected fog density %g.\n", *(float *)&value);
4743     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGSTART, &value);
4744     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4745     ok(*(float *)&value == 4.0f, "Unexpected fog start %g.\n", *(float *)&value);
4746     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_A, &value);
4747     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4748     ok(*(float *)&value == 4.0f, "Unexpected point scale A %g.\n", *(float *)&value);
4749     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_B, &value);
4750     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4751     ok(*(float *)&value == 12.0f, "Unexpected point scale B %g.\n", *(float *)&value);
4752 
4753     hr = effect->lpVtbl->EndPass(effect);
4754 
4755     par = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
4756     ok(par != NULL, "GetParameterByName failed.\n");
4757     hr = effect->lpVtbl->SetVector(effect, par, &fvect2);
4758     ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr);
4759     hr = effect->lpVtbl->BeginPass(effect, 1);
4760     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4761 
4762     test_effect_preshader_compare_shader(device, 1, FALSE);
4763 
4764     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
4765     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4766 
4767     hr = effect->lpVtbl->SetVector(effect, par, &fvect1);
4768     ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr);
4769     hr = effect->lpVtbl->CommitChanges(effect);
4770     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4771     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
4772     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4773     ok(!vshader, "Incorrect shader selected.\n");
4774 
4775     hr = effect->lpVtbl->EndPass(effect);
4776     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4777 
4778     hr = effect->lpVtbl->End(effect);
4779     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4780 
4781     effect->lpVtbl->Release(effect);
4782 
4783     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
4784             NULL, NULL, 0, NULL, &effect, NULL);
4785     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4786 
4787     hr = effect->lpVtbl->Begin(effect, &npasses, D3DXFX_DONOTSAVESTATE);
4788     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4789 
4790     hr = effect->lpVtbl->BeginPass(effect, 0);
4791     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4792 
4793     hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MINFILTER, &value);
4794     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4795     ok(value == 3, "Unexpected sampler 0 minfilter %u.\n", value);
4796     hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MAGFILTER, &value);
4797     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4798     todo_wine ok(value == 3, "Unexpected sampler 0 magfilter %u.\n", value);
4799 
4800     hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MINFILTER, &value);
4801     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4802     ok(value == 1, "Unexpected sampler 1 minfilter %u.\n", value);
4803     hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MAGFILTER, &value);
4804     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4805     todo_wine
4806     ok(value == 1, "Unexpected sampler 1 magfilter %u.\n", value);
4807 
4808     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value);
4809     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4810     ok(value == 1, "Unexpected vertex sampler 0 minfilter %u.\n", value);
4811     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MAGFILTER, &value);
4812     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4813     todo_wine
4814     ok(value == 1, "Unexpected vertex sampler 0 magfilter %u.\n", value);
4815 
4816     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value);
4817     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4818     ok(value == 2, "Unexpected vertex sampler 1 minfilter %u.\n", value);
4819     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MAGFILTER, &value);
4820     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4821     todo_wine
4822     ok(value == 2, "Unexpected vertex sampler 1 magfilter %u.\n", value);
4823 
4824     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value);
4825     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4826     ok(value == 3, "Unexpected vertex sampler 2 minfilter %u.\n", value);
4827     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MAGFILTER, &value);
4828     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4829     todo_wine
4830     ok(value == 3, "Unexpected vertex sampler 2 magfilter %u.\n", value);
4831 
4832     hr = effect->lpVtbl->EndPass(effect);
4833     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4834     hr = effect->lpVtbl->End(effect);
4835     ok(hr == D3D_OK, "Got result %#x.\n", hr);
4836     effect->lpVtbl->Release(effect);
4837 }
4838 
4839 /*
4840  * fxc.exe /Tfx_2_0
4841  */
4842 #if 0
4843 float4 opvect1;
4844 float4 opvect2;
4845 float4 opvect3;
4846 
4847 technique tech0
4848 {
4849     pass p0
4850     {
4851         LightEnable[0] = TRUE;
4852         LightEnable[1] = TRUE;
4853         LightEnable[2] = TRUE;
4854         LightEnable[3] = TRUE;
4855         LightEnable[4] = TRUE;
4856         LightEnable[5] = TRUE;
4857         LightEnable[6] = TRUE;
4858         LightEnable[7] = TRUE;
4859         LightType[0] = POINT;
4860         LightType[1] = POINT;
4861         LightType[2] = POINT;
4862         LightType[3] = POINT;
4863         LightType[4] = POINT;
4864         LightType[5] = POINT;
4865         LightType[6] = POINT;
4866         LightType[7] = POINT;
4867 
4868         LightDiffuse[0] = exp(opvect1);
4869         LightDiffuse[1] = log(opvect1);
4870         LightDiffuse[2] = asin(opvect1);
4871         LightDiffuse[3] = acos(opvect1);
4872         LightDiffuse[4] = atan(opvect1);
4873         LightDiffuse[5] = atan2(opvect1, opvect2);
4874         LightDiffuse[6] = opvect1 * opvect2;
4875 
4876        /* Placeholder for 'div' instruction manually edited in binary blob. */
4877         LightDiffuse[7] = opvect1 * opvect2;
4878 
4879        /* Placeholder for 'cmp' instruction manually edited in binary blob. */
4880         LightAmbient[0] = opvect1 + opvect2 + opvect3;
4881     }
4882 }
4883 #endif
4884 static const DWORD test_effect_preshader_ops_blob[] =
4885 {
4886     0xfeff0901, 0x0000044c, 0x00000000, 0x00000003, 0x00000001, 0x00000030, 0x00000000, 0x00000000,
4887     0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0x6576706f,
4888     0x00317463, 0x00000003, 0x00000001, 0x00000068, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
4889     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0x6576706f, 0x00327463, 0x00000003,
4890     0x00000001, 0x000000a0, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000,
4891     0x00000000, 0x00000000, 0x00000008, 0x6576706f, 0x00337463, 0x00000001, 0x00000002, 0x00000002,
4892     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4893     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4894     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4895     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4896     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4897     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4898     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4899     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4900     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4901     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4902     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4903     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4904     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4905     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4906     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002,
4907     0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
4908     0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
4909     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000,
4910     0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
4911     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000,
4912     0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004,
4913     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000,
4914     0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4915     0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000,
4916     0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
4917     0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000002,
4918     0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
4919     0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
4920     0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000001, 0x00000001,
4921     0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x0000003c, 0x00000058, 0x00000000,
4922     0x00000000, 0x00000074, 0x00000090, 0x00000000, 0x00000000, 0x00000440, 0x00000000, 0x00000001,
4923     0x00000438, 0x00000000, 0x00000019, 0x00000091, 0x00000000, 0x000000b0, 0x000000ac, 0x00000091,
4924     0x00000001, 0x000000d0, 0x000000cc, 0x00000091, 0x00000002, 0x000000f0, 0x000000ec, 0x00000091,
4925     0x00000003, 0x00000110, 0x0000010c, 0x00000091, 0x00000004, 0x00000130, 0x0000012c, 0x00000091,
4926     0x00000005, 0x00000150, 0x0000014c, 0x00000091, 0x00000006, 0x00000170, 0x0000016c, 0x00000091,
4927     0x00000007, 0x00000190, 0x0000018c, 0x00000084, 0x00000000, 0x000001b0, 0x000001ac, 0x00000084,
4928     0x00000001, 0x000001d0, 0x000001cc, 0x00000084, 0x00000002, 0x000001f0, 0x000001ec, 0x00000084,
4929     0x00000003, 0x00000210, 0x0000020c, 0x00000084, 0x00000004, 0x00000230, 0x0000022c, 0x00000084,
4930     0x00000005, 0x00000250, 0x0000024c, 0x00000084, 0x00000006, 0x00000270, 0x0000026c, 0x00000084,
4931     0x00000007, 0x00000290, 0x0000028c, 0x00000085, 0x00000000, 0x000002bc, 0x000002ac, 0x00000085,
4932     0x00000001, 0x000002e8, 0x000002d8, 0x00000085, 0x00000002, 0x00000314, 0x00000304, 0x00000085,
4933     0x00000003, 0x00000340, 0x00000330, 0x00000085, 0x00000004, 0x0000036c, 0x0000035c, 0x00000085,
4934     0x00000005, 0x00000398, 0x00000388, 0x00000085, 0x00000006, 0x000003c4, 0x000003b4, 0x00000085,
4935     0x00000007, 0x000003f0, 0x000003e0, 0x00000087, 0x00000000, 0x0000041c, 0x0000040c, 0x00000000,
4936     0x00000009, 0x00000000, 0x00000000, 0xffffffff, 0x00000018, 0x00000000, 0x0000016c, 0x46580200,
4937     0x003afffe, 0x42415443, 0x0000001c, 0x000000b3, 0x46580200, 0x00000003, 0x0000001c, 0x20000100,
4938     0x000000b0, 0x00000058, 0x00000002, 0x00000001, 0x00000060, 0x00000070, 0x00000080, 0x00010002,
4939     0x00000001, 0x00000088, 0x00000070, 0x00000098, 0x00020002, 0x00000001, 0x000000a0, 0x00000070,
4940     0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
4941     0x00000000, 0x00000000, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000,
4942     0x6576706f, 0x00337463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369,
4943     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
4944     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
4945     /* FXLC for LightAmbient[0] start. */
4946     0x001afffe, 0x434c5846,
4947     0x00000001, /* Instruction count, set to 1. */
4948     0x30000004, /* Operation code (bits 20-30) set to 'cmp' opcode 0x300. */
4949     0x00000003, /* Input arguments count set to 3. */
4950     /* Argument 1. */
4951     0x00000000, /* Relative addressing flag. */
4952     0x00000002, /* Register table ("c", float constants). */
4953     0x00000000, /* Register offset. */
4954     /* Argument 2. */
4955     0x00000000, 0x00000002, 0x00000004,
4956     /* Argument 3. */
4957     0x00000000, 0x00000002, 0x00000008,
4958     /* Output register. */
4959     0x00000000, 0x00000004, 0x00000000,
4960     /* End mark. */
4961     0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
4962     /* Padding to match placeholder length. */
4963     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4964     /* FXLC for LightAmbient[0] end. */
4965     0x00000000, 0x00000000, 0xffffffff, 0x00000017, 0x00000000, 0x00000114,
4966     0x46580200, 0x002ffffe, 0x42415443, 0x0000001c, 0x00000087, 0x46580200, 0x00000002, 0x0000001c,
4967     0x20000100, 0x00000084, 0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c,
4968     0x00010002, 0x00000001, 0x00000074, 0x0000005c, 0x6576706f, 0x00317463, 0x00030001, 0x00040001,
4969     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6576706f, 0x00327463,
4970     0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820,
4971     0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235,
4972     0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
4973     /* FXLC for LightDiffuse[7] start. */
4974     0x000ffffe, 0x434c5846,
4975     0x00000001, /* Instruction count. */
4976     0x20800004, /* Operation code (bits 20-30) set to 'div' opcode 0x208. */
4977     0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000,
4978     0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
4979     /* FXLC for LightDiffuse[7] end. */
4980     0x00000000, 0x00000000, 0xffffffff,
4981     0x00000016, 0x00000000, 0x00000114, 0x46580200, 0x002ffffe, 0x42415443, 0x0000001c, 0x00000087,
4982     0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000084, 0x00000044, 0x00000002, 0x00000001,
4983     0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001, 0x00000074, 0x0000005c, 0x6576706f,
4984     0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
4985     0x00000000, 0x6576706f, 0x00327463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874,
4986     0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
4987     0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000ffffe,
4988     0x434c5846, 0x00000001, 0x20500004, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
4989     0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
4990     0x00000000, 0x00000000, 0xffffffff, 0x00000015, 0x00000000, 0x00000114, 0x46580200, 0x002ffffe,
4991     0x42415443, 0x0000001c, 0x00000087, 0x46580200, 0x00000002, 0x0000001c, 0x20000100, 0x00000084,
4992     0x00000044, 0x00000002, 0x00000001, 0x0000004c, 0x0000005c, 0x0000006c, 0x00010002, 0x00000001,
4993     0x00000074, 0x0000005c, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000,
4994     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6576706f, 0x00327463, 0x00030001, 0x00040001,
4995     0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
4996     0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
4997     0x54494c43, 0x00000000, 0x000ffffe, 0x434c5846, 0x00000001, 0x20600004, 0x00000002, 0x00000000,
4998     0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000,
4999     0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000014, 0x00000000,
5000     0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001,
5001     0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048,
5002     0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
5003     0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
5004     0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
5005     0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10c00004, 0x00000001, 0x00000000,
5006     0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
5007     0x00000000, 0x00000000, 0xffffffff, 0x00000013, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe,
5008     0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058,
5009     0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001,
5010     0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874,
5011     0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
5012     0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe,
5013     0x434c5846, 0x00000001, 0x10b00004, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
5014     0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff,
5015     0x00000012, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b,
5016     0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001,
5017     0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000,
5018     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820,
5019     0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235,
5020     0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10a00004,
5021     0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0,
5022     0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000011, 0x00000000, 0x0000013c,
5023     0x46580200, 0x0024fffe, 0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c,
5024     0x20000100, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f,
5025     0x00317463, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5026     0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461,
5027     0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43,
5028     0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10600001, 0x00000001, 0x00000000, 0x00000002,
5029     0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10600001, 0x00000001, 0x00000000, 0x00000002,
5030     0x00000001, 0x00000000, 0x00000004, 0x00000001, 0x10600001, 0x00000001, 0x00000000, 0x00000002,
5031     0x00000002, 0x00000000, 0x00000004, 0x00000002, 0x10600001, 0x00000001, 0x00000000, 0x00000002,
5032     0x00000003, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000,
5033     0x00000000, 0xffffffff, 0x00000010, 0x00000000, 0x0000013c, 0x46580200, 0x0024fffe, 0x42415443,
5034     0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058, 0x00000030,
5035     0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x6576706f, 0x00317463, 0x00030001, 0x00040001,
5036     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369,
5037     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
5038     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846,
5039     0x00000004, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004,
5040     0x00000000, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000004,
5041     0x00000001, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004,
5042     0x00000002, 0x10500001, 0x00000001, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000004,
5043     0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
5044 };
5045 
5046 static void test_effect_preshader_ops(IDirect3DDevice9 *device)
5047 {
5048     static D3DLIGHT9 light;
5049     const struct
5050     {
5051         const char *mnem;
5052         unsigned int expected_result[4];
5053         unsigned int result_index;
5054         float *result;
5055         D3DXVECTOR4 opvect1, opvect2, opvect3;
5056         unsigned int ulps;
5057         BOOL todo[4];
5058     }
5059     op_tests[] =
5060     {
5061         {"exp", {0x3f800000, 0x3f800000, 0x3e5edc66, 0x7f800000}, 0, &light.Diffuse.r,
5062                 {0.0f, -0.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}},
5063         {"log", {0, 0x40000000, 0x3f9199b7, 0x43000000}, 1, &light.Diffuse.r,
5064                 {0.0f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}},
5065         {"asin", {0xbe9c00ad, 0xffc00000, 0xffc00000, 0xffc00000}, 2, &light.Diffuse.r,
5066                 {-0.3f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}},
5067         {"acos", {0x3ff01006, 0xffc00000, 0xffc00000, 0xffc00000}, 3, &light.Diffuse.r,
5068                 {-0.3f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}},
5069         {"atan", {0xbe9539d4, 0x3fa9b465, 0xbf927420, 0x3fc90fdb}, 4, &light.Diffuse.r,
5070                 {-0.3f, 4.0f, -2.2f, 3.402823466e+38f}, {1.0f, 2.0f, -3.0f, 4.0f}},
5071         {"atan2 test #1", {0xbfc90fdb, 0x40490fdb, 0x80000000, 0x7fc00000}, 5, &light.Diffuse.r,
5072                 {-0.3f, 0.0f, -0.0f, NAN}, {0.0f, -0.0f, 0.0f, 1.0f}},
5073         {"atan2 test #2", {0xbfc90fdb, 0, 0xc0490fdb, 0}, 5, &light.Diffuse.r,
5074                 {-0.3f, 0.0f, -0.0f, -0.0f}, {-0.0f, 0.0f, -0.0f, 1.0f}},
5075         {"div", {0, 0, 0, 0}, 7, &light.Diffuse.r,
5076                 {-0.3f, 0.0f, -2.2f, NAN}, {0.0f, -0.0f, -3.0f, 1.0f}},
5077         {"cmp", {0x40a00000, 0x40000000, 0x40400000, 0x41000000}, 0, &light.Ambient.r,
5078                 {-0.3f, 0.0f, 2.2f, NAN}, {1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 6.0f, 7.0f, 8.0f}},
5079         {"0 * INF", {0xffc00000, 0xffc00000, 0xc0d33334, 0x7f800000}, 6, &light.Diffuse.r,
5080                 {0.0f, -0.0f, -2.2f, 3.402823466e+38f}, {INFINITY, INFINITY, 3.0f, 4.0f}},
5081     };
5082     unsigned int i, j, passes_count;
5083     ID3DXEffect *effect;
5084     HRESULT hr;
5085 
5086     hr = D3DXCreateEffect(device, test_effect_preshader_ops_blob, sizeof(test_effect_preshader_ops_blob),
5087             NULL, NULL, 0, NULL, &effect, NULL);
5088     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5089     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
5090     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5091     hr = effect->lpVtbl->BeginPass(effect, 0);
5092     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5093 
5094     for (i = 0; i < ARRAY_SIZE(op_tests); ++i)
5095     {
5096         const float *result = op_tests[i].result;
5097         const float *expected_float = (float *)op_tests[i].expected_result;
5098 
5099         hr = effect->lpVtbl->SetVector(effect, "opvect1", &op_tests[i].opvect1);
5100         ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr);
5101         hr = effect->lpVtbl->SetVector(effect, "opvect2", &op_tests[i].opvect2);
5102         ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr);
5103         hr = effect->lpVtbl->SetVector(effect, "opvect3", &op_tests[i].opvect3);
5104         ok(hr == D3D_OK, "SetVector failed, hr %#x.\n", hr);
5105         hr = effect->lpVtbl->CommitChanges(effect);
5106         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5107 
5108         hr = IDirect3DDevice9_GetLight(device, op_tests[i].result_index, &light);
5109         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5110         for (j = 0; j < 4; ++j)
5111         {
5112             todo_wine_if(op_tests[i].todo[j])
5113             ok(compare_float(result[j], expected_float[j], op_tests[i].ulps),
5114                     "Operation %s, component %u, expected %#x (%.8e), got %#x (%.8e).\n", op_tests[i].mnem,
5115                     j, op_tests[i].expected_result[j], expected_float[j],
5116                     ((unsigned int *)result)[j], result[j]);
5117         }
5118     }
5119 
5120     hr = effect->lpVtbl->End(effect);
5121     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5122     effect->lpVtbl->Release(effect);
5123 }
5124 
5125 static void test_isparameterused_children(unsigned int line, ID3DXEffect *effect,
5126         D3DXHANDLE tech, D3DXHANDLE param)
5127 {
5128     D3DXPARAMETER_DESC desc;
5129     D3DXHANDLE param_child;
5130     unsigned int i, child_count;
5131     HRESULT hr;
5132 
5133     hr = effect->lpVtbl->GetParameterDesc(effect, param, &desc);
5134     ok_(__FILE__, line)(hr == D3D_OK, "GetParameterDesc failed, result %#x.\n", hr);
5135     child_count = desc.Elements ? desc.Elements : desc.StructMembers;
5136     for (i = 0; i < child_count; ++i)
5137     {
5138         param_child = desc.Elements ? effect->lpVtbl->GetParameterElement(effect, param, i)
5139                 : effect->lpVtbl->GetParameter(effect, param, i);
5140         ok_(__FILE__, line)(!!param_child, "Failed getting child parameter %s[%u].\n", desc.Name, i);
5141         ok_(__FILE__, line)(!effect->lpVtbl->IsParameterUsed(effect, param_child, tech),
5142                 "Unexpected IsParameterUsed() result for %s[%u].\n", desc.Name, i);
5143         test_isparameterused_children(line, effect, tech, param_child);
5144     }
5145 }
5146 
5147 #ifdef __REACTOS__
5148 #define test_isparameterused_param_with_children(...) \
5149         test_isparameterused_param_with_children_(__LINE__, __VA_ARGS__)
5150 #else
5151 #define test_isparameterused_param_with_children(args...) \
5152         test_isparameterused_param_with_children_(__LINE__, args)
5153 #endif
5154 static void test_isparameterused_param_with_children_(unsigned int line, ID3DXEffect *effect,
5155         ID3DXEffect *effect2, D3DXHANDLE tech, const char *name, BOOL expected_result)
5156 {
5157     D3DXHANDLE param;
5158 
5159     ok_(__FILE__, line)(effect->lpVtbl->IsParameterUsed(effect, (D3DXHANDLE)name, tech)
5160             == expected_result, "Unexpected IsParameterUsed() result for %s (referenced by name).\n", name);
5161 
5162     if (effect2)
5163         param = effect2->lpVtbl->GetParameterByName(effect2, NULL, name);
5164     else
5165         param = effect->lpVtbl->GetParameterByName(effect, NULL, name);
5166     ok_(__FILE__, line)(!!param, "GetParameterByName failed for %s.\n", name);
5167 
5168     ok_(__FILE__, line)(effect->lpVtbl->IsParameterUsed(effect, param, tech) == expected_result,
5169             "Unexpected IsParameterUsed() result for %s (referenced by handle).\n", name);
5170 
5171     test_isparameterused_children(line, effect, tech, param);
5172 }
5173 
5174 static void test_effect_isparameterused(IDirect3DDevice9 *device)
5175 {
5176     static const struct
5177     {
5178         const char *name;
5179         BOOL expected_result;
5180     }
5181     check_parameters[] =
5182     {
5183         {"g_Pos1", TRUE},
5184         {"g_Pos2", TRUE},
5185         {"g_Selector", TRUE},
5186         {"opvect1", TRUE},
5187         {"opvect2", TRUE},
5188         {"opvect3", TRUE},
5189         {"arr2", TRUE},
5190         {"vs_arr", TRUE},
5191         {"g_iVect", TRUE},
5192         {"vect_sampler", TRUE},
5193         {"tex1", TRUE},
5194         {"tex2", FALSE},
5195         {"sampler1", TRUE},
5196         {"ts1", TRUE},
5197         {"ts2", TRUE},
5198         {"ts3", TRUE},
5199     };
5200     ID3DXEffect *effect, *effect2;
5201     HRESULT hr;
5202     D3DXHANDLE tech;
5203     unsigned int i;
5204 
5205     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
5206             NULL, NULL, 0, NULL, &effect, NULL);
5207     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5208 
5209     tech = effect->lpVtbl->GetTechniqueByName(effect, "tech0");
5210     ok(!!tech, "GetTechniqueByName failed.\n");
5211 
5212     for (i = 0; i < ARRAY_SIZE(check_parameters); ++i)
5213         test_isparameterused_param_with_children(effect, NULL, tech, check_parameters[i].name,
5214                 check_parameters[i].expected_result);
5215 
5216     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
5217             NULL, NULL, 0, NULL, &effect2, NULL);
5218     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5219 
5220     for (i = 0; i < ARRAY_SIZE(check_parameters); ++i)
5221         test_isparameterused_param_with_children(effect, effect2, tech, check_parameters[i].name,
5222                 check_parameters[i].expected_result);
5223 
5224     effect2->lpVtbl->Release(effect2);
5225 
5226     hr = D3DXCreateEffect(device, test_effect_states_effect_blob, sizeof(test_effect_states_effect_blob),
5227             NULL, NULL, 0, NULL, &effect2, NULL);
5228     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5229 
5230     test_isparameterused_param_with_children(effect, effect2, tech, "sampler1", TRUE);
5231     effect2->lpVtbl->Release(effect2);
5232 
5233     effect->lpVtbl->Release(effect);
5234 }
5235 
5236 static void test_effect_out_of_bounds_selector(IDirect3DDevice9 *device)
5237 {
5238     ID3DXEffect *effect;
5239     HRESULT hr;
5240     D3DXHANDLE param;
5241     int ivect[4];
5242     unsigned int passes_count;
5243     IDirect3DVertexShader9 *vshader;
5244 
5245     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
5246             NULL, NULL, 0, NULL, &effect, NULL);
5247 
5248     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
5249     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5250 
5251     ivect[0] = ivect[1] = ivect[3] = 1;
5252 
5253     param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
5254     ok(!!param, "GetParameterByName failed.\n");
5255     ivect[2] = 3;
5256     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5257     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5258 
5259     hr = effect->lpVtbl->BeginPass(effect, 0);
5260     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5261     hr = effect->lpVtbl->EndPass(effect);
5262     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5263 
5264     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5265     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5266 
5267     hr = effect->lpVtbl->BeginPass(effect, 1);
5268     ok(hr == E_FAIL, "Got result %#x.\n", hr);
5269 
5270     /* Second try reports success and selects array element used previously.
5271      * Probably array index is not recomputed and previous index value is used. */
5272     hr = effect->lpVtbl->BeginPass(effect, 1);
5273     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5274     test_effect_preshader_compare_shader(device, 2, FALSE);
5275 
5276     /* Confirm that array element selected is the previous good one and does not depend
5277      * on computed (out of bound) index value. */
5278     ivect[2] = 1;
5279     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5280     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5281     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5282     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5283     hr = effect->lpVtbl->CommitChanges(effect);
5284     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5285     test_effect_preshader_compare_shader(device, 1, FALSE);
5286     hr = effect->lpVtbl->EndPass(effect);
5287     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5288     ivect[2] = 3;
5289     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5290     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5291     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5292     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5293     hr = effect->lpVtbl->BeginPass(effect, 1);
5294     ok(hr == E_FAIL, "Got result %#x.\n", hr);
5295     hr = effect->lpVtbl->BeginPass(effect, 1);
5296     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5297     test_effect_preshader_compare_shader(device, 1, FALSE);
5298 
5299     /* End and begin effect again to ensure it will not trigger array
5300      * index recompute and error return from BeginPass. */
5301     hr = effect->lpVtbl->EndPass(effect);
5302     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5303     hr = effect->lpVtbl->End(effect);
5304     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5305     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
5306     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5307     hr = effect->lpVtbl->BeginPass(effect, 1);
5308     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5309     test_effect_preshader_compare_shader(device, 1, FALSE);
5310     hr = effect->lpVtbl->EndPass(effect);
5311     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5312 
5313 
5314     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5315     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5316 
5317     ivect[2] = -2;
5318     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5319     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5320 
5321     hr = effect->lpVtbl->BeginPass(effect, 1);
5322     ok(hr == E_FAIL, "Got result %#x.\n", hr);
5323 
5324     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
5325     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5326     ok(!vshader, "Got non NULL vshader.\n");
5327 
5328     hr = effect->lpVtbl->BeginPass(effect, 1);
5329     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5330 
5331     test_effect_preshader_compare_shader(device, 1, FALSE);
5332 
5333     hr = effect->lpVtbl->EndPass(effect);
5334     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5335 
5336     ivect[2] = -1;
5337     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5338     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5339 
5340     hr = effect->lpVtbl->BeginPass(effect, 1);
5341     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5342 
5343     test_effect_preshader_compare_shader(device, 0, FALSE);
5344 
5345     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5346     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5347 
5348     ivect[2] = 3;
5349     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5350     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5351     hr = effect->lpVtbl->CommitChanges(effect);
5352     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5353 
5354     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
5355     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5356     ok(!vshader, "Got non NULL vshader.\n");
5357 
5358     ivect[2] = -1;
5359     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5360     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5361     hr = effect->lpVtbl->CommitChanges(effect);
5362     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5363 
5364     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
5365     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5366     ok(!vshader, "Got non NULL vshader.\n");
5367 
5368     ivect[2] = 1;
5369     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5370     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5371     hr = effect->lpVtbl->CommitChanges(effect);
5372     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5373 
5374     test_effect_preshader_compare_shader(device, 1, FALSE);
5375 
5376     hr = effect->lpVtbl->EndPass(effect);
5377     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5378 
5379     hr = effect->lpVtbl->End(effect);
5380     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5381 
5382     effect->lpVtbl->Release(effect);
5383 }
5384 
5385 static void test_effect_commitchanges(IDirect3DDevice9 *device)
5386 {
5387     static const struct
5388     {
5389         const char *param_name;
5390         enum expected_state_update state_updated[ARRAY_SIZE(test_effect_preshader_op_expected)];
5391     }
5392     check_op_parameters[] =
5393     {
5394         {"opvect1", {EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED,
5395                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED,
5396                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED,
5397                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_ANYTHING,
5398                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED}},
5399         {"opvect2", {EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED,
5400                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED,
5401                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED,
5402                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_ANYTHING,
5403                      EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED, EXPECTED_STATE_UPDATED}},
5404         {"opvect3", {EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO,
5405                      EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_UPDATED,
5406                      EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO,
5407                      EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ANYTHING,
5408                      EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO, EXPECTED_STATE_ZERO}},
5409     };
5410     static const struct
5411     {
5412         const char *param_name;
5413         const unsigned int const_updated_mask[(ARRAY_SIZE(test_effect_preshader_fvect_v)
5414                 + TEST_EFFECT_BITMASK_BLOCK_SIZE - 1) / TEST_EFFECT_BITMASK_BLOCK_SIZE];
5415     }
5416     check_vconsts_parameters[] =
5417     {
5418         {"g_Selector", {0x00000000, 0x00000002}},
5419         {"g_Pos1",     {0x80000000, 0x00000002}},
5420         {"g_Pos2",     {0x00000000, 0x00000002}},
5421         {"m4x3column", {0x03800000, 0x00000000}},
5422         {"m3x4column", {0x000f0000, 0x00000000}},
5423         {"m4x3row",    {0x0000f000, 0x00000000}},
5424         {"m3x4row",    {0x00700000, 0x00000000}},
5425         {"ts1",        {0x1c000000, 0x00000000}},
5426         {"ts2",        {0x0000003f, 0x00000000}},
5427         {"arr1",       {0x00000000, 0x00000001}},
5428         {"arr2",       {0x60000000, 0x00000000}},
5429         {"ts3",        {0x00000fc0, 0x00000000}},
5430     };
5431     static const struct
5432     {
5433         const char *param_name;
5434         const unsigned int const_updated_mask[(ARRAY_SIZE(test_effect_preshader_bconsts)
5435                 + TEST_EFFECT_BITMASK_BLOCK_SIZE - 1) / TEST_EFFECT_BITMASK_BLOCK_SIZE];
5436     }
5437     check_bconsts_parameters[] =
5438     {
5439         {"mb2x3row", {0x0000001f}},
5440         {"mb2x3column", {0x00000060}},
5441     };
5442     static const unsigned int const_no_update_mask[(ARRAY_SIZE(test_effect_preshader_fvect_v)
5443             + TEST_EFFECT_BITMASK_BLOCK_SIZE - 1) / TEST_EFFECT_BITMASK_BLOCK_SIZE];
5444     static const D3DLIGHT9 light_filler = {D3DLIGHT_POINT};
5445 
5446     ID3DXEffect *effect;
5447     HRESULT hr;
5448     D3DXHANDLE param;
5449     unsigned int i, passes_count, value;
5450     int ivect[4];
5451     D3DXVECTOR4 fvect;
5452     IDirect3DVertexShader9 *vshader;
5453     unsigned char buffer[256];
5454 
5455 
5456     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
5457             NULL, NULL, 0, NULL, &effect, NULL);
5458     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5459 
5460     param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
5461     ok(!!param, "GetParameterByName failed.\n");
5462 
5463     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
5464     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5465 
5466     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5467     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5468 
5469     hr = effect->lpVtbl->BeginPass(effect, 0);
5470     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5471 
5472     for (i = 0; i < ARRAY_SIZE(check_op_parameters); ++i)
5473     {
5474         unsigned int j;
5475 
5476         for (j = 0; j < 8; ++j)
5477         {
5478             hr = IDirect3DDevice9_SetLight(device, j, &light_filler);
5479             ok(hr == D3D_OK, "Got result %#x, i %u, j %u.\n", hr, i, j);
5480         }
5481         param = effect->lpVtbl->GetParameterByName(effect, NULL, check_op_parameters[i].param_name);
5482         ok(!!param, "Failed to get parameter (test %u).\n", i);
5483         hr = effect->lpVtbl->GetValue(effect, param, &fvect, sizeof(fvect));
5484         ok(hr == D3D_OK, "Failed to get parameter value, hr %#x (test %u).\n", hr, i);
5485         hr = effect->lpVtbl->SetValue(effect, param, &fvect, sizeof(fvect));
5486         ok(hr == D3D_OK, "Failed to set parameter value, hr %#x (test %u).\n", hr, i);
5487         hr = effect->lpVtbl->CommitChanges(effect);
5488         ok(hr == D3D_OK, "Failed to commit changes, hr %#x (test %u).\n", hr, i);
5489 
5490         test_effect_preshader_op_results(device, check_op_parameters[i].state_updated,
5491                 check_op_parameters[i].param_name);
5492     }
5493 
5494     for (i = 0; i < ARRAY_SIZE(check_vconsts_parameters); ++i)
5495     {
5496         test_effect_clear_vconsts(device);
5497         param = effect->lpVtbl->GetParameterByName(effect, NULL, check_vconsts_parameters[i].param_name);
5498         ok(!!param, "GetParameterByName failed.\n");
5499         hr = effect->lpVtbl->GetValue(effect, param, buffer, sizeof(buffer));
5500         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5501         hr = effect->lpVtbl->SetValue(effect, param, buffer, sizeof(buffer));
5502         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5503         hr = effect->lpVtbl->CommitChanges(effect);
5504         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5505 
5506         test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[i].const_updated_mask,
5507                 check_vconsts_parameters[i].param_name);
5508     }
5509 
5510     for (i = 0; i < ARRAY_SIZE(check_bconsts_parameters); ++i)
5511     {
5512         test_effect_preshader_clear_pbool_consts(device);
5513         param = effect->lpVtbl->GetParameterByName(effect, NULL, check_bconsts_parameters[i].param_name);
5514         ok(!!param, "GetParameterByName failed.\n");
5515         hr = effect->lpVtbl->GetValue(effect, param, buffer, sizeof(buffer));
5516         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5517         hr = effect->lpVtbl->SetValue(effect, param, buffer, sizeof(buffer));
5518         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5519         hr = effect->lpVtbl->CommitChanges(effect);
5520         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5521 
5522         test_effect_preshader_compare_pbool_consts(device, check_bconsts_parameters[i].const_updated_mask,
5523                 check_bconsts_parameters[i].param_name);
5524     }
5525 
5526     test_effect_clear_vconsts(device);
5527     param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_Selector");
5528     ok(!!param, "GetParameterByName failed.\n");
5529     fvect.x = fvect.y = fvect.z = fvect.w = 0.0f;
5530     hr = effect->lpVtbl->SetVectorArray(effect, param, &fvect, 1);
5531     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5532     hr = effect->lpVtbl->CommitChanges(effect);
5533     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5534     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[0].const_updated_mask,
5535                 check_vconsts_parameters[0].param_name);
5536 
5537     test_effect_clear_vconsts(device);
5538     param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2");
5539     ok(!!param, "GetParameterByName failed.\n");
5540     param = effect->lpVtbl->GetParameterElement(effect, param, 0);
5541     ok(!!param, "GetParameterElement failed.\n");
5542     hr = effect->lpVtbl->SetFloat(effect, param, 92.0f);
5543     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5544     hr = effect->lpVtbl->CommitChanges(effect);
5545     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5546     test_effect_preshader_compare_vconsts(device, const_no_update_mask,
5547                 check_vconsts_parameters[10].param_name);
5548 
5549     test_effect_clear_vconsts(device);
5550     param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2");
5551     ok(!!param, "GetParameterByName failed.\n");
5552     param = effect->lpVtbl->GetParameterElement(effect, param, 1);
5553     ok(!!param, "GetParameterElement failed.\n");
5554     fvect.x = 93.0f;
5555     hr = effect->lpVtbl->SetValue(effect, param, &fvect.x, sizeof(fvect.x));
5556     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5557     hr = effect->lpVtbl->CommitChanges(effect);
5558     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5559     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[10].const_updated_mask,
5560                 check_vconsts_parameters[10].param_name);
5561 
5562     test_effect_clear_vconsts(device);
5563     param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2");
5564     ok(!!param, "GetParameterByName failed.\n");
5565     fvect.x = 92.0f;
5566     hr = effect->lpVtbl->SetFloatArray(effect, param, &fvect.x, 1);
5567     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5568     hr = effect->lpVtbl->CommitChanges(effect);
5569     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5570     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[10].const_updated_mask,
5571                 check_vconsts_parameters[10].param_name);
5572 
5573     test_effect_clear_vconsts(device);
5574     param = effect->lpVtbl->GetParameterByName(effect, NULL, "arr2");
5575     ok(!!param, "GetParameterByName failed.\n");
5576     param = effect->lpVtbl->GetParameterElement(effect, param, 1);
5577     ok(!!param, "GetParameterElement failed.\n");
5578     hr = effect->lpVtbl->SetInt(effect, param, 93);
5579     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5580     hr = effect->lpVtbl->CommitChanges(effect);
5581     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5582     test_effect_preshader_compare_vconsts(device, const_no_update_mask,
5583                 check_vconsts_parameters[10].param_name);
5584 
5585     test_effect_clear_vconsts(device);
5586     param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_Pos1");
5587     ok(!!param, "GetParameterByName failed.\n");
5588     fvect.x = fvect.y = fvect.z = fvect.w = 0.0f;
5589     hr = effect->lpVtbl->SetVector(effect, param, &fvect);
5590     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5591     hr = effect->lpVtbl->CommitChanges(effect);
5592     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5593     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[1].const_updated_mask,
5594                 check_vconsts_parameters[1].param_name);
5595 
5596     test_effect_clear_vconsts(device);
5597     param = effect->lpVtbl->GetParameterByName(effect, NULL, "ts1");
5598     ok(!!param, "GetParameterByName failed.\n");
5599     param = effect->lpVtbl->GetParameterElement(effect, param, 0);
5600     ok(!!param, "GetParameterByName failed.\n");
5601     param = effect->lpVtbl->GetParameterByName(effect, param, "fv");
5602     ok(!!param, "GetParameterByName failed.\n");
5603     fvect.x = 12;
5604     hr = effect->lpVtbl->SetValue(effect, param, &fvect.x, sizeof(float));
5605     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5606     hr = effect->lpVtbl->CommitChanges(effect);
5607     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5608     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[7].const_updated_mask,
5609                 check_vconsts_parameters[7].param_name);
5610 
5611     *(float *)&value = 9999.0f;
5612     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGDENSITY, value);
5613     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5614     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, value);
5615     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5616     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_A, value);
5617     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5618     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_B, value);
5619     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5620     test_effect_clear_vconsts(device);
5621     param = effect->lpVtbl->GetParameterByName(effect, NULL, "ts2");
5622     ok(!!param, "GetParameterByName failed.\n");
5623     param = effect->lpVtbl->GetParameterElement(effect, param, 0);
5624     ok(!!param, "GetParameterByName failed.\n");
5625     param = effect->lpVtbl->GetParameterByName(effect, param, "v1");
5626     ok(!!param, "GetParameterByName failed.\n");
5627     hr = effect->lpVtbl->GetValue(effect, param, &fvect, sizeof(float) * 3);
5628     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5629     hr = effect->lpVtbl->SetValue(effect, param, &fvect, sizeof(float) * 3);
5630     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5631     hr = effect->lpVtbl->CommitChanges(effect);
5632     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5633     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGDENSITY, &value);
5634     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5635     ok(value == 0, "Unexpected fog density %g.\n", *(float *)&value);
5636     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGSTART, &value);
5637     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5638     ok(*(float *)&value == 4.0f, "Unexpected fog start %g.\n", *(float *)&value);
5639     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_A, &value);
5640     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5641     ok(*(float *)&value == 9999.0f, "Unexpected point scale A %g.\n", *(float *)&value);
5642     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_B, &value);
5643     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5644     ok(*(float *)&value == 9999.0f, "Unexpected point scale B %g.\n", *(float *)&value);
5645     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[8].const_updated_mask,
5646                 check_vconsts_parameters[8].param_name);
5647 
5648     *(float *)&value = 9999.0f;
5649     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGDENSITY, value);
5650     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5651     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_FOGSTART, value);
5652     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5653     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_A, value);
5654     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5655     hr = IDirect3DDevice9_SetRenderState(device, D3DRS_POINTSCALE_B, value);
5656     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5657     test_effect_clear_vconsts(device);
5658     param = effect->lpVtbl->GetParameterByName(effect, NULL, "ts3");
5659     ok(!!param, "GetParameterByName failed.\n");
5660     param = effect->lpVtbl->GetParameterByName(effect, param, "ts");
5661     ok(!!param, "GetParameterByName failed.\n");
5662     param = effect->lpVtbl->GetParameterElement(effect, param, 1);
5663     ok(!!param, "GetParameterByName failed.\n");
5664     param = effect->lpVtbl->GetParameterByName(effect, param, "fv");
5665     ok(!!param, "GetParameterByName failed.\n");
5666     hr = effect->lpVtbl->GetValue(effect, param, &fvect.x, sizeof(float));
5667     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5668     hr = effect->lpVtbl->SetValue(effect, param, &fvect.x, sizeof(float));
5669     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5670     hr = effect->lpVtbl->CommitChanges(effect);
5671     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5672     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGDENSITY, &value);
5673     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5674     ok(*(float *)&value == 9999.0f, "Unexpected fog density %g.\n", *(float *)&value);
5675     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_FOGSTART, &value);
5676     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5677     ok(*(float *)&value == 9999.0f, "Unexpected fog start %g.\n", *(float *)&value);
5678     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_A, &value);
5679     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5680     ok(*(float *)&value == 4.0f, "Unexpected point scale A %g.\n", *(float *)&value);
5681     hr = IDirect3DDevice9_GetRenderState(device, D3DRS_POINTSCALE_B, &value);
5682     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5683     ok(*(float *)&value == 12.0f, "Unexpected point scale B %g.\n", *(float *)&value);
5684     test_effect_preshader_compare_vconsts(device, check_vconsts_parameters[11].const_updated_mask,
5685                 check_vconsts_parameters[11].param_name);
5686 
5687     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value);
5688     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5689     ok(value == 1, "Unexpected sampler 0 minfilter %u.\n", value);
5690     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value);
5691     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5692     todo_wine
5693     ok(value == 0, "Unexpected sampler 1 minfilter %u.\n", value);
5694     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value);
5695     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5696     ok(value == 3, "Unexpected sampler 2 minfilter %u.\n", value);
5697 
5698     param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
5699     ok(!!param, "GetParameterByName failed.\n");
5700     ivect[0] = ivect[1] = ivect[2] = ivect[3] = 1;
5701     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5702     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5703 
5704     for (i = 0; i < 3; ++i)
5705     {
5706         hr = IDirect3DDevice9_SetSamplerState(device, D3DVERTEXTEXTURESAMPLER0 + i, D3DSAMP_MINFILTER, 0);
5707         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5708         hr = IDirect3DDevice9_SetSamplerState(device, D3DVERTEXTEXTURESAMPLER0 + i, D3DSAMP_MAGFILTER, 0);
5709         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5710     }
5711 
5712     hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MINFILTER, 0);
5713     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5714     hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, 0);
5715     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5716 
5717     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
5718     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5719     test_effect_clear_vconsts(device);
5720 
5721     hr = effect->lpVtbl->CommitChanges(effect);
5722     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5723 
5724     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
5725     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5726     ok(!vshader, "Got non NULL vshader.\n");
5727     test_effect_preshader_compare_vconsts(device, const_no_update_mask,
5728             "selector g_iVect");
5729 
5730     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER0, D3DSAMP_MINFILTER, &value);
5731     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5732     ok(value == 0, "Unexpected sampler 0 minfilter %u.\n", value);
5733     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER1, D3DSAMP_MINFILTER, &value);
5734     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5735     ok(value == 0, "Unexpected sampler 1 minfilter %u.\n", value);
5736 
5737     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MINFILTER, &value);
5738     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5739     ok(value == 1, "Unexpected sampler 2 minfilter %u.\n", value);
5740     hr = IDirect3DDevice9_GetSamplerState(device, D3DVERTEXTEXTURESAMPLER2, D3DSAMP_MAGFILTER, &value);
5741     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5742     ok(value == 0, "Unexpected sampler 2 minfilter %u.\n", value);
5743     hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MINFILTER, &value);
5744     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5745     ok(value == 1, "Unexpected sampler 0 minfilter %u.\n", value);
5746     hr = IDirect3DDevice9_GetSamplerState(device, 0, D3DSAMP_MAGFILTER, &value);
5747     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5748     ok(value == 0, "Unexpected sampler 0 minfilter %u.\n", value);
5749 
5750     ivect[3] = 2;
5751     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5752     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5753     ivect[3] = 1;
5754     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5755     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5756     hr = effect->lpVtbl->CommitChanges(effect);
5757     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5758     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
5759     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5760     ok(!vshader, "Got non NULL vshader.\n");
5761     test_effect_preshader_compare_vconsts(device, const_no_update_mask,
5762             "selector g_iVect");
5763     ivect[3] = 2;
5764     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5765     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5766     hr = effect->lpVtbl->CommitChanges(effect);
5767     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5768     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
5769     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5770     ok(!!vshader, "Got NULL vshader.\n");
5771     IDirect3DVertexShader9_Release(vshader);
5772     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 0, &fvect.x, 1);
5773     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5774     ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f,
5775             "Vertex shader float constants do not match.\n");
5776     hr = IDirect3DDevice9_SetVertexShaderConstantF(device, 0, &fvect_filler.x, 1);
5777     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5778     test_effect_preshader_compare_vconsts(device, const_no_update_mask,
5779             "selector g_iVect");
5780     ivect[3] = 1;
5781     hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
5782     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5783     hr = effect->lpVtbl->CommitChanges(effect);
5784     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5785     test_effect_preshader_compare_vconsts(device, NULL, NULL);
5786 
5787     hr = effect->lpVtbl->EndPass(effect);
5788     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5789 
5790     hr = effect->lpVtbl->End(effect);
5791     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5792 
5793     effect->lpVtbl->Release(effect);
5794 }
5795 
5796 static void test_effect_preshader_relative_addressing(IDirect3DDevice9 *device)
5797 {
5798     static const struct
5799     {
5800         D3DXVECTOR4 opvect2;
5801         D3DXVECTOR4 g_ivect;
5802         unsigned int expected[4];
5803     }
5804     test_out_of_bounds_index[] =
5805     {
5806         {{1.0f, 2.0f, 3.0f, 4.0f}, {101.0f, 101.0f, 101.0f, 101.0f}, {0, 0x42ca0000, 0x3f800000, 0}},
5807         {{1.0f, 2.0f, 3.0f, 4.0f}, {3333.0f, 1094.0f, 2222.0f, 3333.0f},
5808                 {0x447ac000, 0x45505000, 0x3f800000, 0}},
5809         {{1.0f, 2.0f, 3.0f, 4.0f}, {3333.0f, 1094.0f, 2222.0f, 1.0f},
5810                 {0x447ac000, 0x3f800000, 0x447a8000, 0x453b9000}},
5811         {{1.0f, 2.0f, 3.0f, 4.0f}, {1.0f, 1094.0f, 2222.0f, 3333.0f},
5812                 {0x447ac000, 0x45505000, 0x3f800000, 0x453ba000}},
5813         {{1.0f, 2.0f, 3.0f, 4.0f}, {1111.0f, 1094.0f, 2222.0f, 1111.0f},
5814                 {0x447ac000, 0x448ae000, 0, 0}},
5815         {{1.0f, 2.0f, 3.0f, 4.0f}, {1111.0f, 1094.0f, 2222.0f, 3333.0f},
5816                 {0x447ac000, 0x45505000, 0x3f800000, 0}},
5817         {{-1111.0f, 1094.0f, -2222.0f, -3333.0f}, {4.0f, 3.0f, 2.0f, 1.0f},
5818                 {0x447ac000, 0x40800000, 0x447a8000, 0x453b9000}},
5819         {{1.0f, 2.0f, 3.0f, 4.0f}, {-1.0f, -1.0f, -1.0f, -1.0f}, {0, 0xbf800000, 0, 0}},
5820         {{1.0f, 2.0f, 3.0f, 4.0f}, {-2.0f, -2.0f, -2.0f, -2.0f}, {0, 0xc0000000, 0x459c4800, 0}},
5821         {{1.0f, 2.0f, 3.0f, 4.0f}, {-3.0f, -3.0f, -3.0f, -3.0f}, {0, 0xc0400000, 0x453b9000, 0}},
5822         {{1.0f, 2.0f, 3.0f, 4.0f}, {-4.0f, -4.0f, -4.0f, -4.0f}, {0, 0xc0800000, 0x44fa2000, 0}},
5823         {{1.0f, 2.0f, 3.0f, 4.0f}, {-5.0f, -5.0f, -5.0f, -5.0f}, {0, 0xc0a00000, 0x459c5000, 0}},
5824         {{1.0f, 2.0f, 3.0f, 4.0f}, {-6.0f, -6.0f, -6.0f, -6.0f}, {0, 0xc0c00000, 0x453ba000, 0xc1400000}},
5825         {{1.0f, 2.0f, 3.0f, 4.0f}, {-7.0f, -7.0f, -7.0f, -7.0f}, {0, 0xc0e00000, 0x44fa4000, 0x40400000}},
5826         {{1.0f, 2.0f, 3.0f, 4.0f}, {-8.0f, -8.0f, -8.0f, -8.0f}, {0, 0xc1000000, 0, 0x44fa6000}},
5827         {{1.0f, 2.0f, 3.0f, 4.0f}, {-9.0f, -9.0f, -9.0f, -9.0f}, {0, 0xc1100000, 0, 0}},
5828         {{1.0f, 2.0f, 3.0f, 4.0f}, {-10.0f, -10.0f, -10.0f, -10.0f}, {0, 0xc1200000, 0xc1200000, 0}},
5829         {{1.0f, 2.0f, 3.0f, 4.0f}, {-11.0f, -11.0f, -11.0f, -11.0f}, {0, 0xc1300000, 0x3f800000, 0}},
5830         {{1.0f, 2.0f, 3.0f, 4.0f}, {-12.0f, -12.0f, -12.0f, -12.0f}, {0, 0xc1400000, 0x447a4000, 0}},
5831         {{1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 5.0f, 5.0f, 5.0f}, {0, 0x40a00000, 0x3f800000, 0}},
5832         {{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.0f, 1094.0f, -2222.0f, -3333.0f},
5833                 {0x447ac000, 0xc5505000, 0x459c5000, 0x40000000}},
5834         {{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.0f, 1094.0f, -2222.0f, -1111.0f},
5835                 {0x447ac000, 0xc48ae000, 0x44fa4000, 0x3f800000}},
5836         {{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.0f, 1094.0f, -2222.0f, -3333.0f},
5837                 {0x447ac000, 0xc5505000, 0x459c5000, 0}},
5838         {{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.0f, 1094.0f, -2222.0f, -1111.0f},
5839                 {0x447ac000, 0xc48ae000, 0x44fa4000, 0x40400000}},
5840     };
5841     static const struct
5842     {
5843         unsigned int zw[2];
5844     }
5845     expected_light_specular[] =
5846     {
5847         {{0, 0x44fa2000}},
5848         {{0x447a8000, 0x453b9000}},
5849         {{0x40000000, 0x459c4800}},
5850         {{0xbf800000, 0}},
5851         {{0x447a4000, 0}},
5852         {{0x3f800000, 0}},
5853         {{0xbf800000, 0}},
5854         {{0, 0}},
5855         {{0, 0x447a4000}},
5856         {{0x44fa4000, 0x3f800000}},
5857         {{0x453ba000, 0xbf800000}},
5858         {{0x459c5000, 0}},
5859         {{0x44fa2000, 0}},
5860         {{0x453b9000, 0}},
5861         {{0x459c4800, 0}},
5862         {{0, 0}},
5863     };
5864     static const struct
5865     {
5866         int index_value;
5867         unsigned int expected[4];
5868     }
5869     test_index_to_immediate_table[] =
5870     {
5871         {-1000000, {0, 0x40800000, 0x45bbd800, 0x41300000}},
5872         {-1001, {0x448d4000, 0x41300000, 0, 0}},
5873         {-32, {0x448d4000, 0x40800000, 0, 0}},
5874         {-31, {0x45843000, 0x41400000, 0, 0}},
5875         {-30, {0x46a64000, 0x41400000, 0x447a4000, 0x3f800000}},
5876         {-29, {0, 0x447a4000, 0x447a8000, 0x40000000}},
5877         {-28, {0, 0, 0x447ac000, 0x40400000}},
5878         {-27, {0, 0x3f800000, 0, 0}},
5879         {-26, {0, 0x41100000, 0x45bbd800, 0x41300000}},
5880         {-25, {0, 0x41300000, 0, 0}},
5881         {-24, {0, 0x41600000, 0, 0}},
5882         {-23, {0, 0, 0, 0}},
5883         {-22, {0, 0, 0, 0}},
5884         {-21, {0, 0x40a00000, 0, 0}},
5885         {-20, {0, 0x41500000, 0, 0}},
5886         {-19, {0, 0x41500000, 0, 0}},
5887         {-18, {0, 0xc1900000, 0, 0}},
5888         {-17, {0, 0, 0, 0}},
5889         {-16, {0, 0x40800000, 0, 0}},
5890         {-15, {0, 0x41400000, 0, 0}},
5891         {-14, {0, 0x41400000, 0, 0}},
5892         {-13, {0, 0x447a4000, 0x447a4000, 0x3f800000}},
5893         {-12, {0, 0, 0, 0}},
5894         {-11, {0, 0x3f800000, 0, 0}},
5895         {-10, {0, 0x41100000, 0, 0}},
5896         {-9, {0, 0x41300000, 0, 0}},
5897         {-8, {0, 0x41600000, 0, 0}},
5898         {-7, {0, 0, 0, 0}},
5899         {-6, {0, 0, 0, 0}},
5900         {-5, {0, 0x40a00000, 0, 0}},
5901         {-4, {0, 0x41500000, 0, 0}},
5902         {-3, {0, 0x41500000, 0, 0}},
5903         {-2, {0, 0xc0000000, 0, 0}},
5904         {-1, {0, 0, 0, 0}},
5905         {0, {0x45052000, 0x40800000, 0x447a4000, 0x3f800000}},
5906         {1, {0x467e6000, 0x41400000, 0x447a8000, 0x40000000}},
5907         {2, {0, 0x41400000, 0x447ac000, 0x40400000}},
5908         {3, {0, 0x447a4000, 0, 0}},
5909         {4, {0, 0, 0x45bbd800, 0x41300000}},
5910         {5, {0, 0x3f800000, 0, 0}},
5911         {6, {0, 0x41100000, 0, 0}},
5912         {7, {0, 0x41300000, 0, 0}},
5913         {8, {0, 0x41600000, 0, 0}},
5914         {9, {0, 0, 0, 0}},
5915         {10, {0, 0, 0, 0}},
5916         {11, {0, 0x40a00000, 0, 0}},
5917         {12, {0, 0x41500000, 0, 0}},
5918         {13, {0, 0x41500000, 0, 0}},
5919         {14, {0, 0x41600000, 0, 0}},
5920         {15, {0, 0, 0, 0}},
5921         {16, {0, 0x40800000, 0, 0}},
5922         {17, {0x45052000, 0x41400000, 0x447a4000, 0x3f800000}},
5923         {18, {0x467e6000, 0x41400000, 0x447a8000, 0x40000000}},
5924         {19, {0, 0x447a4000, 0x447ac000, 0x40400000}},
5925         {20, {0, 0, 0, 0}},
5926         {21, {0, 0x3f800000, 0x45bbd800, 0x41300000}},
5927         {22, {0, 0x41100000, 0, 0}},
5928         {23, {0, 0x41300000, 0, 0}},
5929         {24, {0, 0x41600000, 0, 0}},
5930         {25, {0, 0, 0, 0}},
5931         {26, {0, 0, 0, 0}},
5932         {27, {0, 0x40a00000, 0, 0}},
5933         {28, {0, 0x41500000, 0, 0}},
5934         {29, {0, 0x41500000, 0, 0}},
5935         {30, {0, 0x41f00000, 0, 0}},
5936         {31, {0, 0, 0, 0}},
5937         {1001, {0, 0, 0, 0}},
5938         {1000000, {0, 0x40800000, 0, 0}},
5939     };
5940     static const D3DLIGHT9 light_filler = {D3DLIGHT_POINT, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f},
5941             {1.0f, 1.0f, 1.0f, 1.0f}};
5942     unsigned int j, passes_count;
5943     const unsigned int *expected;
5944     const float *expected_float;
5945     ID3DXEffect *effect;
5946     D3DXVECTOR4 fvect;
5947     D3DLIGHT9 light;
5948     const float *v;
5949     HRESULT hr;
5950     int i;
5951 
5952     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
5953             NULL, NULL, 0, NULL, &effect, NULL);
5954     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5955 
5956     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
5957     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5958     hr = effect->lpVtbl->BeginPass(effect, 0);
5959     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5960 
5961     fvect.x = 1001.0f; fvect.y = 1002.0f; fvect.z = 1003.0f; fvect.w = 1004.0f;
5962     hr = effect->lpVtbl->SetVector(effect, "opvect1", &fvect);
5963     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5964 
5965     fvect.x = 2001.0f; fvect.y = 2002.0f; fvect.z = 2003.0f; fvect.w = 2004.0f;
5966     hr = effect->lpVtbl->SetVector(effect, "g_Selector[0]", &fvect);
5967     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5968 
5969     fvect.x = 3001.0f; fvect.y = 3002.0f; fvect.z = 3003.0f; fvect.w = 3004.0f;
5970     hr = effect->lpVtbl->SetVector(effect, "g_Selector[1]", &fvect);
5971     ok(hr == D3D_OK, "Got result %#x.\n", hr);
5972 
5973     v = &light.Specular.r;
5974     for (i = 0; i < ARRAY_SIZE(test_out_of_bounds_index); ++i)
5975     {
5976         hr = effect->lpVtbl->SetVector(effect, "opvect2", &test_out_of_bounds_index[i].opvect2);
5977         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5978         hr = effect->lpVtbl->SetVector(effect, "g_iVect", &test_out_of_bounds_index[i].g_ivect);
5979         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5980 
5981         hr = IDirect3DDevice9_SetLight(device, 1, &light_filler);
5982         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5983 
5984         hr = effect->lpVtbl->CommitChanges(effect);
5985         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5986 
5987         hr = IDirect3DDevice9_GetLight(device, 1, &light);
5988         ok(hr == D3D_OK, "Got result %#x.\n", hr);
5989 
5990         expected = test_out_of_bounds_index[i].expected;
5991         expected_float = (const float *)expected;
5992 
5993         for (j = 0; j < 4; ++j)
5994         {
5995             ok(compare_float(v[j], expected_float[j], 0),
5996                     "Test %d, component %u, expected %#x (%g), got %#x (%g).\n",
5997                     i, j, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]);
5998         }
5999     }
6000 
6001     hr = effect->lpVtbl->SetVector(effect, "opvect2", &test_out_of_bounds_index[7].opvect2);
6002     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6003     hr = effect->lpVtbl->SetVector(effect, "g_iVect", &test_out_of_bounds_index[7].g_ivect);
6004     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6005 
6006     hr = IDirect3DDevice9_SetLight(device, 1, &light_filler);
6007     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6008 
6009     fvect = test_out_of_bounds_index[7].g_ivect;
6010     v = &light.Specular.b;
6011     for (i = -100; i < 100; ++i)
6012     {
6013         fvect.w = i;
6014         hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
6015         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6016         hr = effect->lpVtbl->CommitChanges(effect);
6017         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6018 
6019         hr = IDirect3DDevice9_GetLight(device, 1, &light);
6020         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6021 
6022         expected = expected_light_specular[(unsigned int)i % ARRAY_SIZE(expected_light_specular)].zw;
6023         expected_float = (const float *)expected;
6024 
6025         for (j = 0; j < 2; ++j)
6026         {
6027             ok(compare_float(v[j], expected_float[j], 0),
6028                     "i %d, component %u, expected %#x (%g), got %#x (%g).\n",
6029                     i, j + 2, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]);
6030         }
6031     }
6032 
6033     v = &light.Specular.r;
6034     for (i = 0; i < ARRAY_SIZE(test_index_to_immediate_table); ++i)
6035     {
6036         fvect.x = fvect.y = fvect.z = fvect.w = test_index_to_immediate_table[i].index_value;
6037         hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
6038         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6039         hr = effect->lpVtbl->CommitChanges(effect);
6040         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6041 
6042         hr = IDirect3DDevice9_GetLight(device, 2, &light);
6043         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6044 
6045         expected = test_index_to_immediate_table[i].expected;
6046         expected_float = (const float *)expected;
6047 
6048         for (j = 0; j < 4; ++j)
6049         {
6050             ok(compare_float(v[j], expected_float[j], 0),
6051                     "Test %d, component %u, expected %#x (%g), got %#x (%g).\n",
6052                     i, j, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]);
6053         }
6054     }
6055 
6056     hr = effect->lpVtbl->EndPass(effect);
6057     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6058     hr = effect->lpVtbl->End(effect);
6059     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6060 
6061     effect->lpVtbl->Release(effect);
6062 }
6063 
6064 struct test_state_manager_update
6065 {
6066     unsigned int state_op;
6067     DWORD param1;
6068     DWORD param2;
6069 };
6070 
6071 struct test_manager
6072 {
6073     ID3DXEffectStateManager ID3DXEffectStateManager_iface;
6074     LONG ref;
6075 
6076     IDirect3DDevice9 *device;
6077     struct test_state_manager_update *update_record;
6078     unsigned int update_record_count;
6079     unsigned int update_record_size;
6080 };
6081 
6082 #define INITIAL_UPDATE_RECORD_SIZE 64
6083 
6084 static struct test_manager *impl_from_ID3DXEffectStateManager(ID3DXEffectStateManager *iface)
6085 {
6086     return CONTAINING_RECORD(iface, struct test_manager, ID3DXEffectStateManager_iface);
6087 }
6088 
6089 static void free_test_effect_state_manager(struct test_manager *state_manager)
6090 {
6091     HeapFree(GetProcessHeap(), 0, state_manager->update_record);
6092     state_manager->update_record = NULL;
6093 
6094     IDirect3DDevice9_Release(state_manager->device);
6095 }
6096 
6097 static ULONG WINAPI test_manager_AddRef(ID3DXEffectStateManager *iface)
6098 {
6099     struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
6100 
6101     return InterlockedIncrement(&state_manager->ref);
6102 }
6103 
6104 static ULONG WINAPI test_manager_Release(ID3DXEffectStateManager *iface)
6105 {
6106     struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
6107     ULONG ref = InterlockedDecrement(&state_manager->ref);
6108 
6109     if (!ref)
6110     {
6111         free_test_effect_state_manager(state_manager);
6112         HeapFree(GetProcessHeap(), 0, state_manager);
6113     }
6114     return ref;
6115 }
6116 
6117 static HRESULT test_process_set_state(ID3DXEffectStateManager *iface,
6118     unsigned int state_op, DWORD param1, DWORD param2)
6119 {
6120     struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
6121 
6122     if (state_manager->update_record_count == state_manager->update_record_size)
6123     {
6124         if (!state_manager->update_record_size)
6125         {
6126             state_manager->update_record_size = INITIAL_UPDATE_RECORD_SIZE;
6127             state_manager->update_record = HeapAlloc(GetProcessHeap(), 0,
6128                     sizeof(*state_manager->update_record) * state_manager->update_record_size);
6129         }
6130         else
6131         {
6132             state_manager->update_record_size *= 2;
6133             state_manager->update_record = HeapReAlloc(GetProcessHeap(), 0, state_manager->update_record,
6134                     sizeof(*state_manager->update_record) * state_manager->update_record_size);
6135         }
6136     }
6137     state_manager->update_record[state_manager->update_record_count].state_op = state_op;
6138     state_manager->update_record[state_manager->update_record_count].param1 = param1;
6139     state_manager->update_record[state_manager->update_record_count].param2 = param2;
6140     ++state_manager->update_record_count;
6141     return D3D_OK;
6142 }
6143 
6144 static HRESULT WINAPI test_manager_SetTransform(ID3DXEffectStateManager *iface,
6145         D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix)
6146 {
6147     return test_process_set_state(iface, 0, state, 0);
6148 }
6149 
6150 static HRESULT WINAPI test_manager_SetMaterial(ID3DXEffectStateManager *iface,
6151         const D3DMATERIAL9 *material)
6152 {
6153     return test_process_set_state(iface, 1, 0, 0);
6154 }
6155 
6156 static HRESULT WINAPI test_manager_SetLight(ID3DXEffectStateManager *iface,
6157         DWORD index, const D3DLIGHT9 *light)
6158 {
6159     struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
6160 
6161     IDirect3DDevice9_SetLight(state_manager->device, index, light);
6162     return test_process_set_state(iface, 2, index, 0);
6163 }
6164 
6165 static HRESULT WINAPI test_manager_LightEnable(ID3DXEffectStateManager *iface,
6166         DWORD index, BOOL enable)
6167 {
6168     struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
6169 
6170     IDirect3DDevice9_LightEnable(state_manager->device, index, enable);
6171     return test_process_set_state(iface, 3, index, 0);
6172 }
6173 
6174 static HRESULT WINAPI test_manager_SetRenderState(ID3DXEffectStateManager *iface,
6175         D3DRENDERSTATETYPE state, DWORD value)
6176 {
6177     return test_process_set_state(iface, 4, state, 0);
6178 }
6179 
6180 static HRESULT WINAPI test_manager_SetTexture(ID3DXEffectStateManager *iface,
6181         DWORD stage, struct IDirect3DBaseTexture9 *texture)
6182 {
6183     return test_process_set_state(iface, 5, stage, 0);
6184 }
6185 
6186 static HRESULT WINAPI test_manager_SetTextureStageState(ID3DXEffectStateManager *iface,
6187         DWORD stage, D3DTEXTURESTAGESTATETYPE type, DWORD value)
6188 {
6189     return test_process_set_state(iface, 6, stage, type);
6190 }
6191 
6192 static HRESULT WINAPI test_manager_SetSamplerState(ID3DXEffectStateManager *iface,
6193         DWORD sampler, D3DSAMPLERSTATETYPE type, DWORD value)
6194 {
6195     return test_process_set_state(iface, 7, sampler, type);
6196 }
6197 
6198 static HRESULT WINAPI test_manager_SetNPatchMode(ID3DXEffectStateManager *iface,
6199         FLOAT num_segments)
6200 {
6201     return test_process_set_state(iface, 8, 0, 0);
6202 }
6203 
6204 static HRESULT WINAPI test_manager_SetFVF(ID3DXEffectStateManager *iface,
6205         DWORD format)
6206 {
6207     return test_process_set_state(iface, 9, 0, 0);
6208 }
6209 
6210 static HRESULT WINAPI test_manager_SetVertexShader(ID3DXEffectStateManager *iface,
6211         struct IDirect3DVertexShader9 *shader)
6212 {
6213     return test_process_set_state(iface, 10, 0, 0);
6214 }
6215 
6216 static HRESULT WINAPI test_manager_SetVertexShaderConstantF(ID3DXEffectStateManager *iface,
6217         UINT register_index, const FLOAT *constant_data, UINT register_count)
6218 {
6219     return test_process_set_state(iface, 11, register_index, register_count);
6220 }
6221 
6222 static HRESULT WINAPI test_manager_SetVertexShaderConstantI(ID3DXEffectStateManager *iface,
6223         UINT register_index, const INT *constant_data, UINT register_count)
6224 {
6225     return test_process_set_state(iface, 12, register_index, register_count);
6226 }
6227 
6228 static HRESULT WINAPI test_manager_SetVertexShaderConstantB(ID3DXEffectStateManager *iface,
6229         UINT register_index, const BOOL *constant_data, UINT register_count)
6230 {
6231     return test_process_set_state(iface, 13, register_index, register_count);
6232 }
6233 
6234 static HRESULT WINAPI test_manager_SetPixelShader(ID3DXEffectStateManager *iface,
6235         struct IDirect3DPixelShader9 *shader)
6236 {
6237     return test_process_set_state(iface, 14, 0, 0);
6238 }
6239 
6240 static HRESULT WINAPI test_manager_SetPixelShaderConstantF(ID3DXEffectStateManager *iface,
6241         UINT register_index, const FLOAT *constant_data, UINT register_count)
6242 {
6243     return test_process_set_state(iface, 15, register_index, register_count);
6244 }
6245 
6246 static HRESULT WINAPI test_manager_SetPixelShaderConstantI(ID3DXEffectStateManager *iface,
6247         UINT register_index, const INT *constant_data, UINT register_count)
6248 {
6249     return test_process_set_state(iface, 16, register_index, register_count);
6250 }
6251 
6252 static HRESULT WINAPI test_manager_SetPixelShaderConstantB(ID3DXEffectStateManager *iface,
6253         UINT register_index, const BOOL *constant_data, UINT register_count)
6254 {
6255     return test_process_set_state(iface, 17, register_index, register_count);
6256 }
6257 
6258 static void test_effect_state_manager_init(struct test_manager *state_manager,
6259         IDirect3DDevice9 *device)
6260 {
6261     static const struct ID3DXEffectStateManagerVtbl test_ID3DXEffectStateManager_Vtbl =
6262     {
6263         /*** IUnknown methods ***/
6264         NULL,
6265         test_manager_AddRef,
6266         test_manager_Release,
6267         /*** ID3DXEffectStateManager methods ***/
6268         test_manager_SetTransform,
6269         test_manager_SetMaterial,
6270         test_manager_SetLight,
6271         test_manager_LightEnable,
6272         test_manager_SetRenderState,
6273         test_manager_SetTexture,
6274         test_manager_SetTextureStageState,
6275         test_manager_SetSamplerState,
6276         test_manager_SetNPatchMode,
6277         test_manager_SetFVF,
6278         test_manager_SetVertexShader,
6279         test_manager_SetVertexShaderConstantF,
6280         test_manager_SetVertexShaderConstantI,
6281         test_manager_SetVertexShaderConstantB,
6282         test_manager_SetPixelShader,
6283         test_manager_SetPixelShaderConstantF,
6284         test_manager_SetPixelShaderConstantI,
6285         test_manager_SetPixelShaderConstantB,
6286     };
6287 
6288     state_manager->ID3DXEffectStateManager_iface.lpVtbl = &test_ID3DXEffectStateManager_Vtbl;
6289     state_manager->ref = 1;
6290 
6291     IDirect3DDevice9_AddRef(device);
6292     state_manager->device = device;
6293 }
6294 
6295 static const char *test_effect_state_manager_state_names[] =
6296 {
6297     "SetTransform",
6298     "SetMaterial",
6299     "SetLight",
6300     "LightEnable",
6301     "SetRenderState",
6302     "SetTexture",
6303     "SetTextureStageState",
6304     "SetSamplerState",
6305     "SetNPatchMode",
6306     "SetFVF",
6307     "SetVertexShader",
6308     "SetVertexShaderConstantF",
6309     "SetVertexShaderConstantI",
6310     "SetVertexShaderConstantB",
6311     "SetPixelShader",
6312     "SetPixelShaderConstantF",
6313     "SetPixelShaderConstantI",
6314     "SetPixelShaderConstantB",
6315 };
6316 
6317 static int compare_update_record(const void *a, const void *b)
6318 {
6319     const struct test_state_manager_update *r1 = (const struct test_state_manager_update *)a;
6320     const struct test_state_manager_update *r2 = (const struct test_state_manager_update *)b;
6321 
6322     if (r1->state_op != r2->state_op)
6323         return r1->state_op - r2->state_op;
6324     if (r1->param1 != r2->param1)
6325         return r1->param1 - r2->param1;
6326     return r1->param2 - r2->param2;
6327 }
6328 
6329 static void test_effect_state_manager(IDirect3DDevice9 *device)
6330 {
6331     static const struct test_state_manager_update expected_updates[] =
6332     {
6333         {2, 0, 0},
6334         {2, 1, 0},
6335         {2, 2, 0},
6336         {2, 3, 0},
6337         {2, 4, 0},
6338         {2, 5, 0},
6339         {2, 6, 0},
6340         {2, 7, 0},
6341         {3, 0, 0},
6342         {3, 1, 0},
6343         {3, 2, 0},
6344         {3, 3, 0},
6345         {3, 4, 0},
6346         {3, 5, 0},
6347         {3, 6, 0},
6348         {3, 7, 0},
6349         {4, 28, 0},
6350         {4, 36, 0},
6351         {4, 38, 0},
6352         {4, 158, 0},
6353         {4, 159, 0},
6354         {5, 0, 0},
6355         {5, 259, 0},
6356         {7, 0, 5},
6357         {7, 0, 6},
6358         {7, 1, 5},
6359         {7, 1, 6},
6360         {7, 257, 5},
6361         {7, 257, 6},
6362         {7, 258, 5},
6363         {7, 258, 6},
6364         {7, 259, 5},
6365         {7, 259, 6},
6366         {10, 0, 0},
6367         {11, 0, 34},
6368         {14, 0, 0},
6369         {15, 0, 14},
6370         {16, 0, 1},
6371         {17, 0, 6},
6372     };
6373     static D3DLIGHT9 light_filler =
6374             {D3DLIGHT_DIRECTIONAL, {0.5f, 0.5f, 0.5f, 0.5f}, {0.5f, 0.5f, 0.5f, 0.5f}, {0.5f, 0.5f, 0.5f, 0.5f}};
6375     struct test_manager *state_manager;
6376     unsigned int passes_count, i, n;
6377     ID3DXEffect *effect;
6378     ULONG refcount;
6379     HRESULT hr;
6380 
6381     state_manager = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*state_manager));
6382     test_effect_state_manager_init(state_manager, device);
6383 
6384     for (i = 0; i < 8; ++i)
6385     {
6386         hr = IDirect3DDevice9_SetLight(device, i, &light_filler);
6387         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6388     }
6389 
6390     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6391             NULL, NULL, 0, NULL, &effect, NULL);
6392     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6393 
6394     hr = effect->lpVtbl->SetStateManager(effect, &state_manager->ID3DXEffectStateManager_iface);
6395     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6396 
6397     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
6398     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6399 
6400     hr = effect->lpVtbl->BeginPass(effect, 0);
6401     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6402 
6403     hr = effect->lpVtbl->EndPass(effect);
6404     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6405 
6406     hr = effect->lpVtbl->End(effect);
6407     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6408 
6409     effect->lpVtbl->Release(effect);
6410 
6411     qsort(state_manager->update_record, state_manager->update_record_count,
6412             sizeof(*state_manager->update_record), compare_update_record);
6413 
6414     ok(ARRAY_SIZE(expected_updates) == state_manager->update_record_count,
6415             "Got %u update records.\n", state_manager->update_record_count);
6416     n = min(ARRAY_SIZE(expected_updates), state_manager->update_record_count);
6417     for (i = 0; i < n; ++i)
6418     {
6419         ok(!memcmp(&expected_updates[i], &state_manager->update_record[i],
6420                 sizeof(expected_updates[i])),
6421                 "Update record mismatch, expected %s, %u, %u, got %s, %u, %u.\n",
6422                 test_effect_state_manager_state_names[expected_updates[i].state_op],
6423                 expected_updates[i].param1, expected_updates[i].param2,
6424                 test_effect_state_manager_state_names[state_manager->update_record[i].state_op],
6425                 state_manager->update_record[i].param1, state_manager->update_record[i].param2);
6426     }
6427 
6428     for (i = 0; i < 8; ++i)
6429     {
6430         D3DLIGHT9 light;
6431 
6432         hr = IDirect3DDevice9_GetLight(device, i, &light);
6433         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6434         ok(!memcmp(&light, &light_filler, sizeof(light)), "Light %u mismatch.\n", i);
6435     }
6436 
6437     refcount = state_manager->ID3DXEffectStateManager_iface.lpVtbl->Release(
6438             &state_manager->ID3DXEffectStateManager_iface);
6439     ok(!refcount, "State manager was not properly freed, refcount %u.\n", refcount);
6440 }
6441 
6442 static void test_cross_effect_handle(IDirect3DDevice9 *device)
6443 {
6444     ID3DXEffect *effect1, *effect2;
6445     D3DXHANDLE param1, param2;
6446     static int expected_ivect[4] = {28, 29, 30, 31};
6447     int ivect[4];
6448     HRESULT hr;
6449 
6450     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6451             NULL, NULL, 0, NULL, &effect1, NULL);
6452     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6453     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6454             NULL, NULL, 0, NULL, &effect2, NULL);
6455     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6456 
6457     ok(effect1 != effect2, "Got same effect unexpectedly.\n");
6458 
6459     param1 = effect1->lpVtbl->GetParameterByName(effect1, NULL, "g_iVect");
6460     ok(!!param1, "GetParameterByName failed.\n");
6461 
6462     param2 = effect2->lpVtbl->GetParameterByName(effect2, NULL, "g_iVect");
6463     ok(!!param2, "GetParameterByName failed.\n");
6464 
6465     ok(param1 != param2, "Got same parameter handle unexpectedly.\n");
6466 
6467     hr = effect2->lpVtbl->SetValue(effect2, param1, expected_ivect, sizeof(expected_ivect));
6468     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6469 
6470     hr = effect1->lpVtbl->GetValue(effect1, param1, ivect, sizeof(ivect));
6471     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6472 
6473     ok(!memcmp(ivect, expected_ivect, sizeof(expected_ivect)), "Vector value mismatch.\n");
6474 
6475     effect2->lpVtbl->Release(effect2);
6476     effect1->lpVtbl->Release(effect1);
6477 }
6478 
6479 #if 0
6480 struct test_struct
6481 {
6482     float3 v1_2;
6483     float fv_2;
6484     float4 v2_2;
6485 };
6486 
6487 shared float arr2[1];
6488 shared test_struct ts2[2] = {{{0, 0, 0}, 0, {0, 0, 0, 0}}, {{1, 2, 3}, 4, {5, 6, 7, 8}}};
6489 
6490 struct VS_OUTPUT
6491 {
6492     float4 Position   : POSITION;
6493 };
6494 
6495 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION)
6496 {
6497     VS_OUTPUT Output;
6498 
6499     Output.Position = arr2[0] * vPos;
6500     return Output;
6501 }
6502 
6503 shared vertexshader vs_arr2[2] = {compile vs_3_0 RenderSceneVS(), NULL};
6504 
6505 technique tech0
6506 {
6507     pass p0
6508     {
6509         FogEnable = TRUE;
6510         FogDensity = arr2[0];
6511         PointScale_A = ts2[0].fv_2;
6512         VertexShader = vs_arr2[0];
6513     }
6514 
6515     pass p1
6516     {
6517         VertexShader = vs_arr2[1];
6518     }
6519 }
6520 #endif
6521 static const DWORD test_effect_shared_parameters_blob[] =
6522 {
6523     0xfeff0901, 0x000001dc, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000001,
6524     0x00000001, 0x00000001, 0x00000000, 0x00000005, 0x32727261, 0x00000000, 0x00000000, 0x00000005,
6525     0x000000dc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00000001, 0x000000e4, 0x00000000,
6526     0x00000000, 0x00000003, 0x00000001, 0x00000003, 0x00000000, 0x000000f0, 0x00000000, 0x00000000,
6527     0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x000000fc, 0x00000000, 0x00000000, 0x00000004,
6528     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
6529     0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000,
6530     0x41000000, 0x00000004, 0x00327374, 0x00000005, 0x325f3176, 0x00000000, 0x00000005, 0x325f7666,
6531     0x00000000, 0x00000005, 0x325f3276, 0x00000000, 0x00000010, 0x00000004, 0x00000124, 0x00000000,
6532     0x00000002, 0x00000001, 0x00000002, 0x00000008, 0x615f7376, 0x00327272, 0x00000001, 0x00000002,
6533     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003,
6534     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003,
6535     0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000010,
6536     0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003070, 0x00000004, 0x00000010,
6537     0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003170, 0x00000006, 0x68636574,
6538     0x00000030, 0x00000003, 0x00000001, 0x00000006, 0x00000005, 0x00000004, 0x00000020, 0x00000001,
6539     0x00000000, 0x00000030, 0x0000009c, 0x00000001, 0x00000000, 0x00000108, 0x0000011c, 0x00000001,
6540     0x00000000, 0x000001d0, 0x00000000, 0x00000002, 0x000001a8, 0x00000000, 0x00000004, 0x0000000e,
6541     0x00000000, 0x00000134, 0x00000130, 0x00000014, 0x00000000, 0x00000154, 0x00000150, 0x00000041,
6542     0x00000000, 0x00000174, 0x00000170, 0x00000092, 0x00000000, 0x00000194, 0x00000190, 0x000001c8,
6543     0x00000000, 0x00000001, 0x00000092, 0x00000000, 0x000001b4, 0x000001b0, 0x00000002, 0x00000004,
6544     0x00000001, 0x000000c8, 0xfffe0300, 0x0025fffe, 0x42415443, 0x0000001c, 0x0000005f, 0xfffe0300,
6545     0x00000001, 0x0000001c, 0x00000000, 0x00000058, 0x00000030, 0x00000002, 0x00000001, 0x00000038,
6546     0x00000048, 0x32727261, 0xababab00, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0x00000000,
6547     0x00000000, 0x00000000, 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820,
6548     0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235,
6549     0x00313131, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x03000005,
6550     0xe00f0000, 0xa0000000, 0x90e40000, 0x0000ffff, 0x00000002, 0x00000000, 0x00000000, 0x00000001,
6551     0xffffffff, 0x00000000, 0x00000001, 0x0000000b, 0x615f7376, 0x5b327272, 0x00005d31, 0x00000000,
6552     0x00000000, 0xffffffff, 0x00000003, 0x00000001, 0x0000000b, 0x615f7376, 0x5b327272, 0x00005d30,
6553     0x00000000, 0x00000000, 0xffffffff, 0x00000002, 0x00000000, 0x00000188, 0x46580200, 0x004ffffe,
6554     0x42415443, 0x0000001c, 0x00000107, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000104,
6555     0x00000030, 0x00000002, 0x00000002, 0x00000094, 0x000000a4, 0x00327374, 0x325f3176, 0xababab00,
6556     0x00030001, 0x00030001, 0x00000001, 0x00000000, 0x325f7666, 0xababab00, 0x00030000, 0x00010001,
6557     0x00000001, 0x00000000, 0x325f3276, 0xababab00, 0x00030001, 0x00040001, 0x00000001, 0x00000000,
6558     0x00000034, 0x0000003c, 0x0000004c, 0x00000054, 0x00000064, 0x0000006c, 0x00000005, 0x00080001,
6559     0x00030002, 0x0000007c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
6560     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x40000000,
6561     0x40400000, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x40a00000, 0x40c00000,
6562     0x40e00000, 0x41000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
6563     0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
6564     0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000,
6565     0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
6566     0x00000000, 0x00000000, 0xffffffff, 0x00000001, 0x00000000, 0x000000dc, 0x46580200, 0x0024fffe,
6567     0x42415443, 0x0000001c, 0x0000005b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000058,
6568     0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000048, 0x32727261, 0xababab00, 0x00030000,
6569     0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874,
6570     0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970,
6571     0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe,
6572     0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
6573     0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
6574 };
6575 
6576 #ifdef __REACTOS__
6577 #define test_effect_shared_vs_arr_compare_helper(...) \
6578         test_effect_shared_vs_arr_compare_helper_(__LINE__, __VA_ARGS__)
6579 #else
6580 #define test_effect_shared_vs_arr_compare_helper(args...) \
6581         test_effect_shared_vs_arr_compare_helper_(__LINE__, args)
6582 #endif
6583 static void test_effect_shared_vs_arr_compare_helper_(unsigned int line, ID3DXEffect *effect,
6584         D3DXHANDLE param_child, struct IDirect3DVertexShader9 *vshader1, unsigned int element,
6585         BOOL todo)
6586 {
6587     struct IDirect3DVertexShader9 *vshader2;
6588     D3DXHANDLE param_child2;
6589     HRESULT hr;
6590 
6591     param_child2 = effect->lpVtbl->GetParameterElement(effect, "vs_arr2", element);
6592     ok_(__FILE__, line)(!!param_child2, "GetParameterElement failed.\n");
6593     ok_(__FILE__, line)(param_child != param_child2, "Got same parameter handle unexpectedly.\n");
6594     hr = effect->lpVtbl->GetVertexShader(effect, param_child2, &vshader2);
6595     ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
6596     todo_wine_if(todo)
6597     ok_(__FILE__, line)(vshader1 == vshader2, "Shared shader interface pointers differ.\n");
6598     if (vshader2)
6599         IDirect3DVertexShader9_Release(vshader2);
6600 }
6601 
6602 #ifdef __REACTOS__
6603 #define test_effect_shared_parameters_compare_vconst(...) \
6604         test_effect_shared_parameters_compare_vconst_(__LINE__, __VA_ARGS__)
6605 #else
6606 #define test_effect_shared_parameters_compare_vconst(args...) \
6607         test_effect_shared_parameters_compare_vconst_(__LINE__, args)
6608 #endif
6609 static void test_effect_shared_parameters_compare_vconst_(unsigned int line, IDirect3DDevice9 *device,
6610         unsigned int index, const D3DXVECTOR4 *expected_fvect, BOOL todo)
6611 {
6612     D3DXVECTOR4 fvect;
6613     HRESULT hr;
6614 
6615     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, index, &fvect.x, 1);
6616     ok_(__FILE__, line)(hr == D3D_OK, "Got result %#x.\n", hr);
6617     todo_wine_if(todo)
6618     ok_(__FILE__, line)(!memcmp(&fvect, expected_fvect, sizeof(fvect)),
6619             "Unexpected constant value %g, %g, %g, %g.\n", fvect.x, fvect.y, fvect.z, fvect.w);
6620 }
6621 
6622 static void test_effect_shared_parameters(IDirect3DDevice9 *device)
6623 {
6624     ID3DXEffect *effect1, *effect2, *effect3, *effect4;
6625     ID3DXEffectPool *pool;
6626     HRESULT hr;
6627     D3DXHANDLE param, param_child, param2, param_child2;
6628     unsigned int i, passes_count;
6629     ULONG refcount;
6630     D3DXVECTOR4 fvect;
6631     float fval[2];
6632 
6633     hr = D3DXCreateEffectPool(&pool);
6634     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6635 
6636     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6637             NULL, NULL, 0, pool, &effect2, NULL);
6638     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6639     effect2->lpVtbl->SetFloat(effect2, "arr2[0]", 28.0f);
6640     effect2->lpVtbl->Release(effect2);
6641 
6642     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6643             NULL, NULL, 0, pool, &effect2, NULL);
6644     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6645     effect2->lpVtbl->GetFloat(effect2, "arr2[0]", &fvect.x);
6646     ok(fvect.x == 92.0f, "Unexpected parameter value %g.\n", fvect.x);
6647     effect2->lpVtbl->SetFloat(effect2, "arr2[0]", 28.0f);
6648 
6649     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6650             NULL, NULL, 0, pool, &effect1, NULL);
6651     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6652 
6653     effect1->lpVtbl->GetFloat(effect1, "arr2[0]", &fvect.x);
6654     ok(fvect.x == 28.0f, "Unexpected parameter value %g.\n", fvect.x);
6655 
6656     hr = D3DXCreateEffect(device, test_effect_shared_parameters_blob, sizeof(test_effect_shared_parameters_blob),
6657             NULL, NULL, 0, pool, &effect3, NULL);
6658     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6659     hr = D3DXCreateEffect(device, test_effect_shared_parameters_blob, sizeof(test_effect_shared_parameters_blob),
6660             NULL, NULL, 0, pool, &effect4, NULL);
6661     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6662 
6663     effect2->lpVtbl->SetFloat(effect2, "arr2[0]", 3.0f);
6664     effect2->lpVtbl->SetFloat(effect2, "ts2[0].fv", 3.0f);
6665 
6666     effect3->lpVtbl->GetFloat(effect3, "arr2[0]", &fvect.x);
6667     ok(fvect.x == 0.0f, "Unexpected parameter value %g.\n", fvect.x);
6668     effect4->lpVtbl->SetFloat(effect4, "arr2[0]", 28.0f);
6669     effect3->lpVtbl->GetFloat(effect3, "arr2[0]", &fvect.x);
6670     ok(fvect.x == 28.0f, "Unexpected parameter value %g.\n", fvect.x);
6671     effect1->lpVtbl->GetFloat(effect1, "arr2[0]", &fvect.x);
6672     ok(fvect.x == 3.0f, "Unexpected parameter value %g.\n", fvect.x);
6673 
6674     param = effect3->lpVtbl->GetParameterByName(effect3, NULL, "ts2[0].fv_2");
6675     ok(!!param, "GetParameterByName failed.\n");
6676     effect3->lpVtbl->GetFloat(effect3, param, &fvect.x);
6677     ok(fvect.x == 0.0f, "Unexpected parameter value %g.\n", fvect.x);
6678 
6679     param = effect1->lpVtbl->GetParameterByName(effect1, NULL, "arr2");
6680     ok(!!param, "GetParameterByName failed.\n");
6681     ok(!effect3->lpVtbl->IsParameterUsed(effect3, param, "tech0"),
6682             "Unexpected IsParameterUsed result.\n");
6683 
6684     param = effect3->lpVtbl->GetParameterByName(effect3, NULL, "arr2");
6685     ok(!!param, "GetParameterByName failed.\n");
6686     ok(effect3->lpVtbl->IsParameterUsed(effect3, param, "tech0"),
6687             "Unexpected IsParameterUsed result.\n");
6688 
6689     param = effect1->lpVtbl->GetParameterByName(effect1, NULL, "vs_arr2");
6690     ok(!!param, "GetParameterByName failed.\n");
6691     todo_wine
6692     ok(!effect3->lpVtbl->IsParameterUsed(effect3, param, "tech0"),
6693             "Unexpected IsParameterUsed result.\n");
6694 
6695     ok(effect3->lpVtbl->IsParameterUsed(effect3, "vs_arr2", "tech0"),
6696             "Unexpected IsParameterUsed result.\n");
6697     ok(!effect3->lpVtbl->IsParameterUsed(effect3, "vs_arr2[0]", "tech0"),
6698             "Unexpected IsParameterUsed result.\n");
6699     ok(!effect3->lpVtbl->IsParameterUsed(effect3, "vs_arr2[1]", "tech0"),
6700             "Unexpected IsParameterUsed result.\n");
6701 
6702     ok(effect1->lpVtbl->IsParameterUsed(effect1, param, "tech0"),
6703             "Unexpected IsParameterUsed result.\n");
6704 
6705     hr = effect3->lpVtbl->Begin(effect3, &passes_count, 0);
6706     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6707 
6708     if (0)
6709     {
6710     /*  Native d3dx crashes in BeginPass(). This is the case of shader array declared shared
6711      *  but initialized with different shaders using different parameters. */
6712     hr = effect3->lpVtbl->BeginPass(effect3, 0);
6713     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6714 
6715     hr = effect3->lpVtbl->EndPass(effect3);
6716     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6717     }
6718 
6719     test_effect_clear_vconsts(device);
6720     fvect.x = fvect.y = fvect.z = fvect.w = 28.0f;
6721     hr = effect2->lpVtbl->SetVector(effect2, "g_Pos1", &fvect);
6722     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6723     hr = effect1->lpVtbl->SetVector(effect1, "g_Pos1", &fvect);
6724     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6725 
6726     hr = effect3->lpVtbl->BeginPass(effect3, 1);
6727     todo_wine
6728     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6729 
6730     hr = IDirect3DDevice9_GetVertexShaderConstantF(device, 0, &fvect.x, 1);
6731     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6732     todo_wine
6733     ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f,
6734             "Unexpected vector %g, %g, %g, %g.\n", fvect.x, fvect.y, fvect.z, fvect.w);
6735 
6736     hr = effect3->lpVtbl->EndPass(effect3);
6737     todo_wine
6738     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6739 
6740     hr = effect3->lpVtbl->End(effect3);
6741     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6742 
6743     for (i = 0; i < 2; ++i)
6744     {
6745         struct IDirect3DVertexShader9 *vshader1;
6746 
6747         param_child = effect1->lpVtbl->GetParameterElement(effect1, "vs_arr2", i);
6748         ok(!!param_child, "GetParameterElement failed.\n");
6749         hr = effect1->lpVtbl->GetVertexShader(effect1, param_child, &vshader1);
6750         ok(hr == D3D_OK, "Got result %#x.\n", hr);
6751 
6752         test_effect_shared_vs_arr_compare_helper(effect2, param_child, vshader1, i, FALSE);
6753         test_effect_shared_vs_arr_compare_helper(effect3, param_child, vshader1, i, FALSE);
6754         test_effect_shared_vs_arr_compare_helper(effect4, param_child, vshader1, i, FALSE);
6755         IDirect3DVertexShader9_Release(vshader1);
6756     }
6757 
6758     effect3->lpVtbl->Release(effect3);
6759     effect4->lpVtbl->Release(effect4);
6760 
6761     fval[0] = 1.0f;
6762     hr = effect1->lpVtbl->SetFloatArray(effect1, "arr1", fval, 1);
6763     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6764     fval[0] = 0.0f;
6765     hr = effect2->lpVtbl->GetFloatArray(effect2, "arr1", fval, 1);
6766     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6767     ok(fval[0] == 91.0f, "Unexpected value %g.\n", fval[0]);
6768 
6769     param = effect1->lpVtbl->GetParameterByName(effect1, NULL, "arr2");
6770     ok(!!param, "GetParameterByName failed.\n");
6771     param2 = effect2->lpVtbl->GetParameterByName(effect2, NULL, "arr2");
6772     ok(!!param, "GetParameterByName failed.\n");
6773     ok(param != param2, "Got same parameter handle unexpectedly.\n");
6774     param_child = effect1->lpVtbl->GetParameterElement(effect1, param, 0);
6775     ok(!!param_child, "GetParameterElement failed.\n");
6776     param_child2 = effect1->lpVtbl->GetParameterElement(effect2, param2, 0);
6777     ok(!!param_child2, "GetParameterElement failed.\n");
6778     ok(param_child != param_child2, "Got same parameter handle unexpectedly.\n");
6779 
6780     fval[0] = 33.0f;
6781     hr = effect1->lpVtbl->SetFloatArray(effect1, "arr2", fval, 1);
6782     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6783     fval[0] = 0.0f;
6784     hr = effect1->lpVtbl->GetFloatArray(effect1, "arr2", fval, 2);
6785     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6786     ok(fval[0] == 33.0f && fval[1] == 93.0f, "Unexpected values %g, %g.\n", fval[0], fval[1]);
6787     fval[0] = 0.0f;
6788     hr = effect2->lpVtbl->GetFloatArray(effect2, "arr2", fval, 2);
6789     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6790     ok(fval[0] == 33.0f && fval[1] == 93.0f, "Unexpected values %g, %g.\n", fval[0], fval[1]);
6791 
6792     hr = effect1->lpVtbl->Begin(effect1, &passes_count, 0);
6793     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6794 
6795     hr = effect2->lpVtbl->Begin(effect2, &passes_count, 0);
6796     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6797 
6798     hr = effect1->lpVtbl->BeginPass(effect1, 0);
6799     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6800 
6801     fvect.x = 1.0f;
6802     fvect.y = fvect.z = fvect.w = 0.0f;
6803     test_effect_shared_parameters_compare_vconst(device, 32, &fvect, FALSE);
6804 
6805     hr = effect1->lpVtbl->BeginPass(effect2, 0);
6806     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6807 
6808     fvect.x = 91.0f;
6809     test_effect_shared_parameters_compare_vconst(device, 32, &fvect, FALSE);
6810     fvect.x = 33.0f;
6811     test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE);
6812 
6813     fval[0] = 28.0f;
6814     fval[1] = -1.0f;
6815     hr = effect1->lpVtbl->SetFloatArray(effect1, "arr2", fval, 2);
6816     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6817 
6818     test_effect_clear_vconsts(device);
6819 
6820     hr = effect1->lpVtbl->CommitChanges(effect1);
6821     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6822 
6823     fvect.x = 28.0f;
6824     test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE);
6825     fvect.x = -1.0f;
6826     test_effect_shared_parameters_compare_vconst(device, 30, &fvect, FALSE);
6827 
6828     test_effect_clear_vconsts(device);
6829 
6830     hr = effect1->lpVtbl->CommitChanges(effect1);
6831     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6832 
6833     test_effect_shared_parameters_compare_vconst(device, 29, &fvect_filler, FALSE);
6834     test_effect_shared_parameters_compare_vconst(device, 30, &fvect_filler, FALSE);
6835 
6836     hr = effect2->lpVtbl->CommitChanges(effect2);
6837     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6838 
6839     fvect.x = 28.0f;
6840     test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE);
6841     fvect.x = -1.0f;
6842     test_effect_shared_parameters_compare_vconst(device, 30, &fvect, FALSE);
6843 
6844     fval[0] = -2.0f;
6845     hr = effect2->lpVtbl->SetFloat(effect2, "arr2[0]", fval[0]);
6846     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6847     hr = effect1->lpVtbl->CommitChanges(effect1);
6848     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6849 
6850     fvect.x = -2.0f;
6851     test_effect_shared_parameters_compare_vconst(device, 29, &fvect, FALSE);
6852     fvect.x = -1.0f;
6853     test_effect_shared_parameters_compare_vconst(device, 30, &fvect, FALSE);
6854 
6855     fvect.x = fvect.y = fvect.z = fvect.w = 1111.0f;
6856     hr = effect2->lpVtbl->SetVector(effect2, "g_Pos1", &fvect);
6857     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6858 
6859     hr = effect1->lpVtbl->CommitChanges(effect1);
6860     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6861     test_effect_shared_parameters_compare_vconst(device, 31, &fvect_filler, FALSE);
6862 
6863     hr = effect1->lpVtbl->CommitChanges(effect2);
6864     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6865     test_effect_shared_parameters_compare_vconst(device, 31, &fvect, FALSE);
6866 
6867     hr = effect1->lpVtbl->End(effect1);
6868     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6869 
6870     hr = effect2->lpVtbl->End(effect2);
6871     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6872 
6873     if (0)
6874     {
6875         refcount = pool->lpVtbl->Release(pool);
6876         ok(refcount == 2, "Unexpected refcount %u.\n", refcount);
6877 
6878         refcount = pool->lpVtbl->Release(pool);
6879         ok(refcount == 1, "Unexpected refcount %u.\n", refcount);
6880 
6881         refcount = pool->lpVtbl->Release(pool);
6882         ok(!refcount, "Unexpected refcount %u.\n", refcount);
6883 
6884         /* Native d3dx crashes in GetFloat(). */
6885         effect2->lpVtbl->GetFloat(effect2, "arr2[0]", &fvect.x);
6886     }
6887 
6888     effect1->lpVtbl->Release(effect1);
6889     effect2->lpVtbl->Release(effect2);
6890 
6891     refcount = pool->lpVtbl->Release(pool);
6892     ok(!refcount, "Effect pool was not properly freed, refcount %u.\n", refcount);
6893 }
6894 
6895 static void test_effect_large_address_aware_flag(IDirect3DDevice9 *device)
6896 {
6897     ID3DXEffect *effect;
6898     D3DXHANDLE param;
6899     static int expected_ivect[4] = {28, 29, 30, 31};
6900     int ivect[4];
6901     HRESULT hr;
6902 
6903     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6904             NULL, NULL, D3DXFX_LARGEADDRESSAWARE, NULL, &effect, NULL);
6905     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6906 
6907     param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
6908     ok(!!param, "GetParameterByName failed.\n");
6909 
6910     hr = effect->lpVtbl->SetValue(effect, param, expected_ivect, sizeof(expected_ivect));
6911     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6912 
6913     hr = effect->lpVtbl->GetValue(effect, param, ivect, sizeof(ivect));
6914     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6915 
6916     ok(!memcmp(ivect, expected_ivect, sizeof(expected_ivect)), "Vector value mismatch.\n");
6917 
6918     if (0)
6919     {
6920         /* Native d3dx crashes in GetValue(). */
6921         hr = effect->lpVtbl->GetValue(effect, "g_iVect", ivect, sizeof(ivect));
6922         ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
6923     }
6924 
6925     effect->lpVtbl->Release(effect);
6926 }
6927 
6928 static void test_effect_get_pass_desc(IDirect3DDevice9 *device)
6929 {
6930     unsigned int passes_count;
6931     ID3DXEffect *effect;
6932     D3DXPASS_DESC desc;
6933     D3DXVECTOR4 fvect;
6934     D3DXHANDLE pass;
6935     HRESULT hr;
6936 
6937     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6938             NULL, NULL, 0, NULL, &effect, NULL);
6939     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6940 
6941     pass = effect->lpVtbl->GetPass(effect, "tech0", 1);
6942     ok(!!pass, "GetPass() failed.\n");
6943 
6944     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
6945     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6946     test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 2, FALSE);
6947 
6948     fvect.x = fvect.y = fvect.w = 0.0f;
6949     fvect.z = 0.0f;
6950     hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
6951     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6952 
6953     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
6954     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6955     ok(!desc.pPixelShaderFunction, "Unexpected non null desc.pPixelShaderFunction.\n");
6956 
6957     test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 0, FALSE);
6958 
6959     fvect.z = 3.0f;
6960     hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
6961     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6962 
6963     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
6964     ok(hr == E_FAIL, "Got result %#x.\n", hr);
6965     ok(!desc.pVertexShaderFunction, "Unexpected non null desc.pVertexShaderFunction.\n");
6966 
6967     /* Repeating call to confirm GetPassDesc() returns same error on the second call,
6968      * as it is not the case sometimes for BeginPass() with out of bound access. */
6969     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
6970     ok(hr == E_FAIL, "Got result %#x.\n", hr);
6971     ok(!desc.pVertexShaderFunction, "Unexpected non null desc.pVertexShaderFunction.\n");
6972 
6973     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
6974     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6975 
6976     hr = effect->lpVtbl->BeginPass(effect, 1);
6977     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6978 
6979     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
6980     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6981 
6982     test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 0, FALSE);
6983 
6984     fvect.z = 2.0f;
6985     hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
6986     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
6987     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6988     test_effect_preshader_compare_shader_bytecode(desc.pVertexShaderFunction, 0, 2, FALSE);
6989 
6990     effect->lpVtbl->Release(effect);
6991 
6992     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
6993             NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &effect, NULL);
6994     ok(hr == D3D_OK, "Got result %#x.\n", hr);
6995 
6996     pass = effect->lpVtbl->GetPass(effect, "tech0", 1);
6997     ok(!!pass, "GetPass() failed.\n");
6998 
6999     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
7000     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7001 
7002     ok(!desc.pVertexShaderFunction, "Unexpected non null desc.pVertexShaderFunction.\n");
7003     ok(!desc.pPixelShaderFunction, "Unexpected non null desc.pPixelShaderFunction.\n");
7004 
7005     effect->lpVtbl->Release(effect);
7006 }
7007 
7008 #if 0
7009 float v1 : register(c2);
7010 float v2 : register(c3);
7011 float v3;
7012 float v4 : register(c4);
7013 float v5;
7014 float v6[2] : register(c5) = {11, 22};
7015 
7016 struct VS_OUTPUT
7017 {
7018     float4 Position   : POSITION;
7019 };
7020 
7021 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION)
7022 {
7023     VS_OUTPUT Output;
7024 
7025     Output.Position = v1 * v2 * vPos + v2 + v3 + v4;
7026     Output.Position += v6[0] + v6[1];
7027     return Output;
7028 }
7029 
7030 technique tech0
7031 {
7032     pass p0
7033     {
7034         PointScale_A = v4;
7035         VertexShader = compile vs_3_0 RenderSceneVS();
7036     }
7037 }
7038 #endif
7039 static const DWORD test_effect_skip_constants_blob[] =
7040 {
7041     0xfeff0901, 0x00000144, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
7042     0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00003176, 0x00000003, 0x00000000, 0x0000004c,
7043     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00003276, 0x00000003,
7044     0x00000000, 0x00000074, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000003,
7045     0x00003376, 0x00000003, 0x00000000, 0x0000009c, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
7046     0x00000000, 0x00000003, 0x00003476, 0x00000003, 0x00000000, 0x000000c4, 0x00000000, 0x00000000,
7047     0x00000001, 0x00000001, 0x00000000, 0x00000003, 0x00003576, 0x00000003, 0x00000000, 0x000000f0,
7048     0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41300000, 0x41b00000, 0x00000003, 0x00003676,
7049     0x00000000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
7050     0x00000001, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003070,
7051     0x00000006, 0x68636574, 0x00000030, 0x00000006, 0x00000001, 0x00000002, 0x00000002, 0x00000004,
7052     0x00000020, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054,
7053     0x00000070, 0x00000000, 0x00000000, 0x0000007c, 0x00000098, 0x00000000, 0x00000000, 0x000000a4,
7054     0x000000c0, 0x00000000, 0x00000000, 0x000000cc, 0x000000e8, 0x00000000, 0x00000000, 0x00000138,
7055     0x00000000, 0x00000001, 0x00000130, 0x00000000, 0x00000002, 0x00000041, 0x00000000, 0x000000fc,
7056     0x000000f8, 0x00000092, 0x00000000, 0x0000011c, 0x00000118, 0x00000000, 0x00000002, 0x00000000,
7057     0x00000000, 0xffffffff, 0x00000001, 0x00000000, 0x000001bc, 0xfffe0300, 0x0047fffe, 0x42415443,
7058     0x0000001c, 0x000000e7, 0xfffe0300, 0x00000005, 0x0000001c, 0x20000000, 0x000000e0, 0x00000080,
7059     0x00020002, 0x000a0001, 0x00000084, 0x00000094, 0x000000a4, 0x00030002, 0x000e0001, 0x00000084,
7060     0x00000094, 0x000000a7, 0x00000002, 0x00000001, 0x00000084, 0x00000094, 0x000000aa, 0x00040002,
7061     0x00120001, 0x00000084, 0x00000094, 0x000000ad, 0x00050002, 0x00160002, 0x000000b0, 0x000000c0,
7062     0xab003176, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
7063     0x00000000, 0x76003276, 0x34760033, 0x00367600, 0x00030000, 0x00010001, 0x00000002, 0x00000000,
7064     0x41300000, 0x00000000, 0x00000000, 0x00000000, 0x41b00000, 0x00000000, 0x00000000, 0x00000000,
7065     0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461,
7066     0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f, 0x80000000,
7067     0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0x80010000, 0xa0000003, 0x03000005,
7068     0x80010000, 0x80000000, 0xa0000002, 0x04000004, 0x800f0000, 0x80000000, 0x90e40000, 0xa0000003,
7069     0x03000002, 0x800f0000, 0x80e40000, 0xa0000000, 0x03000002, 0x800f0000, 0x80e40000, 0xa0000004,
7070     0x02000001, 0x80010001, 0xa0000005, 0x03000002, 0x80010001, 0x80000001, 0xa0000006, 0x03000002,
7071     0xe00f0000, 0x80e40000, 0x80000001, 0x0000ffff, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
7072     0x00000000, 0x000000d8, 0x46580200, 0x0023fffe, 0x42415443, 0x0000001c, 0x00000057, 0x46580200,
7073     0x00000001, 0x0000001c, 0x20000100, 0x00000054, 0x00000030, 0x00040002, 0x00120001, 0x00000034,
7074     0x00000044, 0xab003476, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
7075     0x00000000, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
7076     0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
7077     0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000,
7078     0x00000002, 0x00000010, 0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
7079 };
7080 
7081 static void test_effect_skip_constants(IDirect3DDevice9 *device)
7082 {
7083     HRESULT hr;
7084     ID3DXEffect *effect;
7085     unsigned int passes_count;
7086     D3DXVECTOR4 fvect;
7087     unsigned int i;
7088 
7089     hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob),
7090             NULL, NULL, "v3", 0, NULL, &effect, NULL);
7091     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7092     hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob),
7093             NULL, NULL, "v4", 0, NULL, &effect, NULL);
7094     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7095     hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob),
7096             NULL, NULL, "v1;v5;v4", 0, NULL, &effect, NULL);
7097     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7098 
7099     hr = D3DXCreateEffectEx(device, test_effect_skip_constants_blob, sizeof(test_effect_skip_constants_blob),
7100             NULL, NULL, " v1#,.+-= &\t\nv2*/!\"'v5 v6[1]", 0, NULL, &effect, NULL);
7101     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7102 
7103     ok(!effect->lpVtbl->IsParameterUsed(effect, "v1", "tech0"),
7104             "Unexpected IsParameterUsed result.\n");
7105     ok(!effect->lpVtbl->IsParameterUsed(effect, "v2", "tech0"),
7106             "Unexpected IsParameterUsed result.\n");
7107     ok(effect->lpVtbl->IsParameterUsed(effect, "v3", "tech0"),
7108             "Unexpected IsParameterUsed result.\n");
7109     ok(effect->lpVtbl->IsParameterUsed(effect, "v4", "tech0"),
7110             "Unexpected IsParameterUsed result.\n");
7111     ok(!effect->lpVtbl->IsParameterUsed(effect, "v5", "tech0"),
7112             "Unexpected IsParameterUsed result.\n");
7113     ok(!effect->lpVtbl->IsParameterUsed(effect, "v6", "tech0"),
7114             "Unexpected IsParameterUsed result.\n");
7115 
7116     hr = effect->lpVtbl->SetFloat(effect, "v1", 28.0f);
7117     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7118     hr = effect->lpVtbl->SetFloat(effect, "v2", 29.0f);
7119     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7120     hr = effect->lpVtbl->SetFloat(effect, "v3", 30.0f);
7121     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7122     hr = effect->lpVtbl->SetFloat(effect, "v4", 31.0f);
7123     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7124     hr = effect->lpVtbl->SetFloat(effect, "v5", 32.0f);
7125     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7126 
7127     test_effect_clear_vconsts(device);
7128 
7129     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
7130     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7131     hr = effect->lpVtbl->BeginPass(effect, 0);
7132     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7133 
7134     fvect.y = fvect.z = fvect.w = 0.0f;
7135     fvect.x = 30.0f;
7136     test_effect_shared_parameters_compare_vconst(device, 0, &fvect, FALSE);
7137     for (i = 1; i < 4; ++i)
7138         test_effect_shared_parameters_compare_vconst(device, i, &fvect_filler, FALSE);
7139     fvect.x = 31.0f;
7140     test_effect_shared_parameters_compare_vconst(device, 4, &fvect, FALSE);
7141     for (i = 5; i < 256; ++i)
7142         test_effect_shared_parameters_compare_vconst(device, i, &fvect_filler, FALSE);
7143 
7144     hr = effect->lpVtbl->EndPass(effect);
7145     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7146     hr = effect->lpVtbl->End(effect);
7147     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7148 
7149     effect->lpVtbl->Release(effect);
7150 }
7151 
7152 #if 0
7153 vertexshader vs_arr[2] =
7154 {
7155     asm
7156     {
7157         vs_3_0
7158         def c0, 1, 1, 1, 1
7159         dcl_position o0
7160         mov o0, c0
7161     },
7162 
7163     asm
7164     {
7165         vs_3_sw
7166         def c256, 1, 1, 1, 1
7167         dcl_position o0
7168         mov o0, c256
7169     },
7170 };
7171 
7172 int i;
7173 
7174 technique tech0
7175 {
7176     pass p0
7177     {
7178         VertexShader = vs_arr[1];
7179     }
7180 }
7181 technique tech1
7182 {
7183     pass p0
7184     {
7185         VertexShader = vs_arr[i];
7186     }
7187 }
7188 #endif
7189 static const DWORD test_effect_unsupported_shader_blob[] =
7190 {
7191     0xfeff0901, 0x000000ac, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002,
7192     0x00000001, 0x00000002, 0x00000007, 0x615f7376, 0x00007272, 0x00000002, 0x00000000, 0x0000004c,
7193     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000069, 0x00000003,
7194     0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00003070, 0x00000006,
7195     0x68636574, 0x00000030, 0x00000004, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000,
7196     0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000031, 0x00000002, 0x00000002, 0x00000006,
7197     0x00000005, 0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000,
7198     0x00000000, 0x00000074, 0x00000000, 0x00000001, 0x0000006c, 0x00000000, 0x00000001, 0x00000092,
7199     0x00000000, 0x00000058, 0x00000054, 0x000000a0, 0x00000000, 0x00000001, 0x00000098, 0x00000000,
7200     0x00000001, 0x00000092, 0x00000000, 0x00000084, 0x00000080, 0x00000002, 0x00000002, 0x00000001,
7201     0x00000038, 0xfffe0300, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000,
7202     0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0xe00f0000, 0xa0e40000, 0x0000ffff, 0x00000002,
7203     0x00000038, 0xfffe03ff, 0x05000051, 0xa00f0100, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000,
7204     0x0200001f, 0x80000000, 0xe00f0000, 0x02000001, 0xe00f0000, 0xa0e40100, 0x0000ffff, 0x00000001,
7205     0x00000000, 0xffffffff, 0x00000000, 0x00000002, 0x000000e4, 0x00000008, 0x615f7376, 0x00007272,
7206     0x46580200, 0x0023fffe, 0x42415443, 0x0000001c, 0x00000057, 0x46580200, 0x00000001, 0x0000001c,
7207     0x00000100, 0x00000054, 0x00000030, 0x00000002, 0x00000001, 0x00000034, 0x00000044, 0xabab0069,
7208     0x00020000, 0x00010001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
7209     0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
7210     0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000,
7211     0x000cfffe, 0x434c5846, 0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000,
7212     0x00000000, 0x00000004, 0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000000, 0x00000000,
7213     0xffffffff, 0x00000000, 0x00000001, 0x0000000a, 0x615f7376, 0x315b7272, 0x0000005d,
7214 };
7215 
7216 #define TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_POS 81
7217 #define TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_LEN 14
7218 
7219 static void test_effect_unsupported_shader(void)
7220 {
7221     IDirect3DVertexShader9 *vshader;
7222     unsigned int passes_count;
7223     IDirect3DDevice9 *device;
7224     UINT byte_code_size;
7225     ID3DXEffect *effect;
7226     void *byte_code;
7227     ULONG refcount;
7228     HWND window;
7229     HRESULT hr;
7230 
7231     if (!(device = create_device(&window)))
7232         return;
7233 
7234     hr = D3DXCreateEffectEx(device, test_effect_unsupported_shader_blob, sizeof(test_effect_unsupported_shader_blob),
7235             NULL, NULL, NULL, 0, NULL, &effect, NULL);
7236     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7237 
7238     hr = effect->lpVtbl->ValidateTechnique(effect, "missing_technique");
7239     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7240     hr = effect->lpVtbl->ValidateTechnique(effect, "tech0");
7241     ok(hr == E_FAIL, "Got result %#x.\n", hr);
7242 
7243     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
7244     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7245     hr = effect->lpVtbl->SetInt(effect, "i", 1);
7246     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7247     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
7248     ok(hr == E_FAIL, "Got result %#x.\n", hr);
7249     hr = effect->lpVtbl->SetInt(effect, "i", 0);
7250     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7251     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
7252     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7253 
7254     hr = effect->lpVtbl->SetTechnique(effect, "tech0");
7255     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7256     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
7257     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7258     hr = effect->lpVtbl->BeginPass(effect, 0);
7259     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7260 
7261     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
7262     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
7263     ok(!vshader, "Got non NULL vshader.\n");
7264 
7265     hr = effect->lpVtbl->EndPass(effect);
7266     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7267     hr = effect->lpVtbl->End(effect);
7268     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7269 
7270     hr = effect->lpVtbl->SetTechnique(effect, "tech1");
7271     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7272     hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
7273     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7274     hr = effect->lpVtbl->BeginPass(effect, 0);
7275     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7276 
7277     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
7278     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
7279     ok(!!vshader, "Got NULL vshader.\n");
7280     hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
7281     ok(hr == D3D_OK, "Got result %x.\n", hr);
7282     byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
7283     hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
7284     ok(hr == D3D_OK, "Got result %x.\n", hr);
7285     ok(byte_code_size == TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_LEN * sizeof(DWORD),
7286             "Got unexpected byte code size %u.\n", byte_code_size);
7287     ok(!memcmp(byte_code,
7288             &test_effect_unsupported_shader_blob[TEST_EFFECT_UNSUPPORTED_SHADER_BYTECODE_VS_3_0_POS],
7289             byte_code_size), "Incorrect shader selected.\n");
7290     HeapFree(GetProcessHeap(), 0, byte_code);
7291     IDirect3DVertexShader9_Release(vshader);
7292 
7293     hr = effect->lpVtbl->SetInt(effect, "i", 1);
7294     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7295     hr = effect->lpVtbl->CommitChanges(effect);
7296     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7297     hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
7298     ok(hr == D3D_OK, "Got result %x.\n", hr);
7299     ok(!vshader, "Got non NULL vshader.\n");
7300 
7301     effect->lpVtbl->Release(effect);
7302 
7303     refcount = IDirect3DDevice9_Release(device);
7304     ok(!refcount, "Device has %u references left.\n", refcount);
7305     DestroyWindow(window);
7306 }
7307 
7308 #if 0
7309 vertexshader vs_arr[2];
7310 
7311 int i;
7312 
7313 technique tech0
7314 {
7315     pass p0
7316     {
7317         VertexShader = null;
7318     }
7319 }
7320 technique tech1
7321 {
7322     pass p0
7323     {
7324         VertexShader = vs_arr[i];
7325     }
7326 }
7327 #endif
7328 static const DWORD test_effect_null_shader_blob[] =
7329 {
7330     0xfeff0901, 0x000000b4, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002,
7331     0x00000001, 0x00000002, 0x00000007, 0x615f7376, 0x00007272, 0x00000002, 0x00000000, 0x0000004c,
7332     0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000069, 0x00000000,
7333     0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000003,
7334     0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000010, 0x00000004, 0x00000000,
7335     0x00000000, 0x00000000, 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000031, 0x00000002,
7336     0x00000002, 0x00000005, 0x00000004, 0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c,
7337     0x00000048, 0x00000000, 0x00000000, 0x0000007c, 0x00000000, 0x00000001, 0x00000074, 0x00000000,
7338     0x00000001, 0x00000092, 0x00000000, 0x00000058, 0x00000054, 0x000000a8, 0x00000000, 0x00000001,
7339     0x000000a0, 0x00000000, 0x00000001, 0x00000092, 0x00000000, 0x0000008c, 0x00000088, 0x00000002,
7340     0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000001, 0x00000000, 0xffffffff,
7341     0x00000000, 0x00000002, 0x000000e4, 0x00000008, 0x615f7376, 0x00007272, 0x46580200, 0x0023fffe,
7342     0x42415443, 0x0000001c, 0x00000057, 0x46580200, 0x00000001, 0x0000001c, 0x00000100, 0x00000054,
7343     0x00000030, 0x00000002, 0x00000001, 0x00000034, 0x00000044, 0xabab0069, 0x00020000, 0x00010001,
7344     0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4d007874, 0x6f726369,
7345     0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
7346     0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe, 0x54494c43, 0x00000000, 0x000cfffe, 0x434c5846,
7347     0x00000001, 0x10000001, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000004,
7348     0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
7349 };
7350 
7351 static void test_effect_null_shader(void)
7352 {
7353     IDirect3DDevice9 *device;
7354     ID3DXEffect *effect;
7355     D3DXPASS_DESC desc;
7356     D3DXHANDLE pass;
7357     ULONG refcount;
7358     HWND window;
7359     HRESULT hr;
7360 
7361     /* Creating a fresh device because the existing device can have invalid
7362      * render states from previous tests. If IDirect3DDevice9_ValidateDevice()
7363      * returns certain error codes, native ValidateTechnique() fails. */
7364     if (!(device = create_device(&window)))
7365         return;
7366 
7367     hr = D3DXCreateEffectEx(device, test_effect_null_shader_blob,
7368             sizeof(test_effect_null_shader_blob), NULL, NULL, NULL, 0, NULL, &effect, NULL);
7369     ok(hr == D3D_OK, "Failed to create effect, hr %#x.\n", hr);
7370 
7371     pass = effect->lpVtbl->GetPass(effect, "tech0", 0);
7372     ok(!!pass, "GetPass() failed.\n");
7373     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
7374     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7375     ok(!desc.pVertexShaderFunction, "Got non NULL vertex function.\n");
7376 
7377     pass = effect->lpVtbl->GetPass(effect, "tech1", 0);
7378     ok(!!pass, "GetPass() failed.\n");
7379     hr = effect->lpVtbl->GetPassDesc(effect, pass, &desc);
7380     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7381     ok(!desc.pVertexShaderFunction, "Got non NULL vertex function.\n");
7382 
7383     hr = effect->lpVtbl->ValidateTechnique(effect, "tech0");
7384     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7385     hr = effect->lpVtbl->SetInt(effect, "i", 0);
7386     ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr);
7387     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
7388     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7389     hr = effect->lpVtbl->SetInt(effect, "i", 1);
7390     ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr);
7391     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
7392     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7393 
7394     hr = effect->lpVtbl->SetInt(effect, "i", 2);
7395     ok(hr == D3D_OK, "Failed to set parameter, hr %#x.\n", hr);
7396     hr = effect->lpVtbl->ValidateTechnique(effect, "tech1");
7397     ok(hr == E_FAIL, "Got result %#x.\n", hr);
7398 
7399     effect->lpVtbl->Release(effect);
7400 
7401     refcount = IDirect3DDevice9_Release(device);
7402     ok(!refcount, "Device has %u references left.\n", refcount);
7403     DestroyWindow(window);
7404 }
7405 
7406 static void test_effect_clone(void)
7407 {
7408     IDirect3DDevice9 *device, *device2, *device3;
7409     ID3DXEffect *effect, *cloned;
7410     HWND window, window2;
7411     ULONG refcount;
7412     HRESULT hr;
7413 
7414     if (!(device = create_device(&window)))
7415         return;
7416 
7417     /* D3DXFX_NOT_CLONEABLE */
7418     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
7419             NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &effect, NULL);
7420     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7421 
7422     hr = effect->lpVtbl->CloneEffect(effect, NULL, NULL);
7423     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7424 
7425     cloned = (void *)0xdeadbeef;
7426     hr = effect->lpVtbl->CloneEffect(effect, NULL, &cloned);
7427     ok(hr == E_FAIL, "Got result %#x.\n", hr);
7428     ok(cloned == (void *)0xdeadbeef, "Unexpected effect pointer.\n");
7429 
7430     hr = effect->lpVtbl->CloneEffect(effect, device, NULL);
7431     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7432 
7433     cloned = (void *)0xdeadbeef;
7434     hr = effect->lpVtbl->CloneEffect(effect, device, &cloned);
7435     ok(hr == E_FAIL, "Got result %#x.\n", hr);
7436     ok(cloned == (void *)0xdeadbeef, "Unexpected effect pointer.\n");
7437 
7438     effect->lpVtbl->Release(effect);
7439 
7440     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
7441             NULL, NULL, 0, NULL, &effect, NULL);
7442     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7443 
7444     hr = effect->lpVtbl->CloneEffect(effect, NULL, NULL);
7445     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7446 
7447     cloned = (void *)0xdeadbeef;
7448     hr = effect->lpVtbl->CloneEffect(effect, NULL, &cloned);
7449     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7450     ok(cloned == (void *)0xdeadbeef, "Unexpected effect pointer.\n");
7451 
7452     hr = effect->lpVtbl->CloneEffect(effect, device, NULL);
7453     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
7454 
7455     hr = effect->lpVtbl->CloneEffect(effect, device, &cloned);
7456 todo_wine
7457     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7458 if (hr == D3D_OK)
7459 {
7460     ok(cloned != effect, "Expected new effect instance.\n");
7461     cloned->lpVtbl->Release(cloned);
7462 }
7463     /* Try with different device. */
7464     device2 = create_device(&window2);
7465     hr = effect->lpVtbl->CloneEffect(effect, device2, &cloned);
7466 todo_wine
7467     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7468 if (hr == D3D_OK)
7469 {
7470     ok(cloned != effect, "Expected new effect instance.\n");
7471 
7472     hr = cloned->lpVtbl->GetDevice(cloned, &device3);
7473     ok(hr == S_OK, "Failed to get effect device.\n");
7474     ok(device3 == device2, "Unexpected device instance.\n");
7475     IDirect3DDevice9_Release(device3);
7476 
7477     cloned->lpVtbl->Release(cloned);
7478 }
7479     IDirect3DDevice9_Release(device2);
7480     DestroyWindow(window2);
7481     effect->lpVtbl->Release(effect);
7482     refcount = IDirect3DDevice9_Release(device);
7483     ok(!refcount, "Device has %u references left.\n", refcount);
7484     DestroyWindow(window);
7485 }
7486 
7487 static unsigned int get_texture_refcount(IDirect3DTexture9 *iface)
7488 {
7489     IDirect3DTexture9_AddRef(iface);
7490     return IDirect3DTexture9_Release(iface);
7491 }
7492 
7493 static void test_refcount(void)
7494 {
7495     IDirect3DTexture9 *texture, *cur_texture, *managed_texture, *sysmem_texture;
7496     unsigned int passes_count;
7497     IDirect3DDevice9 *device;
7498     ID3DXEffect *effect;
7499     ULONG refcount;
7500     HWND window;
7501     HRESULT hr;
7502 
7503     if (!(device = create_device(&window)))
7504         return;
7505 
7506     hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL);
7507     ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr);
7508 
7509     hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob,
7510             sizeof(test_effect_preshader_effect_blob), NULL, NULL,
7511             D3DXFX_DONOTSAVESTATE, NULL, &effect, NULL);
7512     ok(hr == D3D_OK, "Failed to create effect, hr %#x.\n", hr);
7513 
7514     hr = effect->lpVtbl->SetTexture(effect, "tex1", (IDirect3DBaseTexture9 *)texture);
7515     ok(hr == D3D_OK, "Failed to set texture parameter, hr %#x.\n", hr);
7516 
7517     hr = effect->lpVtbl->Begin(effect, &passes_count, D3DXFX_DONOTSAVESTATE);
7518     ok(hr == D3D_OK, "Begin() failed, hr %#x.\n", hr);
7519 
7520     hr = effect->lpVtbl->BeginPass(effect, 0);
7521     ok(hr == D3D_OK, "BeginPass() failed, hr %#x.\n", hr);
7522 
7523     IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture);
7524     ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture);
7525     IDirect3DTexture9_Release(cur_texture);
7526 
7527     IDirect3DDevice9_SetTexture(device, 0, NULL);
7528     effect->lpVtbl->CommitChanges(effect);
7529 
7530     IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture);
7531     ok(cur_texture == NULL, "Unexpected current texture %p.\n", cur_texture);
7532 
7533     hr = effect->lpVtbl->EndPass(effect);
7534     ok(hr == D3D_OK, "EndPass() failed, hr %#x.\n", hr);
7535 
7536     hr = effect->lpVtbl->BeginPass(effect, 0);
7537     ok(hr == D3D_OK, "BeginPass() failed, hr %#x.\n", hr);
7538 
7539     IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture);
7540     ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture);
7541     IDirect3DTexture9_Release(cur_texture);
7542 
7543     hr = effect->lpVtbl->EndPass(effect);
7544     ok(hr == D3D_OK, "EndPass() failed, hr %#x.\n", hr);
7545     hr = effect->lpVtbl->End(effect);
7546     ok(hr == D3D_OK, "End() failed, hr %#x.\n", hr);
7547 
7548     IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture);
7549     ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture);
7550     IDirect3DTexture9_Release(cur_texture);
7551     refcount = get_texture_refcount(texture);
7552     ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount);
7553 
7554     hr = effect->lpVtbl->OnLostDevice(effect);
7555     ok(hr == D3D_OK, "OnLostDevice() failed, hr %#x.\n", hr);
7556     refcount = get_texture_refcount(texture);
7557     ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount);
7558 
7559     hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED,
7560             &managed_texture, NULL);
7561     ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr);
7562     effect->lpVtbl->SetTexture(effect, "tex1", (IDirect3DBaseTexture9 *)managed_texture);
7563 
7564     refcount = get_texture_refcount(managed_texture);
7565     ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount);
7566     hr = effect->lpVtbl->OnLostDevice(effect);
7567     ok(hr == D3D_OK, "OnLostDevice() failed, hr %#x.\n", hr);
7568     refcount = get_texture_refcount(managed_texture);
7569     ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount);
7570 
7571     hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM,
7572             &sysmem_texture, NULL);
7573     ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr);
7574     effect->lpVtbl->SetTexture(effect, "tex1", (IDirect3DBaseTexture9 *)sysmem_texture);
7575 
7576     refcount = get_texture_refcount(managed_texture);
7577     ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount);
7578     IDirect3DTexture9_Release(managed_texture);
7579     refcount = get_texture_refcount(sysmem_texture);
7580     ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount);
7581     hr = effect->lpVtbl->OnLostDevice(effect);
7582     ok(hr == D3D_OK, "OnLostDevice() failed, hr %#x.\n", hr);
7583     refcount = get_texture_refcount(sysmem_texture);
7584     ok(refcount == 2, "Unexpected texture refcount %u.\n", refcount);
7585 
7586     effect->lpVtbl->Release(effect);
7587 
7588     refcount = get_texture_refcount(sysmem_texture);
7589     ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount);
7590     IDirect3DTexture9_Release(sysmem_texture);
7591 
7592     IDirect3DDevice9_GetTexture(device, 0, (IDirect3DBaseTexture9 **)&cur_texture);
7593     ok(cur_texture == texture, "Unexpected current texture %p.\n", cur_texture);
7594     IDirect3DTexture9_Release(cur_texture);
7595     refcount = get_texture_refcount(texture);
7596     ok(refcount == 1, "Unexpected texture refcount %u.\n", refcount);
7597     IDirect3DTexture9_Release(texture);
7598 
7599     refcount = IDirect3DDevice9_Release(device);
7600     ok(!refcount, "Device has %u references left.\n", refcount);
7601     DestroyWindow(window);
7602 }
7603 
7604 static HRESULT WINAPI d3dxinclude_open(ID3DXInclude *iface, D3DXINCLUDE_TYPE include_type,
7605         const char *filename, const void *parent_data, const void **data, UINT *bytes)
7606 {
7607     static const char include1[] =
7608         "float4 light;\n"
7609         "float4x4 mat;\n"
7610         "float4 color;\n"
7611         "\n"
7612         "struct vs_input\n"
7613         "{\n"
7614         "    float4 position : POSITION;\n"
7615         "    float3 normal : NORMAL;\n"
7616         "};\n"
7617         "\n"
7618         "struct vs_output\n"
7619         "{\n"
7620         "    float4 position : POSITION;\n"
7621         "    float4 diffuse : COLOR;\n"
7622         "};\n";
7623     static const char include2[] =
7624         "#include \"include1.h\"\n"
7625         "\n"
7626         "vs_output vs_main(const vs_input v)\n"
7627         "{\n"
7628         "    vs_output o;\n"
7629         "    const float4 scaled_color = 0.5 * color;\n"
7630         "\n"
7631         "    o.position = mul(v.position, mat);\n"
7632         "    o.diffuse = dot((float3)light, v.normal) * scaled_color;\n"
7633         "\n"
7634         "    return o;\n"
7635         "}\n";
7636     static const char effect2[] =
7637         "#include \"include\\include2.h\"\n"
7638         "\n"
7639         "technique t\n"
7640         "{\n"
7641         "    pass p\n"
7642         "    {\n"
7643         "        VertexShader = compile vs_2_0 vs_main();\n"
7644         "    }\n"
7645         "}\n";
7646     char *buffer;
7647 
7648     trace("filename %s.\n", filename);
7649     trace("parent_data %p: %s.\n", parent_data, parent_data ? (char *)parent_data : "(null)");
7650 
7651     if (!strcmp(filename, "effect2.fx"))
7652     {
7653         buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(effect2));
7654         memcpy(buffer, effect2, sizeof(effect2));
7655         *bytes = sizeof(effect2);
7656         ok(!parent_data, "Unexpected parent_data value.\n");
7657     }
7658     else if (!strcmp(filename, "include1.h"))
7659     {
7660         buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(include1));
7661         memcpy(buffer, include1, sizeof(include1));
7662         *bytes = sizeof(include1);
7663         ok(!strncmp(parent_data, include2, strlen(include2)), "Unexpected parent_data value.\n");
7664     }
7665     else if (!strcmp(filename, "include\\include2.h"))
7666     {
7667         buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(include2));
7668         memcpy(buffer, include2, sizeof(include2));
7669         *bytes = sizeof(include2);
7670         todo_wine ok(parent_data && !strncmp(parent_data, effect2, strlen(effect2)),
7671                 "unexpected parent_data value.\n");
7672     }
7673     else
7674     {
7675         ok(0, "Unexpected #include for file %s.\n", filename);
7676         return D3DERR_INVALIDCALL;
7677     }
7678     *data = buffer;
7679     return S_OK;
7680 }
7681 
7682 static HRESULT WINAPI d3dxinclude_close(ID3DXInclude *iface, const void *data)
7683 {
7684     HeapFree(GetProcessHeap(), 0, (void *)data);
7685     return S_OK;
7686 }
7687 
7688 static const struct ID3DXIncludeVtbl d3dxinclude_vtbl =
7689 {
7690     d3dxinclude_open,
7691     d3dxinclude_close
7692 };
7693 
7694 struct d3dxinclude
7695 {
7696     ID3DXInclude ID3DXInclude_iface;
7697 };
7698 
7699 static void test_create_effect_from_file(void)
7700 {
7701     static const char effect1[] =
7702         "float4 light;\n"
7703         "float4x4 mat;\n"
7704         "float4 color;\n"
7705         "\n"
7706         "struct vs_input\n"
7707         "{\n"
7708         "    float4 position : POSITION;\n"
7709         "    float3 normal : NORMAL;\n"
7710         "};\n"
7711         "\n"
7712         "struct vs_output\n"
7713         "{\n"
7714         "    float4 position : POSITION;\n"
7715         "    float4 diffuse : COLOR;\n"
7716         "};\n"
7717         "\n"
7718         "vs_output vs_main(const vs_input v)\n"
7719         "{\n"
7720         "    vs_output o;\n"
7721         "    const float4 scaled_color = 0.5 * color;\n"
7722         "\n"
7723         "    o.position = mul(v.position, mat);\n"
7724         "    o.diffuse = dot((float3)light, v.normal) * scaled_color;\n"
7725         "\n"
7726         "    return o;\n"
7727         "}\n"
7728         "\n"
7729         "technique t\n"
7730         "{\n"
7731         "    pass p\n"
7732         "    {\n"
7733         "        VertexShader = compile vs_2_0 vs_main();\n"
7734         "    }\n"
7735         "}\n";
7736     static const char include1[] =
7737         "float4 light;\n"
7738         "float4x4 mat;\n"
7739         "float4 color;\n"
7740         "\n"
7741         "struct vs_input\n"
7742         "{\n"
7743         "    float4 position : POSITION;\n"
7744         "    float3 normal : NORMAL;\n"
7745         "};\n"
7746         "\n"
7747         "struct vs_output\n"
7748         "{\n"
7749         "    float4 position : POSITION;\n"
7750         "    float4 diffuse : COLOR;\n"
7751         "};\n";
7752     static const char include1_wrong[] =
7753         "#error \"wrong include\"\n";
7754     static const char include2[] =
7755         "#include \"include1.h\"\n"
7756         "\n"
7757         "vs_output vs_main(const vs_input v)\n"
7758         "{\n"
7759         "    vs_output o;\n"
7760         "    const float4 scaled_color = 0.5 * color;\n"
7761         "\n"
7762         "    o.position = mul(v.position, mat);\n"
7763         "    o.diffuse = dot((float3)light, v.normal) * scaled_color;\n"
7764         "\n"
7765         "    return o;\n"
7766         "}\n";
7767     static const char effect2[] =
7768         "#include \"include\\include2.h\"\n"
7769         "\n"
7770         "technique t\n"
7771         "{\n"
7772         "    pass p\n"
7773         "    {\n"
7774         "        VertexShader = compile vs_2_0 vs_main();\n"
7775         "    }\n"
7776         "}\n";
7777     static const WCHAR effect1_filename_w[] = {'e','f','f','e','c','t','1','.','f','x',0};
7778     static const WCHAR effect2_filename_w[] = {'e','f','f','e','c','t','2','.','f','x',0};
7779     WCHAR effect_path_w[MAX_PATH], filename_w[MAX_PATH];
7780     char effect_path[MAX_PATH], filename[MAX_PATH];
7781     D3DPRESENT_PARAMETERS present_parameters = {0};
7782     unsigned int filename_size;
7783     struct d3dxinclude include;
7784     IDirect3DDevice9 *device;
7785     ID3DXBuffer *messages;
7786     ID3DXEffect *effect;
7787     IDirect3D9 *d3d;
7788     ULONG refcount;
7789     HWND window;
7790     HRESULT hr;
7791 
7792     if (!(window = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0,
7793             640, 480, NULL, NULL, NULL, NULL)))
7794     {
7795         skip("Failed to create window.\n");
7796         return;
7797     }
7798     if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION)))
7799     {
7800         skip("Failed to create IDirect3D9 object.\n");
7801         DestroyWindow(window);
7802         return;
7803     }
7804     present_parameters.Windowed = TRUE;
7805     present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
7806     hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window,
7807             D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device);
7808     if (FAILED(hr))
7809     {
7810         skip("Failed to create IDirect3DDevice9 object, hr %#x.\n", hr);
7811         IDirect3D9_Release(d3d);
7812         DestroyWindow(window);
7813         return;
7814     }
7815 
7816     if (!create_file("effect1.fx", effect1, sizeof(effect1) - 1, filename))
7817     {
7818         skip("Couldn't create temporary file, skipping test.\n");
7819         return;
7820     }
7821 
7822     filename_size = strlen(filename);
7823     filename_size -= sizeof("effect1.fx") - 1;
7824     memcpy(effect_path, filename, filename_size);
7825     effect_path[filename_size] = 0;
7826     MultiByteToWideChar(CP_ACP, 0, effect_path, -1, effect_path_w, ARRAY_SIZE(effect_path_w));
7827 
7828     create_directory("include");
7829     create_file("effect2.fx", effect2, sizeof(effect2) - 1, NULL);
7830     create_file("include\\include1.h", include1, sizeof(include1) - 1, NULL);
7831     create_file("include\\include2.h", include2, sizeof(include2) - 1, NULL);
7832     create_file("include1.h", include1_wrong, sizeof(include1_wrong) - 1, NULL);
7833 
7834     lstrcpyW(filename_w, effect_path_w);
7835     lstrcatW(filename_w, effect1_filename_w);
7836     effect = NULL;
7837     messages = NULL;
7838     hr = D3DXCreateEffectFromFileExW(device, filename_w, NULL, NULL, NULL,
7839             0, NULL, &effect, &messages);
7840     todo_wine ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr);
7841     if (messages)
7842     {
7843         trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages));
7844         ID3DXBuffer_Release(messages);
7845     }
7846     if (effect)
7847         effect->lpVtbl->Release(effect);
7848 
7849     lstrcpyW(filename_w, effect_path_w);
7850     lstrcatW(filename_w, effect2_filename_w);
7851     effect = NULL;
7852     messages = NULL;
7853     /* This is apparently broken on native, it ends up using the wrong include. */
7854     hr = D3DXCreateEffectFromFileExW(device, filename_w, NULL, NULL, NULL,
7855             0, NULL, &effect, &messages);
7856     todo_wine ok(hr == E_FAIL, "Unexpected error, hr %#x.\n", hr);
7857     if (messages)
7858     {
7859         trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages));
7860         ID3DXBuffer_Release(messages);
7861     }
7862     if (effect)
7863         effect->lpVtbl->Release(effect);
7864 
7865     delete_file("effect1.fx");
7866     delete_file("effect2.fx");
7867     delete_file("include\\include1.h");
7868     delete_file("include\\include2.h");
7869     delete_file("include2.h");
7870     delete_directory("include");
7871 
7872     lstrcpyW(filename_w, effect2_filename_w);
7873     effect = NULL;
7874     messages = NULL;
7875     include.ID3DXInclude_iface.lpVtbl = &d3dxinclude_vtbl;
7876     /* This is actually broken in native d3dx9 (manually tried multiple
7877      * versions, all are affected). For reference, the message printed below
7878      * is "ID3DXEffectCompiler: There were no techniques" */
7879     hr = D3DXCreateEffectFromFileExW(device, filename_w, NULL, &include.ID3DXInclude_iface, NULL,
7880             0, NULL, &effect, &messages);
7881     todo_wine ok(hr == E_FAIL, "D3DXInclude test failed with error %#x.\n", hr);
7882     if (messages)
7883     {
7884         trace("D3DXCreateEffectFromFileExW messages:\n%s", (char *)ID3DXBuffer_GetBufferPointer(messages));
7885         ID3DXBuffer_Release(messages);
7886     }
7887 
7888     refcount = IDirect3DDevice9_Release(device);
7889     ok(!refcount, "Device has %u references left.\n", refcount);
7890     IDirect3D9_Release(d3d);
7891     DestroyWindow(window);
7892 }
7893 
7894 #if 0
7895 technique tech0
7896 {
7897     pass p0
7898     {
7899         LightEnable[0] = FALSE;
7900         FogEnable = FALSE;
7901     }
7902 }
7903 technique tech1
7904 {
7905     pass p0
7906     {
7907         LightEnable[0] = TRUE;
7908         FogEnable = TRUE;
7909     }
7910 }
7911 #endif
7912 static const DWORD test_two_techniques_blob[] =
7913 {
7914     0xfeff0901, 0x000000ac, 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000,
7915     0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000000,
7916     0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000030,
7917     0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
7918     0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
7919     0x00000003, 0x00003070, 0x00000006, 0x68636574, 0x00000031, 0x00000000, 0x00000002, 0x00000002,
7920     0x00000001, 0x0000004c, 0x00000000, 0x00000001, 0x00000044, 0x00000000, 0x00000002, 0x00000091,
7921     0x00000000, 0x00000008, 0x00000004, 0x0000000e, 0x00000000, 0x00000028, 0x00000024, 0x000000a0,
7922     0x00000000, 0x00000001, 0x00000098, 0x00000000, 0x00000002, 0x00000091, 0x00000000, 0x0000005c,
7923     0x00000058, 0x0000000e, 0x00000000, 0x0000007c, 0x00000078, 0x00000000, 0x00000000,
7924 };
7925 
7926 static void test_effect_find_next_valid_technique(void)
7927 {
7928     D3DPRESENT_PARAMETERS present_parameters = {0};
7929     IDirect3DDevice9 *device;
7930     D3DXTECHNIQUE_DESC desc;
7931     ID3DXEffect *effect;
7932     IDirect3D9 *d3d;
7933     D3DXHANDLE tech;
7934     ULONG refcount;
7935     HWND window;
7936     HRESULT hr;
7937 
7938     if (!(window = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0,
7939             640, 480, NULL, NULL, NULL, NULL)))
7940     {
7941         skip("Failed to create window.\n");
7942         return;
7943     }
7944     if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION)))
7945     {
7946         skip("Failed to create IDirect3D9 object.\n");
7947         DestroyWindow(window);
7948         return;
7949     }
7950     present_parameters.Windowed = TRUE;
7951     present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
7952     hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window,
7953             D3DCREATE_HARDWARE_VERTEXPROCESSING, &present_parameters, &device);
7954     if (FAILED(hr))
7955     {
7956         skip("Failed to create IDirect3DDevice9 object, hr %#x.\n", hr);
7957         IDirect3D9_Release(d3d);
7958         DestroyWindow(window);
7959         return;
7960     }
7961 
7962     hr = D3DXCreateEffectEx(device, test_two_techniques_blob, sizeof(test_two_techniques_blob),
7963             NULL, NULL, NULL, 0, NULL, &effect, NULL);
7964     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7965 
7966     hr = effect->lpVtbl->FindNextValidTechnique(effect, NULL, &tech);
7967     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7968     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
7969     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7970     ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name);
7971 
7972     hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech);
7973     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7974     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
7975     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7976     ok(!strcmp(desc.Name, "tech1"), "Got unexpected technique %s.\n", desc.Name);
7977 
7978     hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech);
7979     ok(hr == S_FALSE, "Got result %#x.\n", hr);
7980     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
7981     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7982     ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name);
7983 
7984     effect->lpVtbl->Release(effect);
7985 
7986     hr = D3DXCreateEffectEx(device, test_effect_unsupported_shader_blob, sizeof(test_effect_unsupported_shader_blob),
7987             NULL, NULL, NULL, 0, NULL, &effect, NULL);
7988     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7989 
7990     hr = effect->lpVtbl->FindNextValidTechnique(effect, NULL, &tech);
7991     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7992     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
7993     ok(hr == D3D_OK, "Got result %#x.\n", hr);
7994     ok(!strcmp(desc.Name, "tech1"), "Got unexpected technique %s.\n", desc.Name);
7995 
7996     hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech);
7997     ok(hr == S_FALSE, "Got result %#x.\n", hr);
7998     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
7999     ok(hr == D3D_OK, "Got result %#x.\n", hr);
8000     ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name);
8001 
8002     hr = effect->lpVtbl->SetInt(effect, "i", 1);
8003     ok(hr == D3D_OK, "Got result %#x.\n", hr);
8004 
8005     tech = (D3DXHANDLE)0xdeadbeef;
8006     hr = effect->lpVtbl->FindNextValidTechnique(effect, NULL, &tech);
8007     ok(hr == S_FALSE, "Got result %#x.\n", hr);
8008     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
8009     ok(hr == D3D_OK, "Got result %#x.\n", hr);
8010     ok(!strcmp(desc.Name, "tech0"), "Got unexpected technique %s.\n", desc.Name);
8011 
8012     hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech);
8013     ok(hr == S_FALSE, "Got result %#x.\n", hr);
8014 
8015     hr = effect->lpVtbl->SetInt(effect, "i", 0);
8016     ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
8017 
8018     hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech);
8019     ok(hr == D3D_OK, "Got result %#x.\n", hr);
8020     hr = effect->lpVtbl->GetTechniqueDesc(effect, tech, &desc);
8021     ok(hr == D3D_OK, "Got result %#x.\n", hr);
8022     ok(!strcmp(desc.Name, "tech1"), "Got unexpected technique %s.\n", desc.Name);
8023 
8024     hr = effect->lpVtbl->FindNextValidTechnique(effect, tech, &tech);
8025     ok(hr == S_FALSE, "Got result %#x.\n", hr);
8026 
8027     hr = effect->lpVtbl->FindNextValidTechnique(effect, "nope", &tech);
8028     ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
8029 
8030     effect->lpVtbl->Release(effect);
8031 
8032     refcount = IDirect3DDevice9_Release(device);
8033     ok(!refcount, "Device has %u references left.\n", refcount);
8034     IDirect3D9_Release(d3d);
8035     DestroyWindow(window);
8036 }
8037 
8038 START_TEST(effect)
8039 {
8040     IDirect3DDevice9 *device;
8041     ULONG refcount;
8042     HWND wnd;
8043 
8044     if (!(device = create_device(&wnd)))
8045         return;
8046 
8047     test_create_effect_and_pool(device);
8048     test_create_effect_compiler();
8049     test_effect_parameter_value(device);
8050     test_effect_setvalue_object(device);
8051     test_effect_variable_names(device);
8052     test_effect_compilation_errors(device);
8053     test_effect_states(device);
8054     test_effect_preshader(device);
8055     test_effect_preshader_ops(device);
8056     test_effect_isparameterused(device);
8057     test_effect_out_of_bounds_selector(device);
8058     test_effect_commitchanges(device);
8059     test_effect_preshader_relative_addressing(device);
8060     test_effect_state_manager(device);
8061     test_cross_effect_handle(device);
8062     test_effect_shared_parameters(device);
8063     test_effect_large_address_aware_flag(device);
8064     test_effect_get_pass_desc(device);
8065     test_effect_skip_constants(device);
8066 
8067     refcount = IDirect3DDevice9_Release(device);
8068     ok(!refcount, "Device has %u references left.\n", refcount);
8069     DestroyWindow(wnd);
8070 
8071     test_effect_unsupported_shader();
8072     test_effect_null_shader();
8073     test_effect_clone();
8074     test_refcount();
8075     test_create_effect_from_file();
8076     test_effect_find_next_valid_technique();
8077 }
8078