d3dx9/tests: Add effect parameter value int test.
[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 const char effect_desc[] =
102 "Technique\n"
103 "{\n"
104 "}\n";
105
106 static void test_create_effect_and_pool(IDirect3DDevice9 *device)
107 {
108     HRESULT hr;
109     ID3DXEffect *effect;
110     ID3DXBaseEffect *base;
111     ULONG count;
112     IDirect3DDevice9 *device2;
113     LPD3DXEFFECTSTATEMANAGER manager = (LPD3DXEFFECTSTATEMANAGER)0xdeadbeef;
114     ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2;
115
116     hr = D3DXCreateEffect(NULL, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
117     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
118
119     hr = D3DXCreateEffect(device, NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
120     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
121
122     hr = D3DXCreateEffect(device, effect_desc, 0, NULL, NULL, 0, NULL, NULL, NULL);
123     ok(hr == E_FAIL, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, E_FAIL);
124
125     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
126     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
127
128     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
129     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
130
131     hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
132     ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
133
134     hr = effect->lpVtbl->GetStateManager(effect, NULL);
135     ok(hr == D3DERR_INVALIDCALL, "GetStateManager failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
136
137     hr = effect->lpVtbl->GetStateManager(effect, &manager);
138     ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
139     ok(!manager, "GetStateManager failed, got %p\n", manager);
140
141     /* this works, but it is not recommended! */
142     hr = effect->lpVtbl->SetStateManager(effect, (LPD3DXEFFECTSTATEMANAGER) device);
143     ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
144
145     hr = effect->lpVtbl->GetStateManager(effect, &manager);
146     ok(hr == D3D_OK, "GetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
147     ok(manager != NULL, "GetStateManager failed\n");
148
149     IDirect3DDevice9_AddRef(device);
150     count = IDirect3DDevice9_Release(device);
151     ok(count == 4, "Release failed, got %u, expected 4\n", count);
152
153     count = IUnknown_Release(manager);
154     ok(count == 3, "Release failed, got %u, expected 3\n", count);
155
156     hr = effect->lpVtbl->SetStateManager(effect, NULL);
157     ok(hr == D3D_OK, "SetStateManager failed, got %x, expected 0 (D3D_OK)\n", hr);
158
159     hr = effect->lpVtbl->GetPool(effect, &pool);
160     ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
161     ok(!pool, "GetPool failed, got %p\n", pool);
162
163     hr = effect->lpVtbl->GetPool(effect, NULL);
164     ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
165
166     hr = effect->lpVtbl->GetDevice(effect, &device2);
167     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
168
169     hr = effect->lpVtbl->GetDevice(effect, NULL);
170     ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
171
172     count = IDirect3DDevice9_Release(device2);
173     ok(count == 2, "Release failed, got %u, expected 2\n", count);
174
175     count = effect->lpVtbl->Release(effect);
176     ok(count == 0, "Release failed %u\n", count);
177
178     hr = D3DXCreateEffectPool(NULL);
179     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
180
181     hr = D3DXCreateEffectPool(&pool);
182     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
183
184     count = pool->lpVtbl->Release(pool);
185     ok(count == 0, "Release failed %u\n", count);
186
187     hr = D3DXCreateEffectPool(&pool);
188     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
189
190     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, NULL, NULL);
191     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
192
193     hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3DXEffectPool, (void **)&pool2);
194     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
195     ok(pool == pool2, "Release failed, got %p, expected %p\n", pool2, pool);
196
197     count = pool2->lpVtbl->Release(pool2);
198     ok(count == 1, "Release failed, got %u, expected 1\n", count);
199
200     hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2);
201     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
202
203     count = IDirect3DDevice9_Release(device2);
204     ok(count == 1, "Release failed, got %u, expected 1\n", count);
205
206     hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, &effect, NULL);
207     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
208
209     hr = effect->lpVtbl->GetPool(effect, &pool);
210     ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
211     ok(pool == pool2, "GetPool failed, got %p, expected %p\n", pool2, pool);
212
213     count = pool2->lpVtbl->Release(pool2);
214     ok(count == 2, "Release failed, got %u, expected 2\n", count);
215
216     count = effect->lpVtbl->Release(effect);
217     ok(count == 0, "Release failed %u\n", count);
218
219     count = pool->lpVtbl->Release(pool);
220     ok(count == 0, "Release failed %u\n", count);
221 }
222
223 static void test_create_effect_compiler(void)
224 {
225     HRESULT hr;
226     ID3DXEffectCompiler *compiler, *compiler2;
227     ID3DXBaseEffect *base;
228     IUnknown *unknown;
229     ULONG count;
230
231     hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, &compiler, NULL);
232     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
233
234     hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, NULL, NULL);
235     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
236
237     hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL);
238     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
239
240     count = compiler->lpVtbl->Release(compiler);
241     ok(count == 0, "Release failed %u\n", count);
242
243     hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, NULL, NULL);
244     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
245
246     hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
247     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
248
249     hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
250     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
251
252     hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
253     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
254
255     hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
256     ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
257
258     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXBaseEffect, (void **)&base);
259     ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
260
261     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXEffectCompiler, (void **)&compiler2);
262     ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
263
264     hr = compiler->lpVtbl->QueryInterface(compiler, &IID_IUnknown, (void **)&unknown);
265     ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
266
267     count = unknown->lpVtbl->Release(unknown);
268     ok(count == 2, "Release failed, got %u, expected %u\n", count, 2);
269
270     count = compiler2->lpVtbl->Release(compiler2);
271     ok(count == 1, "Release failed, got %u, expected %u\n", count, 1);
272
273     count = compiler->lpVtbl->Release(compiler);
274     ok(count == 0, "Release failed %u\n", count);
275 }
276
277 /*
278  * Parameter value test
279  */
280 struct test_effect_parameter_value_result
281 {
282     LPCSTR full_name;
283     D3DXPARAMETER_DESC desc;
284     UINT value_offset; /* start position for the value in the blob */
285 };
286
287 /*
288  * fxc.exe /Tfx_2_0
289  */
290 #if 0
291 float f = 0.1;
292 float1 f1 = {1.1};
293 float2 f2 = {2.1, 2.2};
294 float3 f3 = {3.1, 3.2, 3.3};
295 float4 f4 = {4.1, 4.2, 4.3, 4.4};
296 float1x1 f11 = {11.1};
297 float1x2 f12 = {12.1, 12.2};
298 float1x3 f13 = {13.1, 13.2, 13.3};
299 float1x4 f14 = {14.1, 14.2, 14.3, 14.4};
300 float2x1 f21 = {{21.11, 21.21}};
301 float2x2 f22 = {{22.11, 22.21}, {22.12, 22.22}};
302 float2x3 f23 = {{23.11, 23.21}, {23.12, 23.22}, {23.13, 23.23}};
303 float2x4 f24 = {{24.11, 24.21}, {24.12, 24.22}, {24.13, 24.23}, {24.14, 24.24}};
304 float3x1 f31 = {{31.11, 31.21, 31.31}};
305 float3x2 f32 = {{32.11, 32.21, 32.31}, {32.12, 32.22, 32.32}};
306 float3x3 f33 = {{33.11, 33.21, 33.31}, {33.12, 33.22, 33.32},
307         {33.13, 33.23, 33.33}};
308 float3x4 f34 = {{34.11, 34.21, 34.31}, {34.12, 34.22, 34.32},
309         {34.13, 34.23, 34.33}, {34.14, 34.24, 34.34}};
310 float4x1 f41 = {{41.11, 41.21, 41.31, 41.41}};
311 float4x2 f42 = {{42.11, 42.21, 42.31, 42.41}, {42.12, 42.22, 42.32, 42.42}};
312 float4x3 f43 = {{43.11, 43.21, 43.31, 43.41}, {43.12, 43.22, 43.32, 43.42},
313         {43.13, 43.23, 43.33, 43.43}};
314 float4x4 f44 = {{44.11, 44.21, 44.31, 44.41}, {44.12, 44.22, 44.32, 44.42},
315         {44.13, 44.23, 44.33, 44.43}, {44.14, 44.24, 44.34, 44.44}};
316 float f_2[2] = {0.101, 0.102};
317 float1 f1_2[2] = {{1.101}, {1.102}};
318 float2 f2_2[2] = {{2.101, 2.201}, {2.102, 2.202}};
319 float3 f3_2[2] = {{3.101, 3.201, 3.301}, {3.102, 3.202, 3.302}};
320 float4 f4_2[2] = {{4.101, 4.201, 4.301, 4.401}, {4.102, 4.202, 4.302, 4.402}};
321 float1x1 f11_2[2] = {{11.101}, {11.102}};
322 float1x2 f12_2[2] = {{12.101, 12.201}, {12.102, 12.202}};
323 float1x3 f13_2[2] = {{13.101, 13.201, 13.301}, {13.102, 13.202, 13.302}};
324 float1x4 f14_2[2] = {{14.101, 14.201, 14.301, 14.401}, {14.102, 14.202, 14.302, 14.402}};
325 float2x1 f21_2[2] = {{{21.1101, 21.2101}}, {{21.1102, 21.2102}}};
326 float2x2 f22_2[2] = {{{22.1101, 22.2101}, {22.1201, 22.2201}}, {{22.1102, 22.2102}, {22.1202, 22.2202}}};
327 float2x3 f23_2[2] = {{{23.1101, 23.2101}, {23.1201, 23.2201}, {23.1301, 23.2301}}, {{23.1102, 23.2102},
328         {23.1202, 23.2202}, {23.1302, 23.2302}}};
329 float2x4 f24_2[2] = {{{24.1101, 24.2101}, {24.1201, 24.2201}, {24.1301, 24.2301}, {24.1401, 24.2401}},
330         {{24.1102, 24.2102}, {24.1202, 24.2202}, {24.1302, 24.2302}, {24.1402, 24.2402}}};
331 float3x1 f31_2[2] = {{{31.1101, 31.2101, 31.3101}}, {{31.1102, 31.2102, 31.3102}}};
332 float3x2 f32_2[2] = {{{32.1101, 32.2101, 32.3101}, {32.1201, 32.2201, 32.3201}},
333         {{32.1102, 32.2102, 32.3102}, {32.1202, 32.2202, 32.3202}}};
334 float3x3 f33_2[2] = {{{33.1101, 33.2101, 33.3101}, {33.1201, 33.2201, 33.3201},
335         {33.1301, 33.2301, 33.3301}}, {{33.1102, 33.2102, 33.3102}, {33.1202, 33.2202, 33.3202},
336         {33.1302, 33.2302, 33.3302}}};
337 float3x4 f34_2[2] = {{{34.1101, 34.2101, 34.3101}, {34.1201, 34.2201, 34.3201},
338         {34.1301, 34.2301, 34.3301}, {34.1401, 34.2401, 34.3401}}, {{34.1102, 34.2102, 34.3102},
339         {34.1202, 34.2202, 34.3202}, {34.1302, 34.2302, 34.3302}, {34.1402, 34.2402, 34.3402}}};
340 float4x1 f41_2[2] = {{{41.1101, 41.2101, 41.3101, 41.4101}}, {{41.1102, 41.2102, 41.3102, 41.4102}}};
341 float4x2 f42_2[2] = {{{42.1101, 42.2101, 42.3101, 42.4101}, {42.1201, 42.2201, 42.3201, 42.4201}},
342         {{42.1102, 42.2102, 42.3102, 42.4102}, {42.1202, 42.2202, 42.3202, 42.4202}}};
343 float4x3 f43_2[2] = {{{43.1101, 43.2101, 43.3101, 43.4101}, {43.1201, 43.2201, 43.3201, 43.4201},
344         {43.1301, 43.2301, 43.3301, 43.4301}}, {{43.1102, 43.2102, 43.3102, 43.4102},
345         {43.1202, 43.2202, 43.3202, 43.4202}, {43.1302, 43.2302, 43.3302, 43.4302}}};
346 float4x4 f44_2[2] = {{{44.1101, 44.2101, 44.3101, 44.4101}, {44.1201, 44.2201, 44.3201, 44.4201},
347         {44.1301, 44.2301, 44.3301, 44.4301}, {44.1401, 44.2401, 44.3401, 44.4401}},
348         {{44.1102, 44.2102, 44.3102, 44.4102}, {44.1202, 44.2202, 44.3202, 44.4202},
349         {44.1302, 44.2302, 44.3302, 44.4302}, {44.1402, 44.2402, 44.3402, 44.4402}}};
350 technique t { pass p { } }
351 #endif
352 static const DWORD test_effect_parameter_value_blob_float[] =
353 {
354 0xfeff0901, 0x00000b80, 0x00000000, 0x00000003, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
355 0x00000001, 0x00000001, 0x3dcccccd, 0x00000002, 0x00000066, 0x00000003, 0x00000001, 0x0000004c,
356 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x3f8ccccd, 0x00000003, 0x00003166, 0x00000003,
357 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x40066666, 0x400ccccd,
358 0x00000003, 0x00003266, 0x00000003, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
359 0x00000001, 0x40466666, 0x404ccccd, 0x40533333, 0x00000003, 0x00003366, 0x00000003, 0x00000001,
360 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x40833333, 0x40866666, 0x4089999a,
361 0x408ccccd, 0x00000003, 0x00003466, 0x00000003, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
362 0x00000001, 0x00000001, 0x4131999a, 0x00000004, 0x00313166, 0x00000003, 0x00000002, 0x00000130,
363 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x4141999a, 0x41433333, 0x00000004, 0x00323166,
364 0x00000003, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x4151999a,
365 0x41533333, 0x4154cccd, 0x00000004, 0x00333166, 0x00000003, 0x00000002, 0x00000194, 0x00000000,
366 0x00000000, 0x00000001, 0x00000004, 0x4161999a, 0x41633333, 0x4164cccd, 0x41666666, 0x00000004,
367 0x00343166, 0x00000003, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
368 0x41a8e148, 0x41a9ae14, 0x00000004, 0x00313266, 0x00000003, 0x00000002, 0x000001f4, 0x00000000,
369 0x00000000, 0x00000002, 0x00000002, 0x41b0e148, 0x41b1ae14, 0x41b0f5c3, 0x41b1c28f, 0x00000004,
370 0x00323266, 0x00000003, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
371 0x41b8e148, 0x41b9ae14, 0x41b8f5c3, 0x41b9c28f, 0x41b90a3d, 0x41b9d70a, 0x00000004, 0x00333266,
372 0x00000003, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x41c0e148,
373 0x41c1ae14, 0x41c0f5c3, 0x41c1c28f, 0x41c10a3d, 0x41c1d70a, 0x41c11eb8, 0x41c1eb85, 0x00000004,
374 0x00343266, 0x00000003, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
375 0x41f8e148, 0x41f9ae14, 0x41fa7ae1, 0x00000004, 0x00313366, 0x00000003, 0x00000002, 0x000002e0,
376 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x420070a4, 0x4200d70a, 0x42013d71, 0x42007ae1,
377 0x4200e148, 0x420147ae, 0x00000004, 0x00323366, 0x00000003, 0x00000002, 0x00000328, 0x00000000,
378 0x00000000, 0x00000003, 0x00000003, 0x420470a4, 0x4204d70a, 0x42053d71, 0x42047ae1, 0x4204e148,
379 0x420547ae, 0x4204851f, 0x4204eb85, 0x420551ec, 0x00000004, 0x00333366, 0x00000003, 0x00000002,
380 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x420870a4, 0x4208d70a, 0x42093d71,
381 0x42087ae1, 0x4208e148, 0x420947ae, 0x4208851f, 0x4208eb85, 0x420951ec, 0x42088f5c, 0x4208f5c3,
382 0x42095c29, 0x00000004, 0x00343366, 0x00000003, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
383 0x00000004, 0x00000001, 0x422470a4, 0x4224d70a, 0x42253d71, 0x4225a3d7, 0x00000004, 0x00313466,
384 0x00000003, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x422870a4,
385 0x4228d70a, 0x42293d71, 0x4229a3d7, 0x42287ae1, 0x4228e148, 0x422947ae, 0x4229ae14, 0x00000004,
386 0x00323466, 0x00000003, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
387 0x422c70a4, 0x422cd70a, 0x422d3d71, 0x422da3d7, 0x422c7ae1, 0x422ce148, 0x422d47ae, 0x422dae14,
388 0x422c851f, 0x422ceb85, 0x422d51ec, 0x422db852, 0x00000004, 0x00333466, 0x00000003, 0x00000002,
389 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x423070a4, 0x4230d70a, 0x42313d71,
390 0x4231a3d7, 0x42307ae1, 0x4230e148, 0x423147ae, 0x4231ae14, 0x4230851f, 0x4230eb85, 0x423151ec,
391 0x4231b852, 0x42308f5c, 0x4230f5c3, 0x42315c29, 0x4231c28f, 0x00000004, 0x00343466, 0x00000003,
392 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x3dced917, 0x3dd0e560,
393 0x00000004, 0x00325f66, 0x00000003, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
394 0x00000001, 0x3f8ced91, 0x3f8d0e56, 0x00000005, 0x325f3166, 0x00000000, 0x00000003, 0x00000001,
395 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x400676c9, 0x400cdd2f, 0x4006872b,
396 0x400ced91, 0x00000005, 0x325f3266, 0x00000000, 0x00000003, 0x00000001, 0x0000057c, 0x00000000,
397 0x00000002, 0x00000003, 0x00000001, 0x404676c9, 0x404cdd2f, 0x40534396, 0x4046872b, 0x404ced91,
398 0x405353f8, 0x00000005, 0x325f3366, 0x00000000, 0x00000003, 0x00000001, 0x000005c4, 0x00000000,
399 0x00000002, 0x00000004, 0x00000001, 0x40833b64, 0x40866e98, 0x4089a1cb, 0x408cd4fe, 0x40834396,
400 0x408676c9, 0x4089a9fc, 0x408cdd2f, 0x00000005, 0x325f3466, 0x00000000, 0x00000003, 0x00000002,
401 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x41319db2, 0x4131a1cb, 0x00000006,
402 0x5f313166, 0x00000032, 0x00000003, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
403 0x00000002, 0x41419db2, 0x4143374c, 0x4141a1cb, 0x41433b64, 0x00000006, 0x5f323166, 0x00000032,
404 0x00000003, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x41519db2,
405 0x4153374c, 0x4154d0e5, 0x4151a1cb, 0x41533b64, 0x4154d4fe, 0x00000006, 0x5f333166, 0x00000032,
406 0x00000003, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x41619db2,
407 0x4163374c, 0x4164d0e5, 0x41666a7f, 0x4161a1cb, 0x41633b64, 0x4164d4fe, 0x41666e98, 0x00000006,
408 0x5f343166, 0x00000032, 0x00000003, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
409 0x00000001, 0x41a8e17c, 0x41a9ae49, 0x41a8e1b1, 0x41a9ae7d, 0x00000006, 0x5f313266, 0x00000032,
410 0x00000003, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x41b0e17c,
411 0x41b1ae49, 0x41b0f5f7, 0x41b1c2c4, 0x41b0e1b1, 0x41b1ae7d, 0x41b0f62b, 0x41b1c2f8, 0x00000006,
412 0x5f323266, 0x00000032, 0x00000003, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
413 0x00000003, 0x41b8e17c, 0x41b9ae49, 0x41b8f5f7, 0x41b9c2c4, 0x41b90a72, 0x41b9d73f, 0x41b8e1b1,
414 0x41b9ae7d, 0x41b8f62b, 0x41b9c2f8, 0x41b90aa6, 0x41b9d773, 0x00000006, 0x5f333266, 0x00000032,
415 0x00000003, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x41c0e17c,
416 0x41c1ae49, 0x41c0f5f7, 0x41c1c2c4, 0x41c10a72, 0x41c1d73f, 0x41c11eed, 0x41c1ebba, 0x41c0e1b1,
417 0x41c1ae7d, 0x41c0f62b, 0x41c1c2f8, 0x41c10aa6, 0x41c1d773, 0x41c11f21, 0x41c1ebee, 0x00000006,
418 0x5f343266, 0x00000032, 0x00000003, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
419 0x00000001, 0x41f8e17c, 0x41f9ae49, 0x41fa7b16, 0x41f8e1b1, 0x41f9ae7d, 0x41fa7b4a, 0x00000006,
420 0x5f313366, 0x00000032, 0x00000003, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
421 0x00000002, 0x420070be, 0x4200d724, 0x42013d8b, 0x42007afb, 0x4200e162, 0x420147c8, 0x420070d8,
422 0x4200d73f, 0x42013da5, 0x42007b16, 0x4200e17c, 0x420147e3, 0x00000006, 0x5f323366, 0x00000032,
423 0x00000003, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x420470be,
424 0x4204d724, 0x42053d8b, 0x42047afb, 0x4204e162, 0x420547c8, 0x42048539, 0x4204eb9f, 0x42055206,
425 0x420470d8, 0x4204d73f, 0x42053da5, 0x42047b16, 0x4204e17c, 0x420547e3, 0x42048553, 0x4204ebba,
426 0x42055220, 0x00000006, 0x5f333366, 0x00000032, 0x00000003, 0x00000002, 0x00000984, 0x00000000,
427 0x00000002, 0x00000003, 0x00000004, 0x420870be, 0x4208d724, 0x42093d8b, 0x42087afb, 0x4208e162,
428 0x420947c8, 0x42088539, 0x4208eb9f, 0x42095206, 0x42088f76, 0x4208f5dd, 0x42095c43, 0x420870d8,
429 0x4208d73f, 0x42093da5, 0x42087b16, 0x4208e17c, 0x420947e3, 0x42088553, 0x4208ebba, 0x42095220,
430 0x42088f91, 0x4208f5f7, 0x42095c5d, 0x00000006, 0x5f343366, 0x00000032, 0x00000003, 0x00000002,
431 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x422470be, 0x4224d724, 0x42253d8b,
432 0x4225a3f1, 0x422470d8, 0x4224d73f, 0x42253da5, 0x4225a40b, 0x00000006, 0x5f313466, 0x00000032,
433 0x00000003, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x422870be,
434 0x4228d724, 0x42293d8b, 0x4229a3f1, 0x42287afb, 0x4228e162, 0x422947c8, 0x4229ae2f, 0x422870d8,
435 0x4228d73f, 0x42293da5, 0x4229a40b, 0x42287b16, 0x4228e17c, 0x422947e3, 0x4229ae49, 0x00000006,
436 0x5f323466, 0x00000032, 0x00000003, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
437 0x00000003, 0x422c70be, 0x422cd724, 0x422d3d8b, 0x422da3f1, 0x422c7afb, 0x422ce162, 0x422d47c8,
438 0x422dae2f, 0x422c8539, 0x422ceb9f, 0x422d5206, 0x422db86c, 0x422c70d8, 0x422cd73f, 0x422d3da5,
439 0x422da40b, 0x422c7b16, 0x422ce17c, 0x422d47e3, 0x422dae49, 0x422c8553, 0x422cebba, 0x422d5220,
440 0x422db886, 0x00000006, 0x5f333466, 0x00000032, 0x00000003, 0x00000002, 0x00000b64, 0x00000000,
441 0x00000002, 0x00000004, 0x00000004, 0x423070be, 0x4230d724, 0x42313d8b, 0x4231a3f1, 0x42307afb,
442 0x4230e162, 0x423147c8, 0x4231ae2f, 0x42308539, 0x4230eb9f, 0x42315206, 0x4231b86c, 0x42308f76,
443 0x4230f5dd, 0x42315c43, 0x4231c2aa, 0x423070d8, 0x4230d73f, 0x42313da5, 0x4231a40b, 0x42307b16,
444 0x4230e17c, 0x423147e3, 0x4231ae49, 0x42308553, 0x4230ebba, 0x42315220, 0x4231b886, 0x42308f91,
445 0x4230f5f7, 0x42315c5d, 0x4231c2c4, 0x00000006, 0x5f343466, 0x00000032, 0x00000002, 0x00000070,
446 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
447 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
448 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
449 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
450 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
451 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
452 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
453 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
454 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
455 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
456 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
457 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
458 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
459 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
460 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
461 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
462 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
463 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
464 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
465 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
466 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
467 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
468 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
469 };
470
471 struct test_effect_parameter_value_result test_effect_parameter_value_result_float[] =
472 {
473     {"f",     {"f",     NULL, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  10},
474     {"f1",    {"f1",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  20},
475     {"f2",    {"f2",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0,   8},  30},
476     {"f3",    {"f3",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  41},
477     {"f4",    {"f4",    NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  53},
478     {"f11",   {"f11",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 0, 0, 0, 0,   4},  66},
479     {"f12",   {"f12",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 0, 0, 0, 0,   8},  76},
480     {"f13",   {"f13",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 0, 0, 0, 0,  12},  87},
481     {"f14",   {"f14",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 0, 0, 0, 0,  16},  99},
482     {"f21",   {"f21",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 0, 0, 0, 0,   8}, 112},
483     {"f22",   {"f22",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 0, 0, 0, 0,  16}, 123},
484     {"f23",   {"f23",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 0, 0, 0, 0,  24}, 136},
485     {"f24",   {"f24",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 0, 0, 0, 0,  32}, 151},
486     {"f31",   {"f31",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 0, 0, 0, 0,  12}, 168},
487     {"f32",   {"f32",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 0, 0, 0, 0,  24}, 180},
488     {"f33",   {"f33",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 0, 0, 0, 0,  36}, 195},
489     {"f34",   {"f34",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 0, 0, 0, 0,  48}, 213},
490     {"f41",   {"f41",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 0, 0, 0, 0,  16}, 234},
491     {"f42",   {"f42",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 0, 0, 0, 0,  32}, 247},
492     {"f43",   {"f43",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 0, 0, 0, 0,  48}, 264},
493     {"f44",   {"f44",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 0, 0, 0, 0,  64}, 285},
494     {"f_2",   {"f_2",   NULL, D3DXPC_SCALAR,      D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 310},
495     {"f1_2",  {"f1_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 321},
496     {"f2_2",  {"f2_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0,  16}, 333},
497     {"f3_2",  {"f3_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0,  24}, 347},
498     {"f4_2",  {"f4_2",  NULL, D3DXPC_VECTOR,      D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0,  32}, 363},
499     {"f11_2", {"f11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 1, 2, 0, 0, 0,   8}, 381},
500     {"f12_2", {"f12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 2, 2, 0, 0, 0,  16}, 393},
501     {"f13_2", {"f13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 3, 2, 0, 0, 0,  24}, 407},
502     {"f14_2", {"f14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 1, 4, 2, 0, 0, 0,  32}, 423},
503     {"f21_2", {"f21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 1, 2, 0, 0, 0,  16}, 441},
504     {"f22_2", {"f22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 2, 2, 0, 0, 0,  32}, 455},
505     {"f23_2", {"f23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 3, 2, 0, 0, 0,  48}, 473},
506     {"f24_2", {"f24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 2, 4, 2, 0, 0, 0,  64}, 495},
507     {"f31_2", {"f31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 2, 0, 0, 0,  24}, 521},
508     {"f32_2", {"f32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 2, 2, 0, 0, 0,  48}, 537},
509     {"f33_2", {"f33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 2, 0, 0, 0,  72}, 559},
510     {"f34_2", {"f34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 4, 2, 0, 0, 0,  96}, 587},
511     {"f41_2", {"f41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 1, 2, 0, 0, 0,  32}, 621},
512     {"f42_2", {"f42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 2, 2, 0, 0, 0,  64}, 639},
513     {"f43_2", {"f43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 3, 2, 0, 0, 0,  96}, 665},
514     {"f44_2", {"f44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 4, 4, 2, 0, 0, 0, 128}, 699},
515 };
516
517 /*
518  * fxc.exe /Tfx_2_0
519  */
520 #if 0
521 int i = 1;
522 int1 i1 = {11};
523 int2 i2 = {21, 22};
524 int3 i3 = {31, 32, 33};
525 int4 i4 = {41, 42, 43, 44};
526 int1x1 i11 = {111};
527 int1x2 i12 = {121, 122};
528 int1x3 i13 = {131, 132, 133};
529 int1x4 i14 = {141, 142, 143, 144};
530 int2x1 i21 = {{2111, 2121}};
531 int2x2 i22 = {{2211, 2221}, {2212, 2222}};
532 int2x3 i23 = {{2311, 2321}, {2312, 2322}, {2313, 2323}};
533 int2x4 i24 = {{2411, 2421}, {2412, 2422}, {2413, 2423}, {2414, 2424}};
534 int3x1 i31 = {{3111, 3121, 3131}};
535 int3x2 i32 = {{3211, 3221, 3231}, {3212, 3222, 3232}};
536 int3x3 i33 = {{3311, 3321, 3331}, {3312, 3322, 3332},
537         {3313, 3323, 3333}};
538 int3x4 i34 = {{3411, 3421, 3431}, {3412, 3422, 3432},
539         {3413, 3423, 3433}, {3414, 3424, 3434}};
540 int4x1 i41 = {{4111, 4121, 4131, 4141}};
541 int4x2 i42 = {{4211, 4221, 4231, 4241}, {4212, 4222, 4232, 4242}};
542 int4x3 i43 = {{4311, 4321, 4331, 4341}, {4312, 4322, 4332, 4342},
543         {4313, 4323, 4333, 4343}};
544 int4x4 i44 = {{4411, 4421, 4431, 4441}, {4412, 4422, 4432, 4442},
545         {4413, 4423, 4433, 4443}, {4414, 4424, 4434, 4444}};
546 int i_2[2] = {0101, 0102};
547 int1 i1_2[2] = {{1101}, {1102}};
548 int2 i2_2[2] = {{2101, 2201}, {2102, 2202}};
549 int3 i3_2[2] = {{3101, 3201, 3301}, {3102, 3202, 3302}};
550 int4 i4_2[2] = {{4101, 4201, 4301, 4401}, {4102, 4202, 4302, 4402}};
551 int1x1 i11_2[2] = {{11101}, {11102}};
552 int1x2 i12_2[2] = {{12101, 12201}, {12102, 12202}};
553 int1x3 i13_2[2] = {{13101, 13201, 13301}, {13102, 13202, 13302}};
554 int1x4 i14_2[2] = {{14101, 14201, 14301, 14401}, {14102, 14202, 14302, 14402}};
555 int2x1 i21_2[2] = {{{211101, 212101}}, {{211102, 212102}}};
556 int2x2 i22_2[2] = {{{221101, 222101}, {221201, 222201}}, {{221102, 222102}, {221202, 222202}}};
557 int2x3 i23_2[2] = {{{231101, 232101}, {231201, 232201}, {231301, 232301}}, {{231102, 232102},
558         {231202, 232202}, {231302, 232302}}};
559 int2x4 i24_2[2] = {{{241101, 242101}, {241201, 242201}, {241301, 242301}, {241401, 242401}},
560         {{241102, 242102}, {241202, 242202}, {241302, 242302}, {241402, 242402}}};
561 int3x1 i31_2[2] = {{{311101, 312101, 313101}}, {{311102, 312102, 313102}}};
562 int3x2 i32_2[2] = {{{321101, 322101, 323101}, {321201, 322201, 323201}},
563         {{321102, 322102, 323102}, {321202, 322202, 323202}}};
564 int3x3 i33_2[2] = {{{331101, 332101, 333101}, {331201, 332201, 333201},
565         {331301, 332301, 333301}}, {{331102, 332102, 333102}, {331202, 332202, 333202},
566         {331302, 332302, 333302}}};
567 int3x4 i34_2[2] = {{{341101, 342101, 343101}, {341201, 342201, 343201},
568         {341301, 342301, 343301}, {341401, 342401, 343401}}, {{341102, 342102, 343102},
569         {341202, 342202, 343202}, {341302, 342302, 343302}, {341402, 342402, 343402}}};
570 int4x1 i41_2[2] = {{{411101, 412101, 413101, 414101}}, {{411102, 412102, 413102, 414102}}};
571 int4x2 i42_2[2] = {{{421101, 422101, 423101, 424101}, {421201, 422201, 423201, 424201}},
572         {{421102, 422102, 423102, 424102}, {421202, 422202, 423202, 424202}}};
573 int4x3 i43_2[2] = {{{431101, 432101, 433101, 434101}, {431201, 432201, 433201, 434201},
574         {431301, 432301, 433301, 434301}}, {{431102, 432102, 433102, 434102},
575         {431202, 432202, 433202, 434202}, {431302, 432302, 433302, 434302}}};
576 int4x4 i44_2[2] = {{{441101, 442101, 443101, 444101}, {441201, 442201, 443201, 444201},
577         {441301, 442301, 443301, 444301}, {441401, 442401, 443401, 444401}},
578         {{441102, 442102, 443102, 444102}, {441202, 442202, 443202, 444202},
579         {441302, 442302, 443302, 444302}, {441402, 442402, 443402, 444402}}};
580 technique t { pass p { } }
581 #endif
582 static const DWORD test_effect_parameter_value_blob_int[] =
583 {
584 0xfeff0901, 0x00000b80, 0x00000000, 0x00000002, 0x00000000, 0x00000024, 0x00000000, 0x00000000,
585 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000069, 0x00000002, 0x00000001, 0x0000004c,
586 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x0000000b, 0x00000003, 0x00003169, 0x00000002,
587 0x00000001, 0x00000078, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x00000015, 0x00000016,
588 0x00000003, 0x00003269, 0x00000002, 0x00000001, 0x000000a8, 0x00000000, 0x00000000, 0x00000003,
589 0x00000001, 0x0000001f, 0x00000020, 0x00000021, 0x00000003, 0x00003369, 0x00000002, 0x00000001,
590 0x000000dc, 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x00000029, 0x0000002a, 0x0000002b,
591 0x0000002c, 0x00000003, 0x00003469, 0x00000002, 0x00000002, 0x00000104, 0x00000000, 0x00000000,
592 0x00000001, 0x00000001, 0x0000006f, 0x00000004, 0x00313169, 0x00000002, 0x00000002, 0x00000130,
593 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000079, 0x0000007a, 0x00000004, 0x00323169,
594 0x00000002, 0x00000002, 0x00000160, 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x00000083,
595 0x00000084, 0x00000085, 0x00000004, 0x00333169, 0x00000002, 0x00000002, 0x00000194, 0x00000000,
596 0x00000000, 0x00000001, 0x00000004, 0x0000008d, 0x0000008e, 0x0000008f, 0x00000090, 0x00000004,
597 0x00343169, 0x00000002, 0x00000002, 0x000001c0, 0x00000000, 0x00000000, 0x00000002, 0x00000001,
598 0x0000083f, 0x00000849, 0x00000004, 0x00313269, 0x00000002, 0x00000002, 0x000001f4, 0x00000000,
599 0x00000000, 0x00000002, 0x00000002, 0x000008a3, 0x000008ad, 0x000008a4, 0x000008ae, 0x00000004,
600 0x00323269, 0x00000002, 0x00000002, 0x00000230, 0x00000000, 0x00000000, 0x00000002, 0x00000003,
601 0x00000907, 0x00000911, 0x00000908, 0x00000912, 0x00000909, 0x00000913, 0x00000004, 0x00333269,
602 0x00000002, 0x00000002, 0x00000274, 0x00000000, 0x00000000, 0x00000002, 0x00000004, 0x0000096b,
603 0x00000975, 0x0000096c, 0x00000976, 0x0000096d, 0x00000977, 0x0000096e, 0x00000978, 0x00000004,
604 0x00343269, 0x00000002, 0x00000002, 0x000002a4, 0x00000000, 0x00000000, 0x00000003, 0x00000001,
605 0x00000c27, 0x00000c31, 0x00000c3b, 0x00000004, 0x00313369, 0x00000002, 0x00000002, 0x000002e0,
606 0x00000000, 0x00000000, 0x00000003, 0x00000002, 0x00000c8b, 0x00000c95, 0x00000c9f, 0x00000c8c,
607 0x00000c96, 0x00000ca0, 0x00000004, 0x00323369, 0x00000002, 0x00000002, 0x00000328, 0x00000000,
608 0x00000000, 0x00000003, 0x00000003, 0x00000cef, 0x00000cf9, 0x00000d03, 0x00000cf0, 0x00000cfa,
609 0x00000d04, 0x00000cf1, 0x00000cfb, 0x00000d05, 0x00000004, 0x00333369, 0x00000002, 0x00000002,
610 0x0000037c, 0x00000000, 0x00000000, 0x00000003, 0x00000004, 0x00000d53, 0x00000d5d, 0x00000d67,
611 0x00000d54, 0x00000d5e, 0x00000d68, 0x00000d55, 0x00000d5f, 0x00000d69, 0x00000d56, 0x00000d60,
612 0x00000d6a, 0x00000004, 0x00343369, 0x00000002, 0x00000002, 0x000003b0, 0x00000000, 0x00000000,
613 0x00000004, 0x00000001, 0x0000100f, 0x00001019, 0x00001023, 0x0000102d, 0x00000004, 0x00313469,
614 0x00000002, 0x00000002, 0x000003f4, 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x00001073,
615 0x0000107d, 0x00001087, 0x00001091, 0x00001074, 0x0000107e, 0x00001088, 0x00001092, 0x00000004,
616 0x00323469, 0x00000002, 0x00000002, 0x00000448, 0x00000000, 0x00000000, 0x00000004, 0x00000003,
617 0x000010d7, 0x000010e1, 0x000010eb, 0x000010f5, 0x000010d8, 0x000010e2, 0x000010ec, 0x000010f6,
618 0x000010d9, 0x000010e3, 0x000010ed, 0x000010f7, 0x00000004, 0x00333469, 0x00000002, 0x00000002,
619 0x000004ac, 0x00000000, 0x00000000, 0x00000004, 0x00000004, 0x0000113b, 0x00001145, 0x0000114f,
620 0x00001159, 0x0000113c, 0x00001146, 0x00001150, 0x0000115a, 0x0000113d, 0x00001147, 0x00001151,
621 0x0000115b, 0x0000113e, 0x00001148, 0x00001152, 0x0000115c, 0x00000004, 0x00343469, 0x00000002,
622 0x00000000, 0x000004d8, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00000041, 0x00000042,
623 0x00000004, 0x00325f69, 0x00000002, 0x00000001, 0x00000504, 0x00000000, 0x00000002, 0x00000001,
624 0x00000001, 0x0000044d, 0x0000044e, 0x00000005, 0x325f3169, 0x00000000, 0x00000002, 0x00000001,
625 0x0000053c, 0x00000000, 0x00000002, 0x00000002, 0x00000001, 0x00000835, 0x00000899, 0x00000836,
626 0x0000089a, 0x00000005, 0x325f3269, 0x00000000, 0x00000002, 0x00000001, 0x0000057c, 0x00000000,
627 0x00000002, 0x00000003, 0x00000001, 0x00000c1d, 0x00000c81, 0x00000ce5, 0x00000c1e, 0x00000c82,
628 0x00000ce6, 0x00000005, 0x325f3369, 0x00000000, 0x00000002, 0x00000001, 0x000005c4, 0x00000000,
629 0x00000002, 0x00000004, 0x00000001, 0x00001005, 0x00001069, 0x000010cd, 0x00001131, 0x00001006,
630 0x0000106a, 0x000010ce, 0x00001132, 0x00000005, 0x325f3469, 0x00000000, 0x00000002, 0x00000002,
631 0x000005f4, 0x00000000, 0x00000002, 0x00000001, 0x00000001, 0x00002b5d, 0x00002b5e, 0x00000006,
632 0x5f313169, 0x00000032, 0x00000002, 0x00000002, 0x0000062c, 0x00000000, 0x00000002, 0x00000001,
633 0x00000002, 0x00002f45, 0x00002fa9, 0x00002f46, 0x00002faa, 0x00000006, 0x5f323169, 0x00000032,
634 0x00000002, 0x00000002, 0x0000066c, 0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0000332d,
635 0x00003391, 0x000033f5, 0x0000332e, 0x00003392, 0x000033f6, 0x00000006, 0x5f333169, 0x00000032,
636 0x00000002, 0x00000002, 0x000006b4, 0x00000000, 0x00000002, 0x00000001, 0x00000004, 0x00003715,
637 0x00003779, 0x000037dd, 0x00003841, 0x00003716, 0x0000377a, 0x000037de, 0x00003842, 0x00000006,
638 0x5f343169, 0x00000032, 0x00000002, 0x00000002, 0x000006ec, 0x00000000, 0x00000002, 0x00000002,
639 0x00000001, 0x0003389d, 0x00033c85, 0x0003389e, 0x00033c86, 0x00000006, 0x5f313269, 0x00000032,
640 0x00000002, 0x00000002, 0x00000734, 0x00000000, 0x00000002, 0x00000002, 0x00000002, 0x00035fad,
641 0x00036395, 0x00036011, 0x000363f9, 0x00035fae, 0x00036396, 0x00036012, 0x000363fa, 0x00000006,
642 0x5f323269, 0x00000032, 0x00000002, 0x00000002, 0x0000078c, 0x00000000, 0x00000002, 0x00000002,
643 0x00000003, 0x000386bd, 0x00038aa5, 0x00038721, 0x00038b09, 0x00038785, 0x00038b6d, 0x000386be,
644 0x00038aa6, 0x00038722, 0x00038b0a, 0x00038786, 0x00038b6e, 0x00000006, 0x5f333269, 0x00000032,
645 0x00000002, 0x00000002, 0x000007f4, 0x00000000, 0x00000002, 0x00000002, 0x00000004, 0x0003adcd,
646 0x0003b1b5, 0x0003ae31, 0x0003b219, 0x0003ae95, 0x0003b27d, 0x0003aef9, 0x0003b2e1, 0x0003adce,
647 0x0003b1b6, 0x0003ae32, 0x0003b21a, 0x0003ae96, 0x0003b27e, 0x0003aefa, 0x0003b2e2, 0x00000006,
648 0x5f343269, 0x00000032, 0x00000002, 0x00000002, 0x00000834, 0x00000000, 0x00000002, 0x00000003,
649 0x00000001, 0x0004bf3d, 0x0004c325, 0x0004c70d, 0x0004bf3e, 0x0004c326, 0x0004c70e, 0x00000006,
650 0x5f313369, 0x00000032, 0x00000002, 0x00000002, 0x0000088c, 0x00000000, 0x00000002, 0x00000003,
651 0x00000002, 0x0004e64d, 0x0004ea35, 0x0004ee1d, 0x0004e6b1, 0x0004ea99, 0x0004ee81, 0x0004e64e,
652 0x0004ea36, 0x0004ee1e, 0x0004e6b2, 0x0004ea9a, 0x0004ee82, 0x00000006, 0x5f323369, 0x00000032,
653 0x00000002, 0x00000002, 0x000008fc, 0x00000000, 0x00000002, 0x00000003, 0x00000003, 0x00050d5d,
654 0x00051145, 0x0005152d, 0x00050dc1, 0x000511a9, 0x00051591, 0x00050e25, 0x0005120d, 0x000515f5,
655 0x00050d5e, 0x00051146, 0x0005152e, 0x00050dc2, 0x000511aa, 0x00051592, 0x00050e26, 0x0005120e,
656 0x000515f6, 0x00000006, 0x5f333369, 0x00000032, 0x00000002, 0x00000002, 0x00000984, 0x00000000,
657 0x00000002, 0x00000003, 0x00000004, 0x0005346d, 0x00053855, 0x00053c3d, 0x000534d1, 0x000538b9,
658 0x00053ca1, 0x00053535, 0x0005391d, 0x00053d05, 0x00053599, 0x00053981, 0x00053d69, 0x0005346e,
659 0x00053856, 0x00053c3e, 0x000534d2, 0x000538ba, 0x00053ca2, 0x00053536, 0x0005391e, 0x00053d06,
660 0x0005359a, 0x00053982, 0x00053d6a, 0x00000006, 0x5f343369, 0x00000032, 0x00000002, 0x00000002,
661 0x000009cc, 0x00000000, 0x00000002, 0x00000004, 0x00000001, 0x000645dd, 0x000649c5, 0x00064dad,
662 0x00065195, 0x000645de, 0x000649c6, 0x00064dae, 0x00065196, 0x00000006, 0x5f313469, 0x00000032,
663 0x00000002, 0x00000002, 0x00000a34, 0x00000000, 0x00000002, 0x00000004, 0x00000002, 0x00066ced,
664 0x000670d5, 0x000674bd, 0x000678a5, 0x00066d51, 0x00067139, 0x00067521, 0x00067909, 0x00066cee,
665 0x000670d6, 0x000674be, 0x000678a6, 0x00066d52, 0x0006713a, 0x00067522, 0x0006790a, 0x00000006,
666 0x5f323469, 0x00000032, 0x00000002, 0x00000002, 0x00000abc, 0x00000000, 0x00000002, 0x00000004,
667 0x00000003, 0x000693fd, 0x000697e5, 0x00069bcd, 0x00069fb5, 0x00069461, 0x00069849, 0x00069c31,
668 0x0006a019, 0x000694c5, 0x000698ad, 0x00069c95, 0x0006a07d, 0x000693fe, 0x000697e6, 0x00069bce,
669 0x00069fb6, 0x00069462, 0x0006984a, 0x00069c32, 0x0006a01a, 0x000694c6, 0x000698ae, 0x00069c96,
670 0x0006a07e, 0x00000006, 0x5f333469, 0x00000032, 0x00000002, 0x00000002, 0x00000b64, 0x00000000,
671 0x00000002, 0x00000004, 0x00000004, 0x0006bb0d, 0x0006bef5, 0x0006c2dd, 0x0006c6c5, 0x0006bb71,
672 0x0006bf59, 0x0006c341, 0x0006c729, 0x0006bbd5, 0x0006bfbd, 0x0006c3a5, 0x0006c78d, 0x0006bc39,
673 0x0006c021, 0x0006c409, 0x0006c7f1, 0x0006bb0e, 0x0006bef6, 0x0006c2de, 0x0006c6c6, 0x0006bb72,
674 0x0006bf5a, 0x0006c342, 0x0006c72a, 0x0006bbd6, 0x0006bfbe, 0x0006c3a6, 0x0006c78e, 0x0006bc3a,
675 0x0006c022, 0x0006c40a, 0x0006c7f2, 0x00000006, 0x5f343469, 0x00000032, 0x00000002, 0x00000070,
676 0x00000002, 0x00000074, 0x0000002a, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000020,
677 0x00000000, 0x00000000, 0x0000002c, 0x00000048, 0x00000000, 0x00000000, 0x00000054, 0x00000070,
678 0x00000000, 0x00000000, 0x00000080, 0x0000009c, 0x00000000, 0x00000000, 0x000000b0, 0x000000cc,
679 0x00000000, 0x00000000, 0x000000e4, 0x00000100, 0x00000000, 0x00000000, 0x0000010c, 0x00000128,
680 0x00000000, 0x00000000, 0x00000138, 0x00000154, 0x00000000, 0x00000000, 0x00000168, 0x00000184,
681 0x00000000, 0x00000000, 0x0000019c, 0x000001b8, 0x00000000, 0x00000000, 0x000001c8, 0x000001e4,
682 0x00000000, 0x00000000, 0x000001fc, 0x00000218, 0x00000000, 0x00000000, 0x00000238, 0x00000254,
683 0x00000000, 0x00000000, 0x0000027c, 0x00000298, 0x00000000, 0x00000000, 0x000002ac, 0x000002c8,
684 0x00000000, 0x00000000, 0x000002e8, 0x00000304, 0x00000000, 0x00000000, 0x00000330, 0x0000034c,
685 0x00000000, 0x00000000, 0x00000384, 0x000003a0, 0x00000000, 0x00000000, 0x000003b8, 0x000003d4,
686 0x00000000, 0x00000000, 0x000003fc, 0x00000418, 0x00000000, 0x00000000, 0x00000450, 0x0000046c,
687 0x00000000, 0x00000000, 0x000004b4, 0x000004d0, 0x00000000, 0x00000000, 0x000004e0, 0x000004fc,
688 0x00000000, 0x00000000, 0x00000510, 0x0000052c, 0x00000000, 0x00000000, 0x00000548, 0x00000564,
689 0x00000000, 0x00000000, 0x00000588, 0x000005a4, 0x00000000, 0x00000000, 0x000005d0, 0x000005ec,
690 0x00000000, 0x00000000, 0x00000600, 0x0000061c, 0x00000000, 0x00000000, 0x00000638, 0x00000654,
691 0x00000000, 0x00000000, 0x00000678, 0x00000694, 0x00000000, 0x00000000, 0x000006c0, 0x000006dc,
692 0x00000000, 0x00000000, 0x000006f8, 0x00000714, 0x00000000, 0x00000000, 0x00000740, 0x0000075c,
693 0x00000000, 0x00000000, 0x00000798, 0x000007b4, 0x00000000, 0x00000000, 0x00000800, 0x0000081c,
694 0x00000000, 0x00000000, 0x00000840, 0x0000085c, 0x00000000, 0x00000000, 0x00000898, 0x000008b4,
695 0x00000000, 0x00000000, 0x00000908, 0x00000924, 0x00000000, 0x00000000, 0x00000990, 0x000009ac,
696 0x00000000, 0x00000000, 0x000009d8, 0x000009f4, 0x00000000, 0x00000000, 0x00000a40, 0x00000a5c,
697 0x00000000, 0x00000000, 0x00000ac8, 0x00000ae4, 0x00000000, 0x00000000, 0x00000b78, 0x00000000,
698 0x00000001, 0x00000b70, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
699 };
700
701 struct test_effect_parameter_value_result test_effect_parameter_value_result_int[] =
702 {
703     {"i",     {"i",     NULL, D3DXPC_SCALAR,      D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  10},
704     {"i1",    {"i1",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  20},
705     {"i2",    {"i2",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 2, 0, 0, 0, 0,   8},  30},
706     {"i3",    {"i3",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 3, 0, 0, 0, 0,  12},  41},
707     {"i4",    {"i4",    NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 4, 0, 0, 0, 0,  16},  53},
708     {"i11",   {"i11",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 0, 0, 0, 0,   4},  66},
709     {"i12",   {"i12",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 0, 0, 0, 0,   8},  76},
710     {"i13",   {"i13",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 0, 0, 0, 0,  12},  87},
711     {"i14",   {"i14",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 0, 0, 0, 0,  16},  99},
712     {"i21",   {"i21",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 0, 0, 0, 0,   8}, 112},
713     {"i22",   {"i22",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 0, 0, 0, 0,  16}, 123},
714     {"i23",   {"i23",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 0, 0, 0, 0,  24}, 136},
715     {"i24",   {"i24",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 0, 0, 0, 0,  32}, 151},
716     {"i31",   {"i31",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 0, 0, 0, 0,  12}, 168},
717     {"i32",   {"i32",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 0, 0, 0, 0,  24}, 180},
718     {"i33",   {"i33",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 0, 0, 0, 0,  36}, 195},
719     {"i34",   {"i34",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 0, 0, 0, 0,  48}, 213},
720     {"i41",   {"i41",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 0, 0, 0, 0,  16}, 234},
721     {"i42",   {"i42",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 0, 0, 0, 0,  32}, 247},
722     {"i43",   {"i43",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 0, 0, 0, 0,  48}, 264},
723     {"i44",   {"i44",   NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 0, 0, 0, 0,  64}, 285},
724     {"i_2",   {"i_2",   NULL, D3DXPC_SCALAR,      D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 310},
725     {"i1_2",  {"i1_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 321},
726     {"i2_2",  {"i2_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 2, 2, 0, 0, 0,  16}, 333},
727     {"i3_2",  {"i3_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 3, 2, 0, 0, 0,  24}, 347},
728     {"i4_2",  {"i4_2",  NULL, D3DXPC_VECTOR,      D3DXPT_INT, 1, 4, 2, 0, 0, 0,  32}, 363},
729     {"i11_2", {"i11_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 1, 2, 0, 0, 0,   8}, 381},
730     {"i12_2", {"i12_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 2, 2, 0, 0, 0,  16}, 393},
731     {"i13_2", {"i13_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 3, 2, 0, 0, 0,  24}, 407},
732     {"i14_2", {"i14_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 1, 4, 2, 0, 0, 0,  32}, 423},
733     {"i21_2", {"i21_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 1, 2, 0, 0, 0,  16}, 441},
734     {"i22_2", {"i22_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 2, 2, 0, 0, 0,  32}, 455},
735     {"i23_2", {"i23_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 3, 2, 0, 0, 0,  48}, 473},
736     {"i24_2", {"i24_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 2, 4, 2, 0, 0, 0,  64}, 495},
737     {"i31_2", {"i31_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 1, 2, 0, 0, 0,  24}, 521},
738     {"i32_2", {"i32_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 2, 2, 0, 0, 0,  48}, 537},
739     {"i33_2", {"i33_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 3, 2, 0, 0, 0,  72}, 559},
740     {"i34_2", {"i34_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 3, 4, 2, 0, 0, 0,  96}, 587},
741     {"i41_2", {"i41_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 1, 2, 0, 0, 0,  32}, 621},
742     {"i42_2", {"i42_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 2, 2, 0, 0, 0,  64}, 639},
743     {"i43_2", {"i43_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 3, 2, 0, 0, 0,  96}, 665},
744     {"i44_2", {"i44_2", NULL, D3DXPC_MATRIX_ROWS, D3DXPT_INT, 4, 4, 2, 0, 0, 0, 128}, 699},
745 };
746
747 #define ADD_PARAMETER_VALUE(x) {\
748     test_effect_parameter_value_blob_ ## x,\
749     sizeof(test_effect_parameter_value_blob_ ## x),\
750     test_effect_parameter_value_result_ ## x,\
751     sizeof(test_effect_parameter_value_result_ ## x)/sizeof(*test_effect_parameter_value_result_ ## x),\
752 }
753
754 static const struct
755 {
756     const DWORD *blob;
757     UINT blob_size;
758     const struct test_effect_parameter_value_result *res;
759     UINT res_count;
760 }
761 test_effect_parameter_value_data[] =
762 {
763     ADD_PARAMETER_VALUE(float),
764     ADD_PARAMETER_VALUE(int),
765 };
766
767 #undef ADD_PARAMETER_VALUE
768
769 #define EFFECT_PARAMETER_VALUE_ARRAY_SIZE 48
770 /* Constants for special INT/FLOAT conversation */
771 #define INT_FLOAT_MULTI 255.0f
772
773 static void test_effect_parameter_value_GetValue(const struct test_effect_parameter_value_result *res,
774         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
775 {
776     const D3DXPARAMETER_DESC *res_desc = &res->desc;
777     LPCSTR res_full_name = res->full_name;
778     DWORD value[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
779     HRESULT hr;
780     UINT l;
781
782     memset(value, 0xab, sizeof(value));
783     hr = effect->lpVtbl->GetValue(effect, parameter, value, res_desc->Bytes);
784     if (res_desc->Class == D3DXPC_SCALAR
785             || res_desc->Class == D3DXPC_VECTOR
786             || res_desc->Class == D3DXPC_MATRIX_ROWS)
787     {
788         ok(hr == D3D_OK, "%u - %s: GetValue failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
789
790         for (l = 0; l < res_desc->Bytes / sizeof(*value); ++l)
791         {
792             ok(value[l] == res_value[l], "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
793                     i, res_full_name, l, value[l], res_value[l]);
794         }
795
796         for (l = res_desc->Bytes / sizeof(*value); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
797         {
798             ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
799                     i, res_full_name, l, value[l], 0xabababab);
800         }
801     }
802     else
803     {
804         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetValue failed, got %#x, expected %#x\n",
805                 i, res_full_name, hr, D3DERR_INVALIDCALL);
806
807         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
808         {
809             ok(value[l] == 0xabababab, "%u - %s: GetValue value[%u] failed, got %#x, expected %#x\n",
810                     i, res_full_name, l, value[l], 0xabababab);
811         }
812     }
813 }
814
815 static void test_effect_parameter_value_GetBool(const struct test_effect_parameter_value_result *res,
816         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
817 {
818     const D3DXPARAMETER_DESC *res_desc = &res->desc;
819     LPCSTR res_full_name = res->full_name;
820     BOOL bvalue = 0xabababab;
821     HRESULT hr;
822
823     hr = effect->lpVtbl->GetBool(effect, parameter, &bvalue);
824     if (!res_desc->Elements && res_desc->Rows == 1 && res_desc->Columns == 1)
825     {
826         ok(hr == D3D_OK, "%u - %s: GetBool failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
827         ok(bvalue == get_bool(res_value), "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
828                 i, res_full_name, bvalue, get_bool(res_value));
829     }
830     else
831     {
832         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBool failed, got %#x, expected %#x\n",
833                 i, res_full_name, hr, D3DERR_INVALIDCALL);
834         ok(bvalue == 0xabababab, "%u - %s: GetBool bvalue failed, got %#x, expected %#x\n",
835                 i, res_full_name, bvalue, 0xabababab);
836     }
837 }
838
839 static void test_effect_parameter_value_GetBoolArray(const struct test_effect_parameter_value_result *res,
840         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
841 {
842     const D3DXPARAMETER_DESC *res_desc = &res->desc;
843     LPCSTR res_full_name = res->full_name;
844     BOOL bavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
845     HRESULT hr;
846     UINT l;
847
848     memset(bavalue, 0xab, sizeof(bavalue));
849     hr = effect->lpVtbl->GetBoolArray(effect, parameter, bavalue, res_desc->Bytes / sizeof(*bavalue));
850     if (res_desc->Class == D3DXPC_SCALAR
851             || res_desc->Class == D3DXPC_VECTOR
852             || res_desc->Class == D3DXPC_MATRIX_ROWS)
853     {
854         ok(hr == D3D_OK, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
855
856         for (l = 0; l < res_desc->Bytes / sizeof(*bavalue); ++l)
857         {
858             ok(bavalue[l] == get_bool(&res_value[l]), "%u - %s: GetBoolArray bavalue[%u] failed, got %#x, expected %#x\n",
859                     i, res_full_name, l, bavalue[l], get_bool(&res_value[l]));
860         }
861
862         for (l = res_desc->Bytes / sizeof(*bavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
863         {
864             ok(bavalue[l] == 0xabababab, "%u - %s: GetBoolArray bavalue[%u] failed, got %#x, expected %#x\n",
865                     i, res_full_name, l, bavalue[l], 0xabababab);
866         }
867     }
868     else
869     {
870         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetBoolArray failed, got %#x, expected %#x\n",
871                 i, res_full_name, hr, D3DERR_INVALIDCALL);
872
873         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
874         {
875             ok(bavalue[l] == 0xabababab, "%u - %s: GetBoolArray bavalue[%u] failed, got %#x, expected %#x\n",
876                     i, res_full_name, l, bavalue[l], 0xabababab);
877         }
878     }
879 }
880
881 static void test_effect_parameter_value_GetInt(const struct test_effect_parameter_value_result *res,
882         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
883 {
884     const D3DXPARAMETER_DESC *res_desc = &res->desc;
885     LPCSTR res_full_name = res->full_name;
886     INT ivalue = 0xabababab;
887     HRESULT hr;
888
889     hr = effect->lpVtbl->GetInt(effect, parameter, &ivalue);
890     if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
891     {
892         ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
893         ok(ivalue == get_int(res_desc->Type, res_value), "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
894                 i, res_full_name, ivalue, get_int(res_desc->Type, res_value));
895     }
896     else if(!res_desc->Elements && res_desc->Type == D3DXPT_FLOAT &&
897             ((res_desc->Class == D3DXPC_VECTOR && res_desc->Columns != 2) ||
898             (res_desc->Class == D3DXPC_MATRIX_ROWS && res_desc->Rows != 2 && res_desc->Columns == 1)))
899     {
900         INT tmp;
901
902         ok(hr == D3D_OK, "%u - %s: GetInt failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
903
904         tmp = (INT)(min(max(0.0f, *((FLOAT *)res_value + 2)), 1.0f) * INT_FLOAT_MULTI);
905         tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8;
906         tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16;
907         if (res_desc->Columns * res_desc->Rows > 3)
908         {
909             tmp += ((INT)(min(max(0.0f, *((FLOAT *)res_value + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24;
910         }
911
912         ok(ivalue == tmp, "%u - %s: GetInt ivalue failed, got %x, expected %x\n",
913                 i, res_full_name, ivalue, tmp);
914     }
915     else
916     {
917         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetInt failed, got %#x, expected %#x\n",
918                 i, res_full_name, hr, D3DERR_INVALIDCALL);
919         ok(ivalue == 0xabababab, "%u - %s: GetInt ivalue failed, got %i, expected %i\n",
920                 i, res_full_name, ivalue, 0xabababab);
921     }
922 }
923
924 static void test_effect_parameter_value_GetIntArray(const struct test_effect_parameter_value_result *res,
925         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
926 {
927     const D3DXPARAMETER_DESC *res_desc = &res->desc;
928     LPCSTR res_full_name = res->full_name;
929     INT iavalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
930     HRESULT hr;
931     UINT l;
932
933     memset(iavalue, 0xab, sizeof(iavalue));
934     hr = effect->lpVtbl->GetIntArray(effect, parameter, iavalue, res_desc->Bytes / sizeof(*iavalue));
935     if (res_desc->Class == D3DXPC_SCALAR
936             || res_desc->Class == D3DXPC_VECTOR
937             || res_desc->Class == D3DXPC_MATRIX_ROWS)
938     {
939         ok(hr == D3D_OK, "%u - %s: GetIntArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
940
941         for (l = 0; l < res_desc->Bytes / sizeof(*iavalue); ++l)
942         {
943             ok(iavalue[l] == get_int(res_desc->Type, &res_value[l]), "%u - %s: GetIntArray iavalue[%u] failed, got %i, expected %i\n",
944                     i, res_full_name, l, iavalue[l], get_int(res_desc->Type, &res_value[l]));
945         }
946
947         for (l = res_desc->Bytes / sizeof(*iavalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
948         {
949             ok(iavalue[l] == 0xabababab, "%u - %s: GetIntArray iavalue[%u] failed, got %i, expected %i\n",
950                     i, res_full_name, l, iavalue[l], 0xabababab);
951         }
952     }
953     else
954     {
955         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetIntArray failed, got %#x, expected %#x\n",
956                 i, res_full_name, hr, D3DERR_INVALIDCALL);
957
958         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
959         {
960             ok(iavalue[l] == 0xabababab, "%u - %s: GetIntArray iavalue[%u] failed, got %i, expected %i\n",
961                     i, res_full_name, l, iavalue[l], 0xabababab);
962         }
963     }
964 }
965
966 static void test_effect_parameter_value_GetFloat(const struct test_effect_parameter_value_result *res,
967         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
968 {
969     const D3DXPARAMETER_DESC *res_desc = &res->desc;
970     LPCSTR res_full_name = res->full_name;
971     HRESULT hr;
972     DWORD cmp = 0xabababab;
973     FLOAT fvalue = *(FLOAT *)&cmp;
974
975     hr = effect->lpVtbl->GetFloat(effect, parameter, &fvalue);
976     if (!res_desc->Elements && res_desc->Columns == 1 && res_desc->Rows == 1)
977     {
978         ok(hr == D3D_OK, "%u - %s: GetFloat failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
979         ok(compare_float(fvalue, get_float(res_desc->Type, res_value), 512), "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
980                 i, res_full_name, fvalue, get_float(res_desc->Type, res_value));
981     }
982     else
983     {
984         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloat failed, got %#x, expected %#x\n",
985                 i, res_full_name, hr, D3DERR_INVALIDCALL);
986         ok(fvalue == *(FLOAT *)&cmp, "%u - %s: GetFloat fvalue failed, got %f, expected %f\n",
987                 i, res_full_name, fvalue, *(FLOAT *)&cmp);
988     }
989 }
990
991 static void test_effect_parameter_value_GetFloatArray(const struct test_effect_parameter_value_result *res,
992         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
993 {
994     const D3DXPARAMETER_DESC *res_desc = &res->desc;
995     LPCSTR res_full_name = res->full_name;
996     FLOAT favalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
997     HRESULT hr;
998     UINT l;
999     DWORD cmp = 0xabababab;
1000
1001     memset(favalue, 0xab, sizeof(favalue));
1002     hr = effect->lpVtbl->GetFloatArray(effect, parameter, favalue, res_desc->Bytes / sizeof(*favalue));
1003     if (res_desc->Class == D3DXPC_SCALAR
1004             || res_desc->Class == D3DXPC_VECTOR
1005             || res_desc->Class == D3DXPC_MATRIX_ROWS)
1006     {
1007         ok(hr == D3D_OK, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1008
1009         for (l = 0; l < res_desc->Bytes / sizeof(*favalue); ++l)
1010         {
1011             ok(compare_float(favalue[l], get_float(res_desc->Type, &res_value[l]), 512),
1012                     "%u - %s: GetFloatArray favalue[%u] failed, got %f, expected %f\n",
1013                     i, res_full_name, l, favalue[l], get_float(res_desc->Type, &res_value[l]));
1014         }
1015
1016         for (l = res_desc->Bytes / sizeof(*favalue); l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1017         {
1018             ok(favalue[l] == *(FLOAT *)&cmp, "%u - %s: GetFloatArray favalue[%u] failed, got %f, expected %f\n",
1019                     i, res_full_name, l, favalue[l], *(FLOAT *)&cmp);
1020         }
1021     }
1022     else
1023     {
1024         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetFloatArray failed, got %#x, expected %#x\n",
1025                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1026
1027         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1028         {
1029             ok(favalue[l] == *(FLOAT *)&cmp, "%u - %s: GetFloatArray favalue[%u] failed, got %f, expected %f\n",
1030                     i, res_full_name, l, favalue[l], *(FLOAT *)&cmp);
1031         }
1032     }
1033 }
1034
1035 static void test_effect_parameter_value_GetVector(const struct test_effect_parameter_value_result *res,
1036         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1037 {
1038     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1039     LPCSTR res_full_name = res->full_name;
1040     HRESULT hr;
1041     DWORD cmp = 0xabababab;
1042     FLOAT fvalue[4];
1043     UINT l;
1044
1045     memset(fvalue, 0xab, sizeof(fvalue));
1046     hr = effect->lpVtbl->GetVector(effect, parameter, (D3DXVECTOR4 *)&fvalue);
1047     if (!res_desc->Elements &&
1048             (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR) &&
1049             res_desc->Type == D3DXPT_INT && res_desc->Bytes == 4)
1050     {
1051         DWORD tmp;
1052
1053         ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1054
1055         tmp = (DWORD)(*(fvalue + 2) * INT_FLOAT_MULTI);
1056         tmp += ((DWORD)(*(fvalue + 1) * INT_FLOAT_MULTI)) << 8;
1057         tmp += ((DWORD)(*fvalue * INT_FLOAT_MULTI)) << 16;
1058         tmp += ((DWORD)(*(fvalue + 3) * INT_FLOAT_MULTI)) << 24;
1059
1060         ok(*res_value == tmp, "%u - %s: GetVector ivalue failed, got %i, expected %i\n",
1061                 i, res_full_name, tmp, *res_value);
1062     }
1063     else if (!res_desc->Elements && (res_desc->Class == D3DXPC_SCALAR || res_desc->Class == D3DXPC_VECTOR))
1064     {
1065         ok(hr == D3D_OK, "%u - %s: GetVector failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1066
1067         for (l = 0; l < res_desc->Columns; ++l)
1068         {
1069             ok(compare_float(fvalue[l], get_float(res_desc->Type, &res_value[l]), 512),
1070                     "%u - %s: GetVector fvalue[%u] failed, got %f, expected %f\n",
1071                     i, res_full_name, l, fvalue[l], get_float(res_desc->Type, &res_value[l]));
1072         }
1073
1074         for (l = res_desc->Columns; l < 4; ++l)
1075         {
1076             ok(fvalue[l] == 0.0f, "%u - %s: GetVector fvalue[%u] failed, got %f, expected %f\n",
1077                     i, res_full_name, l, fvalue[l], 0.0f);
1078         }
1079     }
1080     else
1081     {
1082         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVector failed, got %#x, expected %#x\n",
1083                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1084
1085         for (l = 0; l < 4; ++l)
1086         {
1087             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVector fvalue[%u] failed, got %f, expected %f\n",
1088                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1089         }
1090     }
1091 }
1092
1093 static void test_effect_parameter_value_GetVectorArray(const struct test_effect_parameter_value_result *res,
1094         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1095 {
1096     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1097     LPCSTR res_full_name = res->full_name;
1098     HRESULT hr;
1099     DWORD cmp = 0xabababab;
1100     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1101     UINT l, k;
1102
1103     memset(fvalue, 0xab, sizeof(fvalue));
1104     hr = effect->lpVtbl->GetVectorArray(effect, parameter, (D3DXVECTOR4 *)&fvalue, res_desc->Elements);
1105     if (!res_desc->Elements)
1106     {
1107         ok(hr == D3D_OK, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1108
1109         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1110         {
1111             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1112                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1113         }
1114     }
1115     else if (res_desc->Elements && res_desc->Class == D3DXPC_VECTOR)
1116     {
1117         ok(hr == D3D_OK, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1118
1119         for (k = 0; k < res_desc->Elements; ++k)
1120         {
1121             for (l = 0; l < res_desc->Columns; ++l)
1122             {
1123                 ok(compare_float(fvalue[l + k * 4], get_float(res_desc->Type, &res_value[ l + k * res_desc->Columns]), 512),
1124                         "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1125                         i, res_full_name, l + k * 4, fvalue[ l + k * 4], get_float(res_desc->Type, &res_value[ l + k * res_desc->Columns]));
1126             }
1127
1128             for (l = res_desc->Columns; l < 4; ++l)
1129             {
1130                 ok(fvalue[ l + k * 4] == 0.0f, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1131                         i, res_full_name, l + k * 4, fvalue[ l + k * 4], 0.0f);
1132             }
1133         }
1134
1135         for (l = res_desc->Elements * 4; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1136         {
1137             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1138                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1139         }
1140     }
1141     else
1142     {
1143         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetVectorArray failed, got %#x, expected %#x\n",
1144                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1145
1146         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1147         {
1148             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetVectorArray fvalue[%u] failed, got %f, expected %f\n",
1149                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1150         }
1151     }
1152 }
1153
1154 static void test_effect_parameter_value_GetMatrix(const struct test_effect_parameter_value_result *res,
1155         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1156 {
1157     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1158     LPCSTR res_full_name = res->full_name;
1159     HRESULT hr;
1160     DWORD cmp = 0xabababab;
1161     FLOAT fvalue[16];
1162     UINT l, k;
1163
1164     memset(fvalue, 0xab, sizeof(fvalue));
1165     hr = effect->lpVtbl->GetMatrix(effect, parameter, (D3DXMATRIX *)&fvalue);
1166     if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1167     {
1168         ok(hr == D3D_OK, "%u - %s: GetMatrix failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1169
1170         for (k = 0; k < 4; ++k)
1171         {
1172             for (l = 0; l < 4; ++l)
1173             {
1174                 if (k < res_desc->Columns && l < res_desc->Rows)
1175                 {
1176                     ok(compare_float(fvalue[l * 4 + k], get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]), 512),
1177                             "%u - %s: GetMatrix fvalue[%u] failed, got %f, expected %f\n",
1178                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k],
1179                             get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]));
1180                 }
1181                 else
1182                 {
1183                     ok(fvalue[l * 4 + k] == 0.0f, "%u - %s: GetMatrix fvalue[%u] failed, got %f, expected %f\n",
1184                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k], 0.0f);
1185                 }
1186             }
1187         }
1188     }
1189     else
1190     {
1191         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrix failed, got %#x, expected %#x\n",
1192                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1193
1194         for (l = 0; l < sizeof(fvalue) / sizeof(*fvalue); ++l)
1195         {
1196             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrix fvalue[%u] failed, got %f, expected %f\n",
1197                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1198         }
1199     }
1200 }
1201
1202 static void test_effect_parameter_value_GetMatrixArray(const struct test_effect_parameter_value_result *res,
1203         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1204 {
1205     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1206     LPCSTR res_full_name = res->full_name;
1207     HRESULT hr;
1208     DWORD cmp = 0xabababab;
1209     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1210     UINT l, k, m;
1211
1212     memset(fvalue, 0xab, sizeof(fvalue));
1213     hr = effect->lpVtbl->GetMatrixArray(effect, parameter, (D3DXMATRIX *)&fvalue, res_desc->Elements);
1214     if (!res_desc->Elements)
1215     {
1216         ok(hr == D3D_OK, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1217
1218         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1219         {
1220             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1221                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1222         }
1223     }
1224     else if (res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1225     {
1226         ok(hr == D3D_OK, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1227
1228         for (m = 0; m < res_desc->Elements; ++m)
1229         {
1230             for (k = 0; k < 4; ++k)
1231             {
1232                 for (l = 0; l < 4; ++l)
1233                 {
1234                     if (k < res_desc->Columns && l < res_desc->Rows)
1235                     {
1236                         ok(compare_float(fvalue[m * 16 + l * 4 + k], get_float(res_desc->Type,
1237                                 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512),
1238                                 "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1239                                 i, res_full_name, m * 16 + l * 4 + k, fvalue[m * 16 + l * 4 + k],
1240                                 get_float(res_desc->Type, &res_value[m * res_desc->Columns * res_desc->Rows
1241                                 + l * res_desc->Columns + k]));
1242                     }
1243                     else
1244                     {
1245                         ok(fvalue[m * 16 + l * 4 + k] == 0.0f, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1246                                 i, res_full_name, m * 16 + l * 4 + k, fvalue[m * 16 + l * 4 + k], 0.0f);
1247                     }
1248                 }
1249             }
1250         }
1251
1252         for (l = res_desc->Elements * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1253         {
1254             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1255                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1256         }
1257     }
1258     else
1259     {
1260         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixArray failed, got %#x, expected %#x\n",
1261                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1262
1263         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1264         {
1265             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixArray fvalue[%u] failed, got %f, expected %f\n",
1266                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1267         }
1268     }
1269 }
1270
1271 static void test_effect_parameter_value_GetMatrixTranspose(const struct test_effect_parameter_value_result *res,
1272         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1273 {
1274     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1275     LPCSTR res_full_name = res->full_name;
1276     HRESULT hr;
1277     DWORD cmp = 0xabababab;
1278     FLOAT fvalue[16];
1279     UINT l, k;
1280
1281     memset(fvalue, 0xab, sizeof(fvalue));
1282     hr = effect->lpVtbl->GetMatrixTranspose(effect, parameter, (D3DXMATRIX *)&fvalue);
1283     if (!res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1284     {
1285         ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1286
1287         for (k = 0; k < 4; ++k)
1288         {
1289             for (l = 0; l < 4; ++l)
1290             {
1291                 if (k < res_desc->Columns && l < res_desc->Rows)
1292                 {
1293                     ok(compare_float(fvalue[l + k * 4], get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]), 512),
1294                             "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1295                             i, res_full_name, l + k * 4, fvalue[l + k * 4],
1296                             get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]));
1297                 }
1298                 else
1299                 {
1300                     ok(fvalue[l + k * 4] == 0.0f, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1301                             i, res_full_name, l + k * 4, fvalue[l + k * 4], 0.0f);
1302                 }
1303             }
1304         }
1305     }
1306     else if (!res_desc->Elements && (res_desc->Class == D3DXPC_VECTOR || res_desc->Class == D3DXPC_SCALAR))
1307     {
1308         ok(hr == D3D_OK, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1309
1310         for (k = 0; k < 4; ++k)
1311         {
1312             for (l = 0; l < 4; ++l)
1313             {
1314                 if (k < res_desc->Columns && l < res_desc->Rows)
1315                 {
1316                     FLOAT res = get_float(res_desc->Type, &res_value[l * res_desc->Columns + k]);
1317
1318                     ok(fvalue[l * 4 + k] == res, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1319                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k], res);
1320                 }
1321                 else
1322                 {
1323                     ok(fvalue[l * 4 + k] == 0.0f, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1324                             i, res_full_name, l * 4 + k, fvalue[l * 4 + k], 0.0f);
1325                 }
1326             }
1327         }
1328     }
1329     else
1330     {
1331         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTranspose failed, got %#x, expected %#x\n",
1332                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1333
1334         for (l = 0; l < sizeof(fvalue) / sizeof(*fvalue); ++l)
1335         {
1336             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTranspose fvalue[%u] failed, got %f, expected %f\n",
1337                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1338         }
1339     }
1340 }
1341
1342 static void test_effect_parameter_value_GetMatrixTransposeArray(const struct test_effect_parameter_value_result *res,
1343         ID3DXEffect *effect, const DWORD *res_value, D3DXHANDLE parameter, UINT i)
1344 {
1345     const D3DXPARAMETER_DESC *res_desc = &res->desc;
1346     LPCSTR res_full_name = res->full_name;
1347     HRESULT hr;
1348     DWORD cmp = 0xabababab;
1349     FLOAT fvalue[EFFECT_PARAMETER_VALUE_ARRAY_SIZE];
1350     UINT l, k, m;
1351
1352     memset(fvalue, 0xab, sizeof(fvalue));
1353     hr = effect->lpVtbl->GetMatrixTransposeArray(effect, parameter, (D3DXMATRIX *)&fvalue, res_desc->Elements);
1354     if (!res_desc->Elements)
1355     {
1356         ok(hr == D3D_OK, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1357
1358         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1359         {
1360             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1361                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1362         }
1363     }
1364     else if (res_desc->Elements && res_desc->Class == D3DXPC_MATRIX_ROWS)
1365     {
1366         ok(hr == D3D_OK, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1367
1368         for (m = 0; m < res_desc->Elements; ++m)
1369         {
1370             for (k = 0; k < 4; ++k)
1371             {
1372                 for (l = 0; l < 4; ++l)
1373                 {
1374                     if (k < res_desc->Columns && l < res_desc->Rows)
1375                     {
1376                         ok(compare_float(fvalue[m * 16 + l + k * 4], get_float(res_desc->Type,
1377                                 &res_value[m * res_desc->Columns * res_desc->Rows + l * res_desc->Columns + k]), 512),
1378                                 "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1379                                 i, res_full_name, m * 16 + l + k * 4, fvalue[m * 16 + l + k * 4],
1380                                 get_float(res_desc->Type, &res_value[m * res_desc->Columns * res_desc->Rows
1381                                 + l * res_desc->Columns + k]));
1382                     }
1383                     else
1384                     {
1385                         ok(fvalue[m * 16 + l + k * 4] == 0.0f, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1386                                 i, res_full_name, m * 16 + l + k * 4, fvalue[m * 16 + l + k * 4], 0.0f);
1387                     }
1388                 }
1389             }
1390         }
1391
1392         for (l = res_desc->Elements * 16; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1393         {
1394             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1395                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1396         }
1397     }
1398     else
1399     {
1400         ok(hr == D3DERR_INVALIDCALL, "%u - %s: GetMatrixTransposeArray failed, got %#x, expected %#x\n",
1401                 i, res_full_name, hr, D3DERR_INVALIDCALL);
1402
1403         for (l = 0; l < EFFECT_PARAMETER_VALUE_ARRAY_SIZE; ++l)
1404         {
1405             ok(fvalue[l] == *(FLOAT *)&cmp, "%u - %s: GetMatrixTransposeArray fvalue[%u] failed, got %f, expected %f\n",
1406                     i, res_full_name, l, fvalue[l], *(FLOAT *)&cmp);
1407         }
1408     }
1409 }
1410
1411 static void test_effect_parameter_value(IDirect3DDevice9 *device)
1412 {
1413     UINT i;
1414     UINT effect_count = sizeof(test_effect_parameter_value_data) / sizeof(*test_effect_parameter_value_data);
1415
1416     for (i = 0; i < effect_count; ++i)
1417     {
1418         const struct test_effect_parameter_value_result *res = test_effect_parameter_value_data[i].res;
1419         UINT res_count = test_effect_parameter_value_data[i].res_count;
1420         const DWORD *blob = test_effect_parameter_value_data[i].blob;
1421         UINT blob_size = test_effect_parameter_value_data[i].blob_size;
1422         HRESULT hr;
1423         ID3DXEffect *effect;
1424         D3DXEFFECT_DESC edesc;
1425         ULONG count;
1426         UINT k;
1427
1428         hr = D3DXCreateEffect(device, blob, blob_size, NULL, NULL, 0, NULL, &effect, NULL);
1429         ok(hr == D3D_OK, "%u: D3DXCreateEffect failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1430
1431         hr = effect->lpVtbl->GetDesc(effect, &edesc);
1432         ok(hr == D3D_OK, "%u: GetDesc failed, got %#x, expected %#x\n", i, hr, D3D_OK);
1433         ok(edesc.Parameters == res_count, "%u: Parameters failed, got %u, expected %u\n",
1434                 i, edesc.Parameters, res_count);
1435
1436         for (k = 0; k < res_count; ++k)
1437         {
1438             const D3DXPARAMETER_DESC *res_desc = &res[k].desc;
1439             LPCSTR res_full_name = res[k].full_name;
1440             UINT res_value_offset = res[k].value_offset;
1441             D3DXHANDLE parameter;
1442             D3DXPARAMETER_DESC pdesc;
1443
1444             parameter = effect->lpVtbl->GetParameterByName(effect, NULL, res_full_name);
1445             ok(parameter != NULL, "%u - %s: GetParameterByName failed\n", i, res_full_name);
1446
1447             hr = effect->lpVtbl->GetParameterDesc(effect, parameter, &pdesc);
1448             ok(hr == D3D_OK, "%u - %s: GetParameterDesc failed, got %#x, expected %#x\n", i, res_full_name, hr, D3D_OK);
1449
1450             ok(res_desc->Name ? !strcmp(pdesc.Name, res_desc->Name) : !pdesc.Name,
1451                     "%u - %s: GetParameterDesc Name failed, got \"%s\", expected \"%s\"\n",
1452                     i, res_full_name, pdesc.Name, res_desc->Name);
1453             ok(res_desc->Semantic ? !strcmp(pdesc.Semantic, res_desc->Semantic) : !pdesc.Semantic,
1454                     "%u - %s: GetParameterDesc Semantic failed, got \"%s\", expected \"%s\"\n",
1455                     i, res_full_name, pdesc.Semantic, res_desc->Semantic);
1456             ok(res_desc->Class == pdesc.Class, "%u - %s: GetParameterDesc Class failed, got %#x, expected %#x\n",
1457                     i, res_full_name, pdesc.Class, res_desc->Class);
1458             ok(res_desc->Type == pdesc.Type, "%u - %s: GetParameterDesc Type failed, got %#x, expected %#x\n",
1459                     i, res_full_name, pdesc.Type, res_desc->Type);
1460             ok(res_desc->Rows == pdesc.Rows, "%u - %s: GetParameterDesc Rows failed, got %u, expected %u\n",
1461                     i, res_full_name, pdesc.Rows, res_desc->Rows);
1462             ok(res_desc->Columns == pdesc.Columns, "%u - %s: GetParameterDesc Columns failed, got %u, expected %u\n",
1463                     i, res_full_name, pdesc.Columns, res_desc->Columns);
1464             ok(res_desc->Elements == pdesc.Elements, "%u - %s: GetParameterDesc Elements failed, got %u, expected %u\n",
1465                     i, res_full_name, pdesc.Elements, res_desc->Elements);
1466             ok(res_desc->Annotations == pdesc.Annotations, "%u - %s: GetParameterDesc Annotations failed, got %u, expected %u\n",
1467                     i, res_full_name, pdesc.Annotations, res_desc->Annotations);
1468             ok(res_desc->StructMembers == pdesc.StructMembers, "%u - %s: GetParameterDesc StructMembers failed, got %u, expected %u\n",
1469                     i, res_full_name, pdesc.StructMembers, res_desc->StructMembers);
1470             ok(res_desc->Flags == pdesc.Flags, "%u - %s: GetParameterDesc Flags failed, got %u, expected %u\n",
1471                     i, res_full_name, pdesc.Flags, res_desc->Flags);
1472             ok(res_desc->Bytes == pdesc.Bytes, "%u - %s: GetParameterDesc Bytes, got %u, expected %u\n",
1473                     i, res_full_name, pdesc.Bytes, res_desc->Bytes);
1474
1475             /* check size */
1476             ok(EFFECT_PARAMETER_VALUE_ARRAY_SIZE >= res_desc->Bytes / 4 +
1477                     (res_desc->Elements ? res_desc->Bytes / 4 / res_desc->Elements : 0),
1478                     "%u - %s: Warning: Array size to small\n", i, res_full_name);
1479
1480             test_effect_parameter_value_GetValue(&res[k], effect, &blob[res_value_offset], parameter, i);
1481             test_effect_parameter_value_GetBool(&res[k], effect, &blob[res_value_offset], parameter, i);
1482             test_effect_parameter_value_GetBoolArray(&res[k], effect, &blob[res_value_offset], parameter, i);
1483             test_effect_parameter_value_GetInt(&res[k], effect, &blob[res_value_offset], parameter, i);
1484             test_effect_parameter_value_GetIntArray(&res[k], effect, &blob[res_value_offset], parameter, i);
1485             test_effect_parameter_value_GetFloat(&res[k], effect, &blob[res_value_offset], parameter, i);
1486             test_effect_parameter_value_GetFloatArray(&res[k], effect, &blob[res_value_offset], parameter, i);
1487             test_effect_parameter_value_GetVector(&res[k], effect, &blob[res_value_offset], parameter, i);
1488             test_effect_parameter_value_GetVectorArray(&res[k], effect, &blob[res_value_offset], parameter, i);
1489             test_effect_parameter_value_GetMatrix(&res[k], effect, &blob[res_value_offset], parameter, i);
1490             test_effect_parameter_value_GetMatrixArray(&res[k], effect, &blob[res_value_offset], parameter, i);
1491             test_effect_parameter_value_GetMatrixTranspose(&res[k], effect, &blob[res_value_offset], parameter, i);
1492             test_effect_parameter_value_GetMatrixTransposeArray(&res[k], effect, &blob[res_value_offset], parameter, i);
1493         }
1494
1495         count = effect->lpVtbl->Release(effect);
1496         ok(!count, "Release failed %u\n", count);
1497     }
1498 }
1499
1500 START_TEST(effect)
1501 {
1502     HWND wnd;
1503     IDirect3D9 *d3d;
1504     IDirect3DDevice9 *device;
1505     D3DPRESENT_PARAMETERS d3dpp;
1506     HRESULT hr;
1507     ULONG count;
1508
1509     wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
1510     d3d = Direct3DCreate9(D3D_SDK_VERSION);
1511     if (!wnd) {
1512         skip("Couldn't create application window\n");
1513         return;
1514     }
1515     if (!d3d) {
1516         skip("Couldn't create IDirect3D9 object\n");
1517         DestroyWindow(wnd);
1518         return;
1519     }
1520
1521     ZeroMemory(&d3dpp, sizeof(d3dpp));
1522     d3dpp.Windowed = TRUE;
1523     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
1524     hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device);
1525     if (FAILED(hr)) {
1526         skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
1527         IDirect3D9_Release(d3d);
1528         DestroyWindow(wnd);
1529         return;
1530     }
1531
1532     test_create_effect_and_pool(device);
1533     test_create_effect_compiler();
1534     test_effect_parameter_value(device);
1535
1536     count = IDirect3DDevice9_Release(device);
1537     ok(count == 0, "The device was not properly freed: refcount %u\n", count);
1538
1539     count = IDirect3D9_Release(d3d);
1540     ok(count == 0, "Release failed %u\n", count);
1541
1542     DestroyWindow(wnd);
1543 }