ReactOS  0.4.15-dev-2991-g632fa1c
effect.c
Go to the documentation of this file.
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 /* helper functions */
27 {
28  INT x = *(INT *)&f;
29  INT y = *(INT *)&g;
30 
31  if (x < 0)
32  x = INT_MIN - x;
33  if (y < 0)
34  y = INT_MIN - y;
35 
36  if (abs(x - y) > ulps)
37  return FALSE;
38 
39  return TRUE;
40 }
41 
42 static inline INT get_int(D3DXPARAMETER_TYPE type, const void *data)
43 {
44  INT i;
45 
46  switch (type)
47  {
48  case D3DXPT_FLOAT:
49  i = *(FLOAT *)data;
50  break;
51 
52  case D3DXPT_INT:
53  i = *(INT *)data;
54  break;
55 
56  case D3DXPT_BOOL:
57  i = *(BOOL *)data;
58  break;
59 
60  default:
61  i = 0;
62  ok(0, "Unhandled type %x.\n", type);
63  break;
64  }
65 
66  return i;
67 }
68 
69 static inline float get_float(D3DXPARAMETER_TYPE type, const void *data)
70 {
71  float f;
72 
73  switch (type)
74  {
75  case D3DXPT_FLOAT:
76  f = *(FLOAT *)data;
77  break;
78 
79  case D3DXPT_INT:
80  f = *(INT *)data;
81  break;
82 
83  case D3DXPT_BOOL:
84  f = *(BOOL *)data;
85  break;
86 
87  default:
88  f = 0.0f;
89  ok(0, "Unhandled type %x.\n", type);
90  break;
91  }
92 
93  return f;
94 }
95 
96 static inline BOOL get_bool(const void *data)
97 {
98  return !!*(BOOL *)data;
99 }
100 
101 static void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype)
102 {
103  switch (outtype)
104  {
105  case D3DXPT_FLOAT:
106  *(FLOAT *)outdata = get_float(intype, indata);
107  break;
108 
109  case D3DXPT_BOOL:
110  *(BOOL *)outdata = get_bool(indata);
111  break;
112 
113  case D3DXPT_INT:
114  *(INT *)outdata = get_int(intype, indata);
115  break;
116 
117  case D3DXPT_PIXELSHADER:
118  case D3DXPT_VERTEXSHADER:
119  case D3DXPT_TEXTURE2D:
120  case D3DXPT_STRING:
121  *(INT *)outdata = 0x12345678;
122  break;
123 
124  default:
125  ok(0, "Unhandled type %x.\n", outtype);
126  *(INT *)outdata = 0;
127  break;
128  }
129 }
130 
131 static IDirect3DDevice9 *create_device(HWND *window)
132 {
133  D3DPRESENT_PARAMETERS present_parameters = { 0 };
134  IDirect3DDevice9 *device;
135  IDirect3D9 *d3d;
136  HRESULT hr;
137  HWND wnd;
138 
139  *window = NULL;
140 
141  if (!(wnd = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0,
142  640, 480, NULL, NULL, NULL, NULL)))
143  {
144  skip("Couldn't create application window.\n");
145  return NULL;
146  }
147 
148  if (!(d3d = Direct3DCreate9(D3D_SDK_VERSION)))
149  {
150  skip("Couldn't create IDirect3D9 object.\n");
151  DestroyWindow(wnd);
152  return NULL;
153  }
154 
155  present_parameters.Windowed = TRUE;
156  present_parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
158  &present_parameters, &device);
159  IDirect3D9_Release(d3d);
160  if (FAILED(hr))
161  {
162  skip("Failed to create IDirect3DDevice9 object %#x.\n", hr);
163  DestroyWindow(wnd);
164  return NULL;
165  }
166 
167  *window = wnd;
168  return device;
169 }
170 
171 static char temp_path[MAX_PATH];
172 
173 static BOOL create_file(const char *filename, const char *data, const unsigned int size, char *out_path)
174 {
175  DWORD written;
176  HANDLE hfile;
177  char path[MAX_PATH];
178 
179  if (!*temp_path)
180  GetTempPathA(sizeof(temp_path), temp_path);
181 
183  strcat(path, filename);
185  if (hfile == INVALID_HANDLE_VALUE)
186  return FALSE;
187 
188  if (WriteFile(hfile, data, size, &written, NULL))
189  {
190  CloseHandle(hfile);
191 
192  if (out_path)
193  strcpy(out_path, path);
194  return TRUE;
195  }
196 
197  CloseHandle(hfile);
198  return FALSE;
199 }
200 
201 static void delete_file(const char *filename)
202 {
203  char path[MAX_PATH];
204 
206  strcat(path, filename);
207  DeleteFileA(path);
208 }
209 
210 static BOOL create_directory(const char *name)
211 {
212  char path[MAX_PATH];
213 
215  strcat(path, name);
216  return CreateDirectoryA(path, NULL);
217 }
218 
219 static void delete_directory(const char *name)
220 {
221  char path[MAX_PATH];
222 
224  strcat(path, name);
226 }
227 
228 static const char effect_desc[] =
229 "Technique\n"
230 "{\n"
231 "}\n";
232 
233 static void test_create_effect_and_pool(IDirect3DDevice9 *device)
234 {
235  HRESULT hr;
236  ID3DXEffect *effect;
237  ID3DXBaseEffect *base;
238  ULONG count;
239  IDirect3DDevice9 *device2;
240  ID3DXEffectStateManager *manager = (ID3DXEffectStateManager *)0xdeadbeef;
241  ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2;
242 
244  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
245 
247  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
248 
250  ok(hr == E_FAIL, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, E_FAIL);
251 
253  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
254 
255  hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
256  todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
257  if (FAILED(hr))
258  {
259  skip("Failed to compile effect, skipping test.\n");
260  return;
261  }
262 
263  hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
264  ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
265 
266  hr = effect->lpVtbl->GetStateManager(effect, NULL);
267  ok(hr == D3DERR_INVALIDCALL, "GetStateManager failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
268 
269  hr = effect->lpVtbl->GetStateManager(effect, &manager);
270  ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
271  ok(!manager, "GetStateManager failed, got %p\n", manager);
272 
273  /* this works, but it is not recommended! */
274  hr = effect->lpVtbl->SetStateManager(effect, (ID3DXEffectStateManager *)device);
275  ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
276 
277  hr = effect->lpVtbl->GetStateManager(effect, &manager);
278  ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
279  ok(manager != NULL, "GetStateManager failed\n");
280 
283  ok(count == 4, "Release failed, got %u, expected 4\n", count);
284 
285  count = IUnknown_Release(manager);
286  ok(count == 3, "Release failed, got %u, expected 3\n", count);
287 
288  hr = effect->lpVtbl->SetStateManager(effect, NULL);
289  ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
290 
291  hr = effect->lpVtbl->GetPool(effect, &pool);
292  ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
293  ok(!pool, "GetPool failed, got %p\n", pool);
294 
295  hr = effect->lpVtbl->GetPool(effect, NULL);
296  ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
297 
298  hr = effect->lpVtbl->GetDevice(effect, &device2);
299  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
300 
301  hr = effect->lpVtbl->GetDevice(effect, NULL);
302  ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
303 
304  count = IDirect3DDevice9_Release(device2);
305  ok(count == 2, "Release failed, got %u, expected 2\n", count);
306 
307  count = effect->lpVtbl->Release(effect);
308  ok(count == 0, "Release failed %u\n", count);
309 
311  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
312 
314  ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
315 
316  count = pool->lpVtbl->Release(pool);
317  ok(count == 0, "Release failed %u\n", count);
318 
320  ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
321 
323  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
324 
325  hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3DXEffectPool, (void **)&pool2);
326  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
327  ok(pool == pool2, "Got effect pool %p, expected %p.\n", pool2, pool);
328 
329  count = pool2->lpVtbl->Release(pool2);
330  ok(count == 1, "Release failed, got %u, expected 1\n", count);
331 
332  hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2);
333  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
334 
335  count = IDirect3DDevice9_Release(device2);
336  ok(count == 1, "Release failed, got %u, expected 1\n", count);
337 
338  hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, &effect, NULL);
339  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
340 
341  hr = effect->lpVtbl->GetPool(effect, &pool);
342  ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
343  ok(pool == pool2, "Got effect pool %p, expected %p.\n", pool2, pool);
344 
345  count = pool2->lpVtbl->Release(pool2);
346  ok(count == 2, "Release failed, got %u, expected 2\n", count);
347 
348  count = effect->lpVtbl->Release(effect);
349  ok(count == 0, "Release failed %u\n", count);
350 
351  count = pool->lpVtbl->Release(pool);
352  ok(count == 0, "Release failed %u\n", count);
353 }
354 
356 {
357  HRESULT hr;
358  ID3DXEffectCompiler *compiler, *compiler2;
359  ID3DXBaseEffect *base;
360  IUnknown *unknown;
361  ULONG count;
362 
363  hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, &compiler, NULL);
364  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
365 
367  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
368 
369  hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL);
370  ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
371  if (FAILED(hr))
372  {
373  skip("D3DXCreateEffectCompiler failed, skipping test.\n");
374  return;
375  }
376 
377  count = compiler->lpVtbl->Release(compiler);
378  ok(count == 0, "Release failed %u\n", count);
379 
381  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
382 
383  hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
384  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
385 
387  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
388 
390  ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
391 
392  hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
393  ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
394 
395  hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXBaseEffect, (void **)&base);
396  ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
397 
398  hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXEffectCompiler, (void **)&compiler2);
399  ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
400 
401  hr = compiler->lpVtbl->QueryInterface(compiler, &IID_IUnknown, (void **)&unknown);
402  ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
403 
404  count = unknown->lpVtbl->Release(unknown);
405  ok(count == 2, "Release failed, got %u, expected %u\n", count, 2);
406 
407  count = compiler2->lpVtbl->Release(compiler2);
408  ok(count == 1, "Release failed, got %u, expected %u\n", count, 1);
409 
410  count = compiler->lpVtbl->Release(compiler);
411  ok(count == 0, "Release failed %u\n", count);
412 }
413 
414 /*
415  * Parameter value test
416  */
418 {
419  const char *full_name;
421  UINT value_offset; /* start position for the value in the blob */
422 };
423 
424 /*
425  * fxc.exe /Tfx_2_0
426  */
427 #if 0
428 float f = 0.1;
429 float1 f1 = {1.1};
430 float2 f2 = {2.1, 2.2};
431 float3 f3 = {3.1, 3.2, 3.3};
432 float4 f4 = {4.1, 4.2, 4.3, 4.4};
433 float1x1 f11 = {11.1};
434 float1x2 f12 = {12.1, 12.2};
435 float1x3 f13 = {13.1, 13.2, 13.3};
436 float1x4 f14 = {14.1, 14.2, 14.3, 14.4};
437 float2x1 f21 = {{21.11, 21.21}};
438 float2x2 f22 = {{22.11, 22.21}, {22.12, 22.22}};
439 float2x3 f23 = {{23.11, 23.21}, {23.12, 23.22}, {23.13, 23.23}};
440 float2x4 f24 = {{24.11, 24.21}, {24.12, 24.22}, {24.13, 24.23}, {24.14, 24.24}};
441 float3x1 f31 = {{31.11, 31.21, 31.31}};
442 float3x2 f32 = {{32.11, 32.21, 32.31}, {32.12, 32.22, 32.32}};
443 float3x3 f33 = {{33.11, 33.21, 33.31}, {33.12, 33.22, 33.32},
444  {33.13, 33.23, 33.33}};
445 float3x4 f34 = {{34.11, 34.21, 34.31}, {34.12, 34.22, 34.32},
446  {34.13, 34.23, 34.33}, {34.14, 34.24, 34.34}};
447 float4x1 f41 = {{41.11, 41.21, 41.31, 41.41}};
448 float4x2 f42 = {{42.11, 42.21, 42.31, 42.41}, {42.12, 42.22, 42.32, 42.42}};
449 float4x3 f43 = {{43.11, 43.21, 43.31, 43.41}, {43.12, 43.22, 43.32, 43.42},
450  {43.13, 43.23, 43.33, 43.43}};
451 float4x4 f44 = {{44.11, 44.21, 44.31, 44.41}, {44.12, 44.22, 44.32, 44.42},
452  {44.13, 44.23, 44.33, 44.43}, {44.14, 44.24, 44.34, 44.44}};
453 float f_2[2] = {0.101, 0.102};
454 float1 f1_2[2] = {{1.101}, {1.102}};
455 float2 f2_2[2] = {{2.101, 2.201}, {2.102, 2.202}};
456 float3 f3_2[2] = {{3.101, 3.201, 3.301}, {3.102, 3.202, 3.302}};
457 float4 f4_2[2] = {{4.101, 4.201, 4.301, 4.401}, {4.102, 4.202, 4.302, 4.402}};
458 float1x1 f11_2[2] = {{11.101}, {11.102}};
459 float1x2 f12_2[2] = {{12.101, 12.201}, {12.102, 12.202}};
460 float1x3 f13_2[2] = {{13.101, 13.201, 13.301}, {13.102, 13.202, 13.302}};
461 float1x4 f14_2[2] = {{14.101, 14.201, 14.301, 14.401}, {14.102, 14.202, 14.302, 14.402}};
462 float2x1 f21_2[2] = {{{21.1101, 21.2101}}, {{21.1102, 21.2102}}};
463 float2x2 f22_2[2] = {{{22.1101, 22.2101}, {22.1201, 22.2201}}, {{22.1102, 22.2102}, {22.1202, 22.2202}}};
464 float2x3 f23_2[2] = {{{23.1101, 23.2101}, {23.1201, 23.2201}, {23.1301, 23.2301}}, {{23.1102, 23.2102},
465  {23.1202, 23.2202}, {23.1302, 23.2302}}};
466 float2x4 f24_2[2] = {{{24.1101, 24.2101}, {24.1201, 24.2201}, {24.1301, 24.2301}, {24.1401, 24.2401}},
467  {{24.1102, 24.2102}, {24.1202, 24.2202}, {24.1302, 24.2302}, {24.1402, 24.2402}}};
468 float3x1 f31_2[2] = {{{31.1101, 31.2101, 31.3101}}, {{31.1102, 31.2102, 31.3102}}};
469 float3x2 f32_2[2] = {{{32.1101, 32.2101, 32.3101}, {32.1201, 32.2201, 32.3201}},
470  {{32.1102, 32.2102, 32.3102}, {32.1202, 32.2202, 32.3202}}};
471 float3x3 f33_2[2] = {{{33.1101, 33.2101, 33.3101}, {33.1201, 33.2201, 33.3201},
472  {33.1301, 33.2301, 33.3301}}, {{33.1102, 33.2102, 33.3102}, {33.1202, 33.2202, 33.3202},
473  {33.1302, 33.2302, 33.3302}}};
474 float3x4 f34_2[2] = {{{34.1101, 34.2101, 34.3101}, {34.1201, 34.2201, 34.3201},
475  {34.1301, 34.2301, 34.3301}, {34.1401, 34.2401, 34.3401}}, {{34.1102, 34.2102, 34.3102},
476  {34.1202, 34.2202, 34.3202}, {34.1302, 34.2302, 34.3302}, {34.1402, 34.2402, 34.3402}}};
477 float4x1 f41_2[2] = {{{41.1101, 41.2101, 41.3101, 41.4101}}, {{41.1102, 41.2102, 41.3102, 41.4102}}};
478 float4x2 f42_2[2] = {{{42.1101, 42.2101, 42.3101, 42.4101}, {42.1201, 42.2201, 42.3201, 42.4201}},
479  {{42.1102, 42.2102, 42.3102, 42.4102}, {42.1202, 42.2202, 42.3202, 42.4202}}};
480 float4x3 f43_2[2] = {{{43.1101, 43.2101, 43.3101, 43.4101}, {43.1201, 43.2201, 43.3201, 43.4201},
481  {43.1301, 43.2301, 43.3301, 43.4301}}, {{43.1102, 43.2102, 43.3102, 43.4102},
482  {43.1202, 43.2202, 43.3202, 43.4202}, {43.1302, 43.2302, 43.3302, 43.4302}}};
483 float4x4 f44_2[2] = {{{44.1101, 44.2101, 44.3101, 44.4101}, {44.1201, 44.2201, 44.3201, 44.4201},
484  {44.1301, 44.2301, 44.3301, 44.4301}, {44.1401, 44.2401, 44.3401, 44.4401}},
485  {{44.1102, 44.2102, 44.3102, 44.4102}, {44.1202, 44.2202, 44.3202, 44.4202},
486  {44.1302, 44.2302, 44.3302, 44.4302}, {44.1402, 44.2402, 44.3402, 44.4402}}};
487 technique t { pass p { } }
488 #endif
490 {
491 0xfeff0901, 0x00000b80, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
492 0x00000001, 0x00000001, 0x3dcccccd, 0x00000002, 0x00000066, 0x00000003, 0x00000001, 0x0000004c,
493 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f8ccccd, 0x00000003, 0x00003166, 0x00000003,
494 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x40066666, 0x400ccccd,
495 0x00000003, 0x00003266, 0x00000003, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
496 0x00000001, 0x40466666, 0x404ccccd, 0x40533333, 0x00000003, 0x00003366, 0x00000003, 0x00000001,
497 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x40833333, 0x40866666, 0x4089999a,
498 0x408ccccd, 0x00000003, 0x00003466, 0x00000003, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
499 0x00000001, 0x00000001, 0x4131999a, 0x00000004, 0x00313166, 0x00000003, 0x00000002, 0x00000130,
500 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x4141999a, 0x41433333, 0x00000004, 0x00323166,
501 0x00000003, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x4151999a,
502 0x41533333, 0x4154cccd, 0x00000004, 0x00333166, 0x00000003, 0x00000002, 0x00000194, 0x00000000,
503 0x00000000, 0x00000001, 0x00000004, 0x4161999a, 0x41633333, 0x4164cccd, 0x41666666, 0x00000004,
504 0x00343166, 0x00000003, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
505 0x41a8e148, 0x41a9ae14, 0x00000004, 0x00313266, 0x00000003, 0x00000002, 0x000001f4, 0x00000000,
506 0x00000000, 0x00000002, 0x00000002, 0x41b0e148, 0x41b1ae14, 0x41b0f5c3, 0x41b1c28f, 0x00000004,
507 0x00323266, 0x00000003, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
508 0x41b8e148, 0x41b9ae14, 0x41b8f5c3, 0x41b9c28f, 0x41b90a3d, 0x41b9d70a, 0x00000004, 0x00333266,
509 0x00000003, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x41c0e148,
510 0x41c1ae14, 0x41c0f5c3, 0x41c1c28f, 0x41c10a3d, 0x41c1d70a, 0x41c11eb8, 0x41c1eb85, 0x00000004,
511 0x00343266, 0x00000003, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
512 0x41f8e148, 0x41f9ae14, 0x41fa7ae1, 0x00000004, 0x00313366, 0x00000003, 0x00000002, 0x000002e0,
513 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x420070a4, 0x4200d70a, 0x42013d71, 0x42007ae1,
514 0x4200e148, 0x420147ae, 0x00000004, 0x00323366, 0x00000003, 0x00000002, 0x00000328, 0x00000000,
515 0x00000000, 0x00000003, 0x00000003, 0x420470a4, 0x4204d70a, 0x42053d71, 0x42047ae1, 0x4204e148,
516 0x420547ae, 0x4204851f, 0x4204eb85, 0x420551ec, 0x00000004, 0x00333366, 0x00000003, 0x00000002,
517 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x420870a4, 0x4208d70a, 0x42093d71,
518 0x42087ae1, 0x4208e148, 0x420947ae, 0x4208851f, 0x4208eb85, 0x420951ec, 0x42088f5c, 0x4208f5c3,
519 0x42095c29, 0x00000004, 0x00343366, 0x00000003, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
520 0x00000004, 0x00000001, 0x422470a4, 0x4224d70a, 0x42253d71, 0x4225a3d7, 0x00000004, 0x00313466,
521 0x00000003, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x422870a4,
522 0x4228d70a, 0x42293d71, 0x4229a3d7, 0x42287ae1, 0x4228e148, 0x422947ae, 0x4229ae14, 0x00000004,
523 0x00323466, 0x00000003, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
524 0x422c70a4, 0x422cd70a, 0x422d3d71, 0x422da3d7, 0x422c7ae1, 0x422ce148, 0x422d47ae, 0x422dae14,
525 0x422c851f, 0x422ceb85, 0x422d51ec, 0x422db852, 0x00000004, 0x00333466, 0x00000003, 0x00000002,
526 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x423070a4, 0x4230d70a, 0x42313d71,
527 0x4231a3d7, 0x42307ae1, 0x4230e148, 0x423147ae, 0x4231ae14, 0x4230851f, 0x4230eb85, 0x423151ec,
528 0x4231b852, 0x42308f5c, 0x4230f5c3, 0x42315c29, 0x4231c28f, 0x00000004, 0x00343466, 0x00000003,
529 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x3dced917, 0x3dd0e560,
530 0x00000004, 0x00325f66, 0x00000003, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
531 0x00000001, 0x3f8ced91, 0x3f8d0e56, 0x00000005, 0x325f3166, 0x00000000, 0x00000003, 0x00000001,
532 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x400676c9, 0x400cdd2f, 0x4006872b,
533 0x400ced91, 0x00000005, 0x325f3266, 0x00000000, 0x00000003, 0x00000001, 0x0000057c, 0x00000000,
534 0x00000002, 0x00000003, 0x00000001, 0x404676c9, 0x404cdd2f, 0x40534396, 0x4046872b, 0x404ced91,
535 0x405353f8, 0x00000005, 0x325f3366, 0x00000000, 0x00000003, 0x00000001, 0x000005c4, 0x00000000,
536 0x00000002, 0x00000004, 0x00000001, 0x40833b64, 0x40866e98, 0x4089a1cb, 0x408cd4fe, 0x40834396,
537 0x408676c9, 0x4089a9fc, 0x408cdd2f, 0x00000005, 0x325f3466, 0x00000000, 0x00000003, 0x00000002,
538 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41319db2, 0x4131a1cb, 0x00000006,
539 0x5f313166, 0x00000032, 0x00000003, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
540 0x00000002, 0x41419db2, 0x4143374c, 0x4141a1cb, 0x41433b64, 0x00000006, 0x5f323166, 0x00000032,
541 0x00000003, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x41519db2,
542 0x4153374c, 0x4154d0e5, 0x4151a1cb, 0x41533b64, 0x4154d4fe, 0x00000006, 0x5f333166, 0x00000032,
543 0x00000003, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x41619db2,
544 0x4163374c, 0x4164d0e5, 0x41666a7f, 0x4161a1cb, 0x41633b64, 0x4164d4fe, 0x41666e98, 0x00000006,
545 0x5f343166, 0x00000032, 0x00000003, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
546 0x00000001, 0x41a8e17c, 0x41a9ae49, 0x41a8e1b1, 0x41a9ae7d, 0x00000006, 0x5f313266, 0x00000032,
547 0x00000003, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x41b0e17c,
548 0x41b1ae49, 0x41b0f5f7, 0x41b1c2c4, 0x41b0e1b1, 0x41b1ae7d, 0x41b0f62b, 0x41b1c2f8, 0x00000006,
549 0x5f323266, 0x00000032, 0x00000003, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
550 0x00000003, 0x41b8e17c, 0x41b9ae49, 0x41b8f5f7, 0x41b9c2c4, 0x41b90a72, 0x41b9d73f, 0x41b8e1b1,
551 0x41b9ae7d, 0x41b8f62b, 0x41b9c2f8, 0x41b90aa6, 0x41b9d773, 0x00000006, 0x5f333266, 0x00000032,
552 0x00000003, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x41c0e17c,
553 0x41c1ae49, 0x41c0f5f7, 0x41c1c2c4, 0x41c10a72, 0x41c1d73f, 0x41c11eed, 0x41c1ebba, 0x41c0e1b1,
554 0x41c1ae7d, 0x41c0f62b, 0x41c1c2f8, 0x41c10aa6, 0x41c1d773, 0x41c11f21, 0x41c1ebee, 0x00000006,
555 0x5f343266, 0x00000032, 0x00000003, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
556 0x00000001, 0x41f8e17c, 0x41f9ae49, 0x41fa7b16, 0x41f8e1b1, 0x41f9ae7d, 0x41fa7b4a, 0x00000006,
557 0x5f313366, 0x00000032, 0x00000003, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
558 0x00000002, 0x420070be, 0x4200d724, 0x42013d8b, 0x42007afb, 0x4200e162, 0x420147c8, 0x420070d8,
559 0x4200d73f, 0x42013da5, 0x42007b16, 0x4200e17c, 0x420147e3, 0x00000006, 0x5f323366, 0x00000032,
560 0x00000003, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x420470be,
561 0x4204d724, 0x42053d8b, 0x42047afb, 0x4204e162, 0x420547c8, 0x42048539, 0x4204eb9f, 0x42055206,
562 0x420470d8, 0x4204d73f, 0x42053da5, 0x42047b16, 0x4204e17c, 0x420547e3, 0x42048553, 0x4204ebba,
563 0x42055220, 0x00000006, 0x5f333366, 0x00000032, 0x00000003, 0x00000002, 0x00000984, 0x00000000,
564 0x00000002, 0x00000003, 0x00000004, 0x420870be, 0x4208d724, 0x42093d8b, 0x42087afb, 0x4208e162,
565 0x420947c8, 0x42088539, 0x4208eb9f, 0x42095206, 0x42088f76, 0x4208f5dd, 0x42095c43, 0x420870d8,
566 0x4208d73f, 0x42093da5, 0x42087b16, 0x4208e17c, 0x420947e3, 0x42088553, 0x4208ebba, 0x42095220,
567 0x42088f91, 0x4208f5f7, 0x42095c5d, 0x00000006, 0x5f343366, 0x00000032, 0x00000003, 0x00000002,
568 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x422470be, 0x4224d724, 0x42253d8b,
569 0x4225a3f1, 0x422470d8, 0x4224d73f, 0x42253da5, 0x4225a40b, 0x00000006, 0x5f313466, 0x00000032,
570 0x00000003, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x422870be,
571 0x4228d724, 0x42293d8b, 0x4229a3f1, 0x42287afb, 0x4228e162, 0x422947c8, 0x4229ae2f, 0x422870d8,
572 0x4228d73f, 0x42293da5, 0x4229a40b, 0x42287b16, 0x4228e17c, 0x422947e3, 0x4229ae49, 0x00000006,
573 0x5f323466, 0x00000032, 0x00000003, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
574 0x00000003, 0x422c70be, 0x422cd724, 0x422d3d8b, 0x422da3f1, 0x422c7afb, 0x422ce162, 0x422d47c8,
575 0x422dae2f, 0x422c8539, 0x422ceb9f, 0x422d5206, 0x422db86c, 0x422c70d8, 0x422cd73f, 0x422d3da5,
576 0x422da40b, 0x422c7b16, 0x422ce17c, 0x422d47e3, 0x422dae49, 0x422c8553, 0x422cebba, 0x422d5220,
577 0x422db886, 0x00000006, 0x5f333466, 0x00000032, 0x00000003, 0x00000002, 0x00000b64, 0x00000000,
578 0x00000002, 0x00000004, 0x00000004, 0x423070be, 0x4230d724, 0x42313d8b, 0x4231a3f1, 0x42307afb,
579 0x4230e162, 0x423147c8, 0x4231ae2f, 0x42308539, 0x4230eb9f, 0x42315206, 0x4231b86c, 0x42308f76,
580 0x4230f5dd, 0x42315c43, 0x4231c2aa, 0x423070d8, 0x4230d73f, 0x42313da5, 0x4231a40b, 0x42307b16,
581 0x4230e17c, 0x423147e3, 0x4231ae49, 0x42308553, 0x4230ebba, 0x42315220, 0x4231b886, 0x42308f91,
582 0x4230f5f7, 0x42315c5d, 0x4231c2c4, 0x00000006, 0x5f343466, 0x00000032, 0x00000002, 0x00000070,
583 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
584 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
585 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
586 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
587 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
588 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
589 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
590 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
591 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
592 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
593 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
594 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
595 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
596 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
597 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
598 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
599 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
600 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
601 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
602 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
603 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
604 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
605 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
606 };
607 
609 {
610  {"f", {"f", NULL, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0, 4}, 10},
611  {"f1", {"f1", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0, 4}, 20},
612  {"f2", {"f2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0, 8}, 30},
613  {"f3", {"f3", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 41},
614  {"f4", {"f4", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 53},
615  {"f11", {"f11", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0, 4}, 66},
616  {"f12", {"f12", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0, 8}, 76},
617  {"f13", {"f13", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 87},
618  {"f14", {"f14", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 99},
619  {"f21", {"f21", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 0, 0, 0, 0, 8}, 112},
620  {"f22", {"f22", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 0, 0, 0, 0, 16}, 123},
621  {"f23", {"f23", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 0, 0, 0, 0, 24}, 136},
622  {"f24", {"f24", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 0, 0, 0, 0, 32}, 151},
623  {"f31", {"f31", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 0, 0, 0, 0, 12}, 168},
624  {"f32", {"f32", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 0, 0, 0, 0, 24}, 180},
625  {"f33", {"f33", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 0, 0, 0, 0, 36}, 195},
626  {"f34", {"f34", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 0, 0, 0, 0, 48}, 213},
627  {"f41", {"f41", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 0, 0, 0, 0, 16}, 234},
628  {"f42", {"f42", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 0, 0, 0, 0, 32}, 247},
629  {"f43", {"f43", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 0, 0, 0, 0, 48}, 264},
630  {"f44", {"f44", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 0, 0, 0, 0, 64}, 285},
631  {"f_2", {"f_2", NULL, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0, 8}, 310},
632  {"f1_2", {"f1_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0, 8}, 321},
633  {"f2_2", {"f2_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0, 16}, 333},
634  {"f3_2", {"f3_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0, 24}, 347},
635  {"f4_2", {"f4_2", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0, 32}, 363},
636  {"f11_2", {"f11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0, 8}, 381},
637  {"f12_2", {"f12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0, 16}, 393},
638  {"f13_2", {"f13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0, 24}, 407},
639  {"f14_2", {"f14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0, 32}, 423},
640  {"f21_2", {"f21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 2, 0, 0, 0, 16}, 441},
641  {"f22_2", {"f22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 2, 0, 0, 0, 32}, 455},
642  {"f23_2", {"f23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 2, 0, 0, 0, 48}, 473},
643  {"f24_2", {"f24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 2, 0, 0, 0, 64}, 495},
644  {"f31_2", {"f31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 0, 0, 24}, 521},
645  {"f32_2", {"f32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 2, 0, 0, 0, 48}, 537},
646  {"f33_2", {"f33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 2, 0, 0, 0, 72}, 559},
647  {"f34_2", {"f34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 2, 0, 0, 0, 96}, 587},
648  {"f41_2", {"f41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 2, 0, 0, 0, 32}, 621},
649  {"f42_2", {"f42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 2, 0, 0, 0, 64}, 639},
650  {"f43_2", {"f43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 2, 0, 0, 0, 96}, 665},
651  {"f44_2", {"f44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 0, 0, 128}, 699},
652 };
653 
654 /*
655  * fxc.exe /Tfx_2_0
656  */
657 #if 0
658 int i = 1;
659 int1 i1 = {11};
660 int2 i2 = {21, 22};
661 int3 i3 = {31, 32, 33};
662 int4 i4 = {41, 42, 43, 44};
663 int1x1 i11 = {111};
664 int1x2 i12 = {121, 122};
665 int1x3 i13 = {131, 132, 133};
666 int1x4 i14 = {141, 142, 143, 144};
667 int2x1 i21 = {{2111, 2121}};
668 int2x2 i22 = {{2211, 2221}, {2212, 2222}};
669 int2x3 i23 = {{2311, 2321}, {2312, 2322}, {2313, 2323}};
670 int2x4 i24 = {{2411, 2421}, {2412, 2422}, {2413, 2423}, {2414, 2424}};
671 int3x1 i31 = {{3111, 3121, 3131}};
672 int3x2 i32 = {{3211, 3221, 3231}, {3212, 3222, 3232}};
673 int3x3 i33 = {{3311, 3321, 3331}, {3312, 3322, 3332},
674  {3313, 3323, 3333}};
675 int3x4 i34 = {{3411, 3421, 3431}, {3412, 3422, 3432},
676  {3413, 3423, 3433}, {3414, 3424, 3434}};
677 int4x1 i41 = {{4111, 4121, 4131, 4141}};
678 int4x2 i42 = {{4211, 4221, 4231, 4241}, {4212, 4222, 4232, 4242}};
679 int4x3 i43 = {{4311, 4321, 4331, 4341}, {4312, 4322, 4332, 4342},
680  {4313, 4323, 4333, 4343}};
681 int4x4 i44 = {{4411, 4421, 4431, 4441}, {4412, 4422, 4432, 4442},
682  {4413, 4423, 4433, 4443}, {4414, 4424, 4434, 4444}};
683 int i_2[2] = {0101, 0102};
684 int1 i1_2[2] = {{1101}, {1102}};
685 int2 i2_2[2] = {{2101, 2201}, {2102, 2202}};
686 int3 i3_2[2] = {{3101, 3201, 3301}, {3102, 3202, 3302}};
687 int4 i4_2[2] = {{4101, 4201, 4301, 4401}, {4102, 4202, 4302, 4402}};
688 int1x1 i11_2[2] = {{11101}, {11102}};
689 int1x2 i12_2[2] = {{12101, 12201}, {12102, 12202}};
690 int1x3 i13_2[2] = {{13101, 13201, 13301}, {13102, 13202, 13302}};
691 int1x4 i14_2[2] = {{14101, 14201, 14301, 14401}, {14102, 14202, 14302, 14402}};
692 int2x1 i21_2[2] = {{{211101, 212101}}, {{211102, 212102}}};
693 int2x2 i22_2[2] = {{{221101, 222101}, {221201, 222201}}, {{221102, 222102}, {221202, 222202}}};
694 int2x3 i23_2[2] = {{{231101, 232101}, {231201, 232201}, {231301, 232301}}, {{231102, 232102},
695  {231202, 232202}, {231302, 232302}}};
696 int2x4 i24_2[2] = {{{241101, 242101}, {241201, 242201}, {241301, 242301}, {241401, 242401}},
697  {{241102, 242102}, {241202, 242202}, {241302, 242302}, {241402, 242402}}};
698 int3x1 i31_2[2] = {{{311101, 312101, 313101}}, {{311102, 312102, 313102}}};
699 int3x2 i32_2[2] = {{{321101, 322101, 323101}, {321201, 322201, 323201}},
700  {{321102, 322102, 323102}, {321202, 322202, 323202}}};
701 int3x3 i33_2[2] = {{{331101, 332101, 333101}, {331201, 332201, 333201},
702  {331301, 332301, 333301}}, {{331102, 332102, 333102}, {331202, 332202, 333202},
703  {331302, 332302, 333302}}};
704 int3x4 i34_2[2] = {{{341101, 342101, 343101}, {341201, 342201, 343201},
705  {341301, 342301, 343301}, {341401, 342401, 343401}}, {{341102, 342102, 343102},
706  {341202, 342202, 343202}, {341302, 342302, 343302}, {341402, 342402, 343402}}};
707 int4x1 i41_2[2] = {{{411101, 412101, 413101, 414101}}, {{411102, 412102, 413102, 414102}}};
708 int4x2 i42_2[2] = {{{421101, 422101, 423101, 424101}, {421201, 422201, 423201, 424201}},
709  {{421102, 422102, 423102, 424102}, {421202, 422202, 423202, 424202}}};
710 int4x3 i43_2[2] = {{{431101, 432101, 433101, 434101}, {431201, 432201, 433201, 434201},
711  {431301, 432301, 433301, 434301}}, {{431102, 432102, 433102, 434102},
712  {431202, 432202, 433202, 434202}, {431302, 432302, 433302, 434302}}};
713 int4x4 i44_2[2] = {{{441101, 442101, 443101, 444101}, {441201, 442201, 443201, 444201},
714  {441301, 442301, 443301, 444301}, {441401, 442401, 443401, 444401}},
715  {{441102, 442102, 443102, 444102}, {441202, 442202, 443202, 444202},
716  {441302, 442302, 443302, 444302}, {441402, 442402, 443402, 444402}}};
717 technique t { pass p { } }
718 #endif
720 {
721 0xfeff0901, 0x00000b80, 0x00000000, 0x00000002, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
722 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000069, 0x00000002, 0x00000001, 0x0000004c,
723 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x0000000b, 0x00000003, 0x00003169, 0x00000002,
724 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x00000015, 0x00000016,
725 0x00000003, 0x00003269, 0x00000002, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
726 0x00000001, 0x0000001f, 0x00000020, 0x00000021, 0x00000003, 0x00003369, 0x00000002, 0x00000001,
727 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000029, 0x0000002a, 0x0000002b,
728 0x0000002c, 0x00000003, 0x00003469, 0x00000002, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
729 0x00000001, 0x00000001, 0x0000006f, 0x00000004, 0x00313169, 0x00000002, 0x00000002, 0x00000130,
730 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000079, 0x0000007a, 0x00000004, 0x00323169,
731 0x00000002, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x00000083,
732 0x00000084, 0x00000085, 0x00000004, 0x00333169, 0x00000002, 0x00000002, 0x00000194, 0x00000000,
733 0x00000000, 0x00000001, 0x00000004, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000004,
734 0x00343169, 0x00000002, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
735 0x0000083f, 0x00000849, 0x00000004, 0x00313269, 0x00000002, 0x00000002, 0x000001f4, 0x00000000,
736 0x00000000, 0x00000002, 0x00000002, 0x000008a3, 0x000008ad, 0x000008a4, 0x000008ae, 0x00000004,
737 0x00323269, 0x00000002, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
738 0x00000907, 0x00000911, 0x00000908, 0x00000912, 0x00000909, 0x00000913, 0x00000004, 0x00333269,
739 0x00000002, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x0000096b,
740 0x00000975, 0x0000096c, 0x00000976, 0x0000096d, 0x00000977, 0x0000096e, 0x00000978, 0x00000004,
741 0x00343269, 0x00000002, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
742 0x00000c27, 0x00000c31, 0x00000c3b, 0x00000004, 0x00313369, 0x00000002, 0x00000002, 0x000002e0,
743 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000c8b, 0x00000c95, 0x00000c9f, 0x00000c8c,
744 0x00000c96, 0x00000ca0, 0x00000004, 0x00323369, 0x00000002, 0x00000002, 0x00000328, 0x00000000,
745 0x00000000, 0x00000003, 0x00000003, 0x00000cef, 0x00000cf9, 0x00000d03, 0x00000cf0, 0x00000cfa,
746 0x00000d04, 0x00000cf1, 0x00000cfb, 0x00000d05, 0x00000004, 0x00333369, 0x00000002, 0x00000002,
747 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x00000d53, 0x00000d5d, 0x00000d67,
748 0x00000d54, 0x00000d5e, 0x00000d68, 0x00000d55, 0x00000d5f, 0x00000d69, 0x00000d56, 0x00000d60,
749 0x00000d6a, 0x00000004, 0x00343369, 0x00000002, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
750 0x00000004, 0x00000001, 0x0000100f, 0x00001019, 0x00001023, 0x0000102d, 0x00000004, 0x00313469,
751 0x00000002, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x00001073,
752 0x0000107d, 0x00001087, 0x00001091, 0x00001074, 0x0000107e, 0x00001088, 0x00001092, 0x00000004,
753 0x00323469, 0x00000002, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
754 0x000010d7, 0x000010e1, 0x000010eb, 0x000010f5, 0x000010d8, 0x000010e2, 0x000010ec, 0x000010f6,
755 0x000010d9, 0x000010e3, 0x000010ed, 0x000010f7, 0x00000004, 0x00333469, 0x00000002, 0x00000002,
756 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x0000113b, 0x00001145, 0x0000114f,
757 0x00001159, 0x0000113c, 0x00001146, 0x00001150, 0x0000115a, 0x0000113d, 0x00001147, 0x00001151,
758 0x0000115b, 0x0000113e, 0x00001148, 0x00001152, 0x0000115c, 0x00000004, 0x00343469, 0x00000002,
759 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00000041, 0x00000042,
760 0x00000004, 0x00325f69, 0x00000002, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
761 0x00000001, 0x0000044d, 0x0000044e, 0x00000005, 0x325f3169, 0x00000000, 0x00000002, 0x00000001,
762 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000835, 0x00000899, 0x00000836,
763 0x0000089a, 0x00000005, 0x325f3269, 0x00000000, 0x00000002, 0x00000001, 0x0000057c, 0x00000000,
764 0x00000002, 0x00000003, 0x00000001, 0x00000c1d, 0x00000c81, 0x00000ce5, 0x00000c1e, 0x00000c82,
765 0x00000ce6, 0x00000005, 0x325f3369, 0x00000000, 0x00000002, 0x00000001, 0x000005c4, 0x00000000,
766 0x00000002, 0x00000004, 0x00000001, 0x00001005, 0x00001069, 0x000010cd, 0x00001131, 0x00001006,
767 0x0000106a, 0x000010ce, 0x00001132, 0x00000005, 0x325f3469, 0x00000000, 0x00000002, 0x00000002,
768 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00002b5d, 0x00002b5e, 0x00000006,
769 0x5f313169, 0x00000032, 0x00000002, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
770 0x00000002, 0x00002f45, 0x00002fa9, 0x00002f46, 0x00002faa, 0x00000006, 0x5f323169, 0x00000032,
771 0x00000002, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0000332d,
772 0x00003391, 0x000033f5, 0x0000332e, 0x00003392, 0x000033f6, 0x00000006, 0x5f333169, 0x00000032,
773 0x00000002, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x00003715,
774 0x00003779, 0x000037dd, 0x00003841, 0x00003716, 0x0000377a, 0x000037de, 0x00003842, 0x00000006,
775 0x5f343169, 0x00000032, 0x00000002, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
776 0x00000001, 0x0003389d, 0x00033c85, 0x0003389e, 0x00033c86, 0x00000006, 0x5f313269, 0x00000032,
777 0x00000002, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00035fad,
778 0x00036395, 0x00036011, 0x000363f9, 0x00035fae, 0x00036396, 0x00036012, 0x000363fa, 0x00000006,
779 0x5f323269, 0x00000032, 0x00000002, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
780 0x00000003, 0x000386bd, 0x00038aa5, 0x00038721, 0x00038b09, 0x00038785, 0x00038b6d, 0x000386be,
781 0x00038aa6, 0x00038722, 0x00038b0a, 0x00038786, 0x00038b6e, 0x00000006, 0x5f333269, 0x00000032,
782 0x00000002, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x0003adcd,
783 0x0003b1b5, 0x0003ae31, 0x0003b219, 0x0003ae95, 0x0003b27d, 0x0003aef9, 0x0003b2e1, 0x0003adce,
784 0x0003b1b6, 0x0003ae32, 0x0003b21a, 0x0003ae96, 0x0003b27e, 0x0003aefa, 0x0003b2e2, 0x00000006,
785 0x5f343269, 0x00000032, 0x00000002, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
786 0x00000001, 0x0004bf3d, 0x0004c325, 0x0004c70d, 0x0004bf3e, 0x0004c326, 0x0004c70e, 0x00000006,
787 0x5f313369, 0x00000032, 0x00000002, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
788 0x00000002, 0x0004e64d, 0x0004ea35, 0x0004ee1d, 0x0004e6b1, 0x0004ea99, 0x0004ee81, 0x0004e64e,
789 0x0004ea36, 0x0004ee1e, 0x0004e6b2, 0x0004ea9a, 0x0004ee82, 0x00000006, 0x5f323369, 0x00000032,
790 0x00000002, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00050d5d,
791 0x00051145, 0x0005152d, 0x00050dc1, 0x000511a9, 0x00051591, 0x00050e25, 0x0005120d, 0x000515f5,
792 0x00050d5e, 0x00051146, 0x0005152e, 0x00050dc2, 0x000511aa, 0x00051592, 0x00050e26, 0x0005120e,
793 0x000515f6, 0x00000006, 0x5f333369, 0x00000032, 0x00000002, 0x00000002, 0x00000984, 0x00000000,
794 0x00000002, 0x00000003, 0x00000004, 0x0005346d, 0x00053855, 0x00053c3d, 0x000534d1, 0x000538b9,
795 0x00053ca1, 0x00053535, 0x0005391d, 0x00053d05, 0x00053599, 0x00053981, 0x00053d69, 0x0005346e,
796 0x00053856, 0x00053c3e, 0x000534d2, 0x000538ba, 0x00053ca2, 0x00053536, 0x0005391e, 0x00053d06,
797 0x0005359a, 0x00053982, 0x00053d6a, 0x00000006, 0x5f343369, 0x00000032, 0x00000002, 0x00000002,
798 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x000645dd, 0x000649c5, 0x00064dad,
799 0x00065195, 0x000645de, 0x000649c6, 0x00064dae, 0x00065196, 0x00000006, 0x5f313469, 0x00000032,
800 0x00000002, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x00066ced,
801 0x000670d5, 0x000674bd, 0x000678a5, 0x00066d51, 0x00067139, 0x00067521, 0x00067909, 0x00066cee,
802 0x000670d6, 0x000674be, 0x000678a6, 0x00066d52, 0x0006713a, 0x00067522, 0x0006790a, 0x00000006,
803 0x5f323469, 0x00000032, 0x00000002, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
804 0x00000003, 0x000693fd, 0x000697e5, 0x00069bcd, 0x00069fb5, 0x00069461, 0x00069849, 0x00069c31,
805 0x0006a019, 0x000694c5, 0x000698ad, 0x00069c95, 0x0006a07d, 0x000693fe, 0x000697e6, 0x00069bce,
806 0x00069fb6, 0x00069462, 0x0006984a, 0x00069c32, 0x0006a01a, 0x000694c6, 0x000698ae, 0x00069c96,
807 0x0006a07e, 0x00000006, 0x5f333469, 0x00000032, 0x00000002, 0x00000002, 0x00000b64, 0x00000000,
808 0x00000002, 0x00000004, 0x00000004, 0x0006bb0d, 0x0006bef5, 0x0006c2dd, 0x0006c6c5, 0x0006bb71,
809 0x0006bf59, 0x0006c341, 0x0006c729, 0x0006bbd5, 0x0006bfbd, 0x0006c3a5, 0x0006c78d, 0x0006bc39,
810 0x0006c021, 0x0006c409, 0x0006c7f1, 0x0006bb0e, 0x0006bef6, 0x0006c2de, 0x0006c6c6, 0x0006bb72,
811 0x0006bf5a, 0x0006c342, 0x0006c72a, 0x0006bbd6, 0x0006bfbe, 0x0006c3a6, 0x0006c78e, 0x0006bc3a,
812 0x0006c022, 0x0006c40a, 0x0006c7f2, 0x00000006, 0x5f343469, 0x00000032, 0x00000002, 0x00000070,
813 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
814 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
815 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
816 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
817 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
818 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
819 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
820 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
821 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
822 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
823 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
824 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
825 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
826 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
827 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
828 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
829 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
830 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
831 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
832 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
833 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
834 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
835 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
836 };
837 
839 {
840  {"i", {"i", NULL, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 0, 0, 0, 0, 4}, 10},
841  {"i1", {"i1", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 1, 0, 0, 0, 0, 4}, 20},
842  {"i2", {"i2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 2, 0, 0, 0, 0, 8}, 30},
843  {"i3", {"i3", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 0, 0, 0, 0, 12}, 41},
844  {"i4", {"i4", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 0, 0, 0, 0, 16}, 53},
845  {"i11", {"i11", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 0, 0, 0, 0, 4}, 66},
846  {"i12", {"i12", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 0, 0, 0, 0, 8}, 76},
847  {"i13", {"i13", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 0, 0, 0, 0, 12}, 87},
848  {"i14", {"i14", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 0, 0, 0, 0, 16}, 99},
849  {"i21", {"i21", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 0, 0, 0, 0, 8}, 112},
850  {"i22", {"i22", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 0, 0, 0, 0, 16}, 123},
851  {"i23", {"i23", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 0, 0, 0, 0, 24}, 136},
852  {"i24", {"i24", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 0, 0, 0, 0, 32}, 151},
853  {"i31", {"i31", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 0, 0, 0, 0, 12}, 168},
854  {"i32", {"i32", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 0, 0, 0, 0, 24}, 180},
855  {"i33", {"i33", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 0, 0, 0, 0, 36}, 195},
856  {"i34", {"i34", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 0, 0, 0, 0, 48}, 213},
857  {"i41", {"i41", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 0, 0, 0, 0, 16}, 234},
858  {"i42", {"i42", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 0, 0, 0, 0, 32}, 247},
859  {"i43", {"i43", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 0, 0, 0, 0, 48}, 264},
860  {"i44", {"i44", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 0, 0, 0, 0, 64}, 285},
861  {"i_2", {"i_2", NULL, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 2, 0, 0, 0, 8}, 310},
862  {"i1_2", {"i1_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 1, 2, 0, 0, 0, 8}, 321},
863  {"i2_2", {"i2_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 2, 2, 0, 0, 0, 16}, 333},
864  {"i3_2", {"i3_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 3, 2, 0, 0, 0, 24}, 347},
865  {"i4_2", {"i4_2", NULL, D3DXPC_VECTOR, D3DXPT_INT, 1, 4, 2, 0, 0, 0, 32}, 363},
866  {"i11_2", {"i11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 2, 0, 0, 0, 8}, 381},
867  {"i12_2", {"i12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 2, 0, 0, 0, 16}, 393},
868  {"i13_2", {"i13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 2, 0, 0, 0, 24}, 407},
869  {"i14_2", {"i14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 2, 0, 0, 0, 32}, 423},
870  {"i21_2", {"i21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 2, 0, 0, 0, 16}, 441},
871  {"i22_2", {"i22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 2, 0, 0, 0, 32}, 455},
872  {"i23_2", {"i23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 2, 0, 0, 0, 48}, 473},
873  {"i24_2", {"i24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 2, 0, 0, 0, 64}, 495},
874  {"i31_2", {"i31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 2, 0, 0, 0, 24}, 521},
875  {"i32_2", {"i32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 2, 0, 0, 0, 48}, 537},
876  {"i33_2", {"i33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 2, 0, 0, 0, 72}, 559},
877  {"i34_2", {"i34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 2, 0, 0, 0, 96}, 587},
878  {"i41_2", {"i41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 2, 0, 0, 0, 32}, 621},
879  {"i42_2", {"i42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 2, 0, 0, 0, 64}, 639},
880  {"i43_2", {"i43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 2, 0, 0, 0, 96}, 665},
881  {"i44_2", {"i44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 2, 0, 0, 0, 128}, 699},
882 };
883 
884 /*
885  * fxc.exe /Tfx_2_0
886  */
887 #if 0
888 string s = "test";
889 string s_2[2] = {"test1", "test2"};
890 texture2D tex;
891 Vertexshader v;
892 Vertexshader v_2[2];
893 Pixelshader p;
894 Pixelshader p_2[2];
895 technique t { pass p { } }
896 #endif
898 {
899 0xfeff0901, 0x00000100, 0x00000000, 0x00000004, 0x00000004, 0x0000001c, 0x00000000, 0x00000000,
900 0x00000001, 0x00000002, 0x00000073, 0x00000004, 0x00000004, 0x00000040, 0x00000000, 0x00000002,
901 0x00000002, 0x00000003, 0x00000004, 0x00325f73, 0x00000007, 0x00000004, 0x00000060, 0x00000000,
902 0x00000000, 0x00000004, 0x00000004, 0x00786574, 0x00000010, 0x00000004, 0x00000080, 0x00000000,
903 0x00000000, 0x00000005, 0x00000002, 0x00000076, 0x00000010, 0x00000004, 0x000000a4, 0x00000000,
904 0x00000002, 0x00000006, 0x00000007, 0x00000004, 0x00325f76, 0x0000000f, 0x00000004, 0x000000c4,
905 0x00000000, 0x00000000, 0x00000008, 0x00000002, 0x00000070, 0x0000000f, 0x00000004, 0x000000e8,
906 0x00000000, 0x00000002, 0x00000009, 0x0000000a, 0x00000004, 0x00325f70, 0x00000002, 0x00000070,
907 0x00000002, 0x00000074, 0x00000007, 0x00000001, 0x00000007, 0x0000000b, 0x00000004, 0x00000018,
908 0x00000000, 0x00000000, 0x00000024, 0x00000038, 0x00000000, 0x00000000, 0x00000048, 0x0000005c,
909 0x00000000, 0x00000000, 0x00000068, 0x0000007c, 0x00000000, 0x00000000, 0x00000088, 0x0000009c,
910 0x00000000, 0x00000000, 0x000000ac, 0x000000c0, 0x00000000, 0x00000000, 0x000000cc, 0x000000e0,
911 0x00000000, 0x00000000, 0x000000f8, 0x00000000, 0x00000001, 0x000000f0, 0x00000000, 0x00000000,
912 0x0000000a, 0x00000000, 0x00000009, 0x00000000, 0x0000000a, 0x00000000, 0x00000008, 0x00000000,
913 0x00000006, 0x00000000, 0x00000007, 0x00000000, 0x00000005, 0x00000000, 0x00000004, 0x00000000,
914 0x00000002, 0x00000006, 0x74736574, 0x00000031, 0x00000003, 0x00000006, 0x74736574, 0x00000032,
915 0x00000001, 0x00000005, 0x74736574, 0x00000000,
916 };
917 
919 {
920  {"s", {"s", NULL, D3DXPC_OBJECT, D3DXPT_STRING, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0},
921  {"s_2", {"s_2", NULL, D3DXPC_OBJECT, D3DXPT_STRING, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0},
922  {"tex", {"tex", NULL, D3DXPC_OBJECT, D3DXPT_TEXTURE2D, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0},
923  {"v", {"v", NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0},
924  {"v_2", {"v_2", NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0},
925  {"p", {"p", NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER, 0, 0, 0, 0, 0, 0, sizeof(void *)}, 0},
926  {"p_2", {"p_2", NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER, 0, 0, 2, 0, 0, 0, 2 * sizeof(void *)}, 0},
927 };
928 
929 /*
930  * fxc.exe /Tfx_2_0
931  */
932 #if 0
933 float3 f3 = {-3.1, 153.2, 283.3};
934 float3 f3min = {-31.1, -31.2, -31.3};
935 float3 f3max = {320.1, 320.2, 320.3};
936 float4 f4 = {-4.1, 154.2, 284.3, 34.4};
937 float4 f4min = {-41.1, -41.2, -41.3, -41.4};
938 float4 f4max = {420.1, 42.20, 420.3, 420.4};
939 technique t { pass p { } }
940 #endif
942 {
943 0xfeff0901, 0x00000150, 0x00000000, 0x00000003, 0x00000001, 0x0000002c, 0x00000000, 0x00000000,
944 0x00000003, 0x00000001, 0xc0466666, 0x43193333, 0x438da666, 0x00000003, 0x00003366, 0x00000003,
945 0x00000001, 0x0000005c, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0xc1f8cccd, 0xc1f9999a,
946 0xc1fa6666, 0x00000006, 0x696d3366, 0x0000006e, 0x00000003, 0x00000001, 0x00000090, 0x00000000,
947 0x00000000, 0x00000003, 0x00000001, 0x43a00ccd, 0x43a0199a, 0x43a02666, 0x00000006, 0x616d3366,
948 0x00000078, 0x00000003, 0x00000001, 0x000000c8, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
949 0xc0833333, 0x431a3333, 0x438e2666, 0x4209999a, 0x00000003, 0x00003466, 0x00000003, 0x00000001,
950 0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0xc2246666, 0xc224cccd, 0xc2253333,
951 0xc225999a, 0x00000006, 0x696d3466, 0x0000006e, 0x00000003, 0x00000001, 0x00000134, 0x00000000,
952 0x00000000, 0x00000004, 0x00000001, 0x43d20ccd, 0x4228cccd, 0x43d22666, 0x43d23333, 0x00000006,
953 0x616d3466, 0x00000078, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001,
954 0x00000001, 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x00000034, 0x00000050,
955 0x00000000, 0x00000000, 0x00000068, 0x00000084, 0x00000000, 0x00000000, 0x0000009c, 0x000000b8,
956 0x00000000, 0x00000000, 0x000000d0, 0x000000ec, 0x00000000, 0x00000000, 0x00000108, 0x00000124,
957 0x00000000, 0x00000000, 0x00000148, 0x00000000, 0x00000001, 0x00000140, 0x00000000, 0x00000000,
958 0x00000000, 0x00000000,
959 };
960 
962 {
963  {"f3", {"f3", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 10},
964  {"f3min", {"f3min", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 22},
965  {"f3max", {"f3max", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0, 12}, 35},
966  {"f4", {"f4", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 48},
967  {"f4min", {"f4min", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 61},
968  {"f4max", {"f4max", NULL, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0, 16}, 75},
969 };
970 
971 #define ADD_PARAMETER_VALUE(x) {\
972  test_effect_parameter_value_blob_ ## x,\
973  sizeof(test_effect_parameter_value_blob_ ## x),\
974  test_effect_parameter_value_result_ ## x,\
975  ARRAY_SIZE(test_effect_parameter_value_result_ ## x),\
976 }
977 
978 static const struct
979 {
980  const DWORD *blob;
984 }
986 {
987  ADD_PARAMETER_VALUE(float),
988  ADD_PARAMETER_VALUE(int),
989  ADD_PARAMETER_VALUE(object),
990  ADD_PARAMETER_VALUE(special),
991 };
992 
993 #undef ADD_PARAMETER_VALUE
994 
995 /* Multiple of 16 to cover complete matrices */
996 #define EFFECT_PARAMETER_VALUE_ARRAY_SIZE 48
997 /* Constants for special INT/FLOAT conversation */
998 #define INT_FLOAT_MULTI 255.0f
999 #define INT_FLOAT_MULTI_INVERSE (1/INT_FLOAT_MULTI)
1000 
1002  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1003 {
1004  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1005  const char *res_full_name = res->full_name;
1007  HRESULT hr;
1008  UINT l;
1009 
1010  memset(value, 0xab, sizeof(value));
1011  hr = effect->lpVtbl->GetValue(effect, parameter, value, res_desc->Bytes);
1012  if (res_desc->Class == D3DXPC_SCALAR
1013  || res_desc->Class == D3DXPC_VECTOR
1014  || res_desc->Class == D3DXPC_MATRIX_ROWS)
1015  {
1016  ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1017 
1018  for (l = 0; l < res_desc->Bytes / sizeof(*value); ++l)
1019  {
1020  ok(value[l] == res_value[l], "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
1021  i, res_full_name, l, value[l], res_value[l]);
1022  }
1023 
1024  for (l = res_desc->Bytes / sizeof(*value); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1025  {
1026  ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
1027  i, res_full_name, l, value[l], 0xabababab);
1028  }
1029  }
1030  else if (res_desc->Class == D3DXPC_OBJECT)
1031  {
1032  switch (res_desc->Type)
1033  {
1034  case D3DXPT_PIXELSHADER:
1035  case D3DXPT_VERTEXSHADER:
1036  case D3DXPT_TEXTURE2D:
1037  ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1038 
1039  for (l = 0; l < (res_desc->Elements ? res_desc->Elements : 1); ++l)
1040  {
1041  IUnknown *unk = *((IUnknown **)value + l);
1042  if (unk) IUnknown_Release(unk);
1043  }
1044  break;
1045 
1046  case D3DXPT_STRING:
1047  ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1048  break;
1049 
1050  default:
1051  ok(0, "Type is %u, this should not happen!\n", res_desc->Type);
1052  break;
1053  }
1054  }
1055  else
1056  {
1057  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
1058  i, res_full_name, hr, D3DERR_INVALIDCALL);
1059 
1060  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1061  {
1062  ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
1063  i, res_full_name, l, value[l], 0xabababab);
1064  }
1065  }
1066 }
1067 
1069  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1070 {
1071  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1072  const char *res_full_name = res->full_name;
1073  BOOL bvalue = 0xabababab;
1074  HRESULT hr;
1075 
1076  hr = effect->lpVtbl->GetBool(effect, parameter, &bvalue);
1077  if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
1078  {
1079  ok(hr == D3D_OK, "%u - %s: GetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1080  ok(bvalue == get_bool(res_value), "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
1081  i, res_full_name, bvalue, get_bool(res_value));
1082  }
1083  else
1084  {
1085  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1086  i, res_full_name, hr, D3DERR_INVALIDCALL);
1087  ok(bvalue == 0xabababab, "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
1088  i, res_full_name, bvalue, 0xabababab);
1089  }
1090 }
1091 
1093  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1094 {
1095  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1096  const char *res_full_name = res->full_name;
1098  HRESULT hr;
1099  UINT l, err = 0;
1100 
1101  memset(bavalue, 0xab, sizeof(bavalue));
1102  hr = effect->lpVtbl->GetBoolArray(effect, parameter, bavalue, res_desc->Bytes / sizeof(*bavalue));
1103  if (res_desc->Class == D3DXPC_SCALAR
1104  || res_desc->Class == D3DXPC_VECTOR
1105  || res_desc->Class == D3DXPC_MATRIX_ROWS)
1106  {
1107  ok(hr == D3D_OK, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1108 
1109  for (l = 0; l < res_desc->Bytes / sizeof(*bavalue); ++l)
1110  {
1111  if (bavalue[l] != get_bool(&res_value[l])) ++err;
1112  }
1113 
1114  for (l = res_desc->Bytes / sizeof(*bavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1115  {
1116  if (bavalue[l] != 0xabababab) ++err;
1117  }
1118  }
1119  else
1120  {
1121  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1122  i, res_full_name, hr, D3DERR_INVALIDCALL);
1123 
1124  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (bavalue[l] != 0xabababab) ++err;
1125  }
1126  ok(!err, "%u - %s: GetBoolArray failed with %u errors\n", i, res_full_name, err);
1127 }
1128 
1130  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1131 {
1132  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1133  const char *res_full_name = res->full_name;
1134  INT ivalue = 0xabababab;
1135  HRESULT hr;
1136 
1137  hr = effect->lpVtbl->GetInt(effect, parameter, &ivalue);
1138  if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
1139  {
1140  ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1141  ok(ivalue == get_int(res_desc->Type, res_value), "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
1142  i, res_full_name, ivalue, get_int(res_desc->Type, res_value));
1143  }
1144  else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
1145  ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
1146  (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
1147  {
1148  INT tmp;
1149 
1150  ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1151 
1152  tmp = (INT)(min(max(0.0f, *((FLOAT *)res_value + 2)), 1.0f) * INT_FLOAT_MULTI);
1153  tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8;
1154  tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16;
1155  if (res_desc->Columns * res_desc->Rows > 3)
1156  {
1157  tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24;
1158  }
1159 
1160  ok(ivalue == tmp, "%u - %s: GetInt ivalue failed, got %x, expected %x\n",
1161  i, res_full_name, ivalue, tmp);
1162  }
1163  else
1164  {
1165  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1166  i, res_full_name, hr, D3DERR_INVALIDCALL);
1167  ok(ivalue == 0xabababab, "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
1168  i, res_full_name, ivalue, 0xabababab);
1169  }
1170 }
1171 
1173  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1174 {
1175  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1176  const char *res_full_name = res->full_name;
1178  HRESULT hr;
1179  UINT l, err = 0;
1180 
1181  memset(iavalue, 0xab, sizeof(iavalue));
1182  hr = effect->lpVtbl->GetIntArray(effect, parameter, iavalue, res_desc->Bytes / sizeof(*iavalue));
1183  if (res_desc->Class == D3DXPC_SCALAR
1184  || res_desc->Class == D3DXPC_VECTOR
1185  || res_desc->Class == D3DXPC_MATRIX_ROWS)
1186  {
1187  ok(hr == D3D_OK, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1188 
1189  for (l = 0; l < res_desc->Bytes / sizeof(*iavalue); ++l)
1190  {
1191  if (iavalue[l] != get_int(res_desc->Type, &res_value[l])) ++err;
1192  }
1193 
1194  for (l = res_desc->Bytes / sizeof(*iavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1195  {
1196  if (iavalue[l] != 0xabababab) ++err;
1197  }
1198  }
1199  else
1200  {
1201  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1202  i, res_full_name, hr, D3DERR_INVALIDCALL);
1203 
1204  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (iavalue[l] != 0xabababab) ++err;
1205  }
1206  ok(!err, "%u - %s: GetIntArray failed with %u errors\n", i, res_full_name, err);
1207 }
1208 
1210  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1211 {
1212  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1213  const char *res_full_name = res->full_name;
1214  HRESULT hr;
1215  DWORD cmp = 0xabababab;
1216  FLOAT fvalue = *(FLOAT *)&cmp;
1217 
1218  hr = effect->lpVtbl->GetFloat(effect, parameter, &fvalue);
1219  if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
1220  {
1221  ok(hr == D3D_OK, "%u - %s: GetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1222  ok(compare_float(fvalue, get_float(res_desc->Type, res_value), 512), "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
1223  i, res_full_name, fvalue, get_float(res_desc->Type, res_value));
1224  }
1225  else
1226  {
1227  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1228  i, res_full_name, hr, D3DERR_INVALIDCALL);
1229  ok(fvalue == *(FLOAT *)&cmp, "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
1230  i, res_full_name, fvalue, *(FLOAT *)&cmp);
1231  }
1232 }
1233 
1235  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1236 {
1237  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1238  const char *res_full_name = res->full_name;
1240  HRESULT hr;
1241  UINT l, err = 0;
1242  DWORD cmp = 0xabababab;
1243 
1244  memset(favalue, 0xab, sizeof(favalue));
1245  hr = effect->lpVtbl->GetFloatArray(effect, parameter, favalue, res_desc->Bytes / sizeof(*favalue));
1246  if (res_desc->Class == D3DXPC_SCALAR
1247  || res_desc->Class == D3DXPC_VECTOR
1248  || res_desc->Class == D3DXPC_MATRIX_ROWS)
1249  {
1250  ok(hr == D3D_OK, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1251 
1252  for (l = 0; l < res_desc->Bytes / sizeof(*favalue); ++l)
1253  {
1254  if (!compare_float(favalue[l], get_float(res_desc->Type, &res_value[l]), 512)) ++err;
1255  }
1256 
1257  for (l = res_desc->Bytes / sizeof(*favalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1258  {
1259  if (favalue[l] != *(FLOAT *)&cmp) ++err;
1260  }
1261  }
1262  else
1263  {
1264  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1265  i, res_full_name, hr, D3DERR_INVALIDCALL);
1266 
1267  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (favalue[l] != *(FLOAT *)&cmp) ++err;
1268  }
1269  ok(!err, "%u - %s: GetFloatArray failed with %u errors\n", i, res_full_name, err);
1270 }
1271 
1273  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1274 {
1275  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1276  const char *res_full_name = res->full_name;
1277  HRESULT hr;
1278  DWORD cmp = 0xabababab;
1279  FLOAT fvalue[4];
1280  UINT l, err = 0;
1281 
1282  memset(fvalue, 0xab, sizeof(fvalue));
1283  hr = effect->lpVtbl->GetVector(effect, parameter, (D3DXVECTOR4 *)&fvalue);
1284  if (!res_desc->Elements &&
1285  (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR) &&
1286  res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
1287  {
1288  DWORD tmp;
1289 
1290  ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1291 
1292  tmp = (DWORD)(*(fvalue + 2) * INT_FLOAT_MULTI);
1293  tmp += ((DWORD)(*(fvalue + 1) * INT_FLOAT_MULTI)) << 8;
1294  tmp += ((DWORD)(*fvalue * INT_FLOAT_MULTI)) << 16;
1295  tmp += ((DWORD)(*(fvalue + 3) * INT_FLOAT_MULTI)) << 24;
1296 
1297  if (*res_value != tmp) ++err;
1298  }
1299  else if (!res_desc->Elements && (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR))
1300  {
1301  ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1302 
1303  for (l = 0; l < res_desc->Columns; ++l)
1304  {
1305  if (!compare_float(fvalue[l], get_float(res_desc->Type, &res_value[l]), 512)) ++err;
1306  }
1307 
1308  for (l = res_desc->Columns; l < 4; ++l) if (fvalue[l] != 0.0f) ++err;
1309  }
1310  else
1311  {
1312  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1313  i, res_full_name, hr, D3DERR_INVALIDCALL);
1314 
1315  for (l = 0; l < 4; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1316  }
1317  ok(!err, "%u - %s: GetVector failed with %u errors\n", i, res_full_name, err);
1318 }
1319 
1321  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1322 {
1323  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1324  const char *res_full_name = res->full_name;
1325  HRESULT hr;
1326  DWORD cmp = 0xabababab;
1328  UINT l, k, element, err = 0;
1329 
1330  for (element = 0; element <= res_desc->Elements + 1; ++element)
1331  {
1332  memset(fvalue, 0xab, sizeof(fvalue));
1333  hr = effect->lpVtbl->GetVectorArray(effect, parameter, (D3DXVECTOR4 *)&fvalue, element);
1334  if (!element)
1335  {
1336  ok(hr == D3D_OK, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1337 
1338  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1339  }
1340  else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_VECTOR)
1341  {
1342  ok(hr == D3D_OK, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1343 
1344  for (k = 0; k < element; ++k)
1345  {
1346  for (l = 0; l < res_desc->Columns; ++l)
1347  {
1348  if (!compare_float(fvalue[l + k * 4], get_float(res_desc->Type,
1349  &res_value[l + k * res_desc->Columns]), 512))
1350  ++err;
1351  }
1352 
1353  for (l = res_desc->Columns; l < 4; ++l) if (fvalue[l + k * 4] != 0.0f) ++err;
1354  }
1355 
1356  for (l = element * 4; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1357  }
1358  else
1359  {
1360  ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetVectorArray failed, got %#x, expected %#x\n",
1361  i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1362 
1363  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1364  }
1365  ok(!err, "%u - %s[%u]: GetVectorArray failed with %u errors\n", i, res_full_name, element, err);
1366  }
1367 }
1368 
1370  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1371 {
1372  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1373  const char *res_full_name = res->full_name;
1374  HRESULT hr;
1375  union
1376  {
1377  DWORD d;
1378  float f;
1379  } cmp;
1380  float fvalue[16];
1381  UINT l, k, err = 0;
1382 
1383  cmp.d = 0xabababab;
1384  memset(fvalue, 0xab, sizeof(fvalue));
1385  hr = effect->lpVtbl->GetMatrix(effect, parameter, (D3DXMATRIX *)&fvalue);
1386  if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1387  {
1388  ok(hr == D3D_OK, "%u - %s: GetMatrix failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK);
1389 
1390  for (k = 0; k < 4; ++k)
1391  {
1392  for (l = 0; l < 4; ++l)
1393  {
1394  if (k < res_desc->Columns && l < res_desc->Rows)
1395  {
1396  if (!compare_float(fvalue[l * 4 + k], get_float(res_desc->Type,
1397  &res_value[l * res_desc->Columns + k]), 512))
1398  ++err;
1399  }
1400  else if (fvalue[l * 4 + k] != 0.0f) ++err;
1401  }
1402  }
1403  }
1404  else
1405  {
1406  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x.\n",
1407  i, res_full_name, hr, D3DERR_INVALIDCALL);
1408 
1409  for (l = 0; l < ARRAY_SIZE(fvalue); ++l)
1410  if (fvalue[l] != cmp.f)
1411  ++err;
1412  }
1413  ok(!err, "%u - %s: GetMatrix failed with %u errors.\n", i, res_full_name, err);
1414 }
1415 
1417  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1418 {
1419  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1420  const char *res_full_name = res->full_name;
1421  HRESULT hr;
1422  DWORD cmp = 0xabababab;
1424  UINT l, k, m, element, err = 0;
1425 
1426  for (element = 0; element <= res_desc->Elements + 1; ++element)
1427  {
1428  memset(fvalue, 0xab, sizeof(fvalue));
1429  hr = effect->lpVtbl->GetMatrixArray(effect, parameter, (D3DXMATRIX *)&fvalue, element);
1430  if (!element)
1431  {
1432  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1433 
1434  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1435  }
1436  else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1437  {
1438  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, element, hr, D3D_OK);
1439 
1440  for (m = 0; m < element; ++m)
1441  {
1442  for (k = 0; k < 4; ++k)
1443  {
1444  for (l = 0; l < 4; ++l)
1445  {
1446  if (k < res_desc->Columns && l < res_desc->Rows)
1447  {
1448  if (!compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type,
1449  &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1450  ++err;
1451  }
1452  else if (fvalue[m * 16 + l * 4 + k] != 0.0f) ++err;
1453  }
1454  }
1455  }
1456 
1457  for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1458  }
1459  else
1460  {
1461  ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixArray failed, got %#x, expected %#x\n",
1462  i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1463 
1464  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1465  }
1466  ok(!err, "%u - %s[%u]: GetMatrixArray failed with %u errors\n", i, res_full_name, element, err);
1467  }
1468 }
1469 
1471  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1472 {
1473  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1474  const char *res_full_name = res->full_name;
1475  HRESULT hr;
1476  DWORD cmp = 0xabababab;
1478  D3DXMATRIX *matrix_pointer_array[sizeof(fvalue)/sizeof(D3DXMATRIX)];
1479  UINT l, k, m, element, err = 0;
1480 
1481  for (element = 0; element <= res_desc->Elements + 1; ++element)
1482  {
1483  memset(fvalue, 0xab, sizeof(fvalue));
1484  for (l = 0; l < element; ++l)
1485  {
1486  matrix_pointer_array[l] = (D3DXMATRIX *)&fvalue[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
1487  }
1488  hr = effect->lpVtbl->GetMatrixPointerArray(effect, parameter, matrix_pointer_array, element);
1489  if (!element)
1490  {
1491  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1492  i, res_full_name, element, hr, D3D_OK);
1493 
1494  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1495  }
1496  else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1497  {
1498  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1499  i, res_full_name, element, hr, D3D_OK);
1500 
1501  for (m = 0; m < element; ++m)
1502  {
1503  for (k = 0; k < 4; ++k)
1504  {
1505  for (l = 0; l < 4; ++l)
1506  {
1507  if (k < res_desc->Columns && l < res_desc->Rows)
1508  {
1509  if (!compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type,
1510  &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1511  ++err;
1512  }
1513  else if (fvalue[m * 16 + l * 4 + k] != 0.0f) ++err;
1514  }
1515  }
1516  }
1517 
1518  for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1519  }
1520  else
1521  {
1522  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1523 
1524  ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1525  i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1526  }
1527  ok(!err, "%u - %s[%u]: GetMatrixPointerArray failed with %u errors\n", i, res_full_name, element, err);
1528  }
1529 }
1530 
1532  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1533 {
1534  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1535  const char *res_full_name = res->full_name;
1536  HRESULT hr;
1537  union
1538  {
1539  DWORD d;
1540  float f;
1541  } cmp;
1542  float fvalue[16];
1543  UINT l, k, err = 0;
1544 
1545  cmp.d = 0xabababab;
1546  memset(fvalue, 0xab, sizeof(fvalue));
1547  hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, (D3DXMATRIX *)&fvalue);
1548  if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1549  {
1550  ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK);
1551 
1552  for (k = 0; k < 4; ++k)
1553  {
1554  for (l = 0; l < 4; ++l)
1555  {
1556  if (k < res_desc->Columns && l < res_desc->Rows)
1557  {
1558  if (!compare_float(fvalue[l + k * 4], get_float(res_desc->Type,
1559  &res_value[l * res_desc->Columns + k]), 512))
1560  ++err;
1561  }
1562  else if (fvalue[l + k * 4] != 0.0f) ++err;
1563  }
1564  }
1565  }
1566  else if (!res_desc->Elements && (res_desc->Class == D3DXPC_VECTOR || res_desc->Class == D3DXPC_SCALAR))
1567  {
1568  ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n", i, res_full_name, hr, D3D_OK);
1569 
1570  for (k = 0; k < 4; ++k)
1571  {
1572  for (l = 0; l < 4; ++l)
1573  {
1574  if (k < res_desc->Columns && l < res_desc->Rows)
1575  {
1576  if (!compare_float(fvalue[l * 4 + k], get_float(res_desc->Type,
1577  &res_value[l * res_desc->Columns + k]), 512))
1578  ++err;
1579  }
1580  else if (fvalue[l * 4 + k] != 0.0f) ++err;
1581  }
1582  }
1583  }
1584  else
1585  {
1586  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x.\n",
1587  i, res_full_name, hr, D3DERR_INVALIDCALL);
1588 
1589  for (l = 0; l < ARRAY_SIZE(fvalue); ++l)
1590  if (fvalue[l] != cmp.f)
1591  ++err;
1592  }
1593  ok(!err, "%u - %s: GetMatrixTranspose failed with %u errors.\n", i, res_full_name, err);
1594 }
1595 
1597  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1598 {
1599  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1600  const char *res_full_name = res->full_name;
1601  HRESULT hr;
1602  DWORD cmp = 0xabababab;
1604  UINT l, k, m, element, err = 0;
1605 
1606  for (element = 0; element <= res_desc->Elements + 1; ++element)
1607  {
1608  memset(fvalue, 0xab, sizeof(fvalue));
1609  hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)&fvalue, element);
1610  if (!element)
1611  {
1612  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1613  i, res_full_name, element, hr, D3D_OK);
1614 
1615  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1616  }
1617  else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1618  {
1619  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1620  i, res_full_name, element, hr, D3D_OK);
1621 
1622  for (m = 0; m < element; ++m)
1623  {
1624  for (k = 0; k < 4; ++k)
1625  {
1626  for (l = 0; l < 4; ++l)
1627  {
1628  if (k < res_desc->Columns && l < res_desc->Rows)
1629  {
1630  if (!compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type,
1631  &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1632  ++err;
1633  }
1634  else if (fvalue[m * 16 + l + k * 4] != 0.0f) ++err;
1635  }
1636  }
1637  }
1638 
1639  for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1640  }
1641  else
1642  {
1643  ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1644  i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1645 
1646  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1647  }
1648  ok(!err, "%u - %s[%u]: GetMatrixTransposeArray failed with %u errors\n", i, res_full_name, element, err);
1649  }
1650 }
1651 
1653  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1654 {
1655  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1656  const char *res_full_name = res->full_name;
1657  HRESULT hr;
1658  DWORD cmp = 0xabababab;
1660  D3DXMATRIX *matrix_pointer_array[sizeof(fvalue)/sizeof(D3DXMATRIX)];
1661  UINT l, k, m, element, err = 0;
1662 
1663  for (element = 0; element <= res_desc->Elements + 1; ++element)
1664  {
1665  memset(fvalue, 0xab, sizeof(fvalue));
1666  for (l = 0; l < element; ++l)
1667  {
1668  matrix_pointer_array[l] = (D3DXMATRIX *)&fvalue[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
1669  }
1670  hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, parameter, matrix_pointer_array, element);
1671  if (!element)
1672  {
1673  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
1674  i, res_full_name, element, hr, D3D_OK);
1675 
1676  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1677  }
1678  else if (element <= res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1679  {
1680  ok(hr == D3D_OK, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
1681  i, res_full_name, element, hr, D3D_OK);
1682 
1683  for (m = 0; m < element; ++m)
1684  {
1685  for (k = 0; k < 4; ++k)
1686  {
1687  for (l = 0; l < 4; ++l)
1688  {
1689  if (k < res_desc->Columns && l < res_desc->Rows)
1690  {
1691  if (!compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type,
1692  &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512))
1693  ++err;
1694  }
1695  else if (fvalue[m * 16 + l + k * 4] != 0.0f) ++err;
1696  }
1697  }
1698  }
1699 
1700  for (l = element * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1701  }
1702  else
1703  {
1704  ok(hr == D3DERR_INVALIDCALL, "%u - %s[%u]: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
1705  i, res_full_name, element, hr, D3DERR_INVALIDCALL);
1706 
1707  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l) if (fvalue[l] != *(FLOAT *)&cmp) ++err;
1708  }
1709  ok(!err, "%u - %s[%u]: GetMatrixTransposePointerArray failed with %u errors\n", i, res_full_name, element, err);
1710  }
1711 }
1712 
1714  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1715 {
1716  test_effect_parameter_value_GetValue(res, effect, res_value, parameter, i);
1717  test_effect_parameter_value_GetBool(res, effect, res_value, parameter, i);
1718  test_effect_parameter_value_GetBoolArray(res, effect, res_value, parameter, i);
1719  test_effect_parameter_value_GetInt(res, effect, res_value, parameter, i);
1720  test_effect_parameter_value_GetIntArray(res, effect, res_value, parameter, i);
1721  test_effect_parameter_value_GetFloat(res, effect, res_value, parameter, i);
1722  test_effect_parameter_value_GetFloatArray(res, effect, res_value, parameter, i);
1723  test_effect_parameter_value_GetVector(res, effect, res_value, parameter, i);
1724  test_effect_parameter_value_GetVectorArray(res, effect, res_value, parameter, i);
1725  test_effect_parameter_value_GetMatrix(res, effect, res_value, parameter, i);
1726  test_effect_parameter_value_GetMatrixArray(res, effect, res_value, parameter, i);
1727  test_effect_parameter_value_GetMatrixPointerArray(res, effect, res_value, parameter, i);
1728  test_effect_parameter_value_GetMatrixTranspose(res, effect, res_value, parameter, i);
1729  test_effect_parameter_value_GetMatrixTransposeArray(res, effect, res_value, parameter, i);
1730  test_effect_parameter_value_GetMatrixTransposePointerArray(res, effect, res_value, parameter, i);
1731 }
1732 
1734  ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1735 {
1736  const D3DXPARAMETER_DESC *res_desc = &res->desc;
1737  const char *res_full_name = res->full_name;
1738  HRESULT hr;
1739 
1740  if (res_desc->Class == D3DXPC_SCALAR
1741  || res_desc->Class == D3DXPC_VECTOR
1742  || res_desc->Class == D3DXPC_MATRIX_ROWS)
1743  {
1744  hr = effect->lpVtbl->SetValue(effect, parameter, res_value, res_desc->Bytes);
1745  ok(hr == D3D_OK, "%u - %s: SetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1746  }
1747  else
1748  {
1749  /* nothing to do */
1750  switch (res_desc->Type)
1751  {
1752  case D3DXPT_PIXELSHADER:
1753  case D3DXPT_VERTEXSHADER:
1754  case D3DXPT_TEXTURE2D:
1755  case D3DXPT_STRING:
1756  break;
1757 
1758  default:
1759  ok(0, "Type is %u, this should not happen!\n", res_desc->Type);
1760  break;
1761  }
1762  }
1763 }
1764 
1765 static void test_effect_parameter_value(IDirect3DDevice9 *device)
1766 {
1767  unsigned int effect_count = ARRAY_SIZE(test_effect_parameter_value_data), i;
1768 
1769  for (i = 0; i < effect_count; ++i)
1770  {
1775  HRESULT hr;
1776  ID3DXEffect *effect;
1777  D3DXEFFECT_DESC edesc;
1778  ULONG count;
1779  UINT k;
1780 
1781  hr = D3DXCreateEffect(device, blob, blob_size, NULL, NULL, 0, NULL, &effect, NULL);
1782  ok(hr == D3D_OK, "%u: D3DXCreateEffect failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1783 
1784  hr = effect->lpVtbl->GetDesc(effect, &edesc);
1785  ok(hr == D3D_OK, "%u: GetDesc failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1786  ok(edesc.Parameters == res_count, "%u: Parameters failed, got %u, expected %u\n",
1787  i, edesc.Parameters, res_count);
1788 
1789  for (k = 0; k < res_count; ++k)
1790  {
1791  const D3DXPARAMETER_DESC *res_desc = &res[k].desc;
1792  const char *res_full_name = res[k].full_name;
1793  UINT res_value_offset = res[k].value_offset;
1794  D3DXHANDLE parameter;
1795  D3DXPARAMETER_DESC pdesc;
1796  BOOL bvalue = TRUE;
1797  INT ivalue = 42;
1798  FLOAT fvalue = 2.71828f;
1800  DWORD expected_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1801  UINT l, n, m, element;
1802  const D3DXMATRIX *matrix_pointer_array[sizeof(input_value)/sizeof(D3DXMATRIX)];
1803 
1804  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, res_full_name);
1805  ok(parameter != NULL, "%u - %s: GetParameterByName failed\n", i, res_full_name);
1806 
1807  hr = effect->lpVtbl->GetParameterDesc(effect, parameter, &pdesc);
1808  ok(hr == D3D_OK, "%u - %s: GetParameterDesc failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1809 
1810  ok(res_desc->Name ? !strcmp(pdesc.Name, res_desc->Name) : !pdesc.Name,
1811  "%u - %s: GetParameterDesc Name failed, got \"%s\", expected \"%s\"\n",
1812  i, res_full_name, pdesc.Name, res_desc->Name);
1813  ok(res_desc->Semantic ? !strcmp(pdesc.Semantic, res_desc->Semantic) : !pdesc.Semantic,
1814  "%u - %s: GetParameterDesc Semantic failed, got \"%s\", expected \"%s\"\n",
1815  i, res_full_name, pdesc.Semantic, res_desc->Semantic);
1816  ok(res_desc->Class == pdesc.Class, "%u - %s: GetParameterDesc Class failed, got %#x, expected %#x\n",
1817  i, res_full_name, pdesc.Class, res_desc->Class);
1818  ok(res_desc->Type == pdesc.Type, "%u - %s: GetParameterDesc Type failed, got %#x, expected %#x\n",
1819  i, res_full_name, pdesc.Type, res_desc->Type);
1820  ok(res_desc->Rows == pdesc.Rows, "%u - %s: GetParameterDesc Rows failed, got %u, expected %u\n",
1821  i, res_full_name, pdesc.Rows, res_desc->Rows);
1822  ok(res_desc->Columns == pdesc.Columns, "%u - %s: GetParameterDesc Columns failed, got %u, expected %u\n",
1823  i, res_full_name, pdesc.Columns, res_desc->Columns);
1824  ok(res_desc->Elements == pdesc.Elements, "%u - %s: GetParameterDesc Elements failed, got %u, expected %u\n",
1825  i, res_full_name, pdesc.Elements, res_desc->Elements);
1826  ok(res_desc->Annotations == pdesc.Annotations, "%u - %s: GetParameterDesc Annotations failed, got %u, expected %u\n",
1827  i, res_full_name, pdesc.Annotations, res_desc->Annotations);
1828  ok(res_desc->StructMembers == pdesc.StructMembers, "%u - %s: GetParameterDesc StructMembers failed, got %u, expected %u\n",
1829  i, res_full_name, pdesc.StructMembers, res_desc->StructMembers);
1830  ok(res_desc->Flags == pdesc.Flags, "%u - %s: GetParameterDesc Flags failed, got %u, expected %u\n",
1831  i, res_full_name, pdesc.Flags, res_desc->Flags);
1832  ok(res_desc->Bytes == pdesc.Bytes, "%u - %s: GetParameterDesc Bytes, got %u, expected %u\n",
1833  i, res_full_name, pdesc.Bytes, res_desc->Bytes);
1834 
1835  /* check size */
1836  ok(EFFECT_PARAMETER_VALUE_ARRAY_SIZE >= res_desc->Bytes / 4 +
1837  (res_desc->Elements ? res_desc->Bytes / 4 / res_desc->Elements : 0),
1838  "%u - %s: Warning: Array size too small\n", i, res_full_name);
1839 
1840  test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1841  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1842  test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1843 
1844  /*
1845  * check invalid calls
1846  * These will crash:
1847  * effect->lpVtbl->SetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL));
1848  * effect->lpVtbl->SetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT));
1849  * effect->lpVtbl->SetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT));
1850  * effect->lpVtbl->SetVector(effect, parameter, NULL);
1851  * effect->lpVtbl->SetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1852  * effect->lpVtbl->SetMatrix(effect, parameter, NULL);
1853  * effect->lpVtbl->GetMatrix(effect, parameter, NULL);
1854  * effect->lpVtbl->SetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1855  * effect->lpVtbl->SetMatrixPointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1856  * effect->lpVtbl->SetMatrixTranspose(effect, parameter, NULL);
1857  * effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1858  * effect->lpVtbl->SetMatrixTransposePointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1859  * effect->lpVtbl->GetValue(effect, parameter, NULL, res_desc->Bytes);
1860  * effect->lpVtbl->SetValue(effect, parameter, NULL, res_desc->Bytes);
1861  */
1862  hr = effect->lpVtbl->SetBool(effect, NULL, bvalue);
1863  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n",
1864  i, res_full_name, hr, D3DERR_INVALIDCALL);
1865 
1866  hr = effect->lpVtbl->GetBool(effect, NULL, &bvalue);
1867  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1868  i, res_full_name, hr, D3DERR_INVALIDCALL);
1869 
1870  hr = effect->lpVtbl->GetBool(effect, parameter, NULL);
1871  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1872  i, res_full_name, hr, D3DERR_INVALIDCALL);
1873 
1874  hr = effect->lpVtbl->SetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL));
1875  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n",
1876  i, res_full_name, hr, D3DERR_INVALIDCALL);
1877 
1878  hr = effect->lpVtbl->GetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL));
1879  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1880  i, res_full_name, hr, D3DERR_INVALIDCALL);
1881 
1882  hr = effect->lpVtbl->GetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL));
1883  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1884  i, res_full_name, hr, D3DERR_INVALIDCALL);
1885 
1886  hr = effect->lpVtbl->SetInt(effect, NULL, ivalue);
1887  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n",
1888  i, res_full_name, hr, D3DERR_INVALIDCALL);
1889 
1890  hr = effect->lpVtbl->GetInt(effect, NULL, &ivalue);
1891  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1892  i, res_full_name, hr, D3DERR_INVALIDCALL);
1893 
1894  hr = effect->lpVtbl->GetInt(effect, parameter, NULL);
1895  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1896  i, res_full_name, hr, D3DERR_INVALIDCALL);
1897 
1898  hr = effect->lpVtbl->SetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT));
1899  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n",
1900  i, res_full_name, hr, D3DERR_INVALIDCALL);
1901 
1902  hr = effect->lpVtbl->GetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT));
1903  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1904  i, res_full_name, hr, D3DERR_INVALIDCALL);
1905 
1906  hr = effect->lpVtbl->GetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT));
1907  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1908  i, res_full_name, hr, D3DERR_INVALIDCALL);
1909 
1910  hr = effect->lpVtbl->SetFloat(effect, NULL, fvalue);
1911  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n",
1912  i, res_full_name, hr, D3DERR_INVALIDCALL);
1913 
1914  hr = effect->lpVtbl->GetFloat(effect, NULL, &fvalue);
1915  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1916  i, res_full_name, hr, D3DERR_INVALIDCALL);
1917 
1918  hr = effect->lpVtbl->GetFloat(effect, parameter, NULL);
1919  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1920  i, res_full_name, hr, D3DERR_INVALIDCALL);
1921 
1922  hr = effect->lpVtbl->SetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT));
1923  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n",
1924  i, res_full_name, hr, D3DERR_INVALIDCALL);
1925 
1926  hr = effect->lpVtbl->GetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT));
1927  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1928  i, res_full_name, hr, D3DERR_INVALIDCALL);
1929 
1930  hr = effect->lpVtbl->GetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT));
1931  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1932  i, res_full_name, hr, D3DERR_INVALIDCALL);
1933 
1934  hr = effect->lpVtbl->SetVector(effect, NULL, (D3DXVECTOR4 *)input_value);
1935  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n",
1936  i, res_full_name, hr, D3DERR_INVALIDCALL);
1937 
1938  hr = effect->lpVtbl->GetVector(effect, NULL, (D3DXVECTOR4 *)input_value);
1939  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1940  i, res_full_name, hr, D3DERR_INVALIDCALL);
1941 
1942  hr = effect->lpVtbl->GetVector(effect, parameter, NULL);
1943  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1944  i, res_full_name, hr, D3DERR_INVALIDCALL);
1945 
1946  hr = effect->lpVtbl->SetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1947  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n",
1948  i, res_full_name, hr, D3DERR_INVALIDCALL);
1949 
1950  hr = effect->lpVtbl->GetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1951  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1952  i, res_full_name, hr, D3DERR_INVALIDCALL);
1953 
1954  hr = effect->lpVtbl->GetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1955  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1956  i, res_full_name, hr, D3DERR_INVALIDCALL);
1957 
1958  hr = effect->lpVtbl->SetMatrix(effect, NULL, (D3DXMATRIX *)input_value);
1959  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n",
1960  i, res_full_name, hr, D3DERR_INVALIDCALL);
1961 
1962  hr = effect->lpVtbl->GetMatrix(effect, NULL, (D3DXMATRIX *)input_value);
1963  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x\n",
1964  i, res_full_name, hr, D3DERR_INVALIDCALL);
1965 
1966  hr = effect->lpVtbl->SetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1967  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n",
1968  i, res_full_name, hr, D3DERR_INVALIDCALL);
1969 
1970  hr = effect->lpVtbl->GetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1971  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1972  i, res_full_name, hr, D3DERR_INVALIDCALL);
1973 
1974  hr = effect->lpVtbl->GetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1975  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1976  i, res_full_name, hr, D3DERR_INVALIDCALL);
1977 
1978  hr = effect->lpVtbl->SetMatrixPointerArray(effect, NULL, matrix_pointer_array, res_desc->Elements ? res_desc->Elements : 1);
1979  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
1980  i, res_full_name, hr, D3DERR_INVALIDCALL);
1981 
1982  hr = effect->lpVtbl->SetMatrixPointerArray(effect, NULL, matrix_pointer_array, 0);
1983  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
1984  i, res_full_name, hr, D3DERR_INVALIDCALL);
1985 
1986  hr = effect->lpVtbl->GetMatrixPointerArray(effect, NULL, NULL, 0);
1987  ok(hr == D3D_OK, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1988  i, res_full_name, hr, D3D_OK);
1989 
1990  hr = effect->lpVtbl->GetMatrixPointerArray(effect, NULL, NULL, res_desc->Elements ? res_desc->Elements : 1);
1991  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1992  i, res_full_name, hr, D3DERR_INVALIDCALL);
1993 
1994  hr = effect->lpVtbl->GetMatrixPointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1995  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixPointerArray failed, got %#x, expected %#x\n",
1996  i, res_full_name, hr, D3DERR_INVALIDCALL);
1997 
1998  hr = effect->lpVtbl->SetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value);
1999  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n",
2000  i, res_full_name, hr, D3DERR_INVALIDCALL);
2001 
2002  hr = effect->lpVtbl->GetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value);
2003  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
2004  i, res_full_name, hr, D3DERR_INVALIDCALL);
2005 
2006  hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, NULL);
2007  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
2008  i, res_full_name, hr, D3DERR_INVALIDCALL);
2009 
2010  hr = effect->lpVtbl->SetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
2011  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n",
2012  i, res_full_name, hr, D3DERR_INVALIDCALL);
2013 
2014  hr = effect->lpVtbl->GetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
2015  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
2016  i, res_full_name, hr, D3DERR_INVALIDCALL);
2017 
2018  hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
2019  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
2020  i, res_full_name, hr, D3DERR_INVALIDCALL);
2021 
2022  hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, NULL, matrix_pointer_array, res_desc->Elements ? res_desc->Elements : 1);
2023  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2024  i, res_full_name, hr, D3DERR_INVALIDCALL);
2025 
2026  hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, NULL, matrix_pointer_array, 0);
2027  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2028  i, res_full_name, hr, D3DERR_INVALIDCALL);
2029 
2030  hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, NULL, NULL, 0);
2031  ok(hr == D3D_OK, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2032  i, res_full_name, hr, D3D_OK);
2033 
2034  hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, NULL, NULL, res_desc->Elements ? res_desc->Elements : 1);
2035  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2036  i, res_full_name, hr, D3DERR_INVALIDCALL);
2037 
2038  hr = effect->lpVtbl->GetMatrixTransposePointerArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
2039  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2040  i, res_full_name, hr, D3DERR_INVALIDCALL);
2041 
2042  hr = effect->lpVtbl->SetValue(effect, NULL, input_value, res_desc->Bytes);
2043  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n",
2044  i, res_full_name, hr, D3DERR_INVALIDCALL);
2045 
2046  hr = effect->lpVtbl->SetValue(effect, parameter, input_value, res_desc->Bytes - 1);
2047  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n",
2048  i, res_full_name, hr, D3DERR_INVALIDCALL);
2049 
2050  hr = effect->lpVtbl->GetValue(effect, NULL, input_value, res_desc->Bytes);
2051  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
2052  i, res_full_name, hr, D3DERR_INVALIDCALL);
2053 
2054  hr = effect->lpVtbl->GetValue(effect, parameter, input_value, res_desc->Bytes - 1);
2055  ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
2056  i, res_full_name, hr, D3DERR_INVALIDCALL);
2057 
2058  test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
2059 
2060  /* SetBool */
2061  bvalue = 5;
2062  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2063  hr = effect->lpVtbl->SetBool(effect, parameter, bvalue);
2064  if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
2065  {
2066  bvalue = TRUE;
2067  set_number(expected_value, res_desc->Type, &bvalue, D3DXPT_BOOL);
2068  ok(hr == D3D_OK, "%u - %s: SetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2069  }
2070  else
2071  {
2072  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n",
2073  i, res_full_name, hr, D3DERR_INVALIDCALL);
2074  }
2075  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2076  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2077 
2078  /* SetBoolArray */
2079  *input_value = 1;
2080  for (l = 1; l < res_desc->Bytes / sizeof(*input_value); ++l)
2081  {
2082  *(input_value + l) = *(input_value + l - 1) + 1;
2083  }
2084  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2085  hr = effect->lpVtbl->SetBoolArray(effect, parameter, (BOOL *)input_value, res_desc->Bytes / sizeof(*input_value));
2086  if (res_desc->Class == D3DXPC_SCALAR
2087  || res_desc->Class == D3DXPC_VECTOR
2088  || res_desc->Class == D3DXPC_MATRIX_ROWS)
2089  {
2090  for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2091  {
2092  set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_BOOL);
2093  }
2094  ok(hr == D3D_OK, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2095  }
2096  else
2097  {
2098  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n",
2099  i, res_full_name, hr, D3DERR_INVALIDCALL);
2100  }
2101  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2102  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2103 
2104  /* SetInt */
2105  ivalue = 0x1fbf02ff;
2106  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2107  hr = effect->lpVtbl->SetInt(effect, parameter, ivalue);
2108  if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
2109  {
2110  set_number(expected_value, res_desc->Type, &ivalue, D3DXPT_INT);
2111  ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2112  }
2113  else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
2114  ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
2115  (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
2116  {
2117  FLOAT tmp = ((ivalue & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
2118  set_number(expected_value, res_desc->Type, &tmp, D3DXPT_FLOAT);
2119  tmp = ((ivalue & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
2120  set_number(expected_value + 1, res_desc->Type, &tmp, D3DXPT_FLOAT);
2121  tmp = (ivalue & 0xff) * INT_FLOAT_MULTI_INVERSE;
2122  set_number(expected_value + 2, res_desc->Type, &tmp, D3DXPT_FLOAT);
2123  tmp = ((ivalue & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
2124  set_number(expected_value + 3, res_desc->Type, &tmp, D3DXPT_FLOAT);
2125 
2126  ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n",
2127  i, res_full_name, hr, D3D_OK);
2128  }
2129  else
2130  {
2131  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n",
2132  i, res_full_name, hr, D3DERR_INVALIDCALL);
2133  }
2134  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2135  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2136 
2137  /* SetIntArray */
2138  *input_value = 123456;
2139  for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2140  {
2141  *(input_value + l) = *(input_value + l - 1) + 23;
2142  }
2143  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2144  hr = effect->lpVtbl->SetIntArray(effect, parameter, (INT *)input_value, res_desc->Bytes / sizeof(*input_value));
2145  if (res_desc->Class == D3DXPC_SCALAR
2146  || res_desc->Class == D3DXPC_VECTOR
2147  || res_desc->Class == D3DXPC_MATRIX_ROWS)
2148  {
2149  for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2150  {
2151  set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_INT);
2152  }
2153  ok(hr == D3D_OK, "%u - %s: SetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2154  }
2155  else
2156  {
2157  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n",
2158  i, res_full_name, hr, D3DERR_INVALIDCALL);
2159  }
2160  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2161  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2162 
2163  /* SetFloat */
2164  fvalue = 1.33;
2165  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2166  hr = effect->lpVtbl->SetFloat(effect, parameter, fvalue);
2167  if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
2168  {
2169  set_number(expected_value, res_desc->Type, &fvalue, D3DXPT_FLOAT);
2170  ok(hr == D3D_OK, "%u - %s: SetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2171  }
2172  else
2173  {
2174  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n",
2175  i, res_full_name, hr, D3DERR_INVALIDCALL);
2176  }
2177  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2178  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2179 
2180  /* SetFloatArray */
2181  fvalue = 1.33;
2182  for (l = 0; l < res_desc->Bytes / sizeof(fvalue); ++l)
2183  {
2184  *(input_value + l) = *(DWORD *)&fvalue;
2185  fvalue += 1.12;
2186  }
2187  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2188  hr = effect->lpVtbl->SetFloatArray(effect, parameter, (FLOAT *)input_value, res_desc->Bytes / sizeof(*input_value));
2189  if (res_desc->Class == D3DXPC_SCALAR
2190  || res_desc->Class == D3DXPC_VECTOR
2191  || res_desc->Class == D3DXPC_MATRIX_ROWS)
2192  {
2193  for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
2194  {
2195  set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT);
2196  }
2197  ok(hr == D3D_OK, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2198  }
2199  else
2200  {
2201  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n",
2202  i, res_full_name, hr, D3DERR_INVALIDCALL);
2203  }
2204  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2205  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2206 
2207  /* SetVector */
2208  fvalue = -1.33;
2209  for (l = 0; l < 4; ++l)
2210  {
2211  *(input_value + l) = *(DWORD *)&fvalue;
2212  fvalue += 1.12;
2213  }
2214  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2215  hr = effect->lpVtbl->SetVector(effect, parameter, (D3DXVECTOR4 *)input_value);
2216  if (!res_desc->Elements &&
2217  (res_desc->Class == D3DXPC_SCALAR
2218  || res_desc->Class == D3DXPC_VECTOR))
2219  {
2220  /* only values between 0 and INT_FLOAT_MULTI are valid */
2221  if (res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
2222  {
2223  *expected_value = (DWORD)(max(min(*(FLOAT *)(input_value + 2), 1.0f), 0.0f) * INT_FLOAT_MULTI);
2224  *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 1), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 8;
2225  *expected_value += ((DWORD)(max(min(*(FLOAT *)input_value, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16;
2226  *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 3), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24;
2227  }
2228  else
2229  {
2230  for (l = 0; l < 4; ++l)
2231  {
2232  set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT);
2233  }
2234  }
2235  ok(hr == D3D_OK, "%u - %s: SetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2236  }
2237  else
2238  {
2239  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n",
2240  i, res_full_name, hr, D3DERR_INVALIDCALL);
2241  }
2242  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2243  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2244 
2245  /* SetVectorArray */
2246  for (element = 0; element < res_desc->Elements + 1; ++element)
2247  {
2248  fvalue = 1.33;
2249  for (l = 0; l < element * 4; ++l)
2250  {
2251  *(input_value + l) = *(DWORD *)&fvalue;
2252  fvalue += 1.12;
2253  }
2254  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2255  hr = effect->lpVtbl->SetVectorArray(effect, parameter, (D3DXVECTOR4 *)input_value, element);
2256  if (res_desc->Elements && res_desc->Class == D3DXPC_VECTOR && element <= res_desc->Elements)
2257  {
2258  for (m = 0; m < element; ++m)
2259  {
2260  for (l = 0; l < res_desc->Columns; ++l)
2261  {
2262  set_number(expected_value + m * res_desc->Columns + l, res_desc->Type, input_value + m * 4 + l, D3DXPT_FLOAT);
2263  }
2264  }
2265  ok(hr == D3D_OK, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2266  }
2267  else
2268  {
2269  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n",
2270  i, res_full_name, hr, D3DERR_INVALIDCALL);
2271  }
2272  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2273  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2274  }
2275 
2276  /* SetMatrix */
2277  fvalue = 1.33;
2278  for (l = 0; l < 16; ++l)
2279  {
2280  *(input_value + l) = *(DWORD *)&fvalue;
2281  fvalue += 1.12;
2282  }
2283  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2284  hr = effect->lpVtbl->SetMatrix(effect, parameter, (D3DXMATRIX *)input_value);
2285  if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
2286  {
2287  for (l = 0; l < 4; ++l)
2288  {
2289  for (m = 0; m < 4; ++m)
2290  {
2291  if (m < res_desc->Rows && l < res_desc->Columns)
2292  set_number(expected_value + l + m * res_desc->Columns, res_desc->Type,
2293  input_value + l + m * 4, D3DXPT_FLOAT);
2294  }
2295 
2296  }
2297  ok(hr == D3D_OK, "%u - %s: SetMatrix failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2298  }
2299  else
2300  {
2301  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n",
2302  i, res_full_name, hr, D3DERR_INVALIDCALL);
2303  }
2304  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2305  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2306 
2307  /* SetMatrixArray */
2308  for (element = 0; element < res_desc->Elements + 1; ++element)
2309  {
2310  fvalue = 1.33;
2311  for (l = 0; l < element * 16; ++l)
2312  {
2313  *(input_value + l) = *(DWORD *)&fvalue;
2314  fvalue += 1.12;
2315  }
2316  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2317  hr = effect->lpVtbl->SetMatrixArray(effect, parameter, (D3DXMATRIX *)input_value, element);
2318  if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements)
2319  {
2320  for (n = 0; n < element; ++n)
2321  {
2322  for (l = 0; l < 4; ++l)
2323  {
2324  for (m = 0; m < 4; ++m)
2325  {
2326  if (m < res_desc->Rows && l < res_desc->Columns)
2327  set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2328  res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT);
2329  }
2330 
2331  }
2332  }
2333  ok(hr == D3D_OK, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2334  }
2335  else
2336  {
2337  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n",
2338  i, res_full_name, hr, D3DERR_INVALIDCALL);
2339  }
2340  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2341  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2342  }
2343 
2344  /* SetMatrixPointerArray */
2345  for (element = 0; element < res_desc->Elements + 1; ++element)
2346  {
2347  fvalue = 1.33;
2348  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
2349  {
2350  *(input_value + l) = *(DWORD *)&fvalue;
2351  fvalue += 1.12;
2352  }
2353  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2354  for (l = 0; l < element; ++l)
2355  {
2356  matrix_pointer_array[l] = (D3DXMATRIX *)&input_value[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
2357  }
2358  hr = effect->lpVtbl->SetMatrixPointerArray(effect, parameter, matrix_pointer_array, element);
2359  if (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Elements >= element)
2360  {
2361  for (n = 0; n < element; ++n)
2362  {
2363  for (l = 0; l < 4; ++l)
2364  {
2365  for (m = 0; m < 4; ++m)
2366  {
2367  if (m < res_desc->Rows && l < res_desc->Columns)
2368  set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2369  res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT);
2370  }
2371 
2372  }
2373  }
2374  ok(hr == D3D_OK, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
2375  i, res_full_name, hr, D3D_OK);
2376  }
2377  else
2378  {
2379  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixPointerArray failed, got %#x, expected %#x\n",
2380  i, res_full_name, hr, D3DERR_INVALIDCALL);
2381  }
2382  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2383  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2384  }
2385 
2386  /* SetMatrixTranspose */
2387  fvalue = 1.33;
2388  for (l = 0; l < 16; ++l)
2389  {
2390  *(input_value + l) = *(DWORD *)&fvalue;
2391  fvalue += 1.12;
2392  }
2393  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2394  hr = effect->lpVtbl->SetMatrixTranspose(effect, parameter, (D3DXMATRIX *)input_value);
2395  if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
2396  {
2397  for (l = 0; l < 4; ++l)
2398  {
2399  for (m = 0; m < 4; ++m)
2400  {
2401  if (m < res_desc->Rows && l < res_desc->Columns)
2402  set_number(expected_value + l + m * res_desc->Columns, res_desc->Type,
2403  input_value + l * 4 + m, D3DXPT_FLOAT);
2404  }
2405 
2406  }
2407  ok(hr == D3D_OK, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2408  }
2409  else
2410  {
2411  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n",
2412  i, res_full_name, hr, D3DERR_INVALIDCALL);
2413  }
2414  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2415  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2416 
2417  /* SetMatrixTransposeArray */
2418  for (element = 0; element < res_desc->Elements + 1; ++element)
2419  {
2420  fvalue = 1.33;
2421  for (l = 0; l < element * 16; ++l)
2422  {
2423  *(input_value + l) = *(DWORD *)&fvalue;
2424  fvalue += 1.12;
2425  }
2426  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2427  hr = effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)input_value, element);
2428  if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements)
2429  {
2430  for (n = 0; n < element; ++n)
2431  {
2432  for (l = 0; l < 4; ++l)
2433  {
2434  for (m = 0; m < 4; ++m)
2435  {
2436  if (m < res_desc->Rows && l < res_desc->Columns)
2437  set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2438  res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT);
2439  }
2440 
2441  }
2442  }
2443  ok(hr == D3D_OK, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2444  }
2445  else
2446  {
2447  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n",
2448  i, res_full_name, hr, D3DERR_INVALIDCALL);
2449  }
2450  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2451  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2452  }
2453 
2454  /* SetMatrixTransposePointerArray */
2455  for (element = 0; element < res_desc->Elements + 1; ++element)
2456  {
2457  fvalue = 1.33;
2458  for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
2459  {
2460  *(input_value + l) = *(DWORD *)&fvalue;
2461  fvalue += 1.12;
2462  }
2463  memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2464  for (l = 0; l < element; ++l)
2465  {
2466  matrix_pointer_array[l] = (D3DXMATRIX *)&input_value[l * sizeof(**matrix_pointer_array) / sizeof(FLOAT)];
2467  }
2468  hr = effect->lpVtbl->SetMatrixTransposePointerArray(effect, parameter, matrix_pointer_array, element);
2469  if (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Elements >= element)
2470  {
2471  for (n = 0; n < element; ++n)
2472  {
2473  for (l = 0; l < 4; ++l)
2474  {
2475  for (m = 0; m < 4; ++m)
2476  {
2477  if (m < res_desc->Rows && l < res_desc->Columns)
2478  set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2479  res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT);
2480  }
2481 
2482  }
2483  }
2484  ok(hr == D3D_OK, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2485  i, res_full_name, hr, D3D_OK);
2486  }
2487  else
2488  {
2489  ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposePointerArray failed, got %#x, expected %#x\n",
2490  i, res_full_name, hr, D3DERR_INVALIDCALL);
2491  }
2492  test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2493  test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2494  }
2495  }
2496 
2497  count = effect->lpVtbl->Release(effect);
2498  ok(!count, "Release failed %u\n", count);
2499  }
2500 }
2501 
2502 static void test_effect_setvalue_object(IDirect3DDevice9 *device)
2503 {
2504  static const char expected_string[] = "test_string_1";
2505  static const char expected_string2[] = "test_longer_string_2";
2506  static const char *expected_string_array[] = {expected_string, expected_string2};
2507  const char *string_array[ARRAY_SIZE(expected_string_array)];
2508  const char *string, *string2;
2509  IDirect3DTexture9 *texture_set;
2510  IDirect3DTexture9 *texture;
2511  D3DXHANDLE parameter;
2512  ID3DXEffect *effect;
2513  unsigned int i;
2514  ULONG count;
2515  HRESULT hr;
2516 
2518  sizeof(test_effect_parameter_value_blob_object), NULL, NULL, 0, NULL, &effect, NULL);
2519  ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2520 
2521  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "tex");
2522  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2523 
2524  texture = NULL;
2526  ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2527  hr = effect->lpVtbl->SetValue(effect, parameter, &texture, sizeof(texture));
2528  ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2529  texture_set = NULL;
2530  hr = effect->lpVtbl->GetValue(effect, parameter, &texture_set, sizeof(texture_set));
2531  ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2532  ok(texture == texture_set, "Texture does not match.\n");
2533 
2534  count = IDirect3DTexture9_Release(texture_set);
2535  ok(count == 2, "Got reference count %u, expected 2.\n", count);
2536  texture_set = NULL;
2537  hr = effect->lpVtbl->SetValue(effect, parameter, &texture_set, sizeof(texture_set));
2538  ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
2540  ok(!count, "Got reference count %u, expected 0.\n", count);
2541 
2542  hr = effect->lpVtbl->SetString(effect, "s", expected_string);
2543  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2544  string = NULL;
2545  hr = effect->lpVtbl->GetString(effect, "s", &string);
2546  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2547  hr = effect->lpVtbl->GetString(effect, "s", &string2);
2548  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2549 
2550  ok(string != expected_string, "String pointers are the same.\n");
2551  ok(string == string2, "String pointers differ.\n");
2552  ok(!strcmp(string, expected_string), "Unexpected string '%s'.\n", string);
2553 
2554  string = expected_string2;
2555  hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string) - 1);
2556  ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
2557  hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string));
2558  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2559  hr = effect->lpVtbl->SetValue(effect, "s", &string, sizeof(string) * 2);
2560  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2561  string = NULL;
2562  hr = effect->lpVtbl->GetValue(effect, "s", &string, sizeof(string));
2563  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2564 
2565  ok(string != expected_string2, "String pointers are the same.\n");
2566  ok(!strcmp(string, expected_string2), "Unexpected string '%s'.\n", string);
2567 
2568  hr = effect->lpVtbl->SetValue(effect, "s_2", expected_string_array,
2569  sizeof(expected_string_array));
2570  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2571  hr = effect->lpVtbl->GetValue(effect, "s_2", string_array,
2572  sizeof(string_array));
2573  ok(hr == D3D_OK, "Got result %#x.\n", hr);
2574  for (i = 0; i < ARRAY_SIZE(expected_string_array); ++i)
2575  {
2576  ok(!strcmp(string_array[i], expected_string_array[i]), "Unexpected string '%s', i %u.\n",
2577  string_array[i], i);
2578  }
2579  effect->lpVtbl->Release(effect);
2580 }
2581 
2582 /*
2583  * fxc.exe /Tfx_2_0
2584  */
2585 #if 0
2586 float a = 2.1;
2587 float b[1];
2588 float c <float d = 3;>;
2589 struct {float e;} f;
2590 float g <float h[1] = {3};>;
2591 struct s {float j;};
2592 float i <s k[1] = {4};>;
2593 technique t <s l[1] = {5};> { pass p <s m[1] = {6};> { } }
2594 #endif
2596 {
2597 0xfeff0901, 0x0000024c, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
2598 0x00000001, 0x00000001, 0x40066666, 0x00000002, 0x00000061, 0x00000003, 0x00000000, 0x0000004c,
2599 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x00000002, 0x00000062, 0x00000003,
2600 0x00000000, 0x0000009c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x40400000,
2601 0x00000003, 0x00000000, 0x00000094, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002,
2602 0x00000064, 0x00000002, 0x00000063, 0x00000000, 0x00000005, 0x000000dc, 0x00000000, 0x00000000,
2603 0x00000001, 0x00000003, 0x00000000, 0x000000e4, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
2604 0x00000000, 0x00000002, 0x00000066, 0x00000002, 0x00000065, 0x00000003, 0x00000000, 0x00000134,
2605 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x40400000, 0x00000003, 0x00000000,
2606 0x0000012c, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000068, 0x00000002,
2607 0x00000067, 0x00000003, 0x00000000, 0x000001a4, 0x00000000, 0x00000000, 0x00000001, 0x00000001,
2608 0x00000000, 0x40800000, 0x00000000, 0x00000005, 0x00000194, 0x00000000, 0x00000001, 0x00000001,
2609 0x00000003, 0x00000000, 0x0000019c, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002,
2610 0x0000006b, 0x00000002, 0x0000006a, 0x00000002, 0x00000069, 0x40a00000, 0x00000000, 0x00000005,
2611 0x000001e4, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000000, 0x000001ec, 0x00000000,
2612 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x0000006c, 0x00000002, 0x0000006a, 0x40c00000,
2613 0x00000000, 0x00000005, 0x0000022c, 0x00000000, 0x00000001, 0x00000001, 0x00000003, 0x00000000,
2614 0x00000234, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x0000006d, 0x00000002,
2615 0x0000006a, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001, 0x00000001,
2616 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000,
2617 0x00000000, 0x00000054, 0x00000070, 0x00000000, 0x00000001, 0x00000078, 0x00000074, 0x000000a4,
2618 0x000000d8, 0x00000000, 0x00000000, 0x000000ec, 0x00000108, 0x00000000, 0x00000001, 0x00000110,
2619 0x0000010c, 0x0000013c, 0x00000158, 0x00000000, 0x00000001, 0x00000160, 0x0000015c, 0x00000244,
2620 0x00000001, 0x00000001, 0x000001b0, 0x000001ac, 0x0000023c, 0x00000001, 0x00000000, 0x000001f8,
2621 0x000001f4, 0x00000000, 0x00000000,
2622 };
2623 
2624 static void test_effect_variable_names(IDirect3DDevice9 *device)
2625 {
2626  ID3DXEffect *effect;
2627  ULONG count;
2628  HRESULT hr;
2629  D3DXHANDLE parameter, p;
2630 
2632  sizeof(test_effect_variable_names_blob), NULL, NULL, 0, NULL, &effect, NULL);
2633  ok(hr == D3D_OK, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3D_OK);
2634 
2635  /*
2636  * check invalid calls
2637  * This will crash:
2638  * effect->lpVtbl->GetAnnotationByName(effect, "invalid1", "invalid2");
2639  */
2640  p = effect->lpVtbl->GetParameterByName(effect, NULL, NULL);
2641  ok(p == NULL, "GetParameterByName failed, got %p, expected %p\n", p, NULL);
2642 
2643  p = effect->lpVtbl->GetParameterByName(effect, NULL, "invalid1");
2644  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2645 
2646  p = effect->lpVtbl->GetParameterByName(effect, "invalid1", NULL);
2647  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2648 
2649  p = effect->lpVtbl->GetParameterByName(effect, "invalid1", "invalid2");
2650  ok(p == NULL, "GetParameterByName failed, got %p, expected %p\n", p, NULL);
2651 
2652  /* float a; */
2653  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "a");
2654  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2655 
2656  p = effect->lpVtbl->GetParameterByName(effect, "a", NULL);
2657  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2658 
2659  /* members */
2660  p = effect->lpVtbl->GetParameterByName(effect, NULL, "a.");
2661  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2662 
2663  p = effect->lpVtbl->GetParameterByName(effect, "a.", NULL);
2664  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2665 
2666  p = effect->lpVtbl->GetParameterByName(effect, "a", ".");
2667  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2668 
2669  p = effect->lpVtbl->GetParameterByName(effect, NULL, "a.invalid");
2670  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2671 
2672  p = effect->lpVtbl->GetParameterByName(effect, "a.invalid", NULL);
2673  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2674 
2675  p = effect->lpVtbl->GetParameterByName(effect, "a", ".invalid");
2676  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2677 
2678  p = effect->lpVtbl->GetParameterByName(effect, "a.", "invalid");
2679  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2680 
2681  p = effect->lpVtbl->GetParameterByName(effect, "a", "invalid");
2682  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2683 
2684  /* elements */
2685  p = effect->lpVtbl->GetParameterByName(effect, NULL, "a[]");
2686  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2687 
2688  p = effect->lpVtbl->GetParameterByName(effect, "a[]", NULL);
2689  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2690 
2691  p = effect->lpVtbl->GetParameterByName(effect, NULL, "a[0]");
2692  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2693 
2694  p = effect->lpVtbl->GetParameterByName(effect, "a[0]", NULL);
2695  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2696 
2697  p = effect->lpVtbl->GetParameterByName(effect, "a", "[0]");
2698  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2699 
2700  p = effect->lpVtbl->GetParameterElement(effect, "a", 0);
2701  ok(p == NULL, "GetParameterElement failed, got %p\n", p);
2702 
2703  /* annotations */
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, "a", "@invalid");
2711  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2712 
2713  p = effect->lpVtbl->GetParameterByName(effect, "a@", "invalid");
2714  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2715 
2716  p = effect->lpVtbl->GetParameterByName(effect, NULL, "a@invalid");
2717  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2718 
2719  p = effect->lpVtbl->GetParameterByName(effect, "a@invalid", NULL);
2720  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2721 
2722  p = effect->lpVtbl->GetAnnotationByName(effect, "a", NULL);
2723  ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2724 
2725  p = effect->lpVtbl->GetAnnotationByName(effect, "a", "invalid");
2726  ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2727 
2728  p = effect->lpVtbl->GetAnnotation(effect, "a", 0);
2729  ok(p == NULL, "GetAnnotation failed, got %p\n", p);
2730 
2731  /* float b[1]; */
2732  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "b");
2733  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2734 
2735  p = effect->lpVtbl->GetParameterByName(effect, "b", NULL);
2736  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2737 
2738  /* elements */
2739  p = effect->lpVtbl->GetParameterByName(effect, NULL, "b[]");
2740  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2741 
2742  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "b[0]");
2743  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2744 
2745  p = effect->lpVtbl->GetParameterByName(effect, "b[0]", NULL);
2746  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2747 
2748  p = effect->lpVtbl->GetParameterElement(effect, "b", 0);
2749  ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2750 
2751  p = effect->lpVtbl->GetParameterByName(effect, "b", "[0]");
2752  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2753 
2754  p = effect->lpVtbl->GetParameterByName(effect, NULL, "b[1]");
2755  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2756 
2757  p = effect->lpVtbl->GetParameterElement(effect, "b", 1);
2758  ok(p == NULL, "GetParameterElement failed, got %p\n", p);
2759 
2760  /* float c <float d = 3;>; */
2761  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "c");
2762  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2763 
2764  p = effect->lpVtbl->GetParameterByName(effect, "c", NULL);
2765  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2766 
2767  /* annotations */
2768  p = effect->lpVtbl->GetParameterByName(effect, "c", "@d");
2769  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2770 
2771  p = effect->lpVtbl->GetParameterByName(effect, "c@", "d");
2772  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2773 
2774  p = effect->lpVtbl->GetParameterByName(effect, NULL, "c@invalid");
2775  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2776 
2777  p = effect->lpVtbl->GetParameterByName(effect, "c@invalid", NULL);
2778  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2779 
2780  p = effect->lpVtbl->GetAnnotationByName(effect, "c", NULL);
2781  ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2782 
2783  p = effect->lpVtbl->GetAnnotationByName(effect, "c", "invalid");
2784  ok(p == NULL, "GetAnnotationByName failed, got %p\n", p);
2785 
2786  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "c@d");
2787  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2788 
2789  p = effect->lpVtbl->GetParameterByName(effect, "c@d", NULL);
2790  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2791 
2792  p = effect->lpVtbl->GetAnnotationByName(effect, "c", "d");
2793  ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter);
2794 
2795  p = effect->lpVtbl->GetAnnotation(effect, "c", 0);
2796  ok(parameter == p, "GetAnnotation failed, got %p, expected %p\n", p, parameter);
2797 
2798  p = effect->lpVtbl->GetAnnotation(effect, "c", 1);
2799  ok(p == NULL, "GetAnnotation failed, got %p\n", p);
2800 
2801  /* struct {float e;} f; */
2802  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "f");
2803  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2804 
2805  p = effect->lpVtbl->GetParameterByName(effect, "f", NULL);
2806  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2807 
2808  /* members */
2809  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "f.e");
2810  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2811 
2812  p = effect->lpVtbl->GetParameterByName(effect, "f.e", NULL);
2813  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2814 
2815  p = effect->lpVtbl->GetParameterByName(effect, "f", "e");
2816  ok(parameter == p, "GetParameterByName failed, got %p, expected %p\n", p, parameter);
2817 
2818  p = effect->lpVtbl->GetParameterByName(effect, "f", ".e");
2819  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2820 
2821  p = effect->lpVtbl->GetParameterByName(effect, "f.", "e");
2822  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2823 
2824  p = effect->lpVtbl->GetParameterByName(effect, "f.invalid", NULL);
2825  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2826 
2827  p = effect->lpVtbl->GetParameterByName(effect, NULL, "f.invalid");
2828  ok(p == NULL, "GetParameterByName failed, got %p\n", p);
2829 
2830  /* float g <float h[1] = {3};>; */
2831  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "g@h[0]");
2832  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2833 
2834  p = effect->lpVtbl->GetAnnotationByName(effect, "g", "h[0]");
2835  ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter);
2836 
2837  p = effect->lpVtbl->GetParameterElement(effect, "g@h", 0);
2838  ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2839 
2840  p = effect->lpVtbl->GetParameterElement(effect, effect->lpVtbl->GetAnnotation(effect, "g", 0), 0);
2841  ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2842 
2843  /* struct s {float j;}; float i <s k[1] = {4};>; */
2844  parameter = effect->lpVtbl->GetParameterByName(effect, NULL, "i@k[0].j");
2845  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2846 
2847  p = effect->lpVtbl->GetAnnotationByName(effect, "i", "k[0].j");
2848  ok(parameter == p, "GetAnnotationByName failed, got %p, expected %p\n", p, parameter);
2849 
2850  p = effect->lpVtbl->GetParameterByName(effect, effect->lpVtbl->GetParameterElement(effect, "i@k", 0), "j");
2851  ok(parameter == p, "GetParameterElement failed, got %p, expected %p\n", p, parameter);
2852 
2853  /* technique t <s l[1] = {5};> */
2854  parameter = effect->lpVtbl->GetAnnotationByName(effect, "t", "l[0].j");
2855  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2856 
2857  /* pass p <s m[1] = {6};> */
2858  parameter = effect->lpVtbl->GetAnnotationByName(effect, effect->lpVtbl->GetPassByName(effect, "t", "p"), "m[0].j");
2859  ok(parameter != NULL, "GetParameterByName failed, got %p\n", parameter);
2860 
2861  count = effect->lpVtbl->Release(effect);
2862  ok(!count, "Release failed %u\n", count);
2863 }
2864 
2865 static void test_effect_compilation_errors(IDirect3DDevice9 *device)
2866 {
2867  ID3DXEffect *effect;
2868  ID3DXBuffer *compilation_errors;
2869  HRESULT hr;
2870 
2871  /* Test binary effect */
2872  compilation_errors = (ID3DXBuffer*)0xdeadbeef;
2873  hr = D3DXCreateEffect(NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, &compilation_errors);
2874  ok(hr == D3DERR_INVALIDCALL, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
2875  ok(!compilation_errors, "Returned %p\n", compilation_errors);
2876 
2877  compilation_errors = (ID3DXBuffer*)0xdeadbeef;
2879  sizeof(test_effect_variable_names_blob), NULL, NULL, 0, NULL, &effect, &compilation_errors);
2880  ok(hr == D3D_OK, "D3DXCreateEffect failed, got %#x, expected %#x\n", hr, D3D_OK);
2881  ok(!compilation_errors, "Returned %p\n", compilation_errors);
2882  effect->lpVtbl->Release(effect);
2883 }
2884 
2885 /*
2886  * fxc.exe /Tfx_2_0
2887  */
2888 #if 0
2889 vertexshader vs_arr1[2] =
2890 {
2891  asm
2892  {
2893  vs_1_1
2894  def c0, 1, 1, 1, 1
2895  mov oPos, c0
2896  },
2897  asm
2898  {
2899  vs_2_0
2900  def c0, 2, 2, 2, 2
2901  mov oPos, c0
2902  }
2903 };
2904 
2905 sampler sampler1 =
2906  sampler_state
2907  {
2908  MipFilter = LINEAR;
2909  };
2910 
2911 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};
2912 technique tech0
2913 {
2914  pass p0
2915  {
2916  vertexshader = vs_arr1[1];
2917  VertexShaderConstant1[1] = 3.0f;
2918  VertexShaderConstant4[2] = 1;
2919  VertexShaderConstant1[3] = {2, 2, 2, 2};
2920  VertexShaderConstant4[4] = {4, 4, 4, 4, 5, 5, 5, 5, 6};
2921  BlendOp = 2;
2922  AlphaOp[3] = 4;
2923  ZEnable = true;
2924  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};
2925  ViewTransform=(camera);
2926  LightEnable[2] = TRUE;
2927  LightType[2] = POINT;
2928  LightPosition[2] = {4.0f, 5.0f, 6.0f};
2929  Sampler[1] = sampler1;
2930  }
2931 }
2932 #endif
2934 {
2935  0xfeff0901, 0x00000368, 0x00000000, 0x00000010, 0x00000004, 0x00000020, 0x00000000, 0x00000002,
2936  0x00000001, 0x00000002, 0x00000008, 0x615f7376, 0x00317272, 0x0000000a, 0x00000004, 0x00000074,
2937  0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
2938  0x00000001, 0x00000001, 0x00000001, 0x000000ab, 0x00000100, 0x00000044, 0x00000040, 0x00000009,
2939  0x706d6173, 0x3172656c, 0x00000000, 0x00000003, 0x00000002, 0x000000e0, 0x000000ec, 0x00000000,
2940  0x00000004, 0x00000004, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2941  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2942  0x00000000, 0x40c00000, 0x00000007, 0x656d6163, 0x00006172, 0x00000005, 0x57454956, 0x00000000,
2943  0x00000003, 0x00000010, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000003,
2944  0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f800000, 0x00000003,
2945  0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x40000000, 0x40000000,
2946  0x40000000, 0x40000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000004,
2947  0x00000001, 0x40800000, 0x40800000, 0x40800000, 0x40800000, 0x40a00000, 0x40a00000, 0x40a00000,
2948  0x40a00000, 0x40c00000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000009,
2949  0x00000001, 0x00000002, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
2950  0x00000001, 0x00000004, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
2951  0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
2952  0x00000001, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2953  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2954  0x40800000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0x00000001,
2955  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2956  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2957  0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x00000001,
2958  0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000001,
2959  0x00000002, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x40800000,
2960  0x40a00000, 0x40c00000, 0x00000003, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
2961  0x00000001, 0x00000000, 0x0000000a, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
2962  0x00003070, 0x00000006, 0x68636574, 0x00000030, 0x00000003, 0x00000001, 0x00000005, 0x00000004,
2963  0x00000004, 0x00000018, 0x00000000, 0x00000000, 0x0000002c, 0x00000060, 0x00000000, 0x00000000,
2964  0x00000084, 0x000000a0, 0x00000000, 0x00000000, 0x0000035c, 0x00000000, 0x00000001, 0x00000354,
2965  0x00000000, 0x0000000e, 0x00000092, 0x00000000, 0x000000fc, 0x000000f8, 0x00000098, 0x00000001,
2966  0x00000114, 0x00000110, 0x0000009b, 0x00000002, 0x00000134, 0x00000130, 0x00000098, 0x00000003,
2967  0x00000160, 0x00000150, 0x0000009b, 0x00000004, 0x000001a0, 0x0000017c, 0x0000004b, 0x00000000,
2968  0x000001c0, 0x000001bc, 0x0000006b, 0x00000003, 0x000001e0, 0x000001dc, 0x00000000, 0x00000000,
2969  0x00000200, 0x000001fc, 0x0000007d, 0x00000001, 0x0000025c, 0x0000021c, 0x0000007c, 0x00000000,
2970  0x000002b8, 0x00000278, 0x00000091, 0x00000002, 0x000002d8, 0x000002d4, 0x00000084, 0x00000002,
2971  0x000002f8, 0x000002f4, 0x00000088, 0x00000002, 0x00000320, 0x00000314, 0x000000b2, 0x00000001,
2972  0x00000340, 0x0000033c, 0x00000002, 0x00000003, 0x00000001, 0x0000002c, 0xfffe0101, 0x00000051,
2973  0xa00f0000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x00000001, 0xc00f0000, 0xa0e40000,
2974  0x0000ffff, 0x00000002, 0x0000002c, 0xfffe0200, 0x05000051, 0xa00f0000, 0x40000000, 0x40000000,
2975  0x40000000, 0x40000000, 0x02000001, 0xc00f0000, 0xa0e40000, 0x0000ffff, 0x00000000, 0x00000000,
2976  0xffffffff, 0x0000000d, 0x00000001, 0x00000009, 0x706d6173, 0x3172656c, 0x00000000, 0x00000000,
2977  0x00000000, 0xffffffff, 0x00000009, 0x00000000, 0x0000016c, 0x46580200, 0x0030fffe, 0x42415443,
2978  0x0000001c, 0x0000008b, 0x46580200, 0x00000001, 0x0000001c, 0x20000100, 0x00000088, 0x00000030,
2979  0x00000002, 0x00000004, 0x00000038, 0x00000048, 0x656d6163, 0xab006172, 0x00030003, 0x00040004,
2980  0x00000001, 0x00000000, 0x40800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2981  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
2982  0x00000000, 0x40c00000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c,
2983  0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x0002fffe,
2984  0x54494c43, 0x00000000, 0x0024fffe, 0x434c5846, 0x00000004, 0x10000004, 0x00000001, 0x00000000,
2985  0x00000002, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10000004, 0x00000001, 0x00000000,
2986  0x00000002, 0x00000004, 0x00000000, 0x00000004, 0x00000004, 0x10000004, 0x00000001, 0x00000000,
2987  0x00000002, 0x00000008, 0x00000000, 0x00000004, 0x00000008, 0x10000004, 0x00000001, 0x00000000,
2988  0x00000002, 0x0000000c, 0x00000000, 0x00000004, 0x0000000c, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
2989  0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000001, 0x0000000b, 0x615f7376, 0x5b317272,
2990  0x00005d31,
2991 };
2992 #define TEST_EFFECT_STATES_VSHADER_POS 315
2993 
2994 static const D3DXVECTOR4 fvect_filler = {-9999.0f, -9999.0f, -9999.0f, -9999.0f};
2995 
2996 static void test_effect_clear_vconsts(IDirect3DDevice9 *device)
2997 {
2998  unsigned int i;
2999  HRESULT hr;
3000 
3001  for (i = 0; i < 256; ++i)
3002  {
3004  ok(hr == D3D_OK, "Got result %#x.\n", hr);
3005  }
3006 }
3007 
3008 static void test_effect_states(IDirect3DDevice9 *device)
3009 {
3010  static const D3DMATRIX test_mat =
3011  {{{
3012  -1.0f, 0.0f, 0.0f, 0.0f,
3013  0.0f, 0.0f, 0.0f, 0.0f,
3014  0.0f, 0.0f, 0.0f, 0.0f,
3015  0.0f, 0.0f, 0.0f, 0.0f
3016  }}};
3017  static const D3DMATRIX test_mat_camera =
3018  {{{
3019  4.0f, 0.0f, 0.0f, 0.0f,
3020  0.0f, 0.0f, 0.0f, 0.0f,
3021  0.0f, 0.0f, 0.0f, 0.0f,
3022  0.0f, 0.0f, 0.0f, 6.0f
3023  }}};
3024  static const D3DMATRIX test_mat_world1 =
3025  {{{
3026  2.0f, 0.0f, 0.0f, 0.0f,
3027  0.0f, 0.0f, 0.0f, 0.0f,
3028  0.0f, 0.0f, 0.0f, 0.0f,
3029  0.0f, 0.0f, 0.0f, 4.0f
3030  }}};
3031 
3032  IDirect3DVertexShader9 *vshader;
3033  ID3DXEffect *effect;
3034  UINT byte_code_size;
3035  D3DXVECTOR4 fvect;
3036  void *byte_code;
3037  D3DLIGHT9 light;
3038  D3DMATRIX mat;
3039  UINT npasses;
3040  DWORD value;
3041  HRESULT hr;
3042  BOOL bval;
3043 
3045  NULL, NULL, 0, NULL, &effect, NULL);
3046  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3047 
3048  /* State affected in passes saved/restored even if no pass
3049  was performed. States not present in passes are not saved &
3050  restored */
3052  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3054  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3055 
3056  hr = effect->lpVtbl->Begin(effect, &npasses, 0);
3057  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3058  ok(npasses == 1, "Expected 1 pass, got %u\n", npasses);
3059 
3061  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3063  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3064 
3065  hr = effect->lpVtbl->End(effect);
3066  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3067 
3069  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3070  ok(value == 1, "Got result %u, expected %u.\n", value, 1);
3072  ok(value == 2, "Got result %u, expected %u.\n", value, 2);
3073 
3074  /* Test states application in BeginPass. No states are restored
3075  on EndPass. */
3077  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3079  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3080 
3082  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3083  if (hr == D3D_OK)
3084  ok(!bval, "Got result %u, expected 0.\n", bval);
3085 
3087  hr = effect->lpVtbl->Begin(effect, NULL, 0);
3088  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3089 
3091  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3092  ok(!memcmp(mat.m, test_mat.m, sizeof(mat)), "World matrix does not match.\n");
3093 
3095 
3096  hr = effect->lpVtbl->BeginPass(effect, 0);
3097  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3098 
3100  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3101  ok(!memcmp(mat.m, test_mat_world1.m, sizeof(mat)), "World matrix does not match.\n");
3102 
3104  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3105  ok(!memcmp(mat.m, test_mat_camera.m, sizeof(mat)), "View matrix does not match.\n");
3106 
3108  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3109  ok(value == 2, "Got result %u, expected %u\n", value, 2);
3110 
3112  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3113  ok(vshader != NULL, "Got NULL vshader.\n");
3114  if (vshader)
3115  {
3116  hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
3117  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3118  byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
3119  hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
3120  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3121  ok(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size);
3123  "Incorrect shader selected.\n");
3124  HeapFree(GetProcessHeap(), 0, byte_code);
3126  }
3127 
3129  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3130  if (hr == D3D_OK)
3131  ok(bval, "Got result %u, expected TRUE.\n", bval);
3133  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3134  if (hr == D3D_OK)
3135  ok(light.Position.x == 4.0f && light.Position.y == 5.0f && light.Position.z == 6.0f,
3136  "Got unexpected light position (%f, %f, %f).\n", light.Position.x, light.Position.y, light.Position.z);
3137 
3138  /* Testing first value only for constants 1, 2 as the rest of the vector seem to
3139  * contain garbage data on native. */
3141  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3142  ok(fvect.x == 3.0f, "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3143  fvect.x, fvect.y, fvect.z, fvect.w);
3145  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3146  ok(fvect.x == 1.0f, "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3147  fvect.x, fvect.y, fvect.z, fvect.w);
3148 
3150  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3151  ok(fvect.x == 2.0f && fvect.y == 2.0f && fvect.z == 2.0f && fvect.w == 2.0f,
3152  "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3153  fvect.x, fvect.y, fvect.z, fvect.w);
3154 
3156  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3157  ok(fvect.x == 4.0f && fvect.y == 4.0f && fvect.z == 4.0f && fvect.w == 4.0f,
3158  "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3159  fvect.x, fvect.y, fvect.z, fvect.w);
3161  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3162  ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f,
3163  "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3164  fvect.x, fvect.y, fvect.z, fvect.w);
3166  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3167  ok(fvect.x == 0.0f && fvect.y == 0.0f && fvect.z == 0.0f && fvect.w == 0.0f,
3168  "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3169  fvect.x, fvect.y, fvect.z, fvect.w);
3171  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3172  ok(!memcmp(&fvect, &fvect_filler, sizeof(fvect_filler)),
3173  "Got unexpected vertex shader constant (%.8e, %.8e, %.8e, %.8e).\n",
3174  fvect.x, fvect.y, fvect.z, fvect.w);
3175 
3176  hr = effect->lpVtbl->EndPass(effect);
3177  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3179  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3180  ok(value == 2, "Got result %u, expected %u\n", value, 2);
3181 
3183  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3184  ok(value, "Got result %u, expected TRUE.\n", value);
3185 
3187  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3188  ok(value == D3DTEXF_LINEAR, "Unexpected sampler 1 mipfilter %u.\n", value);
3189 
3191  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3192  ok(value == 4, "Unexpected texture stage 3 AlphaOp %u.\n", value);
3193 
3194  hr = effect->lpVtbl->End(effect);
3195  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3196 
3198  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3199  ok(!memcmp(mat.m, test_mat.m, sizeof(mat)), "World matrix not restored.\n");
3200 
3202  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3203  if (hr == D3D_OK)
3204  ok(!bval, "Got result %u, expected 0.\n", bval);
3205 
3206  /* State is not restored if effect is released without End call */
3208  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3209 
3210  hr = effect->lpVtbl->Begin(effect, &npasses, 0);
3211  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3212 
3214  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3215 
3216  effect->lpVtbl->Release(effect);
3217 
3219  ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
3220  ok(value == 3, "Got result %u, expected %u.\n", value, 1);
3221 }
3222 
3223 /*
3224  * fxc.exe /Tfx_2_0
3225  */
3226 #if 0
3227 float4 g_Pos1;
3228 float4 g_Pos2;
3229 float4 g_Selector[3] = {{0, 0, 0, 0}, {10, 10, 10, 10}, {5001, 5002, 5003, 5004}};
3230 
3231 float4 opvect1 = {0.0, -0.0, -2.2, 3.402823466e+38F};
3232 float4 opvect2 = {1.0, 2.0, -3.0, 4.0};
3233 float4 opvect3 = {0.0, -0.0, -2.2, 3.402823466e+38F};
3234 
3235 float4 vect_sampler = {1, 2, 3, 4};
3236 
3237 float3 vec3 = {1001, 1002, 1003};
3238 
3239 int4 g_iVect = {4, 3, 2, 1};
3240 
3241 vertexshader vs_arr[3] =
3242 {
3243  asm
3244  {
3245  vs_1_0
3246  def c0, 1, 1, 1, 1
3247  mov oPos, c0
3248  },
3249  asm
3250  {
3251  vs_1_1
3252  def c0, 2, 2, 2, 2
3253  mov oPos, c0
3254  },
3255  asm
3256  {
3257  vs_2_0
3258  def c0, 3, 3, 3, 3
3259  mov oPos, c0
3260  }
3261 };
3262 
3263 float4x4 m4x4 = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}, {41, 42, 43, 44}};
3264 
3265 row_major float4x3 m4x3row = {{11, 12, 13}, {21, 22, 23}, {31, 32, 33}, {41, 42, 43}};
3266 row_major float3x4 m3x4row = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}};
3267 column_major float4x3 m4x3column = {{11, 12, 13},{21, 22, 23},{31, 32, 33},{41, 42, 43}};
3268 column_major float3x4 m3x4column = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}};
3269 row_major float2x2 m2x2row = {{11, 12}, {21, 22}};
3270 column_major float2x2 m2x2column = {{11, 12}, {21, 22}};
3271 row_major float2x3 m2x3row = {{11, 12, 13}, {21, 22, 23}};
3272 column_major float2x3 m2x3column = {{11, 12, 13}, {21, 22, 23}};
3273 row_major float3x2 m3x2row = {{11, 12}, {21, 22}, {31, 32}};
3274 column_major float3x2 m3x2column = {{11, 12}, {21, 22}, {31, 32}};
3275 
3276 row_major bool2x3 mb2x3row = {{true, false, true}, {false, true, true}};
3277 column_major bool2x3 mb2x3column = {{true, false, true}, {false, true, true}};
3278 
3279 struct test_struct
3280 {
3281  float3 v1;
3282  float fv;
3283  float4 v2;
3284 };
3285 
3286 struct struct_array
3287 {
3288  test_struct ts[2];
3289 };
3290 
3291 test_struct ts1[1] = {{{9, 10, 11}, 12, {13, 14, 15, 16}}};
3292 shared test_struct ts2[2] = {{{0, 0, 0}, 0, {0, 0, 0, 0}}, {{1, 2, 3}, 4, {5, 6, 7, 8}}};
3293 struct_array ts3 = {{{1, 2, 3}, 4, {5, 6, 7, 8}}, {{9, 10, 11}, 12, {13, 14, 15, 16}}};
3294 
3295 float arr1[1] = {91};
3296 shared float arr2[2] = {92, 93};
3297 
3298 Texture2D tex1;
3299 Texture2D tex2;
3300 sampler sampler1 =
3301 sampler_state
3302 {
3303  Texture = tex1;
3304  MinFilter = g_iVect.y;
3305  MagFilter = vect_sampler.x + vect_sampler.y;
3306 };
3307 
3308 sampler samplers_array[2] =
3309 {
3310  sampler_state
3311  {
3312  MinFilter = 1;
3313  MagFilter = vect_sampler.x;
3314  },
3315  sampler_state
3316  {
3317  MinFilter = 2;
3318  MagFilter = vect_sampler.y;
3319  }
3320 };
3321 
3322 struct VS_OUTPUT
3323 {
3324  float4 Position : POSITION;
3325  float2 TextureUV : TEXCOORD0;
3326  float4 Diffuse : COLOR0;
3327 };
3328 VS_OUTPUT RenderSceneVS(float4 vPos : POSITION,
3329  float3 vNormal : NORMAL,
3330  float2 vTexCoord0 : TEXCOORD0,
3331  uniform int nNumLights,
3332  uniform bool bTexture)
3333 {
3334  VS_OUTPUT Output;
3335 
3336  if (g_Selector[1].y > float4(0.5, 0.5, 0.5, 0.5).y)
3337  Output.Position = -g_Pos1 * 2 - float4(-4, -5, -6, -7);
3338  else
3339  Output.Position = -g_Pos2 * 3 - float4(-4, -5, -6, -7);
3340  Output.TextureUV = float2(0, 0);
3341  Output.Diffuse = 0;
3342  Output.Diffuse.xyz = mul(vPos, m4x3column);
3343  Output.Diffuse += mul(vPos, m3x4column);
3344  Output.Diffuse += mul(vPos, m3x4row);
3345  Output.Diffuse.xyz += mul(vPos, m4x3row);
3346  Output.Diffuse += mul(vPos, ts1[0].fv);
3347  Output.Diffuse += mul(vPos, ts1[0].v2);
3348  Output.Diffuse += mul(vPos, ts2[1].fv);
3349  Output.Diffuse += mul(vPos, ts2[1].v2);
3350  Output.Diffuse += mul(vPos, arr1[0]);
3351  Output.Diffuse += mul(vPos, arr2[1]);
3352  Output.Diffuse += mul(vPos, ts3.ts[1].fv);
3353  Output.Diffuse += mul(vPos, ts3.ts[1].v2);
3354  Output.Diffuse += tex2Dlod(sampler1, g_Pos1);
3355  Output.Diffuse += tex2Dlod(samplers_array[1], g_Pos1);
3356  return Output;
3357 }
3358 
3359 VS_OUTPUT RenderSceneVS2(float4 vPos : POSITION)
3360 {
3361  VS_OUTPUT Output;
3362 
3363  Output.Position = g_Pos1;
3364  Output.TextureUV = float2(0, 0);
3365  Output.Diffuse = 0;
3366  return Output;
3367 }
3368 
3369 struct PS_OUTPUT
3370 {
3371  float4 RGBColor : COLOR0; /* Pixel color */
3372 };
3373 PS_OUTPUT RenderScenePS( VS_OUTPUT In, uniform bool2x3 mb)
3374 {
3375  PS_OUTPUT Output;
3376  int i;
3377 
3378  Output.RGBColor = In.Diffuse;
3379  Output.RGBColor.xy += mul(In.Diffuse, m2x2row);
3380  Output.RGBColor.xy += mul(In.Diffuse, m2x2column);
3381  Output.RGBColor.xy += mul(In.Diffuse, m3x2row);
3382  Output.RGBColor.xy += mul(In.Diffuse, m3x2column);
3383  Output.RGBColor.xyz += mul(In.Diffuse, m2x3row);
3384  Output.RGBColor.xyz += mul(In.Diffuse, m2x3column);
3385  for (i = 0; i < g_iVect.x; ++i)
3386  Output.RGBColor.xyz += mul(In.Diffuse, m2x3column);
3387  if (mb[1][1])
3388  {
3389  Output.RGBColor += sin(Output.RGBColor);
3390  Output.RGBColor += cos(Output.RGBColor);
3391  Output.RGBColor.xyz += mul(Output.RGBColor, m2x3column);
3392  Output.RGBColor.xyz += mul(Output.RGBColor, m2x3row);
3393  Output.RGBColor.xy += mul(Output.RGBColor, m3x2column);
3394  Output.RGBColor.xy += mul(Output.RGBColor, m3x2row);
3395  }
3396  if (mb2x3column[0][0])
3397  {
3398  Output.RGBColor += sin(Output.RGBColor);
3399  Output.RGBColor += cos(Output.RGBColor);
3400  Output.RGBColor.xyz += mul(Output.RGBColor, m2x3column);
3401  Output.RGBColor.xyz += mul(Output.RGBColor, m2x3row);
3402  Output.RGBColor.xy += mul(Output.RGBColor, m3x2column);
3403  Output.RGBColor.xy += mul(Output.RGBColor, m3x2row);
3404  }
3405  Output.RGBColor += tex2D(sampler1, In.TextureUV);
3406  Output.RGBColor += tex2D(samplers_array[0], In.TextureUV);
3407  return Output;
3408 }
3409 
3410 shared vertexshader vs_arr2[2] = {compile vs_3_0 RenderSceneVS(1, true), compile vs_3_0 RenderSceneVS2()};
3411 pixelshader ps_arr[1] = {compile ps_3_0 RenderScenePS(mb2x3row)};
3412 
3413 technique tech0
3414 {
3415  pass p0
3416  {
3417  VertexShader = vs_arr2[g_iVect.w - 1];
3418  PixelShader = ps_arr[g_iVect.w - 1];
3419 
3420  LightEnable[0] = TRUE;
3421  LightEnable[1] = TRUE;
3422  LightEnable[2] = TRUE;
3423  LightEnable[3] = TRUE;
3424  LightEnable[4] = TRUE;
3425  LightEnable[5] = TRUE;
3426  LightEnable[6] = TRUE;
3427  LightEnable[7] = TRUE;
3428  LightType[0] = POINT;
3429  LightType[1] = POINT;
3430  LightType[2] = POINT;
3431  LightType[3] = POINT;
3432  LightType[4] = POINT;
3433  LightType[5] = POINT;
3434  LightType[6] = POINT;
3435  LightType[7] = POINT;
3436  LightDiffuse[0] = 1 / opvect1;
3437  LightDiffuse[1] = rsqrt(opvect1);
3438  LightDiffuse[2] = opvect1 * opvect2;
3439  LightDiffuse[3] = opvect1 + opvect2;
3440  LightDiffuse[4] = float4(opvect1 < opvect2);
3441  LightDiffuse[5] = float4(opvect1 >= opvect2);
3442  LightDiffuse[6] = -opvect1;
3443  LightDiffuse[7] = rcp(opvect1);
3444 
3445  LightAmbient[0] = frac(opvect1);
3446  LightAmbient[1] = min(opvect1, opvect2);
3447  LightAmbient[2] = max(opvect1, opvect2);
3448  LightAmbient[3] = sin(opvect1);
3449  LightAmbient[4] = cos(opvect1);
3450  LightAmbient[5] = 1e-2 / opvect1;
3451  LightAmbient[6] = float4(0, dot(opvect1, opvect2), dot(opvect2, opvect2), 0);
3452  LightAmbient[7] = opvect1 + 1e-12 * opvect2 - opvect3;
3453 
3454  LightSpecular[0] = float4(dot(opvect1.zx, opvect2.xy), dot(opvect1.zzx, opvect2.xyz),
3455  dot(opvect1.zzzx, opvect2.xxyy), 0);
3456  LightSpecular[1] = float4(opvect1[g_iVect.z], g_iVect[opvect2.y + 1],
3457  g_Selector[4 + g_iVect.w].x + g_Selector[7 + g_iVect.w].y,
3458  g_Selector[g_iVect.w].x + g_Selector[g_iVect.x].y);
3459  LightSpecular[2] = float4(dot(m4x4[3 + g_iVect.z], m4x4[g_iVect.w * 2]), ts3.ts[g_iVect.x].fv,
3460  vec3[g_iVect.z], float3(1, 2, 3)[g_iVect.w]);
3461 
3462  FogEnable = TRUE;
3463  FogDensity = ts2[0].fv;
3464  FogStart = ts2[1].fv;
3465  PointScale_A = ts3.ts[0].fv;
3466  PointScale_B = ts3.ts[1].fv;
3467  }
3468  pass p1
3469  {
3470  VertexShader = vs_arr[g_iVect.z];
3471  }
3472 }
3473 #endif
3475 {
3476  0xfeff0901, 0x00001160, 0x00000000, 0x00000003, 0x00000001, 0x00000030, 0x00000000, 0x00000000,
3477  0x00000004, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x6f505f67,
3478  0x00003173, 0x00000003, 0x00000001, 0x00000068, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
3479  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x6f505f67, 0x00003273, 0x00000003,
3480  0x00000001, 0x000000c0, 0x00000000, 0x00000003, 0x00000004, 0x00000001, 0x00000000, 0x00000000,
3481  0x00000000, 0x00000000, 0x41200000, 0x41200000, 0x41200000, 0x41200000, 0x459c4800, 0x459c5000,
3482  0x459c5800, 0x459c6000, 0x0000000b, 0x65535f67, 0x7463656c, 0x0000726f, 0x00000003, 0x00000001,
3483  0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000000, 0x80000000, 0xc00ccccd,
3484  0x7f7fffff, 0x00000008, 0x6576706f, 0x00317463, 0x00000003, 0x00000001, 0x00000134, 0x00000000,
3485  0x00000000, 0x00000004, 0x00000001, 0x3f800000, 0x40000000, 0xc0400000, 0x40800000, 0x00000008,
3486  0x6576706f, 0x00327463, 0x00000003, 0x00000001, 0x0000016c, 0x00000000, 0x00000000, 0x00000004,
3487  0x00000001, 0x00000000, 0x80000000, 0xc00ccccd, 0x7f7fffff, 0x00000008, 0x6576706f, 0x00337463,
3488  0x00000003, 0x00000001, 0x000001a4, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x3f800000,
3489  0x40000000, 0x40400000, 0x40800000, 0x0000000d, 0x74636576, 0x6d61735f, 0x72656c70, 0x00000000,
3490  0x00000003, 0x00000001, 0x000001e0, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x447a4000,
3491  0x447a8000, 0x447ac000, 0x00000005, 0x33636576, 0x00000000, 0x00000002, 0x00000001, 0x00000218,
3492  0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000004, 0x00000003, 0x00000002, 0x00000001,
3493  0x00000008, 0x56695f67, 0x00746365, 0x00000010, 0x00000004, 0x00000244, 0x00000000, 0x00000003,
3494  0x00000001, 0x00000002, 0x00000003, 0x00000007, 0x615f7376, 0x00007272, 0x00000003, 0x00000002,
3495  0x000002ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x41300000, 0x41400000, 0x41500000,
3496  0x41600000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000,
3497  0x42080000, 0x42240000, 0x42280000, 0x422c0000, 0x42300000, 0x00000005, 0x3478346d, 0x00000000,
3498  0x00000003, 0x00000002, 0x00000304, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0x41300000,
3499  0x41400000, 0x41500000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41f80000, 0x42000000, 0x42040000,
3500  0x42240000, 0x42280000, 0x422c0000, 0x00000008, 0x3378346d, 0x00776f72, 0x00000003, 0x00000002,
3501  0x0000035c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x41300000, 0x41400000, 0x41500000,
3502  0x41600000, 0x41a80000, 0x41b00000, 0x41b80000, 0x41c00000, 0x41f80000, 0x42000000, 0x42040000,
3503  0x42080000, 0x00000008, 0x3478336d, 0x00776f72, 0x00000003, 0x00000002, 0x000003b4, 0x00000000,
3504  0x00000000, 0x0000000