kernel32: Add a structure to store all the information about an executable.
[wine] / dlls / d3d10 / tests / effect.c
1 /*
2  * Copyright 2008 Henri Verbeet for CodeWeavers
3  * Copyright 2009 Rico Schüller
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19
20 #define COBJMACROS
21 #include "d3d10.h"
22 #include "wine/test.h"
23
24 static ID3D10Device *create_device(void)
25 {
26     ID3D10Device *device;
27
28     if (SUCCEEDED(D3D10CreateDevice(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &device)))
29     {
30         trace("Created a HW device\n");
31         return device;
32     }
33
34     trace("Failed to create a HW device, trying REF\n");
35     if (SUCCEEDED(D3D10CreateDevice(NULL, D3D10_DRIVER_TYPE_REFERENCE, NULL, 0, D3D10_SDK_VERSION, &device)))
36     {
37         trace("Created a REF device\n");
38         return device;
39     }
40
41     trace("Failed to create a device, returning NULL\n");
42     return NULL;
43 }
44
45 /*
46  * test_effect_constant_buffer_type
47  */
48 #if 0
49 cbuffer cb
50 {
51     float   f1 : SV_POSITION;
52     float   f2 : COLOR0;
53 };
54 #endif
55 static DWORD fx_test_ecbt[] = {
56 0x43425844, 0xc92a4732, 0xbd0d68c0, 0x877f71ee,
57 0x871fc277, 0x00000001, 0x0000010a, 0x00000001,
58 0x00000024, 0x30315846, 0x000000de, 0xfeff1001,
59 0x00000001, 0x00000002, 0x00000000, 0x00000000,
60 0x00000000, 0x00000000, 0x00000000, 0x00000042,
61 0x00000000, 0x00000000, 0x00000000, 0x00000000,
62 0x00000000, 0x00000000, 0x00000000, 0x00000000,
63 0x00000000, 0x00000000, 0x00000000, 0x66006263,
64 0x74616f6c, 0x00000700, 0x00000100, 0x00000000,
65 0x00000400, 0x00001000, 0x00000400, 0x00090900,
66 0x00316600, 0x505f5653, 0x5449534f, 0x004e4f49,
67 0x43003266, 0x524f4c4f, 0x00040030, 0x00100000,
68 0x00000000, 0x00020000, 0xffff0000, 0x0000ffff,
69 0x00290000, 0x000d0000, 0x002c0000, 0x00000000,
70 0x00000000, 0x00000000, 0x00000000, 0x00380000,
71 0x000d0000, 0x003b0000, 0x00040000, 0x00000000,
72 0x00000000, 0x00000000, 0x52590000,
73 };
74
75 static void test_effect_constant_buffer_type(ID3D10Device *device)
76 {
77     ID3D10Effect *effect;
78     ID3D10EffectConstantBuffer *constantbuffer;
79     ID3D10EffectType *type, *type2, *null_type;
80     D3D10_EFFECT_TYPE_DESC type_desc;
81     HRESULT hr;
82     LPCSTR string;
83     unsigned int i;
84
85     /*
86      * Don't use sizeof(fx_test_ecbt), use fx_test_ecbt[6] as size,
87      * because the DWORD fx_test_ecbt[] has only complete DWORDs and
88      * so it could happen that there are padded bytes at the end.
89      *
90      * The fx size (fx_test_ecbt[6]) could be up to 3 BYTEs smaller
91      * than the sizeof(fx_test_ecbt).
92      */
93     hr = D3D10CreateEffectFromMemory(fx_test_ecbt, fx_test_ecbt[6], 0, device, NULL, &effect);
94     ok(SUCCEEDED(hr), "D3D10CreateEffectFromMemory failed (%x)\n", hr);
95
96     constantbuffer = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
97     type = constantbuffer->lpVtbl->GetType(constantbuffer);
98
99     hr = type->lpVtbl->GetDesc(type, &type_desc);
100     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
101
102     ok(strcmp(type_desc.TypeName, "cbuffer") == 0, "TypeName is \"%s\", expected \"cbuffer\"\n", type_desc.TypeName);
103     ok(type_desc.Class == D3D10_SVC_OBJECT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_OBJECT);
104     ok(type_desc.Type == D3D10_SVT_CBUFFER, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_CBUFFER);
105     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
106     ok(type_desc.Members == 2, "Members is %u, expected 2\n", type_desc.Members);
107     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
108     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
109     ok(type_desc.PackedSize == 0x8, "PackedSize is %#x, expected 0x8\n", type_desc.PackedSize);
110     ok(type_desc.UnpackedSize == 0x10, "UnpackedSize is %#x, expected 0x10\n", type_desc.UnpackedSize);
111     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
112
113     string = type->lpVtbl->GetMemberName(type, 0);
114     ok(strcmp(string, "f1") == 0, "GetMemberName is \"%s\", expected \"f1\"\n", string);
115
116     string = type->lpVtbl->GetMemberSemantic(type, 0);
117     ok(strcmp(string, "SV_POSITION") == 0, "GetMemberSemantic is \"%s\", expected \"SV_POSITION\"\n", string);
118
119     string = type->lpVtbl->GetMemberName(type, 1);
120     ok(strcmp(string, "f2") == 0, "GetMemberName is \"%s\", expected \"f2\"\n", string);
121
122     string = type->lpVtbl->GetMemberSemantic(type, 1);
123     ok(strcmp(string, "COLOR0") == 0, "GetMemberSemantic is \"%s\", expected \"COLOR0\"\n", string);
124
125     for (i = 0; i < 3; ++i)
126     {
127         if (i == 0) type2 = type->lpVtbl->GetMemberTypeByIndex(type, 0);
128         else if (i == 1) type2 = type->lpVtbl->GetMemberTypeByName(type, "f1");
129         else type2 = type->lpVtbl->GetMemberTypeBySemantic(type, "SV_POSITION");
130
131         hr = type2->lpVtbl->GetDesc(type2, &type_desc);
132         ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
133
134         ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
135         ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
136         ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
137         ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
138         ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
139         ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
140         ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
141         ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
142         ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
143         ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
144
145         if (i == 0) type2 = type->lpVtbl->GetMemberTypeByIndex(type, 1);
146         else if (i == 1) type2 = type->lpVtbl->GetMemberTypeByName(type, "f2");
147         else type2 = type->lpVtbl->GetMemberTypeBySemantic(type, "COLOR0");
148
149         hr = type2->lpVtbl->GetDesc(type2, &type_desc);
150         ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
151
152         ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
153         ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
154         ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
155         ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
156         ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
157         ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
158         ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
159         ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
160         ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
161         ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
162     }
163
164     type2 = type->lpVtbl->GetMemberTypeByIndex(type, 0);
165     hr = type2->lpVtbl->GetDesc(type2, NULL);
166     ok(hr == E_INVALIDARG, "GetDesc got %x, expected %x\n", hr, E_INVALIDARG);
167
168     null_type = type->lpVtbl->GetMemberTypeByIndex(type, 3);
169     hr = null_type->lpVtbl->GetDesc(null_type, &type_desc);
170     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
171
172     hr = null_type->lpVtbl->GetDesc(null_type, NULL);
173     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
174
175     type2 = type->lpVtbl->GetMemberTypeByName(type, "invalid");
176     ok(type2 == null_type, "GetMemberTypeByName got wrong type %p, expected %p\n", type2, null_type);
177
178     type2 = type->lpVtbl->GetMemberTypeByName(type, NULL);
179     ok(type2 == null_type, "GetMemberTypeByName got wrong type %p, expected %p\n", type2, null_type);
180
181     type2 = type->lpVtbl->GetMemberTypeBySemantic(type, "invalid");
182     ok(type2 == null_type, "GetMemberTypeBySemantic got wrong type %p, expected %p\n", type2, null_type);
183
184     type2 = type->lpVtbl->GetMemberTypeBySemantic(type, NULL);
185     ok(type2 == null_type, "GetMemberTypeBySemantic got wrong type %p, expected %p\n", type2, null_type);
186
187     string = type->lpVtbl->GetMemberName(type, 3);
188     ok(string == NULL, "GetMemberName is \"%s\", expected \"NULL\"\n", string);
189
190     string = type->lpVtbl->GetMemberSemantic(type, 3);
191     ok(string == NULL, "GetMemberSemantic is \"%s\", expected \"NULL\"\n", string);
192
193     effect->lpVtbl->Release(effect);
194 }
195
196 /*
197  * test_effect_variable_type
198  */
199 #if 0
200 struct test
201 {
202     float   f3 : SV_POSITION;
203     float   f4 : COLOR0;
204 };
205 struct test1
206 {
207     float   f1;
208     float   f2;
209     test    t;
210 };
211 cbuffer cb
212 {
213     test1 t1;
214 };
215 #endif
216 static DWORD fx_test_evt[] = {
217 0x43425844, 0xe079efed, 0x90bda0f2, 0xa6e2d0b4,
218 0xd2d6c200, 0x00000001, 0x0000018c, 0x00000001,
219 0x00000024, 0x30315846, 0x00000160, 0xfeff1001,
220 0x00000001, 0x00000001, 0x00000000, 0x00000000,
221 0x00000000, 0x00000000, 0x00000000, 0x000000e0,
222 0x00000000, 0x00000000, 0x00000000, 0x00000000,
223 0x00000000, 0x00000000, 0x00000000, 0x00000000,
224 0x00000000, 0x00000000, 0x00000000, 0x74006263,
225 0x31747365, 0x00316600, 0x616f6c66, 0x00100074,
226 0x00010000, 0x00000000, 0x00040000, 0x00100000,
227 0x00040000, 0x09090000, 0x32660000, 0x74007400,
228 0x00747365, 0x53003366, 0x4f505f56, 0x49544953,
229 0x66004e4f, 0x4f430034, 0x30524f4c, 0x00003700,
230 0x00000300, 0x00000000, 0x00000800, 0x00001000,
231 0x00000800, 0x00000200, 0x00003c00, 0x00003f00,
232 0x00000000, 0x00001600, 0x00004b00, 0x00004e00,
233 0x00000400, 0x00001600, 0x00000700, 0x00000300,
234 0x00000000, 0x00001800, 0x00002000, 0x00001000,
235 0x00000300, 0x00000d00, 0x00000000, 0x00000000,
236 0x00001600, 0x00003200, 0x00000000, 0x00000400,
237 0x00001600, 0x00003500, 0x00000000, 0x00001000,
238 0x00005500, 0x00317400, 0x00000004, 0x00000020,
239 0x00000000, 0x00000001, 0xffffffff, 0x00000000,
240 0x000000dd, 0x00000091, 0x00000000, 0x00000000,
241 0x00000000, 0x00000000, 0x00000000,
242 };
243
244 static void test_effect_variable_type(ID3D10Device *device)
245 {
246     ID3D10Effect *effect;
247     ID3D10EffectConstantBuffer *constantbuffer;
248     ID3D10EffectVariable *variable;
249     ID3D10EffectType *type, *type2, *type3;
250     D3D10_EFFECT_TYPE_DESC type_desc;
251     HRESULT hr;
252     LPCSTR string;
253     unsigned int i;
254
255     hr = D3D10CreateEffectFromMemory(fx_test_evt, fx_test_evt[6], 0, device, NULL, &effect);
256     ok(SUCCEEDED(hr), "D3D10CreateEffectFromMemory failed (%x)\n", hr);
257
258     constantbuffer = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
259     type = constantbuffer->lpVtbl->GetType(constantbuffer);
260     hr = type->lpVtbl->GetDesc(type, &type_desc);
261     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
262
263     ok(strcmp(type_desc.TypeName, "cbuffer") == 0, "TypeName is \"%s\", expected \"cbuffer\"\n", type_desc.TypeName);
264     ok(type_desc.Class == D3D10_SVC_OBJECT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_OBJECT);
265     ok(type_desc.Type == D3D10_SVT_CBUFFER, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_CBUFFER);
266     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
267     ok(type_desc.Members == 1, "Members is %u, expected 1\n", type_desc.Members);
268     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
269     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
270     ok(type_desc.PackedSize == 0x10, "PackedSize is %#x, expected 0x10\n", type_desc.PackedSize);
271     ok(type_desc.UnpackedSize == 0x20, "UnpackedSize is %#x, expected 0x20\n", type_desc.UnpackedSize);
272     ok(type_desc.Stride == 0x20, "Stride is %#x, expected 0x20\n", type_desc.Stride);
273
274     constantbuffer = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
275     variable = constantbuffer->lpVtbl->GetMemberByIndex(constantbuffer, 0);
276     type = variable->lpVtbl->GetType(variable);
277     hr = type->lpVtbl->GetDesc(type, &type_desc);
278     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
279
280     ok(strcmp(type_desc.TypeName, "test1") == 0, "TypeName is \"%s\", expected \"test1\"\n", type_desc.TypeName);
281     ok(type_desc.Class == D3D10_SVC_STRUCT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_STRUCT);
282     ok(type_desc.Type == D3D10_SVT_VOID, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_VOID);
283     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
284     ok(type_desc.Members == 3, "Members is %u, expected 3\n", type_desc.Members);
285     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
286     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
287     ok(type_desc.PackedSize == 0x10, "PackedSize is %#x, expected 0x10\n", type_desc.PackedSize);
288     ok(type_desc.UnpackedSize == 0x18, "UnpackedSize is %#x, expected 0x18\n", type_desc.UnpackedSize);
289     ok(type_desc.Stride == 0x20, "Stride is %#x, expected 0x20\n", type_desc.Stride);
290
291     string = type->lpVtbl->GetMemberName(type, 0);
292     ok(strcmp(string, "f1") == 0, "GetMemberName is \"%s\", expected \"f1\"\n", string);
293
294     string = type->lpVtbl->GetMemberName(type, 1);
295     ok(strcmp(string, "f2") == 0, "GetMemberName is \"%s\", expected \"f2\"\n", string);
296
297     string = type->lpVtbl->GetMemberName(type, 2);
298     ok(strcmp(string, "t") == 0, "GetMemberName is \"%s\", expected \"t\"\n", string);
299
300     type2 = type->lpVtbl->GetMemberTypeByIndex(type, 0);
301     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
302     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
303
304     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
305     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
306     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
307     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
308     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
309     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
310     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
311     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
312     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
313     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
314
315     type2 = type->lpVtbl->GetMemberTypeByIndex(type, 1);
316     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
317     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
318
319     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
320     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
321     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
322     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
323     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
324     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
325     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
326     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
327     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
328     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
329
330     type2 = type->lpVtbl->GetMemberTypeByIndex(type, 2);
331     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
332     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
333
334     ok(strcmp(type_desc.TypeName, "test") == 0, "TypeName is \"%s\", expected \"test\"\n", type_desc.TypeName);
335     ok(type_desc.Class == D3D10_SVC_STRUCT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_STRUCT);
336     ok(type_desc.Type == D3D10_SVT_VOID, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_VOID);
337     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
338     ok(type_desc.Members == 2, "Members is %u, expected 2\n", type_desc.Members);
339     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
340     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
341     ok(type_desc.PackedSize == 0x8, "PackedSize is %#x, expected 0x8\n", type_desc.PackedSize);
342     ok(type_desc.UnpackedSize == 0x8, "UnpackedSize is %#x, expected 0x8\n", type_desc.UnpackedSize);
343     ok(type_desc.Stride == 0x10, "Stride is %x, expected 0x10\n", type_desc.Stride);
344
345     for (i = 0; i < 3; ++i)
346     {
347         if (i == 0) type3 = type2->lpVtbl->GetMemberTypeByIndex(type2, 0);
348         else if (i == 1) type3 = type2->lpVtbl->GetMemberTypeByName(type2, "f3");
349         else type3 = type2->lpVtbl->GetMemberTypeBySemantic(type2, "SV_POSITION");
350
351         hr = type3->lpVtbl->GetDesc(type3, &type_desc);
352         ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
353
354         ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n",
355             type_desc.TypeName);
356         ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
357         ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
358         ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
359         ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
360         ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
361         ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
362         ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
363         ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
364         ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
365
366         if (i == 0) type3 = type2->lpVtbl->GetMemberTypeByIndex(type2, 1);
367         else if (i == 1) type3 = type2->lpVtbl->GetMemberTypeByName(type2, "f4");
368         else type3 = type2->lpVtbl->GetMemberTypeBySemantic(type2, "COLOR0");
369
370         hr = type3->lpVtbl->GetDesc(type3, &type_desc);
371         ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
372
373         ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n",
374             type_desc.TypeName);
375         ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
376         ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
377         ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
378         ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
379         ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
380         ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
381         ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
382         ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
383         ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
384     }
385
386     type2 = type->lpVtbl->GetMemberTypeByIndex(type, 0);
387     hr = type2->lpVtbl->GetDesc(type2, NULL);
388     ok(hr == E_INVALIDARG, "GetDesc got %x, expected %x\n", hr, E_INVALIDARG);
389
390     type2 = type->lpVtbl->GetMemberTypeByIndex(type, 4);
391     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
392     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
393
394     type2 = type->lpVtbl->GetMemberTypeByName(type, "invalid");
395     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
396     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
397
398     type2 = type->lpVtbl->GetMemberTypeByName(type, NULL);
399     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
400     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
401
402     type2 = type->lpVtbl->GetMemberTypeBySemantic(type, "invalid");
403     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
404     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
405
406     type2 = type->lpVtbl->GetMemberTypeBySemantic(type, NULL);
407     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
408     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
409
410     string = type->lpVtbl->GetMemberName(type, 4);
411     ok(string == NULL, "GetMemberName is \"%s\", expected NULL\n", string);
412
413     string = type->lpVtbl->GetMemberSemantic(type, 4);
414     ok(string == NULL, "GetMemberSemantic is \"%s\", expected NULL\n", string);
415
416     effect->lpVtbl->Release(effect);
417 }
418
419 /*
420  * test_effect_variable_member
421  */
422 #if 0
423 struct test
424 {
425     float   f3 : SV_POSITION;
426     float   f4 : COLOR0;
427 };
428 struct test1
429 {
430     float   f1;
431     float   f2;
432     test    t;
433 };
434 cbuffer cb
435 {
436     test1 t1;
437 };
438 #endif
439 static DWORD fx_test_evm[] = {
440 0x43425844, 0xe079efed, 0x90bda0f2, 0xa6e2d0b4,
441 0xd2d6c200, 0x00000001, 0x0000018c, 0x00000001,
442 0x00000024, 0x30315846, 0x00000160, 0xfeff1001,
443 0x00000001, 0x00000001, 0x00000000, 0x00000000,
444 0x00000000, 0x00000000, 0x00000000, 0x000000e0,
445 0x00000000, 0x00000000, 0x00000000, 0x00000000,
446 0x00000000, 0x00000000, 0x00000000, 0x00000000,
447 0x00000000, 0x00000000, 0x00000000, 0x74006263,
448 0x31747365, 0x00316600, 0x616f6c66, 0x00100074,
449 0x00010000, 0x00000000, 0x00040000, 0x00100000,
450 0x00040000, 0x09090000, 0x32660000, 0x74007400,
451 0x00747365, 0x53003366, 0x4f505f56, 0x49544953,
452 0x66004e4f, 0x4f430034, 0x30524f4c, 0x00003700,
453 0x00000300, 0x00000000, 0x00000800, 0x00001000,
454 0x00000800, 0x00000200, 0x00003c00, 0x00003f00,
455 0x00000000, 0x00001600, 0x00004b00, 0x00004e00,
456 0x00000400, 0x00001600, 0x00000700, 0x00000300,
457 0x00000000, 0x00001800, 0x00002000, 0x00001000,
458 0x00000300, 0x00000d00, 0x00000000, 0x00000000,
459 0x00001600, 0x00003200, 0x00000000, 0x00000400,
460 0x00001600, 0x00003500, 0x00000000, 0x00001000,
461 0x00005500, 0x00317400, 0x00000004, 0x00000020,
462 0x00000000, 0x00000001, 0xffffffff, 0x00000000,
463 0x000000dd, 0x00000091, 0x00000000, 0x00000000,
464 0x00000000, 0x00000000, 0x00000000,
465 };
466
467 static void test_effect_variable_member(ID3D10Device *device)
468 {
469     ID3D10Effect *effect;
470     ID3D10EffectConstantBuffer *constantbuffer;
471     ID3D10EffectVariable *variable, *variable2, *variable3, *null_variable;
472     D3D10_EFFECT_VARIABLE_DESC desc;
473     HRESULT hr;
474
475     hr = D3D10CreateEffectFromMemory(fx_test_evm, fx_test_evm[6], 0, device, NULL, &effect);
476     ok(SUCCEEDED(hr), "D3D10CreateEffectFromMemory failed (%x)\n", hr);
477
478     constantbuffer = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
479     hr = constantbuffer->lpVtbl->GetDesc(constantbuffer, &desc);
480     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
481
482     ok(strcmp(desc.Name, "cb") == 0, "Name is \"%s\", expected \"cb\"\n", desc.Name);
483     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
484     ok(desc.Flags == 0, "Type is %u, expected 0\n", desc.Flags);
485     ok(desc.Annotations == 0, "Elements is %u, expected 0\n", desc.Annotations);
486     ok(desc.BufferOffset == 0, "Members is %u, expected 0\n", desc.BufferOffset);
487     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
488
489     null_variable = constantbuffer->lpVtbl->GetMemberByIndex(constantbuffer, 1);
490     hr = null_variable->lpVtbl->GetDesc(null_variable, &desc);
491     ok(hr == E_FAIL, "GetDesc got %x, expected %x\n", hr, E_FAIL);
492
493     variable = constantbuffer->lpVtbl->GetMemberByIndex(constantbuffer, 0);
494     hr = variable->lpVtbl->GetDesc(variable, &desc);
495     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
496
497     variable2 = constantbuffer->lpVtbl->GetMemberByName(constantbuffer, "t1");
498     ok(variable == variable2, "GetMemberByName got %p, expected %p\n", variable2, variable);
499     hr = variable2->lpVtbl->GetDesc(variable2, &desc);
500     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
501
502     ok(strcmp(desc.Name, "t1") == 0, "Name is \"%s\", expected \"t1\"\n", desc.Name);
503     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
504     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
505     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
506     ok(desc.BufferOffset == 0, "BufferOffset is %u, expected 0\n", desc.BufferOffset);
507     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
508
509     variable2 = constantbuffer->lpVtbl->GetMemberByName(constantbuffer, "invalid");
510     ok(null_variable == variable2, "GetMemberByName got %p, expected %p\n", variable2, null_variable);
511
512     variable2 = constantbuffer->lpVtbl->GetMemberByName(constantbuffer, NULL);
513     ok(null_variable == variable2, "GetMemberByName got %p, expected %p\n", variable2, null_variable);
514
515     variable2 = constantbuffer->lpVtbl->GetMemberBySemantic(constantbuffer, "invalid");
516     ok(null_variable == variable2, "GetMemberBySemantic got %p, expected %p\n", variable2, null_variable);
517
518     variable2 = constantbuffer->lpVtbl->GetMemberBySemantic(constantbuffer, NULL);
519     ok(null_variable == variable2, "GetMemberBySemantic got %p, expected %p\n", variable2, null_variable);
520
521     /* check members of "t1" */
522     variable2 = variable->lpVtbl->GetMemberByName(variable, "f1");
523     hr = variable2->lpVtbl->GetDesc(variable2, &desc);
524     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
525
526     ok(strcmp(desc.Name, "f1") == 0, "Name is \"%s\", expected \"f1\"\n", desc.Name);
527     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
528     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
529     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
530     ok(desc.BufferOffset == 0, "BufferOffset is %u, expected 0\n", desc.BufferOffset);
531     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
532
533     variable3 = variable->lpVtbl->GetMemberByIndex(variable, 0);
534     ok(variable2 == variable3, "GetMemberByIndex got %p, expected %p\n", variable3, variable2);
535
536     variable2 = variable->lpVtbl->GetMemberByName(variable, "f2");
537     hr = variable2->lpVtbl->GetDesc(variable2, &desc);
538     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
539
540     ok(strcmp(desc.Name, "f2") == 0, "Name is \"%s\", expected \"f2\"\n", desc.Name);
541     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
542     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
543     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
544     ok(desc.BufferOffset == 4, "BufferOffset is %u, expected 4\n", desc.BufferOffset);
545     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
546
547     variable3 = variable->lpVtbl->GetMemberByIndex(variable, 1);
548     ok(variable2 == variable3, "GetMemberByIndex got %p, expected %p\n", variable3, variable2);
549
550     variable2 = variable->lpVtbl->GetMemberByName(variable, "t");
551     hr = variable2->lpVtbl->GetDesc(variable2, &desc);
552     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
553
554     ok(strcmp(desc.Name, "t") == 0, "Name is \"%s\", expected \"t\"\n", desc.Name);
555     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
556     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
557     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
558     ok(desc.BufferOffset == 16, "BufferOffset is %u, expected 16\n", desc.BufferOffset);
559     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
560
561     variable3 = variable->lpVtbl->GetMemberByIndex(variable, 2);
562     ok(variable2 == variable3, "GetMemberByIndex got %p, expected %p\n", variable3, variable2);
563
564     /* check members of "t" */
565     variable3 = variable2->lpVtbl->GetMemberByName(variable2, "f3");
566     hr = variable3->lpVtbl->GetDesc(variable3, &desc);
567     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
568
569     ok(strcmp(desc.Name, "f3") == 0, "Name is \"%s\", expected \"f3\"\n", desc.Name);
570     ok(strcmp(desc.Semantic, "SV_POSITION") == 0, "Semantic is \"%s\", expected \"SV_POSITION\"\n", desc.Semantic);
571     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
572     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
573     ok(desc.BufferOffset == 16, "BufferOffset is %u, expected 16\n", desc.BufferOffset);
574     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
575
576     variable = variable2->lpVtbl->GetMemberBySemantic(variable2, "SV_POSITION");
577     ok(variable == variable3, "GetMemberBySemantic got %p, expected %p\n", variable, variable3);
578
579     variable = variable2->lpVtbl->GetMemberByIndex(variable2, 0);
580     ok(variable == variable3, "GetMemberByIndex got %p, expected %p\n", variable, variable3);
581
582     variable3 = variable2->lpVtbl->GetMemberByName(variable2, "f4");
583     hr = variable3->lpVtbl->GetDesc(variable3, &desc);
584     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
585
586     ok(strcmp(desc.Name, "f4") == 0, "Name is \"%s\", expected \"f4\"\n", desc.Name);
587     ok(strcmp(desc.Semantic, "COLOR0") == 0, "Semantic is \"%s\", expected \"COLOR0\"\n", desc.Semantic);
588     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
589     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
590     ok(desc.BufferOffset == 20, "BufferOffset is %u, expected 20\n", desc.BufferOffset);
591     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
592
593     variable = variable2->lpVtbl->GetMemberBySemantic(variable2, "COLOR0");
594     ok(variable == variable3, "GetMemberBySemantic got %p, expected %p\n", variable, variable3);
595
596     variable = variable2->lpVtbl->GetMemberByIndex(variable2, 1);
597     ok(variable == variable3, "GetMemberByIndex got %p, expected %p\n", variable, variable3);
598
599     effect->lpVtbl->Release(effect);
600 }
601
602 /*
603  * test_effect_variable_element
604  */
605 #if 0
606 struct test
607 {
608     float   f3 : SV_POSITION;
609     float   f4 : COLOR0;
610     float   f5 : COLOR1;
611 };
612 struct test1
613 {
614     float   f1;
615     float   f2[3];
616     test    t[2];
617 };
618 cbuffer cb
619 {
620     test1 t1;
621 };
622 #endif
623 static DWORD fx_test_eve[] = {
624 0x43425844, 0x6ea69fd9, 0x9b4e6390, 0x006f9f71,
625 0x57ad58f4, 0x00000001, 0x000001c2, 0x00000001,
626 0x00000024, 0x30315846, 0x00000196, 0xfeff1001,
627 0x00000001, 0x00000001, 0x00000000, 0x00000000,
628 0x00000000, 0x00000000, 0x00000000, 0x00000116,
629 0x00000000, 0x00000000, 0x00000000, 0x00000000,
630 0x00000000, 0x00000000, 0x00000000, 0x00000000,
631 0x00000000, 0x00000000, 0x00000000, 0x74006263,
632 0x31747365, 0x00316600, 0x616f6c66, 0x00100074,
633 0x00010000, 0x00000000, 0x00040000, 0x00100000,
634 0x00040000, 0x09090000, 0x32660000, 0x00001000,
635 0x00000100, 0x00000300, 0x00002400, 0x00001000,
636 0x00000c00, 0x00090900, 0x74007400, 0x00747365,
637 0x53003366, 0x4f505f56, 0x49544953, 0x66004e4f,
638 0x4f430034, 0x30524f4c, 0x00356600, 0x4f4c4f43,
639 0x53003152, 0x03000000, 0x02000000, 0x1c000000,
640 0x10000000, 0x18000000, 0x03000000, 0x58000000,
641 0x5b000000, 0x00000000, 0x16000000, 0x67000000,
642 0x6a000000, 0x04000000, 0x16000000, 0x71000000,
643 0x74000000, 0x08000000, 0x16000000, 0x07000000,
644 0x03000000, 0x00000000, 0x5c000000, 0x60000000,
645 0x28000000, 0x03000000, 0x0d000000, 0x00000000,
646 0x00000000, 0x16000000, 0x32000000, 0x00000000,
647 0x10000000, 0x35000000, 0x51000000, 0x00000000,
648 0x40000000, 0x7b000000, 0x74000000, 0x00040031,
649 0x00600000, 0x00000000, 0x00010000, 0xffff0000,
650 0x0000ffff, 0x01130000, 0x00c70000, 0x00000000,
651 0x00000000, 0x00000000, 0x00000000, 0x00000000,
652 0x00000000,
653 };
654
655 static void test_effect_variable_element(ID3D10Device *device)
656 {
657     ID3D10Effect *effect;
658     ID3D10EffectConstantBuffer *constantbuffer, *parent;
659     ID3D10EffectVariable *variable, *variable2, *variable3, *variable4, *variable5;
660     ID3D10EffectType *type, *type2;
661     D3D10_EFFECT_VARIABLE_DESC desc;
662     D3D10_EFFECT_TYPE_DESC type_desc;
663     HRESULT hr;
664
665     hr = D3D10CreateEffectFromMemory(fx_test_eve, fx_test_eve[6], 0, device, NULL, &effect);
666     ok(SUCCEEDED(hr), "D3D10CreateEffectFromMemory failed (%x)\n", hr);
667
668     constantbuffer = effect->lpVtbl->GetConstantBufferByIndex(effect, 0);
669     hr = constantbuffer->lpVtbl->GetDesc(constantbuffer, &desc);
670     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
671
672     ok(strcmp(desc.Name, "cb") == 0, "Name is \"%s\", expected \"cb\"\n", desc.Name);
673     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
674     ok(desc.Flags == 0, "Type is %u, expected 0\n", desc.Flags);
675     ok(desc.Annotations == 0, "Elements is %u, expected 0\n", desc.Annotations);
676     ok(desc.BufferOffset == 0, "Members is %u, expected 0\n", desc.BufferOffset);
677     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
678
679     variable = constantbuffer->lpVtbl->GetMemberByIndex(constantbuffer, 0);
680     hr = variable->lpVtbl->GetDesc(variable, &desc);
681     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
682
683     parent = variable->lpVtbl->GetParentConstantBuffer(variable);
684     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
685         parent, constantbuffer);
686
687     variable2 = constantbuffer->lpVtbl->GetMemberByName(constantbuffer, "t1");
688     hr = variable2->lpVtbl->GetDesc(variable2, &desc);
689     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
690
691     parent = variable2->lpVtbl->GetParentConstantBuffer(variable2);
692     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
693
694     /* check variable f1 */
695     variable3 = variable2->lpVtbl->GetMemberByName(variable2, "f1");
696     hr = variable3->lpVtbl->GetDesc(variable3, &desc);
697     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
698
699     ok(strcmp(desc.Name, "f1") == 0, "Name is \"%s\", expected \"f1\"\n", desc.Name);
700     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
701     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
702     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
703     ok(desc.BufferOffset == 0, "BufferOffset is %u, expected 0\n", desc.BufferOffset);
704     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
705
706     parent = variable3->lpVtbl->GetParentConstantBuffer(variable3);
707     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
708         parent, constantbuffer);
709
710     type = variable3->lpVtbl->GetType(variable3);
711     hr = type->lpVtbl->GetDesc(type, &type_desc);
712     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
713
714     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
715     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
716     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
717     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
718     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
719     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
720     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
721     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
722     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
723     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
724
725     /* check variable f2 */
726     variable3 = variable2->lpVtbl->GetMemberByName(variable2, "f2");
727     hr = variable3->lpVtbl->GetDesc(variable3, &desc);
728     ok(SUCCEEDED(hr), "GetDesc failed (%x)!\n", hr);
729
730     ok(strcmp(desc.Name, "f2") == 0, "Name is \"%s\", expected \"f2\"\n", desc.Name);
731     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
732     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
733     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
734     ok(desc.BufferOffset == 16, "BufferOffset is %u, expected 16\n", desc.BufferOffset);
735     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
736
737     parent = variable3->lpVtbl->GetParentConstantBuffer(variable3);
738     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
739         parent, constantbuffer);
740
741     type = variable3->lpVtbl->GetType(variable3);
742     hr = type->lpVtbl->GetDesc(type, &type_desc);
743     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
744
745     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
746     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
747     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
748     ok(type_desc.Elements == 3, "Elements is %u, expected 3\n", type_desc.Elements);
749     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
750     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
751     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
752     ok(type_desc.PackedSize == 0xc, "PackedSize is %#x, expected 0xc\n", type_desc.PackedSize);
753     ok(type_desc.UnpackedSize == 0x24, "UnpackedSize is %#x, expected 0x24\n", type_desc.UnpackedSize);
754     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
755
756     variable4 = variable3->lpVtbl->GetElement(variable3, 0);
757     hr = variable4->lpVtbl->GetDesc(variable4, &desc);
758     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
759
760     ok(strcmp(desc.Name, "f2") == 0, "Name is \"%s\", expected \"f2\"\n", desc.Name);
761     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
762     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
763     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
764     ok(desc.BufferOffset == 16, "BufferOffset is %u, expected 16\n", desc.BufferOffset);
765     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
766
767     parent = variable4->lpVtbl->GetParentConstantBuffer(variable4);
768     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
769         parent, constantbuffer);
770
771     type = variable4->lpVtbl->GetType(variable4);
772     hr = type->lpVtbl->GetDesc(type, &type_desc);
773     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
774
775     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
776     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
777     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
778     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
779     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
780     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
781     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
782     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
783     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
784     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
785
786     variable4 = variable3->lpVtbl->GetElement(variable3, 1);
787     hr = variable4->lpVtbl->GetDesc(variable4, &desc);
788     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
789
790     ok(strcmp(desc.Name, "f2") == 0, "Name is \"%s\", expected \"f2\"\n", desc.Name);
791     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
792     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
793     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
794     ok(desc.BufferOffset == 32, "BufferOffset is %u, expected 32\n", desc.BufferOffset);
795     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
796
797     parent = variable4->lpVtbl->GetParentConstantBuffer(variable4);
798     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
799         parent, constantbuffer);
800
801     type2 = variable4->lpVtbl->GetType(variable4);
802     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
803     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
804     ok(type == type2, "type(%p) != type2(%p)\n", type, type2);
805
806     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
807     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
808     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
809     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
810     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
811     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
812     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
813     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
814     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
815     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
816
817     variable4 = variable3->lpVtbl->GetElement(variable3, 2);
818     hr = variable4->lpVtbl->GetDesc(variable4, &desc);
819     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
820
821     ok(strcmp(desc.Name, "f2") == 0, "Name is \"%s\", expected \"f2\"\n", desc.Name);
822     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
823     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
824     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
825     ok(desc.BufferOffset == 48, "BufferOffset is %u, expected 48\n", desc.BufferOffset);
826     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
827
828     parent = variable4->lpVtbl->GetParentConstantBuffer(variable4);
829     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
830         parent, constantbuffer);
831
832     type2 = variable4->lpVtbl->GetType(variable4);
833     hr = type2->lpVtbl->GetDesc(type2, &type_desc);
834     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
835     ok(type == type2, "type(%p) != type2(%p)\n", type, type2);
836
837     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
838     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
839     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
840     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
841     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
842     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
843     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
844     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
845     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
846     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
847
848     /* check variable t */
849     variable3 = variable2->lpVtbl->GetMemberByName(variable2, "t");
850     hr = variable3->lpVtbl->GetDesc(variable3, &desc);
851     ok(SUCCEEDED(hr), "GetDesc failed (%x)!\n", hr);
852
853     ok(strcmp(desc.Name, "t") == 0, "Name is \"%s\", expected \"t\"\n", desc.Name);
854     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
855     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
856     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
857     ok(desc.BufferOffset == 64, "BufferOffset is %u, expected 64\n", desc.BufferOffset);
858     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
859
860     parent = variable3->lpVtbl->GetParentConstantBuffer(variable3);
861     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
862         parent, constantbuffer);
863
864     type = variable3->lpVtbl->GetType(variable3);
865     hr = type->lpVtbl->GetDesc(type, &type_desc);
866     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
867
868     ok(strcmp(type_desc.TypeName, "test") == 0, "TypeName is \"%s\", expected \"test\"\n", type_desc.TypeName);
869     ok(type_desc.Class == D3D10_SVC_STRUCT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_STRUCT);
870     ok(type_desc.Type == D3D10_SVT_VOID, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_VOID);
871     ok(type_desc.Elements == 2, "Elements is %u, expected 2\n", type_desc.Elements);
872     ok(type_desc.Members == 3, "Members is %u, expected 3\n", type_desc.Members);
873     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
874     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
875     ok(type_desc.PackedSize == 0x18, "PackedSize is %#x, expected 0x18\n", type_desc.PackedSize);
876     ok(type_desc.UnpackedSize == 0x1c, "UnpackedSize is %#x, expected 0x1c\n", type_desc.UnpackedSize);
877     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
878
879     variable4 = variable3->lpVtbl->GetElement(variable3, 0);
880     hr = variable4->lpVtbl->GetDesc(variable4, &desc);
881     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
882
883     ok(strcmp(desc.Name, "t") == 0, "Name is \"%s\", expected \"t\"\n", desc.Name);
884     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
885     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
886     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
887     ok(desc.BufferOffset == 64, "BufferOffset is %u, expected 64\n", desc.BufferOffset);
888     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
889
890     parent = variable4->lpVtbl->GetParentConstantBuffer(variable4);
891     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
892         parent, constantbuffer);
893
894     type = variable4->lpVtbl->GetType(variable4);
895     hr = type->lpVtbl->GetDesc(type, &type_desc);
896     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
897
898     ok(strcmp(type_desc.TypeName, "test") == 0, "TypeName is \"%s\", expected \"test\"\n", type_desc.TypeName);
899     ok(type_desc.Class == D3D10_SVC_STRUCT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_STRUCT);
900     ok(type_desc.Type == D3D10_SVT_VOID, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_VOID);
901     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
902     ok(type_desc.Members == 3, "Members is %u, expected 3\n", type_desc.Members);
903     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
904     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
905     ok(type_desc.PackedSize == 0xc, "PackedSize is %#x, expected 0xc\n", type_desc.PackedSize);
906     ok(type_desc.UnpackedSize == 0xc, "UnpackedSize is %#x, expected 0xc\n", type_desc.UnpackedSize);
907     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
908
909     variable5 = variable4->lpVtbl->GetMemberByIndex(variable4, 0);
910     hr = variable5->lpVtbl->GetDesc(variable5, &desc);
911     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
912
913     ok(strcmp(desc.Name, "f3") == 0, "Name is \"%s\", expected \"f3\"\n", desc.Name);
914     ok(strcmp(desc.Semantic, "SV_POSITION") == 0, "Semantic is \"%s\", expected \"SV_POSITION\"\n", desc.Semantic);
915     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
916     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
917     ok(desc.BufferOffset == 64, "BufferOffset is %u, expected 64\n", desc.BufferOffset);
918     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
919
920     parent = variable5->lpVtbl->GetParentConstantBuffer(variable5);
921     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
922
923     type = variable5->lpVtbl->GetType(variable5);
924     hr = type->lpVtbl->GetDesc(type, &type_desc);
925     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
926
927     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
928     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
929     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
930     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
931     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
932     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
933     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
934     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
935     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
936     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
937
938     variable5 = variable4->lpVtbl->GetMemberByIndex(variable4, 1);
939     hr = variable5->lpVtbl->GetDesc(variable5, &desc);
940     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
941
942     ok(strcmp(desc.Name, "f4") == 0, "Name is \"%s\", expected \"f4\"\n", desc.Name);
943     ok(strcmp(desc.Semantic, "COLOR0") == 0, "Semantic is \"%s\", expected \"COLOR0\"\n", desc.Semantic);
944     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
945     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
946     ok(desc.BufferOffset == 68, "BufferOffset is %u, expected 68\n", desc.BufferOffset);
947     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
948
949     parent = variable5->lpVtbl->GetParentConstantBuffer(variable5);
950     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
951
952     type = variable5->lpVtbl->GetType(variable5);
953     hr = type->lpVtbl->GetDesc(type, &type_desc);
954     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
955
956     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
957     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
958     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
959     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
960     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
961     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
962     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
963     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
964     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
965     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
966
967     variable5 = variable4->lpVtbl->GetMemberByIndex(variable4, 2);
968     hr = variable5->lpVtbl->GetDesc(variable5, &desc);
969     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
970
971     ok(strcmp(desc.Name, "f5") == 0, "Name is \"%s\", expected \"f5\"\n", desc.Name);
972     ok(strcmp(desc.Semantic, "COLOR1") == 0, "Semantic is \"%s\", expected \"COLOR1\"\n", desc.Semantic);
973     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
974     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
975     ok(desc.BufferOffset == 72, "BufferOffset is %u, expected 72\n", desc.BufferOffset);
976     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
977
978     parent = variable5->lpVtbl->GetParentConstantBuffer(variable5);
979     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
980
981     type = variable5->lpVtbl->GetType(variable5);
982     hr = type->lpVtbl->GetDesc(type, &type_desc);
983     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
984
985     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
986     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
987     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
988     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
989     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
990     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
991     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
992     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
993     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
994     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
995
996     variable4 = variable3->lpVtbl->GetElement(variable3, 1);
997     hr = variable4->lpVtbl->GetDesc(variable4, &desc);
998     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
999
1000     ok(strcmp(desc.Name, "t") == 0, "Name is \"%s\", expected \"t\"\n", desc.Name);
1001     ok(desc.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", desc.Semantic);
1002     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
1003     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
1004     ok(desc.BufferOffset == 80, "BufferOffset is %u, expected 80\n", desc.BufferOffset);
1005     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
1006
1007     parent = variable4->lpVtbl->GetParentConstantBuffer(variable4);
1008     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n",
1009         parent, constantbuffer);
1010
1011     type = variable4->lpVtbl->GetType(variable4);
1012     hr = type->lpVtbl->GetDesc(type, &type_desc);
1013     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1014
1015     ok(strcmp(type_desc.TypeName, "test") == 0, "TypeName is \"%s\", expected \"test\"\n", type_desc.TypeName);
1016     ok(type_desc.Class == D3D10_SVC_STRUCT, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_STRUCT);
1017     ok(type_desc.Type == D3D10_SVT_VOID, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_VOID);
1018     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
1019     ok(type_desc.Members == 3, "Members is %u, expected 3\n", type_desc.Members);
1020     ok(type_desc.Rows == 0, "Rows is %u, expected 0\n", type_desc.Rows);
1021     ok(type_desc.Columns == 0, "Columns is %u, expected 0\n", type_desc.Columns);
1022     ok(type_desc.PackedSize == 0xc, "PackedSize is %#x, expected 0xc\n", type_desc.PackedSize);
1023     ok(type_desc.UnpackedSize == 0xc, "UnpackedSize is %#x, expected 0xc\n", type_desc.UnpackedSize);
1024     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
1025
1026     variable5 = variable4->lpVtbl->GetMemberByIndex(variable4, 0);
1027     hr = variable5->lpVtbl->GetDesc(variable5, &desc);
1028     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1029
1030     ok(strcmp(desc.Name, "f3") == 0, "Name is \"%s\", expected \"f3\"\n", desc.Name);
1031     ok(strcmp(desc.Semantic, "SV_POSITION") == 0, "Semantic is \"%s\", expected \"SV_POSITION\"\n", desc.Semantic);
1032     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
1033     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
1034     ok(desc.BufferOffset == 80, "BufferOffset is %u, expected 80\n", desc.BufferOffset);
1035     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
1036
1037     parent = variable5->lpVtbl->GetParentConstantBuffer(variable5);
1038     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
1039
1040     type = variable5->lpVtbl->GetType(variable5);
1041     hr = type->lpVtbl->GetDesc(type, &type_desc);
1042     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1043
1044     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
1045     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
1046     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
1047     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
1048     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
1049     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
1050     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
1051     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
1052     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
1053     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
1054
1055     variable5 = variable4->lpVtbl->GetMemberByIndex(variable4, 1);
1056     hr = variable5->lpVtbl->GetDesc(variable5, &desc);
1057     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1058
1059     ok(strcmp(desc.Name, "f4") == 0, "Name is \"%s\", expected \"f4\"\n", desc.Name);
1060     ok(strcmp(desc.Semantic, "COLOR0") == 0, "Semantic is \"%s\", expected \"COLOR0\"\n", desc.Semantic);
1061     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
1062     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
1063     ok(desc.BufferOffset == 84, "BufferOffset is %u, expected 84\n", desc.BufferOffset);
1064     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
1065
1066     parent = variable5->lpVtbl->GetParentConstantBuffer(variable5);
1067     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
1068
1069     type = variable5->lpVtbl->GetType(variable5);
1070     hr = type->lpVtbl->GetDesc(type, &type_desc);
1071     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1072
1073     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
1074     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
1075     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
1076     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
1077     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
1078     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
1079     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
1080     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
1081     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
1082     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
1083
1084     variable5 = variable4->lpVtbl->GetMemberByIndex(variable4, 2);
1085     hr = variable5->lpVtbl->GetDesc(variable5, &desc);
1086     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1087
1088     ok(strcmp(desc.Name, "f5") == 0, "Name is \"%s\", expected \"f5\"\n", desc.Name);
1089     ok(strcmp(desc.Semantic, "COLOR1") == 0, "Semantic is \"%s\", expected \"COLOR1\"\n", desc.Semantic);
1090     ok(desc.Flags == 0, "Flags is %u, expected 0\n", desc.Flags);
1091     ok(desc.Annotations == 0, "Annotations is %u, expected 0\n", desc.Annotations);
1092     ok(desc.BufferOffset == 88, "BufferOffset is %u, expected 88\n", desc.BufferOffset);
1093     ok(desc.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", desc.ExplicitBindPoint);
1094
1095     parent = variable5->lpVtbl->GetParentConstantBuffer(variable5);
1096     ok(parent == constantbuffer, "GetParentConstantBuffer got %p, expected %p\n", parent, constantbuffer);
1097
1098     type = variable5->lpVtbl->GetType(variable5);
1099     hr = type->lpVtbl->GetDesc(type, &type_desc);
1100     ok(SUCCEEDED(hr), "GetDesc failed (%x)\n", hr);
1101
1102     ok(strcmp(type_desc.TypeName, "float") == 0, "TypeName is \"%s\", expected \"float\"\n", type_desc.TypeName);
1103     ok(type_desc.Class == D3D10_SVC_SCALAR, "Class is %x, expected %x\n", type_desc.Class, D3D10_SVC_SCALAR);
1104     ok(type_desc.Type == D3D10_SVT_FLOAT, "Type is %x, expected %x\n", type_desc.Type, D3D10_SVT_FLOAT);
1105     ok(type_desc.Elements == 0, "Elements is %u, expected 0\n", type_desc.Elements);
1106     ok(type_desc.Members == 0, "Members is %u, expected 0\n", type_desc.Members);
1107     ok(type_desc.Rows == 1, "Rows is %u, expected 1\n", type_desc.Rows);
1108     ok(type_desc.Columns == 1, "Columns is %u, expected 1\n", type_desc.Columns);
1109     ok(type_desc.PackedSize == 0x4, "PackedSize is %#x, expected 0x4\n", type_desc.PackedSize);
1110     ok(type_desc.UnpackedSize == 0x4, "UnpackedSize is %#x, expected 0x4\n", type_desc.UnpackedSize);
1111     ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
1112
1113     effect->lpVtbl->Release(effect);
1114 }
1115
1116 START_TEST(effect)
1117 {
1118     ID3D10Device *device;
1119     ULONG refcount;
1120
1121     device = create_device();
1122     if (!device)
1123     {
1124         skip("Failed to create device, skipping tests\n");
1125         return;
1126     }
1127
1128     test_effect_constant_buffer_type(device);
1129     test_effect_variable_type(device);
1130     test_effect_variable_member(device);
1131     test_effect_variable_element(device);
1132
1133     refcount = ID3D10Device_Release(device);
1134     ok(!refcount, "Device has %u references left\n", refcount);
1135 }