msvcp90: Added num_put<char>::put(double) implementation.
[wine] / dlls / d3dx9_36 / tests / effect.c
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 */
26 static BOOL compare_float(FLOAT f, FLOAT g, UINT ulps)
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, LPCVOID 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, LPCVOID 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(LPCVOID data)
97 {
98     return (*(BOOL *)data) ? TRUE : FALSE;
99 }
100
101 static void set_number(LPVOID outdata, D3DXPARAMETER_TYPE outtype, LPCVOID 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 const char effect_desc[] =
132 "Technique\n"
133 "{\n"
134 "}\n";
135
136 static void test_create_effect_and_pool(IDirect3DDevice9 *device)
137 {
138     HRESULT hr;
139     ID3DXEffect *effect;
140     ID3DXBaseEffect *base;
141     ULONG count;
142     IDirect3DDevice9 *device2;
143     LPD3DXEFFECTSTATEMANAGER manager = (LPD3DXEFFECTSTATEMANAGER)0xdeadbeef;
144     ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2;
145
146     hr = D3DXCreateEffect(NULL, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
147     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
148
149     hr = D3DXCreateEffect(device, NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
150     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
151
152     hr = D3DXCreateEffect(device, effect_desc, 0, NULL, NULL, 0, NULL, NULL, NULL);
153     ok(hr == E_FAIL, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, E_FAIL);
154
155     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
156     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
157
158     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
159     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
160
161     hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
162     ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
163
164     hr = effect->lpVtbl->GetStateManager(effect, NULL);
165     ok(hr == D3DERR_INVALIDCALL, "GetStateManager failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
166
167     hr = effect->lpVtbl->GetStateManager(effect, &manager);
168     ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
169     ok(!manager, "GetStateManager failed, got %p\n", manager);
170
171     /* this works, but it is not recommended! */
172     hr = effect->lpVtbl->SetStateManager(effect, (LPD3DXEFFECTSTATEMANAGER) device);
173     ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
174
175     hr = effect->lpVtbl->GetStateManager(effect, &manager);
176     ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
177     ok(manager != NULL, "GetStateManager failed\n");
178
179     IDirect3DDevice9_AddRef(device);
180     count = IDirect3DDevice9_Release(device);
181     ok(count == 4, "Release failed, got %u, expected 4\n", count);
182
183     count = IUnknown_Release(manager);
184     ok(count == 3, "Release failed, got %u, expected 3\n", count);
185
186     hr = effect->lpVtbl->SetStateManager(effect, NULL);
187     ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
188
189     hr = effect->lpVtbl->GetPool(effect, &pool);
190     ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
191     ok(!pool, "GetPool failed, got %p\n", pool);
192
193     hr = effect->lpVtbl->GetPool(effect, NULL);
194     ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
195
196     hr = effect->lpVtbl->GetDevice(effect, &device2);
197     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
198
199     hr = effect->lpVtbl->GetDevice(effect, NULL);
200     ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
201
202     count = IDirect3DDevice9_Release(device2);
203     ok(count == 2, "Release failed, got %u, expected 2\n", count);
204
205     count = effect->lpVtbl->Release(effect);
206     ok(count == 0, "Release failed %u\n", count);
207
208     hr = D3DXCreateEffectPool(NULL);
209     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
210
211     hr = D3DXCreateEffectPool(&pool);
212     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
213
214     count = pool->lpVtbl->Release(pool);
215     ok(count == 0, "Release failed %u\n", count);
216
217     hr = D3DXCreateEffectPool(&pool);
218     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
219
220     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, NULL, NULL);
221     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
222
223     hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3DXEffectPool, (void **)&pool2);
224     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
225     ok(pool == pool2, "Release failed, got %p, expected %p\n", pool2, pool);
226
227     count = pool2->lpVtbl->Release(pool2);
228     ok(count == 1, "Release failed, got %u, expected 1\n", count);
229
230     hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2);
231     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
232
233     count = IDirect3DDevice9_Release(device2);
234     ok(count == 1, "Release failed, got %u, expected 1\n", count);
235
236     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, &effect, NULL);
237     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
238
239     hr = effect->lpVtbl->GetPool(effect, &pool);
240     ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
241     ok(pool == pool2, "GetPool failed, got %p, expected %p\n", pool2, pool);
242
243     count = pool2->lpVtbl->Release(pool2);
244     ok(count == 2, "Release failed, got %u, expected 2\n", count);
245
246     count = effect->lpVtbl->Release(effect);
247     ok(count == 0, "Release failed %u\n", count);
248
249     count = pool->lpVtbl->Release(pool);
250     ok(count == 0, "Release failed %u\n", count);
251 }
252
253 static void test_create_effect_compiler(void)
254 {
255     HRESULT hr;
256     ID3DXEffectCompiler *compiler, *compiler2;
257     ID3DXBaseEffect *base;
258     IUnknown *unknown;
259     ULONG count;
260
261     hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, &compiler, NULL);
262     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
263
264     hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, NULL, NULL);
265     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
266
267     hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL);
268     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
269
270     count = compiler->lpVtbl->Release(compiler);
271     ok(count == 0, "Release failed %u\n", count);
272
273     hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, NULL, NULL);
274     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
275
276     hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
277     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
278
279     hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
280     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
281
282     hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
283     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
284
285     hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
286     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
287
288     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXBaseEffect, (void **)&base);
289     ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
290
291     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXEffectCompiler, (void **)&compiler2);
292     ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
293
294     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_IUnknown, (void **)&unknown);
295     ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
296
297     count = unknown->lpVtbl->Release(unknown);
298     ok(count == 2, "Release failed, got %u, expected %u\n", count, 2);
299
300     count = compiler2->lpVtbl->Release(compiler2);
301     ok(count == 1, "Release failed, got %u, expected %u\n", count, 1);
302
303     count = compiler->lpVtbl->Release(compiler);
304     ok(count == 0, "Release failed %u\n", count);
305 }
306
307 /*
308  * Parameter value test
309  */
310 struct test_effect_parameter_value_result
311 {
312     LPCSTR full_name;
313     D3DXPARAMETER_DESC desc;
314     UINT value_offset; /* start position for the value in the blob */
315 };
316
317 /*
318  * fxc.exe /Tfx_2_0
319  */
320 #if 0
321 float f = 0.1;
322 float1 f1 = {1.1};
323 float2 f2 = {2.1, 2.2};
324 float3 f3 = {3.1, 3.2, 3.3};
325 float4 f4 = {4.1, 4.2, 4.3, 4.4};
326 float1x1 f11 = {11.1};
327 float1x2 f12 = {12.1, 12.2};
328 float1x3 f13 = {13.1, 13.2, 13.3};
329 float1x4 f14 = {14.1, 14.2, 14.3, 14.4};
330 float2x1 f21 = {{21.11, 21.21}};
331 float2x2 f22 = {{22.11, 22.21}, {22.12, 22.22}};
332 float2x3 f23 = {{23.11, 23.21}, {23.12, 23.22}, {23.13, 23.23}};
333 float2x4 f24 = {{24.11, 24.21}, {24.12, 24.22}, {24.13, 24.23}, {24.14, 24.24}};
334 float3x1 f31 = {{31.11, 31.21, 31.31}};
335 float3x2 f32 = {{32.11, 32.21, 32.31}, {32.12, 32.22, 32.32}};
336 float3x3 f33 = {{33.11, 33.21, 33.31}, {33.12, 33.22, 33.32},
337         {33.13, 33.23, 33.33}};
338 float3x4 f34 = {{34.11, 34.21, 34.31}, {34.12, 34.22, 34.32},
339         {34.13, 34.23, 34.33}, {34.14, 34.24, 34.34}};
340 float4x1 f41 = {{41.11, 41.21, 41.31, 41.41}};
341 float4x2 f42 = {{42.11, 42.21, 42.31, 42.41}, {42.12, 42.22, 42.32, 42.42}};
342 float4x3 f43 = {{43.11, 43.21, 43.31, 43.41}, {43.12, 43.22, 43.32, 43.42},
343         {43.13, 43.23, 43.33, 43.43}};
344 float4x4 f44 = {{44.11, 44.21, 44.31, 44.41}, {44.12, 44.22, 44.32, 44.42},
345         {44.13, 44.23, 44.33, 44.43}, {44.14, 44.24, 44.34, 44.44}};
346 float f_2[2] = {0.101, 0.102};
347 float1 f1_2[2] = {{1.101}, {1.102}};
348 float2 f2_2[2] = {{2.101, 2.201}, {2.102, 2.202}};
349 float3 f3_2[2] = {{3.101, 3.201, 3.301}, {3.102, 3.202, 3.302}};
350 float4 f4_2[2] = {{4.101, 4.201, 4.301, 4.401}, {4.102, 4.202, 4.302, 4.402}};
351 float1x1 f11_2[2] = {{11.101}, {11.102}};
352 float1x2 f12_2[2] = {{12.101, 12.201}, {12.102, 12.202}};
353 float1x3 f13_2[2] = {{13.101, 13.201, 13.301}, {13.102, 13.202, 13.302}};
354 float1x4 f14_2[2] = {{14.101, 14.201, 14.301, 14.401}, {14.102, 14.202, 14.302, 14.402}};
355 float2x1 f21_2[2] = {{{21.1101, 21.2101}}, {{21.1102, 21.2102}}};
356 float2x2 f22_2[2] = {{{22.1101, 22.2101}, {22.1201, 22.2201}}, {{22.1102, 22.2102}, {22.1202, 22.2202}}};
357 float2x3 f23_2[2] = {{{23.1101, 23.2101}, {23.1201, 23.2201}, {23.1301, 23.2301}}, {{23.1102, 23.2102},
358         {23.1202, 23.2202}, {23.1302, 23.2302}}};
359 float2x4 f24_2[2] = {{{24.1101, 24.2101}, {24.1201, 24.2201}, {24.1301, 24.2301}, {24.1401, 24.2401}},
360         {{24.1102, 24.2102}, {24.1202, 24.2202}, {24.1302, 24.2302}, {24.1402, 24.2402}}};
361 float3x1 f31_2[2] = {{{31.1101, 31.2101, 31.3101}}, {{31.1102, 31.2102, 31.3102}}};
362 float3x2 f32_2[2] = {{{32.1101, 32.2101, 32.3101}, {32.1201, 32.2201, 32.3201}},
363         {{32.1102, 32.2102, 32.3102}, {32.1202, 32.2202, 32.3202}}};
364 float3x3 f33_2[2] = {{{33.1101, 33.2101, 33.3101}, {33.1201, 33.2201, 33.3201},
365         {33.1301, 33.2301, 33.3301}}, {{33.1102, 33.2102, 33.3102}, {33.1202, 33.2202, 33.3202},
366         {33.1302, 33.2302, 33.3302}}};
367 float3x4 f34_2[2] = {{{34.1101, 34.2101, 34.3101}, {34.1201, 34.2201, 34.3201},
368         {34.1301, 34.2301, 34.3301}, {34.1401, 34.2401, 34.3401}}, {{34.1102, 34.2102, 34.3102},
369         {34.1202, 34.2202, 34.3202}, {34.1302, 34.2302, 34.3302}, {34.1402, 34.2402, 34.3402}}};
370 float4x1 f41_2[2] = {{{41.1101, 41.2101, 41.3101, 41.4101}}, {{41.1102, 41.2102, 41.3102, 41.4102}}};
371 float4x2 f42_2[2] = {{{42.1101, 42.2101, 42.3101, 42.4101}, {42.1201, 42.2201, 42.3201, 42.4201}},
372         {{42.1102, 42.2102, 42.3102, 42.4102}, {42.1202, 42.2202, 42.3202, 42.4202}}};
373 float4x3 f43_2[2] = {{{43.1101, 43.2101, 43.3101, 43.4101}, {43.1201, 43.2201, 43.3201, 43.4201},
374         {43.1301, 43.2301, 43.3301, 43.4301}}, {{43.1102, 43.2102, 43.3102, 43.4102},
375         {43.1202, 43.2202, 43.3202, 43.4202}, {43.1302, 43.2302, 43.3302, 43.4302}}};
376 float4x4 f44_2[2] = {{{44.1101, 44.2101, 44.3101, 44.4101}, {44.1201, 44.2201, 44.3201, 44.4201},
377         {44.1301, 44.2301, 44.3301, 44.4301}, {44.1401, 44.2401, 44.3401, 44.4401}},
378         {{44.1102, 44.2102, 44.3102, 44.4102}, {44.1202, 44.2202, 44.3202, 44.4202},
379         {44.1302, 44.2302, 44.3302, 44.4302}, {44.1402, 44.2402, 44.3402, 44.4402}}};
380 technique t { pass p { } }
381 #endif
382 static const DWORD test_effect_parameter_value_blob_float[] =
383 {
384 0xfeff0901, 0x00000b80, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
385 0x00000001, 0x00000001, 0x3dcccccd, 0x00000002, 0x00000066, 0x00000003, 0x00000001, 0x0000004c,
386 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f8ccccd, 0x00000003, 0x00003166, 0x00000003,
387 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x40066666, 0x400ccccd,
388 0x00000003, 0x00003266, 0x00000003, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
389 0x00000001, 0x40466666, 0x404ccccd, 0x40533333, 0x00000003, 0x00003366, 0x00000003, 0x00000001,
390 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x40833333, 0x40866666, 0x4089999a,
391 0x408ccccd, 0x00000003, 0x00003466, 0x00000003, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
392 0x00000001, 0x00000001, 0x4131999a, 0x00000004, 0x00313166, 0x00000003, 0x00000002, 0x00000130,
393 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x4141999a, 0x41433333, 0x00000004, 0x00323166,
394 0x00000003, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x4151999a,
395 0x41533333, 0x4154cccd, 0x00000004, 0x00333166, 0x00000003, 0x00000002, 0x00000194, 0x00000000,
396 0x00000000, 0x00000001, 0x00000004, 0x4161999a, 0x41633333, 0x4164cccd, 0x41666666, 0x00000004,
397 0x00343166, 0x00000003, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
398 0x41a8e148, 0x41a9ae14, 0x00000004, 0x00313266, 0x00000003, 0x00000002, 0x000001f4, 0x00000000,
399 0x00000000, 0x00000002, 0x00000002, 0x41b0e148, 0x41b1ae14, 0x41b0f5c3, 0x41b1c28f, 0x00000004,
400 0x00323266, 0x00000003, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
401 0x41b8e148, 0x41b9ae14, 0x41b8f5c3, 0x41b9c28f, 0x41b90a3d, 0x41b9d70a, 0x00000004, 0x00333266,
402 0x00000003, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x41c0e148,
403 0x41c1ae14, 0x41c0f5c3, 0x41c1c28f, 0x41c10a3d, 0x41c1d70a, 0x41c11eb8, 0x41c1eb85, 0x00000004,
404 0x00343266, 0x00000003, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
405 0x41f8e148, 0x41f9ae14, 0x41fa7ae1, 0x00000004, 0x00313366, 0x00000003, 0x00000002, 0x000002e0,
406 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x420070a4, 0x4200d70a, 0x42013d71, 0x42007ae1,
407 0x4200e148, 0x420147ae, 0x00000004, 0x00323366, 0x00000003, 0x00000002, 0x00000328, 0x00000000,
408 0x00000000, 0x00000003, 0x00000003, 0x420470a4, 0x4204d70a, 0x42053d71, 0x42047ae1, 0x4204e148,
409 0x420547ae, 0x4204851f, 0x4204eb85, 0x420551ec, 0x00000004, 0x00333366, 0x00000003, 0x00000002,
410 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x420870a4, 0x4208d70a, 0x42093d71,
411 0x42087ae1, 0x4208e148, 0x420947ae, 0x4208851f, 0x4208eb85, 0x420951ec, 0x42088f5c, 0x4208f5c3,
412 0x42095c29, 0x00000004, 0x00343366, 0x00000003, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
413 0x00000004, 0x00000001, 0x422470a4, 0x4224d70a, 0x42253d71, 0x4225a3d7, 0x00000004, 0x00313466,
414 0x00000003, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x422870a4,
415 0x4228d70a, 0x42293d71, 0x4229a3d7, 0x42287ae1, 0x4228e148, 0x422947ae, 0x4229ae14, 0x00000004,
416 0x00323466, 0x00000003, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
417 0x422c70a4, 0x422cd70a, 0x422d3d71, 0x422da3d7, 0x422c7ae1, 0x422ce148, 0x422d47ae, 0x422dae14,
418 0x422c851f, 0x422ceb85, 0x422d51ec, 0x422db852, 0x00000004, 0x00333466, 0x00000003, 0x00000002,
419 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x423070a4, 0x4230d70a, 0x42313d71,
420 0x4231a3d7, 0x42307ae1, 0x4230e148, 0x423147ae, 0x4231ae14, 0x4230851f, 0x4230eb85, 0x423151ec,
421 0x4231b852, 0x42308f5c, 0x4230f5c3, 0x42315c29, 0x4231c28f, 0x00000004, 0x00343466, 0x00000003,
422 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x3dced917, 0x3dd0e560,
423 0x00000004, 0x00325f66, 0x00000003, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
424 0x00000001, 0x3f8ced91, 0x3f8d0e56, 0x00000005, 0x325f3166, 0x00000000, 0x00000003, 0x00000001,
425 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x400676c9, 0x400cdd2f, 0x4006872b,
426 0x400ced91, 0x00000005, 0x325f3266, 0x00000000, 0x00000003, 0x00000001, 0x0000057c, 0x00000000,
427 0x00000002, 0x00000003, 0x00000001, 0x404676c9, 0x404cdd2f, 0x40534396, 0x4046872b, 0x404ced91,
428 0x405353f8, 0x00000005, 0x325f3366, 0x00000000, 0x00000003, 0x00000001, 0x000005c4, 0x00000000,
429 0x00000002, 0x00000004, 0x00000001, 0x40833b64, 0x40866e98, 0x4089a1cb, 0x408cd4fe, 0x40834396,
430 0x408676c9, 0x4089a9fc, 0x408cdd2f, 0x00000005, 0x325f3466, 0x00000000, 0x00000003, 0x00000002,
431 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41319db2, 0x4131a1cb, 0x00000006,
432 0x5f313166, 0x00000032, 0x00000003, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
433 0x00000002, 0x41419db2, 0x4143374c, 0x4141a1cb, 0x41433b64, 0x00000006, 0x5f323166, 0x00000032,
434 0x00000003, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x41519db2,
435 0x4153374c, 0x4154d0e5, 0x4151a1cb, 0x41533b64, 0x4154d4fe, 0x00000006, 0x5f333166, 0x00000032,
436 0x00000003, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x41619db2,
437 0x4163374c, 0x4164d0e5, 0x41666a7f, 0x4161a1cb, 0x41633b64, 0x4164d4fe, 0x41666e98, 0x00000006,
438 0x5f343166, 0x00000032, 0x00000003, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
439 0x00000001, 0x41a8e17c, 0x41a9ae49, 0x41a8e1b1, 0x41a9ae7d, 0x00000006, 0x5f313266, 0x00000032,
440 0x00000003, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x41b0e17c,
441 0x41b1ae49, 0x41b0f5f7, 0x41b1c2c4, 0x41b0e1b1, 0x41b1ae7d, 0x41b0f62b, 0x41b1c2f8, 0x00000006,
442 0x5f323266, 0x00000032, 0x00000003, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
443 0x00000003, 0x41b8e17c, 0x41b9ae49, 0x41b8f5f7, 0x41b9c2c4, 0x41b90a72, 0x41b9d73f, 0x41b8e1b1,
444 0x41b9ae7d, 0x41b8f62b, 0x41b9c2f8, 0x41b90aa6, 0x41b9d773, 0x00000006, 0x5f333266, 0x00000032,
445 0x00000003, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x41c0e17c,
446 0x41c1ae49, 0x41c0f5f7, 0x41c1c2c4, 0x41c10a72, 0x41c1d73f, 0x41c11eed, 0x41c1ebba, 0x41c0e1b1,
447 0x41c1ae7d, 0x41c0f62b, 0x41c1c2f8, 0x41c10aa6, 0x41c1d773, 0x41c11f21, 0x41c1ebee, 0x00000006,
448 0x5f343266, 0x00000032, 0x00000003, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
449 0x00000001, 0x41f8e17c, 0x41f9ae49, 0x41fa7b16, 0x41f8e1b1, 0x41f9ae7d, 0x41fa7b4a, 0x00000006,
450 0x5f313366, 0x00000032, 0x00000003, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
451 0x00000002, 0x420070be, 0x4200d724, 0x42013d8b, 0x42007afb, 0x4200e162, 0x420147c8, 0x420070d8,
452 0x4200d73f, 0x42013da5, 0x42007b16, 0x4200e17c, 0x420147e3, 0x00000006, 0x5f323366, 0x00000032,
453 0x00000003, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x420470be,
454 0x4204d724, 0x42053d8b, 0x42047afb, 0x4204e162, 0x420547c8, 0x42048539, 0x4204eb9f, 0x42055206,
455 0x420470d8, 0x4204d73f, 0x42053da5, 0x42047b16, 0x4204e17c, 0x420547e3, 0x42048553, 0x4204ebba,
456 0x42055220, 0x00000006, 0x5f333366, 0x00000032, 0x00000003, 0x00000002, 0x00000984, 0x00000000,
457 0x00000002, 0x00000003, 0x00000004, 0x420870be, 0x4208d724, 0x42093d8b, 0x42087afb, 0x4208e162,
458 0x420947c8, 0x42088539, 0x4208eb9f, 0x42095206, 0x42088f76, 0x4208f5dd, 0x42095c43, 0x420870d8,
459 0x4208d73f, 0x42093da5, 0x42087b16, 0x4208e17c, 0x420947e3, 0x42088553, 0x4208ebba, 0x42095220,
460 0x42088f91, 0x4208f5f7, 0x42095c5d, 0x00000006, 0x5f343366, 0x00000032, 0x00000003, 0x00000002,
461 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x422470be, 0x4224d724, 0x42253d8b,
462 0x4225a3f1, 0x422470d8, 0x4224d73f, 0x42253da5, 0x4225a40b, 0x00000006, 0x5f313466, 0x00000032,
463 0x00000003, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x422870be,
464 0x4228d724, 0x42293d8b, 0x4229a3f1, 0x42287afb, 0x4228e162, 0x422947c8, 0x4229ae2f, 0x422870d8,
465 0x4228d73f, 0x42293da5, 0x4229a40b, 0x42287b16, 0x4228e17c, 0x422947e3, 0x4229ae49, 0x00000006,
466 0x5f323466, 0x00000032, 0x00000003, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
467 0x00000003, 0x422c70be, 0x422cd724, 0x422d3d8b, 0x422da3f1, 0x422c7afb, 0x422ce162, 0x422d47c8,
468 0x422dae2f, 0x422c8539, 0x422ceb9f, 0x422d5206, 0x422db86c, 0x422c70d8, 0x422cd73f, 0x422d3da5,
469 0x422da40b, 0x422c7b16, 0x422ce17c, 0x422d47e3, 0x422dae49, 0x422c8553, 0x422cebba, 0x422d5220,
470 0x422db886, 0x00000006, 0x5f333466, 0x00000032, 0x00000003, 0x00000002, 0x00000b64, 0x00000000,
471 0x00000002, 0x00000004, 0x00000004, 0x423070be, 0x4230d724, 0x42313d8b, 0x4231a3f1, 0x42307afb,
472 0x4230e162, 0x423147c8, 0x4231ae2f, 0x42308539, 0x4230eb9f, 0x42315206, 0x4231b86c, 0x42308f76,
473 0x4230f5dd, 0x42315c43, 0x4231c2aa, 0x423070d8, 0x4230d73f, 0x42313da5, 0x4231a40b, 0x42307b16,
474 0x4230e17c, 0x423147e3, 0x4231ae49, 0x42308553, 0x4230ebba, 0x42315220, 0x4231b886, 0x42308f91,
475 0x4230f5f7, 0x42315c5d, 0x4231c2c4, 0x00000006, 0x5f343466, 0x00000032, 0x00000002, 0x00000070,
476 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
477 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
478 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
479 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
480 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
481 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
482 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
483 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
484 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
485 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
486 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
487 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
488 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
489 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
490 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
491 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
492 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
493 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
494 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
495 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
496 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
497 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
498 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
499 };
500
501 struct test_effect_parameter_value_result test_effect_parameter_value_result_float[] =
502 {
503     {"f",     {"f",     NULL, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  10},
504     {"f1",    {"f1",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  20},
505     {"f2",    {"f2",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0,   8},  30},
506     {"f3",    {"f3",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  41},
507     {"f4",    {"f4",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  53},
508     {"f11",   {"f11",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  66},
509     {"f12",   {"f12",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0,   8},  76},
510     {"f13",   {"f13",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  87},
511     {"f14",   {"f14",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  99},
512     {"f21",   {"f21",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 0, 0, 0, 0,   8}, 112},
513     {"f22",   {"f22",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 0, 0, 0, 0,  16}, 123},
514     {"f23",   {"f23",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 0, 0, 0, 0,  24}, 136},
515     {"f24",   {"f24",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 0, 0, 0, 0,  32}, 151},
516     {"f31",   {"f31",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 0, 0, 0, 0,  12}, 168},
517     {"f32",   {"f32",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 0, 0, 0, 0,  24}, 180},
518     {"f33",   {"f33",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 0, 0, 0, 0,  36}, 195},
519     {"f34",   {"f34",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 0, 0, 0, 0,  48}, 213},
520     {"f41",   {"f41",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 0, 0, 0, 0,  16}, 234},
521     {"f42",   {"f42",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 0, 0, 0, 0,  32}, 247},
522     {"f43",   {"f43",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 0, 0, 0, 0,  48}, 264},
523     {"f44",   {"f44",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 0, 0, 0, 0,  64}, 285},
524     {"f_2",   {"f_2",   NULL, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 310},
525     {"f1_2",  {"f1_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 321},
526     {"f2_2",  {"f2_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0,  16}, 333},
527     {"f3_2",  {"f3_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0,  24}, 347},
528     {"f4_2",  {"f4_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0,  32}, 363},
529     {"f11_2", {"f11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 381},
530     {"f12_2", {"f12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0,  16}, 393},
531     {"f13_2", {"f13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0,  24}, 407},
532     {"f14_2", {"f14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0,  32}, 423},
533     {"f21_2", {"f21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 2, 0, 0, 0,  16}, 441},
534     {"f22_2", {"f22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 2, 0, 0, 0,  32}, 455},
535     {"f23_2", {"f23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 2, 0, 0, 0,  48}, 473},
536     {"f24_2", {"f24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 2, 0, 0, 0,  64}, 495},
537     {"f31_2", {"f31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 0, 0,  24}, 521},
538     {"f32_2", {"f32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 2, 0, 0, 0,  48}, 537},
539     {"f33_2", {"f33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 2, 0, 0, 0,  72}, 559},
540     {"f34_2", {"f34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 2, 0, 0, 0,  96}, 587},
541     {"f41_2", {"f41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 2, 0, 0, 0,  32}, 621},
542     {"f42_2", {"f42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 2, 0, 0, 0,  64}, 639},
543     {"f43_2", {"f43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 2, 0, 0, 0,  96}, 665},
544     {"f44_2", {"f44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 0, 0, 128}, 699},
545 };
546
547 /*
548  * fxc.exe /Tfx_2_0
549  */
550 #if 0
551 int i = 1;
552 int1 i1 = {11};
553 int2 i2 = {21, 22};
554 int3 i3 = {31, 32, 33};
555 int4 i4 = {41, 42, 43, 44};
556 int1x1 i11 = {111};
557 int1x2 i12 = {121, 122};
558 int1x3 i13 = {131, 132, 133};
559 int1x4 i14 = {141, 142, 143, 144};
560 int2x1 i21 = {{2111, 2121}};
561 int2x2 i22 = {{2211, 2221}, {2212, 2222}};
562 int2x3 i23 = {{2311, 2321}, {2312, 2322}, {2313, 2323}};
563 int2x4 i24 = {{2411, 2421}, {2412, 2422}, {2413, 2423}, {2414, 2424}};
564 int3x1 i31 = {{3111, 3121, 3131}};
565 int3x2 i32 = {{3211, 3221, 3231}, {3212, 3222, 3232}};
566 int3x3 i33 = {{3311, 3321, 3331}, {3312, 3322, 3332},
567         {3313, 3323, 3333}};
568 int3x4 i34 = {{3411, 3421, 3431}, {3412, 3422, 3432},
569         {3413, 3423, 3433}, {3414, 3424, 3434}};
570 int4x1 i41 = {{4111, 4121, 4131, 4141}};
571 int4x2 i42 = {{4211, 4221, 4231, 4241}, {4212, 4222, 4232, 4242}};
572 int4x3 i43 = {{4311, 4321, 4331, 4341}, {4312, 4322, 4332, 4342},
573         {4313, 4323, 4333, 4343}};
574 int4x4 i44 = {{4411, 4421, 4431, 4441}, {4412, 4422, 4432, 4442},
575         {4413, 4423, 4433, 4443}, {4414, 4424, 4434, 4444}};
576 int i_2[2] = {0101, 0102};
577 int1 i1_2[2] = {{1101}, {1102}};
578 int2 i2_2[2] = {{2101, 2201}, {2102, 2202}};
579 int3 i3_2[2] = {{3101, 3201, 3301}, {3102, 3202, 3302}};
580 int4 i4_2[2] = {{4101, 4201, 4301, 4401}, {4102, 4202, 4302, 4402}};
581 int1x1 i11_2[2] = {{11101}, {11102}};
582 int1x2 i12_2[2] = {{12101, 12201}, {12102, 12202}};
583 int1x3 i13_2[2] = {{13101, 13201, 13301}, {13102, 13202, 13302}};
584 int1x4 i14_2[2] = {{14101, 14201, 14301, 14401}, {14102, 14202, 14302, 14402}};
585 int2x1 i21_2[2] = {{{211101, 212101}}, {{211102, 212102}}};
586 int2x2 i22_2[2] = {{{221101, 222101}, {221201, 222201}}, {{221102, 222102}, {221202, 222202}}};
587 int2x3 i23_2[2] = {{{231101, 232101}, {231201, 232201}, {231301, 232301}}, {{231102, 232102},
588         {231202, 232202}, {231302, 232302}}};
589 int2x4 i24_2[2] = {{{241101, 242101}, {241201, 242201}, {241301, 242301}, {241401, 242401}},
590         {{241102, 242102}, {241202, 242202}, {241302, 242302}, {241402, 242402}}};
591 int3x1 i31_2[2] = {{{311101, 312101, 313101}}, {{311102, 312102, 313102}}};
592 int3x2 i32_2[2] = {{{321101, 322101, 323101}, {321201, 322201, 323201}},
593         {{321102, 322102, 323102}, {321202, 322202, 323202}}};
594 int3x3 i33_2[2] = {{{331101, 332101, 333101}, {331201, 332201, 333201},
595         {331301, 332301, 333301}}, {{331102, 332102, 333102}, {331202, 332202, 333202},
596         {331302, 332302, 333302}}};
597 int3x4 i34_2[2] = {{{341101, 342101, 343101}, {341201, 342201, 343201},
598         {341301, 342301, 343301}, {341401, 342401, 343401}}, {{341102, 342102, 343102},
599         {341202, 342202, 343202}, {341302, 342302, 343302}, {341402, 342402, 343402}}};
600 int4x1 i41_2[2] = {{{411101, 412101, 413101, 414101}}, {{411102, 412102, 413102, 414102}}};
601 int4x2 i42_2[2] = {{{421101, 422101, 423101, 424101}, {421201, 422201, 423201, 424201}},
602         {{421102, 422102, 423102, 424102}, {421202, 422202, 423202, 424202}}};
603 int4x3 i43_2[2] = {{{431101, 432101, 433101, 434101}, {431201, 432201, 433201, 434201},
604         {431301, 432301, 433301, 434301}}, {{431102, 432102, 433102, 434102},
605         {431202, 432202, 433202, 434202}, {431302, 432302, 433302, 434302}}};
606 int4x4 i44_2[2] = {{{441101, 442101, 443101, 444101}, {441201, 442201, 443201, 444201},
607         {441301, 442301, 443301, 444301}, {441401, 442401, 443401, 444401}},
608         {{441102, 442102, 443102, 444102}, {441202, 442202, 443202, 444202},
609         {441302, 442302, 443302, 444302}, {441402, 442402, 443402, 444402}}};
610 technique t { pass p { } }
611 #endif
612 static const DWORD test_effect_parameter_value_blob_int[] =
613 {
614 0xfeff0901, 0x00000b80, 0x00000000, 0x00000002, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
615 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000069, 0x00000002, 0x00000001, 0x0000004c,
616 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x0000000b, 0x00000003, 0x00003169, 0x00000002,
617 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x00000015, 0x00000016,
618 0x00000003, 0x00003269, 0x00000002, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
619 0x00000001, 0x0000001f, 0x00000020, 0x00000021, 0x00000003, 0x00003369, 0x00000002, 0x00000001,
620 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000029, 0x0000002a, 0x0000002b,
621 0x0000002c, 0x00000003, 0x00003469, 0x00000002, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
622 0x00000001, 0x00000001, 0x0000006f, 0x00000004, 0x00313169, 0x00000002, 0x00000002, 0x00000130,
623 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000079, 0x0000007a, 0x00000004, 0x00323169,
624 0x00000002, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x00000083,
625 0x00000084, 0x00000085, 0x00000004, 0x00333169, 0x00000002, 0x00000002, 0x00000194, 0x00000000,
626 0x00000000, 0x00000001, 0x00000004, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000004,
627 0x00343169, 0x00000002, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
628 0x0000083f, 0x00000849, 0x00000004, 0x00313269, 0x00000002, 0x00000002, 0x000001f4, 0x00000000,
629 0x00000000, 0x00000002, 0x00000002, 0x000008a3, 0x000008ad, 0x000008a4, 0x000008ae, 0x00000004,
630 0x00323269, 0x00000002, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
631 0x00000907, 0x00000911, 0x00000908, 0x00000912, 0x00000909, 0x00000913, 0x00000004, 0x00333269,
632 0x00000002, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x0000096b,
633 0x00000975, 0x0000096c, 0x00000976, 0x0000096d, 0x00000977, 0x0000096e, 0x00000978, 0x00000004,
634 0x00343269, 0x00000002, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
635 0x00000c27, 0x00000c31, 0x00000c3b, 0x00000004, 0x00313369, 0x00000002, 0x00000002, 0x000002e0,
636 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000c8b, 0x00000c95, 0x00000c9f, 0x00000c8c,
637 0x00000c96, 0x00000ca0, 0x00000004, 0x00323369, 0x00000002, 0x00000002, 0x00000328, 0x00000000,
638 0x00000000, 0x00000003, 0x00000003, 0x00000cef, 0x00000cf9, 0x00000d03, 0x00000cf0, 0x00000cfa,
639 0x00000d04, 0x00000cf1, 0x00000cfb, 0x00000d05, 0x00000004, 0x00333369, 0x00000002, 0x00000002,
640 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x00000d53, 0x00000d5d, 0x00000d67,
641 0x00000d54, 0x00000d5e, 0x00000d68, 0x00000d55, 0x00000d5f, 0x00000d69, 0x00000d56, 0x00000d60,
642 0x00000d6a, 0x00000004, 0x00343369, 0x00000002, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
643 0x00000004, 0x00000001, 0x0000100f, 0x00001019, 0x00001023, 0x0000102d, 0x00000004, 0x00313469,
644 0x00000002, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x00001073,
645 0x0000107d, 0x00001087, 0x00001091, 0x00001074, 0x0000107e, 0x00001088, 0x00001092, 0x00000004,
646 0x00323469, 0x00000002, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
647 0x000010d7, 0x000010e1, 0x000010eb, 0x000010f5, 0x000010d8, 0x000010e2, 0x000010ec, 0x000010f6,
648 0x000010d9, 0x000010e3, 0x000010ed, 0x000010f7, 0x00000004, 0x00333469, 0x00000002, 0x00000002,
649 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x0000113b, 0x00001145, 0x0000114f,
650 0x00001159, 0x0000113c, 0x00001146, 0x00001150, 0x0000115a, 0x0000113d, 0x00001147, 0x00001151,
651 0x0000115b, 0x0000113e, 0x00001148, 0x00001152, 0x0000115c, 0x00000004, 0x00343469, 0x00000002,
652 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00000041, 0x00000042,
653 0x00000004, 0x00325f69, 0x00000002, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
654 0x00000001, 0x0000044d, 0x0000044e, 0x00000005, 0x325f3169, 0x00000000, 0x00000002, 0x00000001,
655 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000835, 0x00000899, 0x00000836,
656 0x0000089a, 0x00000005, 0x325f3269, 0x00000000, 0x00000002, 0x00000001, 0x0000057c, 0x00000000,
657 0x00000002, 0x00000003, 0x00000001, 0x00000c1d, 0x00000c81, 0x00000ce5, 0x00000c1e, 0x00000c82,
658 0x00000ce6, 0x00000005, 0x325f3369, 0x00000000, 0x00000002, 0x00000001, 0x000005c4, 0x00000000,
659 0x00000002, 0x00000004, 0x00000001, 0x00001005, 0x00001069, 0x000010cd, 0x00001131, 0x00001006,
660 0x0000106a, 0x000010ce, 0x00001132, 0x00000005, 0x325f3469, 0x00000000, 0x00000002, 0x00000002,
661 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00002b5d, 0x00002b5e, 0x00000006,
662 0x5f313169, 0x00000032, 0x00000002, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
663 0x00000002, 0x00002f45, 0x00002fa9, 0x00002f46, 0x00002faa, 0x00000006, 0x5f323169, 0x00000032,
664 0x00000002, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0000332d,
665 0x00003391, 0x000033f5, 0x0000332e, 0x00003392, 0x000033f6, 0x00000006, 0x5f333169, 0x00000032,
666 0x00000002, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x00003715,
667 0x00003779, 0x000037dd, 0x00003841, 0x00003716, 0x0000377a, 0x000037de, 0x00003842, 0x00000006,
668 0x5f343169, 0x00000032, 0x00000002, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
669 0x00000001, 0x0003389d, 0x00033c85, 0x0003389e, 0x00033c86, 0x00000006, 0x5f313269, 0x00000032,
670 0x00000002, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00035fad,
671 0x00036395, 0x00036011, 0x000363f9, 0x00035fae, 0x00036396, 0x00036012, 0x000363fa, 0x00000006,
672 0x5f323269, 0x00000032, 0x00000002, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
673 0x00000003, 0x000386bd, 0x00038aa5, 0x00038721, 0x00038b09, 0x00038785, 0x00038b6d, 0x000386be,
674 0x00038aa6, 0x00038722, 0x00038b0a, 0x00038786, 0x00038b6e, 0x00000006, 0x5f333269, 0x00000032,
675 0x00000002, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x0003adcd,
676 0x0003b1b5, 0x0003ae31, 0x0003b219, 0x0003ae95, 0x0003b27d, 0x0003aef9, 0x0003b2e1, 0x0003adce,
677 0x0003b1b6, 0x0003ae32, 0x0003b21a, 0x0003ae96, 0x0003b27e, 0x0003aefa, 0x0003b2e2, 0x00000006,
678 0x5f343269, 0x00000032, 0x00000002, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
679 0x00000001, 0x0004bf3d, 0x0004c325, 0x0004c70d, 0x0004bf3e, 0x0004c326, 0x0004c70e, 0x00000006,
680 0x5f313369, 0x00000032, 0x00000002, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
681 0x00000002, 0x0004e64d, 0x0004ea35, 0x0004ee1d, 0x0004e6b1, 0x0004ea99, 0x0004ee81, 0x0004e64e,
682 0x0004ea36, 0x0004ee1e, 0x0004e6b2, 0x0004ea9a, 0x0004ee82, 0x00000006, 0x5f323369, 0x00000032,
683 0x00000002, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00050d5d,
684 0x00051145, 0x0005152d, 0x00050dc1, 0x000511a9, 0x00051591, 0x00050e25, 0x0005120d, 0x000515f5,
685 0x00050d5e, 0x00051146, 0x0005152e, 0x00050dc2, 0x000511aa, 0x00051592, 0x00050e26, 0x0005120e,
686 0x000515f6, 0x00000006, 0x5f333369, 0x00000032, 0x00000002, 0x00000002, 0x00000984, 0x00000000,
687 0x00000002, 0x00000003, 0x00000004, 0x0005346d, 0x00053855, 0x00053c3d, 0x000534d1, 0x000538b9,
688 0x00053ca1, 0x00053535, 0x0005391d, 0x00053d05, 0x00053599, 0x00053981, 0x00053d69, 0x0005346e,
689 0x00053856, 0x00053c3e, 0x000534d2, 0x000538ba, 0x00053ca2, 0x00053536, 0x0005391e, 0x00053d06,
690 0x0005359a, 0x00053982, 0x00053d6a, 0x00000006, 0x5f343369, 0x00000032, 0x00000002, 0x00000002,
691 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x000645dd, 0x000649c5, 0x00064dad,
692 0x00065195, 0x000645de, 0x000649c6, 0x00064dae, 0x00065196, 0x00000006, 0x5f313469, 0x00000032,
693 0x00000002, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x00066ced,
694 0x000670d5, 0x000674bd, 0x000678a5, 0x00066d51, 0x00067139, 0x00067521, 0x00067909, 0x00066cee,
695 0x000670d6, 0x000674be, 0x000678a6, 0x00066d52, 0x0006713a, 0x00067522, 0x0006790a, 0x00000006,
696 0x5f323469, 0x00000032, 0x00000002, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
697 0x00000003, 0x000693fd, 0x000697e5, 0x00069bcd, 0x00069fb5, 0x00069461, 0x00069849, 0x00069c31,
698 0x0006a019, 0x000694c5, 0x000698ad, 0x00069c95, 0x0006a07d, 0x000693fe, 0x000697e6, 0x00069bce,
699 0x00069fb6, 0x00069462, 0x0006984a, 0x00069c32, 0x0006a01a, 0x000694c6, 0x000698ae, 0x00069c96,
700 0x0006a07e, 0x00000006, 0x5f333469, 0x00000032, 0x00000002, 0x00000002, 0x00000b64, 0x00000000,
701 0x00000002, 0x00000004, 0x00000004, 0x0006bb0d, 0x0006bef5, 0x0006c2dd, 0x0006c6c5, 0x0006bb71,
702 0x0006bf59, 0x0006c341, 0x0006c729, 0x0006bbd5, 0x0006bfbd, 0x0006c3a5, 0x0006c78d, 0x0006bc39,
703 0x0006c021, 0x0006c409, 0x0006c7f1, 0x0006bb0e, 0x0006bef6, 0x0006c2de, 0x0006c6c6, 0x0006bb72,
704 0x0006bf5a, 0x0006c342, 0x0006c72a, 0x0006bbd6, 0x0006bfbe, 0x0006c3a6, 0x0006c78e, 0x0006bc3a,
705 0x0006c022, 0x0006c40a, 0x0006c7f2, 0x00000006, 0x5f343469, 0x00000032, 0x00000002, 0x00000070,
706 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
707 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
708 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
709 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
710 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
711 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
712 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
713 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
714 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
715 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
716 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
717 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
718 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
719 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
720 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
721 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
722 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
723 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
724 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
725 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
726 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
727 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
728 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
729 };
730
731 struct test_effect_parameter_value_result test_effect_parameter_value_result_int[] =
732 {
733     {"i",     {"i",     NULL, D3DXPC_SCALAR,      D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  10},
734     {"i1",    {"i1",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  20},
735     {"i2",    {"i2",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 2, 0, 0, 0, 0,   8},  30},
736     {"i3",    {"i3",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 3, 0, 0, 0, 0,  12},  41},
737     {"i4",    {"i4",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 4, 0, 0, 0, 0,  16},  53},
738     {"i11",   {"i11",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  66},
739     {"i12",   {"i12",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 0, 0, 0, 0,   8},  76},
740     {"i13",   {"i13",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 0, 0, 0, 0,  12},  87},
741     {"i14",   {"i14",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 0, 0, 0, 0,  16},  99},
742     {"i21",   {"i21",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 0, 0, 0, 0,   8}, 112},
743     {"i22",   {"i22",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 0, 0, 0, 0,  16}, 123},
744     {"i23",   {"i23",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 0, 0, 0, 0,  24}, 136},
745     {"i24",   {"i24",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 0, 0, 0, 0,  32}, 151},
746     {"i31",   {"i31",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 0, 0, 0, 0,  12}, 168},
747     {"i32",   {"i32",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 0, 0, 0, 0,  24}, 180},
748     {"i33",   {"i33",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 0, 0, 0, 0,  36}, 195},
749     {"i34",   {"i34",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 0, 0, 0, 0,  48}, 213},
750     {"i41",   {"i41",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 0, 0, 0, 0,  16}, 234},
751     {"i42",   {"i42",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 0, 0, 0, 0,  32}, 247},
752     {"i43",   {"i43",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 0, 0, 0, 0,  48}, 264},
753     {"i44",   {"i44",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 0, 0, 0, 0,  64}, 285},
754     {"i_2",   {"i_2",   NULL, D3DXPC_SCALAR,      D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 310},
755     {"i1_2",  {"i1_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 321},
756     {"i2_2",  {"i2_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 2, 2, 0, 0, 0,  16}, 333},
757     {"i3_2",  {"i3_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 3, 2, 0, 0, 0,  24}, 347},
758     {"i4_2",  {"i4_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 4, 2, 0, 0, 0,  32}, 363},
759     {"i11_2", {"i11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 381},
760     {"i12_2", {"i12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 2, 0, 0, 0,  16}, 393},
761     {"i13_2", {"i13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 2, 0, 0, 0,  24}, 407},
762     {"i14_2", {"i14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 2, 0, 0, 0,  32}, 423},
763     {"i21_2", {"i21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 2, 0, 0, 0,  16}, 441},
764     {"i22_2", {"i22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 2, 0, 0, 0,  32}, 455},
765     {"i23_2", {"i23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 2, 0, 0, 0,  48}, 473},
766     {"i24_2", {"i24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 2, 0, 0, 0,  64}, 495},
767     {"i31_2", {"i31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 2, 0, 0, 0,  24}, 521},
768     {"i32_2", {"i32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 2, 0, 0, 0,  48}, 537},
769     {"i33_2", {"i33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 2, 0, 0, 0,  72}, 559},
770     {"i34_2", {"i34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 2, 0, 0, 0,  96}, 587},
771     {"i41_2", {"i41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 2, 0, 0, 0,  32}, 621},
772     {"i42_2", {"i42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 2, 0, 0, 0,  64}, 639},
773     {"i43_2", {"i43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 2, 0, 0, 0,  96}, 665},
774     {"i44_2", {"i44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 2, 0, 0, 0, 128}, 699},
775 };
776
777 /*
778  * fxc.exe /Tfx_2_0
779  */
780 #if 0
781 string s = "test";
782 string s_2[2] = {"test1", "test2"};
783 texture2D tex;
784 Vertexshader v;
785 Vertexshader v_2[2];
786 Pixelshader p;
787 Pixelshader p_2[2];
788 technique t { pass p { } }
789 #endif
790 static const DWORD test_effect_parameter_value_blob_object[] =
791 {
792 0xfeff0901, 0x00000100, 0x00000000, 0x00000004, 0x00000004, 0x0000001c, 0x00000000, 0x00000000,
793 0x00000001, 0x00000002, 0x00000073, 0x00000004, 0x00000004, 0x00000040, 0x00000000, 0x00000002,
794 0x00000002, 0x00000003, 0x00000004, 0x00325f73, 0x00000007, 0x00000004, 0x00000060, 0x00000000,
795 0x00000000, 0x00000004, 0x00000004, 0x00786574, 0x00000010, 0x00000004, 0x00000080, 0x00000000,
796 0x00000000, 0x00000005, 0x00000002, 0x00000076, 0x00000010, 0x00000004, 0x000000a4, 0x00000000,
797 0x00000002, 0x00000006, 0x00000007, 0x00000004, 0x00325f76, 0x0000000f, 0x00000004, 0x000000c4,
798 0x00000000, 0x00000000, 0x00000008, 0x00000002, 0x00000070, 0x0000000f, 0x00000004, 0x000000e8,
799 0x00000000, 0x00000002, 0x00000009, 0x0000000a, 0x00000004, 0x00325f70, 0x00000002, 0x00000070,
800 0x00000002, 0x00000074, 0x00000007, 0x00000001, 0x00000007, 0x0000000b, 0x00000004, 0x00000018,
801 0x00000000, 0x00000000, 0x00000024, 0x00000038, 0x00000000, 0x00000000, 0x00000048, 0x0000005c,
802 0x00000000, 0x00000000, 0x00000068, 0x0000007c, 0x00000000, 0x00000000, 0x00000088, 0x0000009c,
803 0x00000000, 0x00000000, 0x000000ac, 0x000000c0, 0x00000000, 0x00000000, 0x000000cc, 0x000000e0,
804 0x00000000, 0x00000000, 0x000000f8, 0x00000000, 0x00000001, 0x000000f0, 0x00000000, 0x00000000,
805 0x0000000a, 0x00000000, 0x00000009, 0x00000000, 0x0000000a, 0x00000000, 0x00000008, 0x00000000,
806 0x00000006, 0x00000000, 0x00000007, 0x00000000, 0x00000005, 0x00000000, 0x00000004, 0x00000000,
807 0x00000002, 0x00000006, 0x74736574, 0x00000031, 0x00000003, 0x00000006, 0x74736574, 0x00000032,
808 0x00000001, 0x00000005, 0x74736574, 0x00000000,
809 };
810
811 struct test_effect_parameter_value_result test_effect_parameter_value_result_object[] =
812 {
813     {"s",     {"s",     NULL, D3DXPC_OBJECT, D3DXPT_STRING,       0, 0, 0, 0, 0, 0, sizeof(LPCSTR)},                      0},
814     {"s_2",   {"s_2",   NULL, D3DXPC_OBJECT, D3DXPT_STRING,       0, 0, 2, 0, 0, 0, 2 * sizeof(LPCSTR)},                  0},
815     {"tex",   {"tex",   NULL, D3DXPC_OBJECT, D3DXPT_TEXTURE2D,    0, 0, 0, 0, 0, 0, sizeof(LPDIRECT3DBASETEXTURE9)},      0},
816     {"v",     {"v",     NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 0, 0, 0, 0, sizeof(LPDIRECT3DVERTEXSHADER9)},     0},
817     {"v_2",   {"v_2",   NULL, D3DXPC_OBJECT, D3DXPT_VERTEXSHADER, 0, 0, 2, 0, 0, 0, 2 * sizeof(LPDIRECT3DVERTEXSHADER9)}, 0},
818     {"p",     {"p",     NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER,  0, 0, 0, 0, 0, 0, sizeof(LPDIRECT3DPIXELSHADER9)},      0},
819     {"p_2",   {"p_2",   NULL, D3DXPC_OBJECT, D3DXPT_PIXELSHADER,  0, 0, 2, 0, 0, 0, 2 * sizeof(LPDIRECT3DPIXELSHADER9)},  0},
820 };
821
822 /*
823  * fxc.exe /Tfx_2_0
824  */
825 #if 0
826 float3 f3 = {-3.1, 153.2, 283.3};
827 float3 f3min = {-31.1, -31.2, -31.3};
828 float3 f3max = {320.1, 320.2, 320.3};
829 float4 f4 = {-4.1, 154.2, 284.3, 34.4};
830 float4 f4min = {-41.1, -41.2, -41.3, -41.4};
831 float4 f4max = {420.1, 42.20, 420.3, 420.4};
832 technique t { pass p { } }
833 #endif
834 static const DWORD test_effect_parameter_value_blob_special[] =
835 {
836 0xfeff0901, 0x00000150, 0x00000000, 0x00000003, 0x00000001, 0x0000002c, 0x00000000, 0x00000000,
837 0x00000003, 0x00000001, 0xc0466666, 0x43193333, 0x438da666, 0x00000003, 0x00003366, 0x00000003,
838 0x00000001, 0x0000005c, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0xc1f8cccd, 0xc1f9999a,
839 0xc1fa6666, 0x00000006, 0x696d3366, 0x0000006e, 0x00000003, 0x00000001, 0x00000090, 0x00000000,
840 0x00000000, 0x00000003, 0x00000001, 0x43a00ccd, 0x43a0199a, 0x43a02666, 0x00000006, 0x616d3366,
841 0x00000078, 0x00000003, 0x00000001, 0x000000c8, 0x00000000, 0x00000000, 0x00000004, 0x00000001,
842 0xc0833333, 0x431a3333, 0x438e2666, 0x4209999a, 0x00000003, 0x00003466, 0x00000003, 0x00000001,
843 0x000000fc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0xc2246666, 0xc224cccd, 0xc2253333,
844 0xc225999a, 0x00000006, 0x696d3466, 0x0000006e, 0x00000003, 0x00000001, 0x00000134, 0x00000000,
845 0x00000000, 0x00000004, 0x00000001, 0x43d20ccd, 0x4228cccd, 0x43d22666, 0x43d23333, 0x00000006,
846 0x616d3466, 0x00000078, 0x00000002, 0x00000070, 0x00000002, 0x00000074, 0x00000006, 0x00000001,
847 0x00000001, 0x00000001, 0x00000004, 0x00000020, 0x00000000, 0x00000000, 0x00000034, 0x00000050,
848 0x00000000, 0x00000000, 0x00000068, 0x00000084, 0x00000000, 0x00000000, 0x0000009c, 0x000000b8,
849 0x00000000, 0x00000000, 0x000000d0, 0x000000ec, 0x00000000, 0x00000000, 0x00000108, 0x00000124,
850 0x00000000, 0x00000000, 0x00000148, 0x00000000, 0x00000001, 0x00000140, 0x00000000, 0x00000000,
851 0x00000000, 0x00000000,
852 };
853
854 struct test_effect_parameter_value_result test_effect_parameter_value_result_special[] =
855 {
856     {"f3",    {"f3",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  10},
857     {"f3min", {"f3min", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  22},
858     {"f3max", {"f3max", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  35},
859     {"f4",    {"f4",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  48},
860     {"f4min", {"f4min", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  61},
861     {"f4max", {"f4max", NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  75},
862 };
863
864 #define ADD_PARAMETER_VALUE(x) {\
865     test_effect_parameter_value_blob_ ## x,\
866     sizeof(test_effect_parameter_value_blob_ ## x),\
867     test_effect_parameter_value_result_ ## x,\
868     sizeof(test_effect_parameter_value_result_ ## x)/sizeof(*test_effect_parameter_value_result_ ## x),\
869 }
870
871 static const struct
872 {
873     const DWORD *blob;
874     UINT blob_size;
875     const struct test_effect_parameter_value_result *res;
876     UINT res_count;
877 }
878 test_effect_parameter_value_data[] =
879 {
880     ADD_PARAMETER_VALUE(float),
881     ADD_PARAMETER_VALUE(int),
882     ADD_PARAMETER_VALUE(object),
883     ADD_PARAMETER_VALUE(special),
884 };
885
886 #undef ADD_PARAMETER_VALUE
887
888 #define EFFECT_PARAMETER_VALUE_ARRAY_SIZE 48
889 /* Constants for special INT/FLOAT conversation */
890 #define INT_FLOAT_MULTI 255.0f
891 #define INT_FLOAT_MULTI_INVERSE (1/INT_FLOAT_MULTI)
892
893 static void test_effect_parameter_value_GetValue(const struct test_effect_parameter_value_result *res,
894         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
895 {
896     const D3DXPARAMETER_DESC *res_desc = &res->desc;
897     LPCSTR res_full_name = res->full_name;
898     DWORD value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
899     HRESULT hr;
900     UINT l;
901
902     memset(value, 0xab, sizeof(value));
903     hr = effect->lpVtbl->GetValue(effect, parameter, value, res_desc->Bytes);
904     if (res_desc->Class == D3DXPC_SCALAR
905             || res_desc->Class == D3DXPC_VECTOR
906             || res_desc->Class == D3DXPC_MATRIX_ROWS)
907     {
908         ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
909
910         for (l = 0; l < res_desc->Bytes / sizeof(*value); ++l)
911         {
912             ok(value[l] == res_value[l], "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
913                     i, res_full_name, l, value[l], res_value[l]);
914         }
915
916         for (l = res_desc->Bytes / sizeof(*value); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
917         {
918             ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
919                     i, res_full_name, l, value[l], 0xabababab);
920         }
921     }
922     else if (res_desc->Class == D3DXPC_OBJECT)
923     {
924         switch (res_desc->Type)
925         {
926             case D3DXPT_PIXELSHADER:
927             case D3DXPT_VERTEXSHADER:
928             case D3DXPT_TEXTURE2D:
929                 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
930
931                 for (l = 0; l < (res_desc->Elements ? res_desc->Elements : 1); ++l)
932                 {
933                     IUnknown *unk = *((IUnknown **)value + l);
934                     if (unk) IUnknown_Release(unk);
935                 }
936                 break;
937
938             case D3DXPT_STRING:
939                 ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
940                 break;
941
942             default:
943                 ok(0, "Type is %u, this should not happen!\n", res_desc->Type);
944                 break;
945         }
946     }
947     else
948     {
949         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
950                 i, res_full_name, hr, D3DERR_INVALIDCALL);
951
952         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
953         {
954             ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
955                     i, res_full_name, l, value[l], 0xabababab);
956         }
957     }
958 }
959
960 static void test_effect_parameter_value_GetBool(const struct test_effect_parameter_value_result *res,
961         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
962 {
963     const D3DXPARAMETER_DESC *res_desc = &res->desc;
964     LPCSTR res_full_name = res->full_name;
965     BOOL bvalue = 0xabababab;
966     HRESULT hr;
967
968     hr = effect->lpVtbl->GetBool(effect, parameter, &bvalue);
969     if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
970     {
971         ok(hr == D3D_OK, "%u - %s: GetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
972         ok(bvalue == get_bool(res_value), "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
973                 i, res_full_name, bvalue, get_bool(res_value));
974     }
975     else
976     {
977         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
978                 i, res_full_name, hr, D3DERR_INVALIDCALL);
979         ok(bvalue == 0xabababab, "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
980                 i, res_full_name, bvalue, 0xabababab);
981     }
982 }
983
984 static void test_effect_parameter_value_GetBoolArray(const struct test_effect_parameter_value_result *res,
985         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
986 {
987     const D3DXPARAMETER_DESC *res_desc = &res->desc;
988     LPCSTR res_full_name = res->full_name;
989     BOOL bavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
990     HRESULT hr;
991     UINT l;
992
993     memset(bavalue, 0xab, sizeof(bavalue));
994     hr = effect->lpVtbl->GetBoolArray(effect, parameter, bavalue, res_desc->Bytes / sizeof(*bavalue));
995     if (res_desc->Class == D3DXPC_SCALAR
996             || res_desc->Class == D3DXPC_VECTOR
997             || res_desc->Class == D3DXPC_MATRIX_ROWS)
998     {
999         ok(hr == D3D_OK, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1000
1001         for (l = 0; l < res_desc->Bytes / sizeof(*bavalue); ++l)
1002         {
1003             ok(bavalue[l] == get_bool(&res_value[l]), "%u - %s: GetBoolArray bavalue[%u] failed, got %#x, expected %#x\n",
1004                     i, res_full_name, l, bavalue[l], get_bool(&res_value[l]));
1005         }
1006
1007         for (l = res_desc->Bytes / sizeof(*bavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1008         {
1009             ok(bavalue[l] == 0xabababab, "%u - %s: GetBoolArray bavalue[%u] failed, got %#x, expected %#x\n",
1010                     i, res_full_name, l, bavalue[l], 0xabababab);
1011         }
1012     }
1013     else
1014     {
1015         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1016                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1017
1018         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1019         {
1020             ok(bavalue[l] == 0xabababab, "%u - %s: GetBoolArray bavalue[%u] failed, got %#x, expected %#x\n",
1021                     i, res_full_name, l, bavalue[l], 0xabababab);
1022         }
1023     }
1024 }
1025
1026 static void test_effect_parameter_value_GetInt(const struct test_effect_parameter_value_result *res,
1027         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1028 {
1029     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1030     LPCSTR res_full_name = res->full_name;
1031     INT ivalue = 0xabababab;
1032     HRESULT hr;
1033
1034     hr = effect->lpVtbl->GetInt(effect, parameter, &ivalue);
1035     if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
1036     {
1037         ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1038         ok(ivalue == get_int(res_desc->Type, res_value), "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
1039                 i, res_full_name, ivalue, get_int(res_desc->Type, res_value));
1040     }
1041     else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
1042             ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
1043             (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
1044     {
1045         INT tmp;
1046
1047         ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1048
1049         tmp = (INT)(min(max(0.0f, *((FLOAT *)res_value + 2)), 1.0f) * INT_FLOAT_MULTI);
1050         tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8;
1051         tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16;
1052         if (res_desc->Columns * res_desc->Rows > 3)
1053         {
1054             tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24;
1055         }
1056
1057         ok(ivalue == tmp, "%u - %s: GetInt ivalue failed, got %x, expected %x\n",
1058                 i, res_full_name, ivalue, tmp);
1059     }
1060     else
1061     {
1062         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1063                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1064         ok(ivalue == 0xabababab, "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
1065                 i, res_full_name, ivalue, 0xabababab);
1066     }
1067 }
1068
1069 static void test_effect_parameter_value_GetIntArray(const struct test_effect_parameter_value_result *res,
1070         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1071 {
1072     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1073     LPCSTR res_full_name = res->full_name;
1074     INT iavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1075     HRESULT hr;
1076     UINT l;
1077
1078     memset(iavalue, 0xab, sizeof(iavalue));
1079     hr = effect->lpVtbl->GetIntArray(effect, parameter, iavalue, res_desc->Bytes / sizeof(*iavalue));
1080     if (res_desc->Class == D3DXPC_SCALAR
1081             || res_desc->Class == D3DXPC_VECTOR
1082             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1083     {
1084         ok(hr == D3D_OK, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1085
1086         for (l = 0; l < res_desc->Bytes / sizeof(*iavalue); ++l)
1087         {
1088             ok(iavalue[l] == get_int(res_desc->Type, &res_value[l]), "%u - %s: GetIntArray iavalue[%u] failed, got %i, expected %i\n",
1089                     i, res_full_name, l, iavalue[l], get_int(res_desc->Type, &res_value[l]));
1090         }
1091
1092         for (l = res_desc->Bytes / sizeof(*iavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1093         {
1094             ok(iavalue[l] == 0xabababab, "%u - %s: GetIntArray iavalue[%u] failed, got %i, expected %i\n",
1095                     i, res_full_name, l, iavalue[l], 0xabababab);
1096         }
1097     }
1098     else
1099     {
1100         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1101                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1102
1103         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1104         {
1105             ok(iavalue[l] == 0xabababab, "%u - %s: GetIntArray iavalue[%u] failed, got %i, expected %i\n",
1106                     i, res_full_name, l, iavalue[l], 0xabababab);
1107         }
1108     }
1109 }
1110
1111 static void test_effect_parameter_value_GetFloat(const struct test_effect_parameter_value_result *res,
1112         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1113 {
1114     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1115     LPCSTR res_full_name = res->full_name;
1116     HRESULT hr;
1117     DWORD cmp = 0xabababab;
1118     FLOAT fvalue = *(FLOAT *)&cmp;
1119
1120     hr = effect->lpVtbl->GetFloat(effect, parameter, &fvalue);
1121     if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
1122     {
1123         ok(hr == D3D_OK, "%u - %s: GetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1124         ok(compare_float(fvalue, get_float(res_desc->Type, res_value), 512), "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
1125                 i, res_full_name, fvalue, get_float(res_desc->Type, res_value));
1126     }
1127     else
1128     {
1129         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1130                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1131         ok(fvalue == *(FLOAT *)&cmp, "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
1132                 i, res_full_name, fvalue, *(FLOAT *)&cmp);
1133     }
1134 }
1135
1136 static void test_effect_parameter_value_GetFloatArray(const struct test_effect_parameter_value_result *res,
1137         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1138 {
1139     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1140     LPCSTR res_full_name = res->full_name;
1141     FLOAT favalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1142     HRESULT hr;
1143     UINT l;
1144     DWORD cmp = 0xabababab;
1145
1146     memset(favalue, 0xab, sizeof(favalue));
1147     hr = effect->lpVtbl->GetFloatArray(effect, parameter, favalue, res_desc->Bytes / sizeof(*favalue));
1148     if (res_desc->Class == D3DXPC_SCALAR
1149             || res_desc->Class == D3DXPC_VECTOR
1150             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1151     {
1152         ok(hr == D3D_OK, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1153
1154         for (l = 0; l < res_desc->Bytes / sizeof(*favalue); ++l)
1155         {
1156             ok(compare_float(favalue[l], get_float(res_desc->Type, &res_value[l]), 512),
1157                     "%u - %s: GetFloatArray favalue[%u] failed, got %f, expected %f\n",
1158                     i, res_full_name, l, favalue[l], get_float(res_desc->Type, &res_value[l]));
1159         }
1160
1161         for (l = res_desc->Bytes / sizeof(*favalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1162         {
1163             ok(favalue[l] == *(FLOAT *)&cmp, "%u - %s: GetFloatArray favalue[%u] failed, got %f, expected %f\n",
1164                     i, res_full_name, l, favalue[l], *(FLOAT *)&cmp);
1165         }
1166     }
1167     else
1168     {
1169         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1170                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1171
1172         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1173         {
1174             ok(favalue[l] == *(FLOAT *)&cmp, "%u - %s: GetFloatArray favalue[%u] failed, got %f, expected %f\n",
1175                     i, res_full_name, l, favalue[l], *(FLOAT *)&cmp);
1176         }
1177     }
1178 }
1179
1180 static void test_effect_parameter_value_GetVector(const struct test_effect_parameter_value_result *res,
1181         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1182 {
1183     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1184     LPCSTR res_full_name = res->full_name;
1185     HRESULT hr;
1186     DWORD cmp = 0xabababab;
1187     FLOAT fvalue[4];
1188     UINT l;
1189
1190     memset(fvalue, 0xab, sizeof(fvalue));
1191     hr = effect->lpVtbl->GetVector(effect, parameter, (D3DXVECTOR4 *)&fvalue);
1192     if (!res_desc->Elements &&
1193             (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR) &&
1194             res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
1195     {
1196         DWORD tmp;
1197
1198         ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1199
1200         tmp = (DWORD)(*(fvalue + 2) * INT_FLOAT_MULTI);
1201         tmp += ((DWORD)(*(fvalue + 1) * INT_FLOAT_MULTI)) << 8;
1202         tmp += ((DWORD)(*fvalue * INT_FLOAT_MULTI)) << 16;
1203         tmp += ((DWORD)(*(fvalue + 3) * INT_FLOAT_MULTI)) << 24;
1204
1205         ok(*res_value == tmp, "%u - %s: GetVector ivalue failed, got %i, expected %i\n",
1206                 i, res_full_name, tmp, *res_value);
1207     }
1208     else if (!res_desc->Elements && (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR))
1209     {
1210         ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1211
1212         for (l = 0; l < res_desc->Columns; ++l)
1213         {
1214             ok(compare_float(fvalue[l], get_float(res_desc->Type, &res_value[l]), 512),
1215                     "%u - %s: GetVector fvalue[%u] failed, got %f, expected %f\n",
1216                     i, res_full_name, l, fvalue[l], get_float(res_desc->Type, &res_value[l]));
1217         }
1218
1219         for (l = res_desc->Columns; l < 4; ++l)
1220         {
1221             ok(fvalue[l] == 0.0f, "%u - %s: GetVector fvalue[%u] failed, got %f, expected %f\n",
1222                     i, res_full_name, l, fvalue[l], 0.0f);
1223         }
1224     }
1225     else
1226     {
1227         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1228                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1229
1230         for (l = 0; l < 4; ++l)
1231         {
1232             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVector fvalue[%u] failed, got %f, expected %f\n",
1233                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1234         }
1235     }
1236 }
1237
1238 static void test_effect_parameter_value_GetVectorArray(const struct test_effect_parameter_value_result *res,
1239         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1240 {
1241     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1242     LPCSTR res_full_name = res->full_name;
1243     HRESULT hr;
1244     DWORD cmp = 0xabababab;
1245     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1246     UINT l, k;
1247
1248     memset(fvalue, 0xab, sizeof(fvalue));
1249     hr = effect->lpVtbl->GetVectorArray(effect, parameter, (D3DXVECTOR4 *)&fvalue, res_desc->Elements);
1250     if (!res_desc->Elements)
1251     {
1252         ok(hr == D3D_OK, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1253
1254         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1255         {
1256             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1257                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1258         }
1259     }
1260     else if (res_desc->Elements && res_desc->Class == D3DXPC_VECTOR)
1261     {
1262         ok(hr == D3D_OK, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1263
1264         for (k = 0; k < res_desc->Elements; ++k)
1265         {
1266             for (l = 0; l < res_desc->Columns; ++l)
1267             {
1268                 ok(compare_float(fvalue[l + k * 4], get_float(res_desc->Type, &res_value[ l + k * res_desc->Columns]), 512),
1269                         "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1270                         i, res_full_name, l + k * 4, fvalue[ l + k * 4], get_float(res_desc->Type, &res_value[ l + k * res_desc->Columns]));
1271             }
1272
1273             for (l = res_desc->Columns; l < 4; ++l)
1274             {
1275                 ok(fvalue[ l + k * 4] == 0.0f, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1276                         i, res_full_name, l + k * 4, fvalue[ l + k * 4], 0.0f);
1277             }
1278         }
1279
1280         for (l = res_desc->Elements * 4; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1281         {
1282             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1283                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1284         }
1285     }
1286     else
1287     {
1288         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1289                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1290
1291         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1292         {
1293             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1294                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1295         }
1296     }
1297 }
1298
1299 static void test_effect_parameter_value_GetMatrix(const struct test_effect_parameter_value_result *res,
1300         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1301 {
1302     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1303     LPCSTR res_full_name = res->full_name;
1304     HRESULT hr;
1305     DWORD cmp = 0xabababab;
1306     FLOAT fvalue[16];
1307     UINT l, k;
1308
1309     memset(fvalue, 0xab, sizeof(fvalue));
1310     hr = effect->lpVtbl->GetMatrix(effect, parameter, (D3DXMATRIX *)&fvalue);
1311     if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1312     {
1313         ok(hr == D3D_OK, "%u - %s: GetMatrix failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1314
1315         for (k = 0; k < 4; ++k)
1316         {
1317             for (l = 0; l < 4; ++l)
1318             {
1319                 if (k < res_desc->Columns && l < res_desc->Rows)
1320                 {
1321                     ok(compare_float(fvalue[l * 4 + k], get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]), 512),
1322                             "%u - %s: GetMatrix fvalue[%u] failed, got %f, expected %f\n",
1323                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k],
1324                             get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]));
1325                 }
1326                 else
1327                 {
1328                     ok(fvalue[l * 4 + k] == 0.0f, "%u - %s: GetMatrix fvalue[%u] failed, got %f, expected %f\n",
1329                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k], 0.0f);
1330                 }
1331             }
1332         }
1333     }
1334     else
1335     {
1336         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x\n",
1337                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1338
1339         for (l = 0; l < sizeof(fvalue) / sizeof(*fvalue); ++l)
1340         {
1341             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrix fvalue[%u] failed, got %f, expected %f\n",
1342                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1343         }
1344     }
1345 }
1346
1347 static void test_effect_parameter_value_GetMatrixArray(const struct test_effect_parameter_value_result *res,
1348         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1349 {
1350     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1351     LPCSTR res_full_name = res->full_name;
1352     HRESULT hr;
1353     DWORD cmp = 0xabababab;
1354     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1355     UINT l, k, m;
1356
1357     memset(fvalue, 0xab, sizeof(fvalue));
1358     hr = effect->lpVtbl->GetMatrixArray(effect, parameter, (D3DXMATRIX *)&fvalue, res_desc->Elements);
1359     if (!res_desc->Elements)
1360     {
1361         ok(hr == D3D_OK, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1362
1363         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1364         {
1365             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1366                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1367         }
1368     }
1369     else if (res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1370     {
1371         ok(hr == D3D_OK, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1372
1373         for (m = 0; m < res_desc->Elements; ++m)
1374         {
1375             for (k = 0; k < 4; ++k)
1376             {
1377                 for (l = 0; l < 4; ++l)
1378                 {
1379                     if (k < res_desc->Columns && l < res_desc->Rows)
1380                     {
1381                         ok(compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type,
1382                                 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512),
1383                                 "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1384                                 i, res_full_name, m * 16 + l * 4 + k, fvalue[m * 16 + l * 4 + k],
1385                                 get_float(res_desc->Type, &res_value[m * res_desc->Columns * res_desc->Rows
1386                                 + l * res_desc->Columns + k]));
1387                     }
1388                     else
1389                     {
1390                         ok(fvalue[m * 16 + l * 4 + k] == 0.0f, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1391                                 i, res_full_name, m * 16 + l * 4 + k, fvalue[m * 16 + l * 4 + k], 0.0f);
1392                     }
1393                 }
1394             }
1395         }
1396
1397         for (l = res_desc->Elements * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1398         {
1399             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1400                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1401         }
1402     }
1403     else
1404     {
1405         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1406                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1407
1408         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1409         {
1410             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1411                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1412         }
1413     }
1414 }
1415
1416 static void test_effect_parameter_value_GetMatrixTranspose(const struct test_effect_parameter_value_result *res,
1417         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1418 {
1419     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1420     LPCSTR res_full_name = res->full_name;
1421     HRESULT hr;
1422     DWORD cmp = 0xabababab;
1423     FLOAT fvalue[16];
1424     UINT l, k;
1425
1426     memset(fvalue, 0xab, sizeof(fvalue));
1427     hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, (D3DXMATRIX *)&fvalue);
1428     if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1429     {
1430         ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1431
1432         for (k = 0; k < 4; ++k)
1433         {
1434             for (l = 0; l < 4; ++l)
1435             {
1436                 if (k < res_desc->Columns && l < res_desc->Rows)
1437                 {
1438                     ok(compare_float(fvalue[l + k * 4], get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]), 512),
1439                             "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1440                             i, res_full_name, l + k * 4, fvalue[l + k * 4],
1441                             get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]));
1442                 }
1443                 else
1444                 {
1445                     ok(fvalue[l + k * 4] == 0.0f, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1446                             i, res_full_name, l + k * 4, fvalue[l + k * 4], 0.0f);
1447                 }
1448             }
1449         }
1450     }
1451     else if (!res_desc->Elements && (res_desc->Class == D3DXPC_VECTOR || res_desc->Class == D3DXPC_SCALAR))
1452     {
1453         ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1454
1455         for (k = 0; k < 4; ++k)
1456         {
1457             for (l = 0; l < 4; ++l)
1458             {
1459                 if (k < res_desc->Columns && l < res_desc->Rows)
1460                 {
1461                     FLOAT res = get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]);
1462
1463                     ok(fvalue[l * 4 + k] == res, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1464                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k], res);
1465                 }
1466                 else
1467                 {
1468                     ok(fvalue[l * 4 + k] == 0.0f, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1469                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k], 0.0f);
1470                 }
1471             }
1472         }
1473     }
1474     else
1475     {
1476         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
1477                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1478
1479         for (l = 0; l < sizeof(fvalue) / sizeof(*fvalue); ++l)
1480         {
1481             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1482                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1483         }
1484     }
1485 }
1486
1487 static void test_effect_parameter_value_GetMatrixTransposeArray(const struct test_effect_parameter_value_result *res,
1488         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1489 {
1490     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1491     LPCSTR res_full_name = res->full_name;
1492     HRESULT hr;
1493     DWORD cmp = 0xabababab;
1494     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1495     UINT l, k, m;
1496
1497     memset(fvalue, 0xab, sizeof(fvalue));
1498     hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)&fvalue, res_desc->Elements);
1499     if (!res_desc->Elements)
1500     {
1501         ok(hr == D3D_OK, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1502
1503         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1504         {
1505             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1506                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1507         }
1508     }
1509     else if (res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1510     {
1511         ok(hr == D3D_OK, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1512
1513         for (m = 0; m < res_desc->Elements; ++m)
1514         {
1515             for (k = 0; k < 4; ++k)
1516             {
1517                 for (l = 0; l < 4; ++l)
1518                 {
1519                     if (k < res_desc->Columns && l < res_desc->Rows)
1520                     {
1521                         ok(compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type,
1522                                 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512),
1523                                 "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1524                                 i, res_full_name, m * 16 + l + k * 4, fvalue[m * 16 + l + k * 4],
1525                                 get_float(res_desc->Type, &res_value[m * res_desc->Columns * res_desc->Rows
1526                                 + l * res_desc->Columns + k]));
1527                     }
1528                     else
1529                     {
1530                         ok(fvalue[m * 16 + l + k * 4] == 0.0f, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1531                                 i, res_full_name, m * 16 + l + k * 4, fvalue[m * 16 + l + k * 4], 0.0f);
1532                     }
1533                 }
1534             }
1535         }
1536
1537         for (l = res_desc->Elements * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1538         {
1539             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1540                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1541         }
1542     }
1543     else
1544     {
1545         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1546                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1547
1548         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1549         {
1550             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1551                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1552         }
1553     }
1554 }
1555
1556 static void test_effect_parameter_value_GetTestGroup(const struct test_effect_parameter_value_result *res,
1557         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1558 {
1559     test_effect_parameter_value_GetValue(res, effect, res_value, parameter, i);
1560     test_effect_parameter_value_GetBool(res, effect, res_value, parameter, i);
1561     test_effect_parameter_value_GetBoolArray(res, effect, res_value, parameter, i);
1562     test_effect_parameter_value_GetInt(res, effect, res_value, parameter, i);
1563     test_effect_parameter_value_GetIntArray(res, effect, res_value, parameter, i);
1564     test_effect_parameter_value_GetFloat(res, effect, res_value, parameter, i);
1565     test_effect_parameter_value_GetFloatArray(res, effect, res_value, parameter, i);
1566     test_effect_parameter_value_GetVector(res, effect, res_value, parameter, i);
1567     test_effect_parameter_value_GetVectorArray(res, effect, res_value, parameter, i);
1568     test_effect_parameter_value_GetMatrix(res, effect, res_value, parameter, i);
1569     test_effect_parameter_value_GetMatrixArray(res, effect, res_value, parameter, i);
1570     test_effect_parameter_value_GetMatrixTranspose(res, effect, res_value, parameter, i);
1571     test_effect_parameter_value_GetMatrixTransposeArray(res, effect, res_value, parameter, i);
1572 }
1573
1574 static void test_effect_parameter_value_ResetValue(const struct test_effect_parameter_value_result *res,
1575         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1576 {
1577     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1578     LPCSTR res_full_name = res->full_name;
1579     HRESULT hr;
1580
1581     if (res_desc->Class == D3DXPC_SCALAR
1582             || res_desc->Class == D3DXPC_VECTOR
1583             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1584     {
1585         hr = effect->lpVtbl->SetValue(effect, parameter, res_value, res_desc->Bytes);
1586         ok(hr == D3D_OK, "%u - %s: SetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1587     }
1588     else
1589     {
1590         /* nothing to do */
1591         switch (res_desc->Type)
1592         {
1593             case D3DXPT_PIXELSHADER:
1594             case D3DXPT_VERTEXSHADER:
1595             case D3DXPT_TEXTURE2D:
1596             case D3DXPT_STRING:
1597                 break;
1598
1599             default:
1600                 ok(0, "Type is %u, this should not happen!\n", res_desc->Type);
1601                 break;
1602         }
1603     }
1604 }
1605
1606 static void test_effect_parameter_value(IDirect3DDevice9 *device)
1607 {
1608     UINT i;
1609     UINT effect_count = sizeof(test_effect_parameter_value_data) / sizeof(*test_effect_parameter_value_data);
1610
1611     for (i = 0; i < effect_count; ++i)
1612     {
1613         const struct test_effect_parameter_value_result *res = test_effect_parameter_value_data[i].res;
1614         UINT res_count = test_effect_parameter_value_data[i].res_count;
1615         const DWORD *blob = test_effect_parameter_value_data[i].blob;
1616         UINT blob_size = test_effect_parameter_value_data[i].blob_size;
1617         HRESULT hr;
1618         ID3DXEffect *effect;
1619         D3DXEFFECT_DESC edesc;
1620         ULONG count;
1621         UINT k;
1622
1623         hr = D3DXCreateEffect(device, blob, blob_size, NULL, NULL, 0, NULL, &effect, NULL);
1624         ok(hr == D3D_OK, "%u: D3DXCreateEffect failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1625
1626         hr = effect->lpVtbl->GetDesc(effect, &edesc);
1627         ok(hr == D3D_OK, "%u: GetDesc failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1628         ok(edesc.Parameters == res_count, "%u: Parameters failed, got %u, expected %u\n",
1629                 i, edesc.Parameters, res_count);
1630
1631         for (k = 0; k < res_count; ++k)
1632         {
1633             const D3DXPARAMETER_DESC *res_desc = &res[k].desc;
1634             LPCSTR res_full_name = res[k].full_name;
1635             UINT res_value_offset = res[k].value_offset;
1636             D3DXHANDLE parameter;
1637             D3DXPARAMETER_DESC pdesc;
1638             BOOL bvalue;
1639             INT ivalue;
1640             FLOAT fvalue;
1641             DWORD input_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1642             DWORD expected_value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1643             UINT l, element;
1644
1645             parameter = effect->lpVtbl->GetParameterByName(effect, NULL, res_full_name);
1646             ok(parameter != NULL, "%u - %s: GetParameterByName failed\n", i, res_full_name);
1647
1648             hr = effect->lpVtbl->GetParameterDesc(effect, parameter, &pdesc);
1649             ok(hr == D3D_OK, "%u - %s: GetParameterDesc failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1650
1651             ok(res_desc->Name ? !strcmp(pdesc.Name, res_desc->Name) : !pdesc.Name,
1652                     "%u - %s: GetParameterDesc Name failed, got \"%s\", expected \"%s\"\n",
1653                     i, res_full_name, pdesc.Name, res_desc->Name);
1654             ok(res_desc->Semantic ? !strcmp(pdesc.Semantic, res_desc->Semantic) : !pdesc.Semantic,
1655                     "%u - %s: GetParameterDesc Semantic failed, got \"%s\", expected \"%s\"\n",
1656                     i, res_full_name, pdesc.Semantic, res_desc->Semantic);
1657             ok(res_desc->Class == pdesc.Class, "%u - %s: GetParameterDesc Class failed, got %#x, expected %#x\n",
1658                     i, res_full_name, pdesc.Class, res_desc->Class);
1659             ok(res_desc->Type == pdesc.Type, "%u - %s: GetParameterDesc Type failed, got %#x, expected %#x\n",
1660                     i, res_full_name, pdesc.Type, res_desc->Type);
1661             ok(res_desc->Rows == pdesc.Rows, "%u - %s: GetParameterDesc Rows failed, got %u, expected %u\n",
1662                     i, res_full_name, pdesc.Rows, res_desc->Rows);
1663             ok(res_desc->Columns == pdesc.Columns, "%u - %s: GetParameterDesc Columns failed, got %u, expected %u\n",
1664                     i, res_full_name, pdesc.Columns, res_desc->Columns);
1665             ok(res_desc->Elements == pdesc.Elements, "%u - %s: GetParameterDesc Elements failed, got %u, expected %u\n",
1666                     i, res_full_name, pdesc.Elements, res_desc->Elements);
1667             ok(res_desc->Annotations == pdesc.Annotations, "%u - %s: GetParameterDesc Annotations failed, got %u, expected %u\n",
1668                     i, res_full_name, pdesc.Annotations, res_desc->Annotations);
1669             ok(res_desc->StructMembers == pdesc.StructMembers, "%u - %s: GetParameterDesc StructMembers failed, got %u, expected %u\n",
1670                     i, res_full_name, pdesc.StructMembers, res_desc->StructMembers);
1671             ok(res_desc->Flags == pdesc.Flags, "%u - %s: GetParameterDesc Flags failed, got %u, expected %u\n",
1672                     i, res_full_name, pdesc.Flags, res_desc->Flags);
1673             ok(res_desc->Bytes == pdesc.Bytes, "%u - %s: GetParameterDesc Bytes, got %u, expected %u\n",
1674                     i, res_full_name, pdesc.Bytes, res_desc->Bytes);
1675
1676             /* check size */
1677             ok(EFFECT_PARAMETER_VALUE_ARRAY_SIZE >= res_desc->Bytes / 4 +
1678                     (res_desc->Elements ? res_desc->Bytes / 4 / res_desc->Elements : 0),
1679                     "%u - %s: Warning: Array size to small\n", i, res_full_name);
1680
1681             test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1682             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1683             test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1684
1685             /*
1686              * check invalid calls
1687              * These will crash:
1688              * effect->lpVtbl->SetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL));
1689              * effect->lpVtbl->SetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT));
1690              * effect->lpVtbl->SetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT));
1691              * effect->lpVtbl->SetVector(effect, parameter, NULL);
1692              * effect->lpVtbl->SetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1693              * effect->lpVtbl->SetMatrix(effect, parameter, NULL);
1694              * effect->lpVtbl->GetMatrix(effect, parameter, NULL);
1695              * effect->lpVtbl->SetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1696              * effect->lpVtbl->SetMatrixTranspose(effect, parameter, NULL);
1697              * effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1698              * effect->lpVtbl->GetValue(effect, parameter, NULL, res_desc->Bytes);
1699              * effect->lpVtbl->SetValue(effect, parameter, NULL, res_desc->Bytes);
1700              */
1701             hr = effect->lpVtbl->SetBool(effect, NULL, bvalue);
1702             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n",
1703                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1704
1705             hr = effect->lpVtbl->GetBool(effect, NULL, &bvalue);
1706             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1707                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1708
1709             hr = effect->lpVtbl->GetBool(effect, parameter, NULL);
1710             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
1711                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1712
1713             hr = effect->lpVtbl->SetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL));
1714             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n",
1715                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1716
1717             hr = effect->lpVtbl->GetBoolArray(effect, NULL, (BOOL *)input_value, res_desc->Bytes / sizeof(BOOL));
1718             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1719                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1720
1721             hr = effect->lpVtbl->GetBoolArray(effect, parameter, NULL, res_desc->Bytes / sizeof(BOOL));
1722             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
1723                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1724
1725             hr = effect->lpVtbl->SetInt(effect, NULL, ivalue);
1726             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n",
1727                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1728
1729             hr = effect->lpVtbl->GetInt(effect, NULL, &ivalue);
1730             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1731                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1732
1733             hr = effect->lpVtbl->GetInt(effect, parameter, NULL);
1734             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
1735                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1736
1737             hr = effect->lpVtbl->SetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT));
1738             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n",
1739                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1740
1741             hr = effect->lpVtbl->GetIntArray(effect, NULL, (INT *)input_value, res_desc->Bytes / sizeof(INT));
1742             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1743                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1744
1745             hr = effect->lpVtbl->GetIntArray(effect, parameter, NULL, res_desc->Bytes / sizeof(INT));
1746             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
1747                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1748
1749             hr = effect->lpVtbl->SetFloat(effect, NULL, fvalue);
1750             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n",
1751                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1752
1753             hr = effect->lpVtbl->GetFloat(effect, NULL, &fvalue);
1754             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1755                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1756
1757             hr = effect->lpVtbl->GetFloat(effect, parameter, NULL);
1758             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
1759                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1760
1761             hr = effect->lpVtbl->SetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT));
1762             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n",
1763                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1764
1765             hr = effect->lpVtbl->GetFloatArray(effect, NULL, (FLOAT *)input_value, res_desc->Bytes / sizeof(FLOAT));
1766             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1767                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1768
1769             hr = effect->lpVtbl->GetFloatArray(effect, parameter, NULL, res_desc->Bytes / sizeof(FLOAT));
1770             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1771                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1772
1773             hr = effect->lpVtbl->SetVector(effect, NULL, (D3DXVECTOR4 *)input_value);
1774             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n",
1775                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1776
1777             hr = effect->lpVtbl->GetVector(effect, NULL, (D3DXVECTOR4 *)input_value);
1778             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1779                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1780
1781             hr = effect->lpVtbl->GetVector(effect, parameter, NULL);
1782             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1783                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1784
1785             hr = effect->lpVtbl->SetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1786             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n",
1787                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1788
1789             hr = effect->lpVtbl->GetVectorArray(effect, NULL, (D3DXVECTOR4 *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1790             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1791                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1792
1793             hr = effect->lpVtbl->GetVectorArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1794             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1795                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1796
1797             hr = effect->lpVtbl->SetMatrix(effect, NULL, (D3DXMATRIX *)input_value);
1798             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n",
1799                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1800
1801             hr = effect->lpVtbl->GetMatrix(effect, NULL, (D3DXMATRIX *)input_value);
1802             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x\n",
1803                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1804
1805             hr = effect->lpVtbl->SetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1806             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n",
1807                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1808
1809             hr = effect->lpVtbl->GetMatrixArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1810             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1811                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1812
1813             hr = effect->lpVtbl->GetMatrixArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1814             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1815                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1816
1817             hr = effect->lpVtbl->SetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value);
1818             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n",
1819                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1820
1821             hr = effect->lpVtbl->GetMatrixTranspose(effect, NULL, (D3DXMATRIX *)input_value);
1822             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
1823                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1824
1825             hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, NULL);
1826             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
1827                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1828
1829             hr = effect->lpVtbl->SetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1830             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n",
1831                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1832
1833             hr = effect->lpVtbl->GetMatrixTransposeArray(effect, NULL, (D3DXMATRIX *)input_value, res_desc->Elements ? res_desc->Elements : 1);
1834             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1835                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1836
1837             hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, NULL, res_desc->Elements ? res_desc->Elements : 1);
1838             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1839                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1840
1841             hr = effect->lpVtbl->SetValue(effect, NULL, input_value, res_desc->Bytes);
1842             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n",
1843                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1844
1845             hr = effect->lpVtbl->SetValue(effect, parameter, input_value, res_desc->Bytes - 1);
1846             ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetValue failed, got %#x, expected %#x\n",
1847                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1848
1849             hr = effect->lpVtbl->GetValue(effect, NULL, input_value, res_desc->Bytes);
1850             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
1851                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1852
1853             hr = effect->lpVtbl->GetValue(effect, parameter, input_value, res_desc->Bytes - 1);
1854             ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
1855                     i, res_full_name, hr, D3DERR_INVALIDCALL);
1856
1857             test_effect_parameter_value_GetTestGroup(&res[k], effect, &blob[res_value_offset], parameter, i);
1858
1859             /* SetBool */
1860             bvalue = 5;
1861             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
1862             hr = effect->lpVtbl->SetBool(effect, parameter, bvalue);
1863             if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
1864             {
1865                 bvalue = bvalue ? TRUE : FALSE;
1866                 set_number(expected_value, res_desc->Type, &bvalue, D3DXPT_BOOL);
1867                 ok(hr == D3D_OK, "%u - %s: SetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1868             }
1869             else
1870             {
1871                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBool failed, got %#x, expected %#x\n",
1872                         i, res_full_name, hr, D3DERR_INVALIDCALL);
1873             }
1874             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
1875             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1876
1877             /* SetBoolArray */
1878             *input_value = 1;
1879             for (l = 1; l < res_desc->Bytes / sizeof(*input_value); ++l)
1880             {
1881                 *(input_value + l) = *(input_value + l - 1) + 1;
1882             }
1883             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
1884             hr = effect->lpVtbl->SetBoolArray(effect, parameter, (BOOL *)input_value, res_desc->Bytes / sizeof(*input_value));
1885             if (res_desc->Class == D3DXPC_SCALAR
1886                     || res_desc->Class == D3DXPC_VECTOR
1887                     || res_desc->Class == D3DXPC_MATRIX_ROWS)
1888             {
1889                 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
1890                 {
1891                     set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_BOOL);
1892                 }
1893                 ok(hr == D3D_OK, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1894             }
1895             else
1896             {
1897                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetBoolArray failed, got %#x, expected %#x\n",
1898                         i, res_full_name, hr, D3DERR_INVALIDCALL);
1899             }
1900             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
1901             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1902
1903             /* SetInt */
1904             ivalue = 0x1fbf02ff;
1905             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
1906             hr = effect->lpVtbl->SetInt(effect, parameter, ivalue);
1907             if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
1908             {
1909                 set_number(expected_value, res_desc->Type, &ivalue, D3DXPT_INT);
1910                 ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1911             }
1912             else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
1913                     ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
1914                     (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
1915             {
1916                 FLOAT tmp = ((ivalue & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
1917                 set_number(expected_value, res_desc->Type, &tmp, D3DXPT_FLOAT);
1918                 tmp = ((ivalue & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
1919                 set_number(expected_value + 1, res_desc->Type, &tmp, D3DXPT_FLOAT);
1920                 tmp = (ivalue & 0xff) * INT_FLOAT_MULTI_INVERSE;
1921                 set_number(expected_value + 2, res_desc->Type, &tmp, D3DXPT_FLOAT);
1922                 tmp = ((ivalue & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
1923                 set_number(expected_value + 3, res_desc->Type, &tmp, D3DXPT_FLOAT);
1924
1925                 ok(hr == D3D_OK, "%u - %s: SetInt failed, got %#x, expected %#x\n",
1926                         i, res_full_name, hr, D3D_OK);
1927             }
1928             else
1929             {
1930                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetInt failed, got %#x, expected %#x\n",
1931                         i, res_full_name, hr, D3DERR_INVALIDCALL);
1932             }
1933             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
1934             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1935
1936             /* SetIntArray */
1937             *input_value = 123456;
1938             for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
1939             {
1940                 *(input_value + l) = *(input_value + l - 1) + 23;
1941             }
1942             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
1943             hr = effect->lpVtbl->SetIntArray(effect, parameter, (INT *)input_value, res_desc->Bytes / sizeof(*input_value));
1944             if (res_desc->Class == D3DXPC_SCALAR
1945                     || res_desc->Class == D3DXPC_VECTOR
1946                     || res_desc->Class == D3DXPC_MATRIX_ROWS)
1947             {
1948                 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
1949                 {
1950                     set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_INT);
1951                 }
1952                 ok(hr == D3D_OK, "%u - %s: SetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1953             }
1954             else
1955             {
1956                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetIntArray failed, got %#x, expected %#x\n",
1957                         i, res_full_name, hr, D3DERR_INVALIDCALL);
1958             }
1959             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
1960             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1961
1962             /* SetFloat */
1963             fvalue = 1.33;
1964             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
1965             hr = effect->lpVtbl->SetFloat(effect, parameter, fvalue);
1966             if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
1967             {
1968                 set_number(expected_value, res_desc->Type, &fvalue, D3DXPT_FLOAT);
1969                 ok(hr == D3D_OK, "%u - %s: SetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1970             }
1971             else
1972             {
1973                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloat failed, got %#x, expected %#x\n",
1974                         i, res_full_name, hr, D3DERR_INVALIDCALL);
1975             }
1976             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
1977             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1978
1979             /* SetFloatArray */
1980             fvalue = 1.33;
1981             for (l = 0; l < res_desc->Bytes / sizeof(fvalue); ++l)
1982             {
1983                 *(input_value + l) = *(DWORD *)&fvalue;
1984                 fvalue += 1.12;
1985             }
1986             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
1987             hr = effect->lpVtbl->SetFloatArray(effect, parameter, (FLOAT *)input_value, res_desc->Bytes / sizeof(*input_value));
1988             if (res_desc->Class == D3DXPC_SCALAR
1989                     || res_desc->Class == D3DXPC_VECTOR
1990                     || res_desc->Class == D3DXPC_MATRIX_ROWS)
1991             {
1992                 for (l = 0; l < res_desc->Bytes / sizeof(*input_value); ++l)
1993                 {
1994                     set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT);
1995                 }
1996                 ok(hr == D3D_OK, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1997             }
1998             else
1999             {
2000                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetFloatArray failed, got %#x, expected %#x\n",
2001                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2002             }
2003             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2004             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2005
2006             /* SetVector */
2007             fvalue = -1.33;
2008             for (l = 0; l < 4; ++l)
2009             {
2010                 *(input_value + l) = *(DWORD *)&fvalue;
2011                 fvalue += 1.12;
2012             }
2013             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2014             hr = effect->lpVtbl->SetVector(effect, parameter, (D3DXVECTOR4 *)input_value);
2015             if (!res_desc->Elements &&
2016                     (res_desc->Class == D3DXPC_SCALAR
2017                     || res_desc->Class == D3DXPC_VECTOR))
2018             {
2019                 /* only values between 0 and INT_FLOAT_MULTI are valid */
2020                 if (res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
2021                 {
2022                     *expected_value = (DWORD)(max(min(*(FLOAT *)(input_value + 2), 1.0f), 0.0f) * INT_FLOAT_MULTI);
2023                     *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 1), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 8;
2024                     *expected_value += ((DWORD)(max(min(*(FLOAT *)input_value, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16;
2025                     *expected_value += ((DWORD)(max(min(*(FLOAT *)(input_value + 3), 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24;
2026                 }
2027                 else
2028                 {
2029                     for (l = 0; l < 4; ++l)
2030                     {
2031                         set_number(expected_value + l, res_desc->Type, input_value + l, D3DXPT_FLOAT);
2032                     }
2033                 }
2034                 ok(hr == D3D_OK, "%u - %s: SetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2035             }
2036             else
2037             {
2038                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVector failed, got %#x, expected %#x\n",
2039                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2040             }
2041             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2042             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2043
2044             /* SetVectorArray */
2045             for (element = 0; element < res_desc->Elements + 1; ++element)
2046             {
2047                 fvalue = 1.33;
2048                 for (l = 0; l < element * 4; ++l)
2049                 {
2050                     *(input_value + l) = *(DWORD *)&fvalue;
2051                     fvalue += 1.12;
2052                 }
2053                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2054                 hr = effect->lpVtbl->SetVectorArray(effect, parameter, (D3DXVECTOR4 *)input_value, element);
2055                 if (res_desc->Elements && res_desc->Class == D3DXPC_VECTOR && element <= res_desc->Elements)
2056                 {
2057                     UINT m;
2058
2059                     for (m = 0; m < element; ++m)
2060                     {
2061                         for (l = 0; l < res_desc->Columns; ++l)
2062                         {
2063                             set_number(expected_value + m * res_desc->Columns + l, res_desc->Type, input_value + m * 4 + l, D3DXPT_FLOAT);
2064                         }
2065                     }
2066                     ok(hr == D3D_OK, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2067                 }
2068                 else
2069                 {
2070                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetVectorArray failed, got %#x, expected %#x\n",
2071                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2072                 }
2073                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2074                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2075             }
2076
2077             /* SetMatrix */
2078             fvalue = 1.33;
2079             for (l = 0; l < 16; ++l)
2080             {
2081                 *(input_value + l) = *(DWORD *)&fvalue;
2082                 fvalue += 1.12;
2083             }
2084             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2085             hr = effect->lpVtbl->SetMatrix(effect, parameter, (D3DXMATRIX *)input_value);
2086             if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
2087             {
2088                 for (l = 0; l < 4; ++l)
2089                 {
2090                     UINT m;
2091
2092                     for (m = 0; m < 4; ++m)
2093                     {
2094                         if (m < res_desc->Rows && l < res_desc->Columns)
2095                             set_number(expected_value + l + m * res_desc->Columns, res_desc->Type,
2096                                     input_value + l + m * 4, D3DXPT_FLOAT);
2097                     }
2098
2099                 }
2100                 ok(hr == D3D_OK, "%u - %s: SetMatrix failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2101             }
2102             else
2103             {
2104                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrix failed, got %#x, expected %#x\n",
2105                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2106             }
2107             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2108             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2109
2110             /* SetMatrixArray */
2111             for (element = 0; element < res_desc->Elements + 1; ++element)
2112             {
2113                 fvalue = 1.33;
2114                 for (l = 0; l < element * 16; ++l)
2115                 {
2116                     *(input_value + l) = *(DWORD *)&fvalue;
2117                     fvalue += 1.12;
2118                 }
2119                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2120                 hr = effect->lpVtbl->SetMatrixArray(effect, parameter, (D3DXMATRIX *)input_value, element);
2121                 if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements)
2122                 {
2123                     UINT n;
2124
2125                     for (n = 0; n < element; ++n)
2126                     {
2127                         for (l = 0; l < 4; ++l)
2128                         {
2129                             UINT m;
2130
2131                             for (m = 0; m < 4; ++m)
2132                             {
2133                                 if (m < res_desc->Rows && l < res_desc->Columns)
2134                                     set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2135                                             res_desc->Type, input_value + l + m * 4 + n * 16, D3DXPT_FLOAT);
2136                             }
2137
2138                         }
2139                     }
2140                     ok(hr == D3D_OK, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2141                 }
2142                 else
2143                 {
2144                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixArray failed, got %#x, expected %#x\n",
2145                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2146                 }
2147                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2148                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2149             }
2150
2151             /* SetMatrixTranspose */
2152             fvalue = 1.33;
2153             for (l = 0; l < 16; ++l)
2154             {
2155                 *(input_value + l) = *(DWORD *)&fvalue;
2156                 fvalue += 1.12;
2157             }
2158             memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2159             hr = effect->lpVtbl->SetMatrixTranspose(effect, parameter, (D3DXMATRIX *)input_value);
2160             if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
2161             {
2162                 for (l = 0; l < 4; ++l)
2163                 {
2164                     UINT m;
2165
2166                     for (m = 0; m < 4; ++m)
2167                     {
2168                         if (m < res_desc->Rows && l < res_desc->Columns)
2169                             set_number(expected_value + l + m * res_desc->Columns, res_desc->Type,
2170                                     input_value + l * 4 + m, D3DXPT_FLOAT);
2171                     }
2172
2173                 }
2174                 ok(hr == D3D_OK, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2175             }
2176             else
2177             {
2178                 ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTranspose failed, got %#x, expected %#x\n",
2179                         i, res_full_name, hr, D3DERR_INVALIDCALL);
2180             }
2181             test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2182             test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2183
2184             /* SetMatrixTransposeArray */
2185             for (element = 0; element < res_desc->Elements + 1; ++element)
2186             {
2187                 fvalue = 1.33;
2188                 for (l = 0; l < element * 16; ++l)
2189                 {
2190                     *(input_value + l) = *(DWORD *)&fvalue;
2191                     fvalue += 1.12;
2192                 }
2193                 memcpy(expected_value, &blob[res_value_offset], res_desc->Bytes);
2194                 hr = effect->lpVtbl->SetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)input_value, element);
2195                 if (res_desc->Class == D3DXPC_MATRIX_ROWS && element <= res_desc->Elements)
2196                 {
2197                     UINT n;
2198
2199                     for (n = 0; n < element; ++n)
2200                     {
2201                         for (l = 0; l < 4; ++l)
2202                         {
2203                             UINT m;
2204
2205                             for (m = 0; m < 4; ++m)
2206                             {
2207                                 if (m < res_desc->Rows && l < res_desc->Columns)
2208                                     set_number(expected_value + l + m * res_desc->Columns + n * res_desc->Columns * res_desc->Rows,
2209                                             res_desc->Type, input_value + l * 4 + m + n * 16, D3DXPT_FLOAT);
2210                             }
2211
2212                         }
2213                     }
2214                     ok(hr == D3D_OK, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
2215                 }
2216                 else
2217                 {
2218                     ok(hr == D3DERR_INVALIDCALL, "%u - %s: SetMatrixTransposeArray failed, got %#x, expected %#x\n",
2219                             i, res_full_name, hr, D3DERR_INVALIDCALL);
2220                 }
2221                 test_effect_parameter_value_GetTestGroup(&res[k], effect, expected_value, parameter, i);
2222                 test_effect_parameter_value_ResetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
2223             }
2224         }
2225
2226         count = effect->lpVtbl->Release(effect);
2227         ok(!count, "Release failed %u\n", count);
2228     }
2229 }
2230
2231 START_TEST(effect)
2232 {
2233     HWND wnd;
2234     IDirect3D9 *d3d;
2235     IDirect3DDevice9 *device;
2236     D3DPRESENT_PARAMETERS d3dpp;
2237     HRESULT hr;
2238     ULONG count;
2239
2240     wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
2241     d3d = Direct3DCreate9(D3D_SDK_VERSION);
2242     if (!wnd) {
2243         skip("Couldn't create application window\n");
2244         return;
2245     }
2246     if (!d3d) {
2247         skip("Couldn't create IDirect3D9 object\n");
2248         DestroyWindow(wnd);
2249         return;
2250     }
2251
2252     ZeroMemory(&d3dpp, sizeof(d3dpp));
2253     d3dpp.Windowed = TRUE;
2254     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
2255     hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device);
2256     if (FAILED(hr)) {
2257         skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
2258         IDirect3D9_Release(d3d);
2259         DestroyWindow(wnd);
2260         return;
2261     }
2262
2263     test_create_effect_and_pool(device);
2264     test_create_effect_compiler();
2265     test_effect_parameter_value(device);
2266
2267     count = IDirect3DDevice9_Release(device);
2268     ok(count == 0, "The device was not properly freed: refcount %u\n", count);
2269
2270     count = IDirect3D9_Release(d3d);
2271     ok(count == 0, "Release failed %u\n", count);
2272
2273     DestroyWindow(wnd);
2274 }