d3d10: Implement ID3D10Effect::GetVariableByIndex().
[wine] / dlls / d3d10 / effect.c
1 /*
2  * Copyright 2009 Henri Verbeet for CodeWeavers
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
20 #include "config.h"
21 #include "wine/port.h"
22
23 #include "d3d10_private.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d10);
26
27 #define MAKE_TAG(ch0, ch1, ch2, ch3) \
28     ((DWORD)(ch0) | ((DWORD)(ch1) << 8) | \
29     ((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 ))
30 #define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C')
31 #define TAG_FX10 MAKE_TAG('F', 'X', '1', '0')
32 #define TAG_ISGN MAKE_TAG('I', 'S', 'G', 'N')
33
34 #define D3D10_FX10_TYPE_COLUMN_SHIFT    11
35 #define D3D10_FX10_TYPE_COLUMN_MASK     (0x7 << D3D10_FX10_TYPE_COLUMN_SHIFT)
36
37 #define D3D10_FX10_TYPE_ROW_SHIFT       8
38 #define D3D10_FX10_TYPE_ROW_MASK        (0x7 << D3D10_FX10_TYPE_ROW_SHIFT)
39
40 #define D3D10_FX10_TYPE_BASETYPE_SHIFT  3
41 #define D3D10_FX10_TYPE_BASETYPE_MASK   (0x1f << D3D10_FX10_TYPE_BASETYPE_SHIFT)
42
43 #define D3D10_FX10_TYPE_CLASS_SHIFT     0
44 #define D3D10_FX10_TYPE_CLASS_MASK      (0x7 << D3D10_FX10_TYPE_CLASS_SHIFT)
45
46 #define D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK 0x4000
47
48 static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl;
49 static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl;
50 static const struct ID3D10EffectVariableVtbl d3d10_effect_variable_vtbl;
51 static const struct ID3D10EffectConstantBufferVtbl d3d10_effect_constant_buffer_vtbl;
52 static const struct ID3D10EffectScalarVariableVtbl d3d10_effect_scalar_variable_vtbl;
53 static const struct ID3D10EffectVectorVariableVtbl d3d10_effect_vector_variable_vtbl;
54 static const struct ID3D10EffectMatrixVariableVtbl d3d10_effect_matrix_variable_vtbl;
55 static const struct ID3D10EffectTypeVtbl d3d10_effect_type_vtbl;
56
57 /* null objects - needed for invalid calls */
58 static struct d3d10_effect_technique null_technique =
59         {&d3d10_effect_technique_vtbl, NULL, NULL, 0, 0, NULL, NULL};
60 static struct d3d10_effect_pass null_pass =
61         {&d3d10_effect_pass_vtbl, NULL, NULL, 0, 0, 0, NULL, NULL};
62 static struct d3d10_effect_type null_type =
63         {&d3d10_effect_type_vtbl, 0, {NULL, NULL, 0}, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL};
64 static struct d3d10_effect_variable null_local_buffer =
65         {(ID3D10EffectVariableVtbl *)&d3d10_effect_constant_buffer_vtbl, &null_local_buffer,
66         NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
67 static struct d3d10_effect_variable null_variable =
68         {&d3d10_effect_variable_vtbl, &null_local_buffer,
69         NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
70 static struct d3d10_effect_variable null_scalar_variable =
71         {(ID3D10EffectVariableVtbl *)&d3d10_effect_scalar_variable_vtbl, &null_local_buffer,
72         NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
73 static struct d3d10_effect_variable null_vector_variable =
74         {(ID3D10EffectVariableVtbl *)&d3d10_effect_vector_variable_vtbl, &null_local_buffer,
75         NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
76 static struct d3d10_effect_variable null_matrix_variable =
77         {(ID3D10EffectVariableVtbl *)&d3d10_effect_matrix_variable_vtbl, &null_local_buffer,
78         NULL, NULL, NULL, 0, 0, 0, 0, &null_type, NULL, NULL, NULL};
79
80 static struct d3d10_effect_type *get_fx10_type(struct d3d10_effect *effect, const char *data, DWORD offset);
81
82 static inline void read_dword(const char **ptr, DWORD *d)
83 {
84     memcpy(d, *ptr, sizeof(*d));
85     *ptr += sizeof(*d);
86 }
87
88 static inline void skip_dword_unknown(const char **ptr, unsigned int count)
89 {
90     unsigned int i;
91     DWORD d;
92
93     FIXME("Skipping %u unknown DWORDs:\n", count);
94     for (i = 0; i < count; ++i)
95     {
96         read_dword(ptr, &d);
97         FIXME("\t0x%08x\n", d);
98     }
99 }
100
101 static inline void write_dword(char **ptr, DWORD d)
102 {
103     memcpy(*ptr, &d, sizeof(d));
104     *ptr += sizeof(d);
105 }
106
107 static inline void write_dword_unknown(char **ptr, DWORD d)
108 {
109     FIXME("Writing unknown DWORD 0x%08x\n", d);
110     write_dword(ptr, d);
111 }
112
113 static HRESULT parse_dxbc(const char *data, SIZE_T data_size,
114         HRESULT (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx)
115 {
116     const char *ptr = data;
117     HRESULT hr = S_OK;
118     DWORD chunk_count;
119     DWORD total_size;
120     unsigned int i;
121     DWORD tag;
122
123     read_dword(&ptr, &tag);
124     TRACE("tag: %s.\n", debugstr_an((const char *)&tag, 4));
125
126     if (tag != TAG_DXBC)
127     {
128         WARN("Wrong tag.\n");
129         return E_FAIL;
130     }
131
132     /* checksum? */
133     skip_dword_unknown(&ptr, 4);
134
135     skip_dword_unknown(&ptr, 1);
136
137     read_dword(&ptr, &total_size);
138     TRACE("total size: %#x\n", total_size);
139
140     read_dword(&ptr, &chunk_count);
141     TRACE("chunk count: %#x\n", chunk_count);
142
143     for (i = 0; i < chunk_count; ++i)
144     {
145         DWORD chunk_tag, chunk_size;
146         const char *chunk_ptr;
147         DWORD chunk_offset;
148
149         read_dword(&ptr, &chunk_offset);
150         TRACE("chunk %u at offset %#x\n", i, chunk_offset);
151
152         chunk_ptr = data + chunk_offset;
153
154         read_dword(&chunk_ptr, &chunk_tag);
155         read_dword(&chunk_ptr, &chunk_size);
156
157         hr = chunk_handler(chunk_ptr, chunk_size, chunk_tag, ctx);
158         if (FAILED(hr)) break;
159     }
160
161     return hr;
162 }
163
164 static BOOL copy_name(const char *ptr, char **name)
165 {
166     size_t name_len;
167
168     if (!ptr) return TRUE;
169
170     name_len = strlen(ptr) + 1;
171     if (name_len == 1)
172     {
173         return TRUE;
174     }
175
176     *name = HeapAlloc(GetProcessHeap(), 0, name_len);
177     if (!*name)
178     {
179         ERR("Failed to allocate name memory.\n");
180         return FALSE;
181     }
182
183     memcpy(*name, ptr, name_len);
184
185     return TRUE;
186 }
187
188 static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
189 {
190     struct d3d10_effect_shader_variable *s = ctx;
191
192     TRACE("tag: %s.\n", debugstr_an((const char *)&tag, 4));
193
194     TRACE("chunk size: %#x\n", data_size);
195
196     switch(tag)
197     {
198         case TAG_ISGN:
199         {
200             /* 32 (DXBC header) + 1 * 4 (chunk index) + 2 * 4 (chunk header) + data_size (chunk data) */
201             UINT size = 44 + data_size;
202             char *ptr;
203
204             s->input_signature = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
205             if (!s->input_signature)
206             {
207                 ERR("Failed to allocate input signature data\n");
208                 return E_OUTOFMEMORY;
209             }
210             s->input_signature_size = size;
211
212             ptr = s->input_signature;
213
214             write_dword(&ptr, TAG_DXBC);
215
216             /* signature(?) */
217             write_dword_unknown(&ptr, 0);
218             write_dword_unknown(&ptr, 0);
219             write_dword_unknown(&ptr, 0);
220             write_dword_unknown(&ptr, 0);
221
222             /* seems to be always 1 */
223             write_dword_unknown(&ptr, 1);
224
225             /* DXBC size */
226             write_dword(&ptr, size);
227
228             /* chunk count */
229             write_dword(&ptr, 1);
230
231             /* chunk index */
232             write_dword(&ptr, (ptr - s->input_signature) + 4);
233
234             /* chunk */
235             write_dword(&ptr, TAG_ISGN);
236             write_dword(&ptr, data_size);
237             memcpy(ptr, data, data_size);
238             break;
239         }
240
241         default:
242             FIXME("Unhandled chunk %s.\n", debugstr_an((const char *)&tag, 4));
243             break;
244     }
245
246     return S_OK;
247 }
248
249 static HRESULT parse_shader(struct d3d10_effect_object *o, const char *data)
250 {
251     ID3D10Device *device = o->pass->technique->effect->device;
252     struct d3d10_effect_shader_variable *s;
253     const char *ptr = data;
254     DWORD dxbc_size;
255     HRESULT hr;
256
257     o->data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct d3d10_effect_shader_variable));
258     if (!o->data)
259     {
260         ERR("Failed to allocate shader variable memory\n");
261         return E_OUTOFMEMORY;
262     }
263
264     if (!ptr) return S_OK;
265
266     s = o->data;
267
268     read_dword(&ptr, &dxbc_size);
269     TRACE("dxbc size: %#x\n", dxbc_size);
270
271     switch (o->type)
272     {
273         case D3D10_EOT_VERTEXSHADER:
274             hr = ID3D10Device_CreateVertexShader(device, ptr, dxbc_size, &s->shader.vs);
275             if (FAILED(hr)) return hr;
276             break;
277
278         case D3D10_EOT_PIXELSHADER:
279             hr = ID3D10Device_CreatePixelShader(device, ptr, dxbc_size, &s->shader.ps);
280             if (FAILED(hr)) return hr;
281             break;
282         case D3D10_EOT_GEOMETRYSHADER:
283             hr = ID3D10Device_CreateGeometryShader(device, ptr, dxbc_size, &s->shader.gs);
284             if (FAILED(hr)) return hr;
285             break;
286     }
287
288     return parse_dxbc(ptr, dxbc_size, shader_chunk_handler, s);
289 }
290
291 static D3D10_SHADER_VARIABLE_CLASS d3d10_variable_class(DWORD c, BOOL is_column_major)
292 {
293     switch (c)
294     {
295         case 1: return D3D10_SVC_SCALAR;
296         case 2: return D3D10_SVC_VECTOR;
297         case 3: if (is_column_major) return D3D10_SVC_MATRIX_COLUMNS;
298                 else return D3D10_SVC_MATRIX_ROWS;
299         default:
300             FIXME("Unknown variable class %#x.\n", c);
301             return 0;
302     }
303 }
304
305 static D3D10_SHADER_VARIABLE_TYPE d3d10_variable_type(DWORD t, BOOL is_object)
306 {
307     if(is_object)
308     {
309         switch (t)
310         {
311             case 1: return D3D10_SVT_STRING;
312             case 2: return D3D10_SVT_BLEND;
313             case 3: return D3D10_SVT_DEPTHSTENCIL;
314             case 4: return D3D10_SVT_RASTERIZER;
315             case 5: return D3D10_SVT_PIXELSHADER;
316             case 6: return D3D10_SVT_VERTEXSHADER;
317             case 7: return D3D10_SVT_GEOMETRYSHADER;
318
319             case 10: return D3D10_SVT_TEXTURE1D;
320             case 11: return D3D10_SVT_TEXTURE1DARRAY;
321             case 12: return D3D10_SVT_TEXTURE2D;
322             case 13: return D3D10_SVT_TEXTURE2DARRAY;
323             case 14: return D3D10_SVT_TEXTURE2DMS;
324             case 15: return D3D10_SVT_TEXTURE2DMSARRAY;
325             case 16: return D3D10_SVT_TEXTURE3D;
326             case 17: return D3D10_SVT_TEXTURECUBE;
327
328             case 19: return D3D10_SVT_RENDERTARGETVIEW;
329             case 20: return D3D10_SVT_DEPTHSTENCILVIEW;
330             case 21: return D3D10_SVT_SAMPLER;
331             default:
332                 FIXME("Unknown variable type %#x.\n", t);
333                 return 0;
334         }
335     }
336     else
337     {
338         switch (t)
339         {
340             case 1: return D3D10_SVT_FLOAT;
341             case 2: return D3D10_SVT_INT;
342             case 3: return D3D10_SVT_UINT;
343             case 4: return D3D10_SVT_BOOL;
344             default:
345                 FIXME("Unknown variable type %#x.\n", t);
346                 return 0;
347         }
348     }
349 }
350
351 static HRESULT parse_fx10_type(struct d3d10_effect_type *t, const char *ptr, const char *data)
352 {
353     DWORD unknown0;
354     DWORD offset;
355     DWORD typeinfo;
356     unsigned int i;
357
358     read_dword(&ptr, &offset);
359     TRACE("Type name at offset %#x.\n", offset);
360
361     if (!copy_name(data + offset, &t->name))
362     {
363         ERR("Failed to copy name.\n");
364         return E_OUTOFMEMORY;
365     }
366     TRACE("Type name: %s.\n", debugstr_a(t->name));
367
368     read_dword(&ptr, &unknown0);
369     TRACE("Unknown 0: %u.\n", unknown0);
370
371     read_dword(&ptr, &t->element_count);
372     TRACE("Element count: %u.\n", t->element_count);
373
374     read_dword(&ptr, &t->size_unpacked);
375     TRACE("Unpacked size: %#x.\n", t->size_unpacked);
376
377     read_dword(&ptr, &t->stride);
378     TRACE("Stride: %#x.\n", t->stride);
379
380     read_dword(&ptr, &t->size_packed);
381     TRACE("Packed size %#x.\n", t->size_packed);
382
383     switch (unknown0)
384     {
385         case 1:
386             t->member_count = 0;
387
388             read_dword(&ptr, &typeinfo);
389             t->column_count = (typeinfo & D3D10_FX10_TYPE_COLUMN_MASK) >> D3D10_FX10_TYPE_COLUMN_SHIFT;
390             t->row_count = (typeinfo & D3D10_FX10_TYPE_ROW_MASK) >> D3D10_FX10_TYPE_ROW_SHIFT;
391             t->basetype = d3d10_variable_type((typeinfo & D3D10_FX10_TYPE_BASETYPE_MASK) >> D3D10_FX10_TYPE_BASETYPE_SHIFT, FALSE);
392             t->type_class = d3d10_variable_class((typeinfo & D3D10_FX10_TYPE_CLASS_MASK) >> D3D10_FX10_TYPE_CLASS_SHIFT, typeinfo & D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK);
393
394             TRACE("Type description: %#x.\n", typeinfo);
395             TRACE("\tcolumns: %u.\n", t->column_count);
396             TRACE("\trows: %u.\n", t->row_count);
397             TRACE("\tbasetype: %s.\n", debug_d3d10_shader_variable_type(t->basetype));
398             TRACE("\tclass: %s.\n", debug_d3d10_shader_variable_class(t->type_class));
399             TRACE("\tunknown bits: %#x.\n", typeinfo & ~(D3D10_FX10_TYPE_COLUMN_MASK | D3D10_FX10_TYPE_ROW_MASK
400                     | D3D10_FX10_TYPE_BASETYPE_MASK | D3D10_FX10_TYPE_CLASS_MASK | D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK));
401             break;
402
403         case 2:
404             TRACE("Type is an object.\n");
405
406             t->member_count = 0;
407             t->column_count = 0;
408             t->row_count = 0;
409             t->type_class = D3D10_SVC_OBJECT;
410
411             read_dword(&ptr, &typeinfo);
412             t->basetype = d3d10_variable_type(typeinfo, TRUE);
413
414             TRACE("Type description: %#x.\n", typeinfo);
415             TRACE("\tbasetype: %s.\n", debug_d3d10_shader_variable_type(t->basetype));
416             TRACE("\tclass: %s.\n", debug_d3d10_shader_variable_class(t->type_class));
417             break;
418
419          case 3:
420             TRACE("Type is a structure.\n");
421
422             read_dword(&ptr, &t->member_count);
423             TRACE("Member count: %u.\n", t->member_count);
424
425             t->column_count = 0;
426             t->row_count = 0;
427             t->basetype = 0;
428             t->type_class = D3D10_SVC_STRUCT;
429
430             t->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, t->member_count * sizeof(*t->members));
431             if (!t->members)
432             {
433                 ERR("Failed to allocate members memory.\n");
434                 return E_OUTOFMEMORY;
435             }
436
437             for (i = 0; i < t->member_count; ++i)
438             {
439                 struct d3d10_effect_type_member *typem = &t->members[i];
440
441                 read_dword(&ptr, &offset);
442                 TRACE("Member name at offset %#x.\n", offset);
443
444                 if (!copy_name(data + offset, &typem->name))
445                 {
446                     ERR("Failed to copy name.\n");
447                     return E_OUTOFMEMORY;
448                 }
449                 TRACE("Member name: %s.\n", debugstr_a(typem->name));
450
451                 read_dword(&ptr, &offset);
452                 TRACE("Member semantic at offset %#x.\n", offset);
453
454                 if (!copy_name(data + offset, &typem->semantic))
455                 {
456                     ERR("Failed to copy semantic.\n");
457                     return E_OUTOFMEMORY;
458                 }
459                 TRACE("Member semantic: %s.\n", debugstr_a(typem->semantic));
460
461                 read_dword(&ptr, &typem->buffer_offset);
462                 TRACE("Member offset in struct: %#x.\n", typem->buffer_offset);
463
464                 read_dword(&ptr, &offset);
465                 TRACE("Member type info at offset %#x.\n", offset);
466
467                 typem->type = get_fx10_type(t->effect, data, offset);
468                 if (!typem->type)
469                 {
470                     ERR("Failed to get variable type.\n");
471                     return E_FAIL;
472                 }
473             }
474             break;
475
476         default:
477             FIXME("Unhandled case %#x.\n", unknown0);
478             return E_FAIL;
479     }
480
481     if (t->element_count)
482     {
483         TRACE("Elementtype for type at offset: %#x\n", t->id);
484
485         /* allocate elementtype - we need only one, because all elements have the same type */
486         t->elementtype = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*t->elementtype));
487         if (!t->elementtype)
488         {
489             ERR("Failed to allocate members memory.\n");
490             return E_OUTOFMEMORY;
491         }
492
493         /* create a copy of the original type with some minor changes */
494         t->elementtype->vtbl = &d3d10_effect_type_vtbl;
495         t->elementtype->effect = t->effect;
496
497         if (!copy_name(t->name, &t->elementtype->name))
498         {
499              ERR("Failed to copy name.\n");
500              return E_OUTOFMEMORY;
501         }
502         TRACE("\tType name: %s.\n", debugstr_a(t->elementtype->name));
503
504         t->elementtype->element_count = 0;
505         TRACE("\tElement count: %u.\n", t->elementtype->element_count);
506
507         /*
508          * Not sure if this calculation is 100% correct, but a test
509          * show's that these values work.
510          */
511         t->elementtype->size_unpacked = t->size_packed / t->element_count;
512         TRACE("\tUnpacked size: %#x.\n", t->elementtype->size_unpacked);
513
514         t->elementtype->stride = t->stride;
515         TRACE("\tStride: %#x.\n", t->elementtype->stride);
516
517         t->elementtype->size_packed = t->size_packed / t->element_count;
518         TRACE("\tPacked size: %#x.\n", t->elementtype->size_packed);
519
520         t->elementtype->member_count = t->member_count;
521         TRACE("\tMember count: %u.\n", t->elementtype->member_count);
522
523         t->elementtype->column_count = t->column_count;
524         TRACE("\tColumns: %u.\n", t->elementtype->column_count);
525
526         t->elementtype->row_count = t->row_count;
527         TRACE("\tRows: %u.\n", t->elementtype->row_count);
528
529         t->elementtype->basetype = t->basetype;
530         TRACE("\tBasetype: %s.\n", debug_d3d10_shader_variable_type(t->elementtype->basetype));
531
532         t->elementtype->type_class = t->type_class;
533         TRACE("\tClass: %s.\n", debug_d3d10_shader_variable_class(t->elementtype->type_class));
534
535         t->elementtype->members = t->members;
536     }
537
538     return S_OK;
539 }
540
541 static struct d3d10_effect_type *get_fx10_type(struct d3d10_effect *effect, const char *data, DWORD offset)
542 {
543     struct d3d10_effect_type *type;
544     struct wine_rb_entry *entry;
545     HRESULT hr;
546
547     entry = wine_rb_get(&effect->types, &offset);
548     if (entry)
549     {
550         TRACE("Returning existing type.\n");
551         return WINE_RB_ENTRY_VALUE(entry, struct d3d10_effect_type, entry);
552     }
553
554     type = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*type));
555     if (!type)
556     {
557         ERR("Failed to allocate type memory.\n");
558         return NULL;
559     }
560
561     type->vtbl = &d3d10_effect_type_vtbl;
562     type->id = offset;
563     type->effect = effect;
564     hr = parse_fx10_type(type, data + offset, data);
565     if (FAILED(hr))
566     {
567         ERR("Failed to parse type info, hr %#x.\n", hr);
568         HeapFree(GetProcessHeap(), 0, type);
569         return NULL;
570     }
571
572     if (wine_rb_put(&effect->types, &offset, &type->entry) == -1)
573     {
574         ERR("Failed to insert type entry.\n");
575         HeapFree(GetProcessHeap(), 0, type);
576         return NULL;
577     }
578
579     return type;
580 }
581
582 static void set_variable_vtbl(struct d3d10_effect_variable *v)
583 {
584     switch (v->type->type_class)
585     {
586         case D3D10_SVC_SCALAR:
587             v->vtbl = (ID3D10EffectVariableVtbl *)&d3d10_effect_scalar_variable_vtbl;
588             break;
589
590         case D3D10_SVC_VECTOR:
591             v->vtbl = (ID3D10EffectVariableVtbl *)&d3d10_effect_vector_variable_vtbl;
592             break;
593
594         case D3D10_SVC_MATRIX_ROWS:
595         case D3D10_SVC_MATRIX_COLUMNS:
596             v->vtbl = (ID3D10EffectVariableVtbl *)&d3d10_effect_matrix_variable_vtbl;
597             break;
598
599         case D3D10_SVC_STRUCT:
600             v->vtbl = &d3d10_effect_variable_vtbl;
601             break;
602
603         default:
604             FIXME("Unhandled type class %s.\n", debug_d3d10_shader_variable_class(v->type->type_class));
605             v->vtbl = &d3d10_effect_variable_vtbl;
606             break;
607     }
608 }
609
610 static HRESULT copy_variableinfo_from_type(struct d3d10_effect_variable *v)
611 {
612     unsigned int i;
613     HRESULT hr;
614
615     if (v->type->member_count)
616     {
617         v->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, v->type->member_count * sizeof(*v->members));
618         if (!v->members)
619         {
620             ERR("Failed to allocate members memory.\n");
621             return E_OUTOFMEMORY;
622         }
623
624         for (i = 0; i < v->type->member_count; ++i)
625         {
626             struct d3d10_effect_variable *var = &v->members[i];
627             struct d3d10_effect_type_member *typem = &v->type->members[i];
628
629             var->buffer = v->buffer;
630             var->effect = v->effect;
631             var->type = typem->type;
632             set_variable_vtbl(var);
633
634             if (!copy_name(typem->name, &var->name))
635             {
636                 ERR("Failed to copy name.\n");
637                 return E_OUTOFMEMORY;
638             }
639             TRACE("Variable name: %s.\n", debugstr_a(var->name));
640
641             if (!copy_name(typem->semantic, &var->semantic))
642             {
643                 ERR("Failed to copy name.\n");
644                 return E_OUTOFMEMORY;
645             }
646             TRACE("Variable semantic: %s.\n", debugstr_a(var->semantic));
647
648             var->buffer_offset = v->buffer_offset + typem->buffer_offset;
649             TRACE("Variable buffer offset: %u.\n", var->buffer_offset);
650
651             hr = copy_variableinfo_from_type(var);
652             if (FAILED(hr)) return hr;
653         }
654     }
655
656     if (v->type->element_count)
657     {
658         unsigned int bufferoffset = v->buffer_offset;
659
660         v->elements = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, v->type->element_count * sizeof(*v->elements));
661         if (!v->elements)
662         {
663             ERR("Failed to allocate elements memory.\n");
664             return E_OUTOFMEMORY;
665         }
666
667         for (i = 0; i < v->type->element_count; ++i)
668         {
669             struct d3d10_effect_variable *var = &v->elements[i];
670
671             var->buffer = v->buffer;
672             var->effect = v->effect;
673             var->type = v->type->elementtype;
674             set_variable_vtbl(var);
675
676             if (!copy_name(v->name, &var->name))
677             {
678                 ERR("Failed to copy name.\n");
679                 return E_OUTOFMEMORY;
680             }
681             TRACE("Variable name: %s.\n", debugstr_a(var->name));
682
683             if (!copy_name(v->semantic, &var->semantic))
684             {
685                 ERR("Failed to copy name.\n");
686                 return E_OUTOFMEMORY;
687             }
688             TRACE("Variable semantic: %s.\n", debugstr_a(var->semantic));
689
690             if (i != 0)
691             {
692                 bufferoffset += v->type->stride;
693             }
694             var->buffer_offset = bufferoffset;
695             TRACE("Variable buffer offset: %u.\n", var->buffer_offset);
696
697             hr = copy_variableinfo_from_type(var);
698             if (FAILED(hr)) return hr;
699         }
700     }
701
702     return S_OK;
703 }
704
705 static HRESULT parse_fx10_variable_head(struct d3d10_effect_variable *v, const char **ptr, const char *data)
706 {
707     DWORD offset;
708
709     read_dword(ptr, &offset);
710     TRACE("Variable name at offset %#x.\n", offset);
711
712     if (!copy_name(data + offset, &v->name))
713     {
714         ERR("Failed to copy name.\n");
715         return E_OUTOFMEMORY;
716     }
717     TRACE("Variable name: %s.\n", debugstr_a(v->name));
718
719     read_dword(ptr, &offset);
720     TRACE("Variable type info at offset %#x.\n", offset);
721
722     v->type = get_fx10_type(v->effect, data, offset);
723     if (!v->type)
724     {
725         ERR("Failed to get variable type.\n");
726         return E_FAIL;
727     }
728     set_variable_vtbl(v);
729
730     return copy_variableinfo_from_type(v);
731 }
732
733 static HRESULT parse_fx10_annotation(struct d3d10_effect_variable *a, const char **ptr, const char *data)
734 {
735     HRESULT hr;
736
737     hr = parse_fx10_variable_head(a, ptr, data);
738     if (FAILED(hr)) return hr;
739
740     skip_dword_unknown(ptr, 1);
741
742     return S_OK;
743 }
744
745 static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr, const char *data)
746 {
747     const char *data_ptr;
748     DWORD offset;
749     HRESULT hr;
750
751     read_dword(ptr, &o->type);
752     TRACE("Effect object is of type %#x.\n", o->type);
753
754     skip_dword_unknown(ptr, 2);
755
756     read_dword(ptr, &offset);
757     TRACE("Effect object idx is at offset %#x.\n", offset);
758
759     data_ptr = data + offset;
760     read_dword(&data_ptr, &offset);
761
762     TRACE("Effect object starts at offset %#x.\n", offset);
763
764     /* FIXME: This probably isn't completely correct. */
765     if (offset == 1)
766     {
767         WARN("Skipping effect object.\n");
768         data_ptr = NULL;
769     }
770     else
771     {
772         data_ptr = data + offset;
773     }
774
775     switch (o->type)
776     {
777         case D3D10_EOT_VERTEXSHADER:
778             TRACE("Vertex shader\n");
779             hr = parse_shader(o, data_ptr);
780             break;
781
782         case D3D10_EOT_PIXELSHADER:
783             TRACE("Pixel shader\n");
784             hr = parse_shader(o, data_ptr);
785             break;
786
787         case D3D10_EOT_GEOMETRYSHADER:
788             TRACE("Geometry shader\n");
789             hr = parse_shader(o, data_ptr);
790             break;
791
792         default:
793             FIXME("Unhandled object type %#x\n", o->type);
794             hr = E_FAIL;
795             break;
796     }
797
798     return hr;
799 }
800
801 static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char **ptr, const char *data)
802 {
803     HRESULT hr = S_OK;
804     unsigned int i;
805     DWORD offset;
806
807     read_dword(ptr, &offset);
808     TRACE("Pass name at offset %#x.\n", offset);
809
810     if (!copy_name(data + offset, &p->name))
811     {
812         ERR("Failed to copy name.\n");
813         return E_OUTOFMEMORY;
814     }
815     TRACE("Pass name: %s.\n", debugstr_a(p->name));
816
817     read_dword(ptr, &p->object_count);
818     TRACE("Pass has %u effect objects.\n", p->object_count);
819
820     read_dword(ptr, &p->annotation_count);
821     TRACE("Pass has %u annotations.\n", p->annotation_count);
822
823     p->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, p->annotation_count * sizeof(*p->annotations));
824     if (!p->annotations)
825     {
826         ERR("Failed to allocate pass annotations memory.\n");
827         return E_OUTOFMEMORY;
828     }
829
830     for(i = 0; i < p->annotation_count; ++i)
831     {
832         struct d3d10_effect_variable *a = &p->annotations[i];
833
834         a->effect = p->technique->effect;
835
836         hr = parse_fx10_annotation(a, ptr, data);
837         if (FAILED(hr)) return hr;
838     }
839
840     p->objects = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, p->object_count * sizeof(*p->objects));
841     if (!p->objects)
842     {
843         ERR("Failed to allocate effect objects memory.\n");
844         return E_OUTOFMEMORY;
845     }
846
847     for (i = 0; i < p->object_count; ++i)
848     {
849         struct d3d10_effect_object *o = &p->objects[i];
850
851         o->pass = p;
852
853         hr = parse_fx10_object(o, ptr, data);
854         if (FAILED(hr)) return hr;
855     }
856
857     return hr;
858 }
859
860 static HRESULT parse_fx10_technique(struct d3d10_effect_technique *t, const char **ptr, const char *data)
861 {
862     unsigned int i;
863     DWORD offset;
864     HRESULT hr;
865
866     read_dword(ptr, &offset);
867     TRACE("Technique name at offset %#x.\n", offset);
868
869     if (!copy_name(data + offset, &t->name))
870     {
871         ERR("Failed to copy name.\n");
872         return E_OUTOFMEMORY;
873     }
874     TRACE("Technique name: %s.\n", debugstr_a(t->name));
875
876     read_dword(ptr, &t->pass_count);
877     TRACE("Technique has %u passes\n", t->pass_count);
878
879     read_dword(ptr, &t->annotation_count);
880     TRACE("Technique has %u annotations.\n", t->annotation_count);
881
882     t->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, t->annotation_count * sizeof(*t->annotations));
883     if (!t->annotations)
884     {
885         ERR("Failed to allocate technique annotations memory.\n");
886         return E_OUTOFMEMORY;
887     }
888
889     for(i = 0; i < t->annotation_count; ++i)
890     {
891         struct d3d10_effect_variable *a = &t->annotations[i];
892
893         a->effect = t->effect;
894
895         hr = parse_fx10_annotation(a, ptr, data);
896         if (FAILED(hr)) return hr;
897     }
898
899     t->passes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, t->pass_count * sizeof(*t->passes));
900     if (!t->passes)
901     {
902         ERR("Failed to allocate passes memory\n");
903         return E_OUTOFMEMORY;
904     }
905
906     for (i = 0; i < t->pass_count; ++i)
907     {
908         struct d3d10_effect_pass *p = &t->passes[i];
909
910         p->vtbl = &d3d10_effect_pass_vtbl;
911         p->technique = t;
912
913         hr = parse_fx10_pass(p, ptr, data);
914         if (FAILED(hr)) return hr;
915     }
916
917     return S_OK;
918 }
919
920 static HRESULT parse_fx10_variable(struct d3d10_effect_variable *v, const char **ptr, const char *data)
921 {
922     DWORD offset;
923     unsigned int i;
924     HRESULT hr;
925
926     hr = parse_fx10_variable_head(v, ptr, data);
927     if (FAILED(hr)) return hr;
928
929     read_dword(ptr, &offset);
930     TRACE("Variable semantic at offset %#x.\n", offset);
931
932     if (!copy_name(data + offset, &v->semantic))
933     {
934         ERR("Failed to copy semantic.\n");
935         return E_OUTOFMEMORY;
936     }
937     TRACE("Variable semantic: %s.\n", debugstr_a(v->semantic));
938
939     read_dword(ptr, &v->buffer_offset);
940     TRACE("Variable offset in buffer: %#x.\n", v->buffer_offset);
941
942     skip_dword_unknown(ptr, 1);
943
944     read_dword(ptr, &v->flag);
945     TRACE("Variable flag: %#x.\n", v->flag);
946
947     read_dword(ptr, &v->annotation_count);
948     TRACE("Variable has %u annotations.\n", v->annotation_count);
949
950     v->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, v->annotation_count * sizeof(*v->annotations));
951     if (!v->annotations)
952     {
953         ERR("Failed to allocate variable annotations memory.\n");
954         return E_OUTOFMEMORY;
955     }
956
957     for (i = 0; i < v->annotation_count; ++i)
958     {
959         struct d3d10_effect_variable *a = &v->annotations[i];
960
961         a->effect = v->effect;
962
963         hr = parse_fx10_annotation(a, ptr, data);
964         if (FAILED(hr)) return hr;
965     }
966
967     return S_OK;
968 }
969
970 static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const char **ptr, const char *data)
971 {
972     unsigned int i;
973     HRESULT hr;
974
975     hr = parse_fx10_variable_head(v, ptr, data);
976     if (FAILED(hr)) return hr;
977
978     skip_dword_unknown(ptr, 2);
979
980     switch (v->type->basetype)
981     {
982         case D3D10_SVT_TEXTURE1D:
983         case D3D10_SVT_TEXTURE1DARRAY:
984         case D3D10_SVT_TEXTURE2D:
985         case D3D10_SVT_TEXTURE2DARRAY:
986         case D3D10_SVT_TEXTURE2DMS:
987         case D3D10_SVT_TEXTURE2DMSARRAY:
988         case D3D10_SVT_TEXTURE3D:
989         case D3D10_SVT_TEXTURECUBE:
990         case D3D10_SVT_RENDERTARGETVIEW:
991         case D3D10_SVT_DEPTHSTENCILVIEW:
992             TRACE("SVT could not have elements.\n");
993             break;
994
995         case D3D10_SVT_VERTEXSHADER:
996         case D3D10_SVT_PIXELSHADER:
997         case D3D10_SVT_GEOMETRYSHADER:
998             TRACE("SVT is a shader.\n");
999             for (i = 0; i < max(v->type->element_count, 1); ++i)
1000             {
1001                 DWORD shader_offset;
1002
1003                 /*
1004                  * TODO: Parse the shader
1005                  */
1006                 read_dword(ptr, &shader_offset);
1007                 FIXME("Shader offset: %#x.\n", shader_offset);
1008             }
1009             break;
1010
1011         case D3D10_SVT_DEPTHSTENCIL:
1012         case D3D10_SVT_BLEND:
1013         case D3D10_SVT_RASTERIZER:
1014         case D3D10_SVT_SAMPLER:
1015             TRACE("SVT is a state.\n");
1016             for (i = 0; i < max(v->type->element_count, 1); ++i)
1017             {
1018                 unsigned int j;
1019                 DWORD object_count;
1020
1021                 read_dword(ptr, &object_count);
1022                 TRACE("Object count: %#x.\n", object_count);
1023
1024                 for (j = 0; j < object_count; ++j)
1025                 {
1026                     skip_dword_unknown(ptr, 4);
1027                 }
1028             }
1029             break;
1030
1031         default:
1032             FIXME("Unhandled case %s.\n", debug_d3d10_shader_variable_type(v->type->basetype));
1033             return E_FAIL;
1034     }
1035
1036     read_dword(ptr, &v->annotation_count);
1037     TRACE("Variable has %u annotations.\n", v->annotation_count);
1038
1039     v->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, v->annotation_count * sizeof(*v->annotations));
1040     if (!v->annotations)
1041     {
1042         ERR("Failed to allocate variable annotations memory.\n");
1043         return E_OUTOFMEMORY;
1044     }
1045
1046     for (i = 0; i < v->annotation_count; ++i)
1047     {
1048         struct d3d10_effect_variable *a = &v->annotations[i];
1049
1050         a->effect = v->effect;
1051
1052         hr = parse_fx10_annotation(a, ptr, data);
1053         if (FAILED(hr)) return hr;
1054     }
1055
1056     return S_OK;
1057 }
1058
1059 static HRESULT parse_fx10_local_buffer(struct d3d10_effect_variable *l, const char **ptr, const char *data)
1060 {
1061     unsigned int i;
1062     DWORD offset;
1063     D3D10_CBUFFER_TYPE d3d10_cbuffer_type;
1064     HRESULT hr;
1065
1066     /* Generate our own type, it isn't in the fx blob. */
1067     l->type = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*l->type));
1068     if (!l->type)
1069     {
1070         ERR("Failed to allocate local buffer type memory.\n");
1071         return E_OUTOFMEMORY;
1072     }
1073     l->type->vtbl = &d3d10_effect_type_vtbl;
1074     l->type->type_class = D3D10_SVC_OBJECT;
1075     l->type->effect = l->effect;
1076
1077     read_dword(ptr, &offset);
1078     TRACE("Local buffer name at offset %#x.\n", offset);
1079
1080     if (!copy_name(data + offset, &l->name))
1081     {
1082         ERR("Failed to copy name.\n");
1083         return E_OUTOFMEMORY;
1084     }
1085     TRACE("Local buffer name: %s.\n", debugstr_a(l->name));
1086
1087     read_dword(ptr, &l->data_size);
1088     TRACE("Local buffer data size: %#x.\n", l->data_size);
1089
1090     read_dword(ptr, &d3d10_cbuffer_type);
1091     TRACE("Local buffer type: %#x.\n", d3d10_cbuffer_type);
1092
1093     switch(d3d10_cbuffer_type)
1094     {
1095         case D3D10_CT_CBUFFER:
1096             l->type->basetype = D3D10_SVT_CBUFFER;
1097             if (!copy_name("cbuffer", &l->type->name))
1098             {
1099                 ERR("Failed to copy name.\n");
1100                 return E_OUTOFMEMORY;
1101             }
1102             break;
1103
1104         case D3D10_CT_TBUFFER:
1105             l->type->basetype = D3D10_SVT_TBUFFER;
1106             if (!copy_name("tbuffer", &l->type->name))
1107             {
1108                 ERR("Failed to copy name.\n");
1109                 return E_OUTOFMEMORY;
1110             }
1111             break;
1112
1113         default:
1114             ERR("Unexpected D3D10_CBUFFER_TYPE %#x!\n", d3d10_cbuffer_type);
1115             return E_FAIL;
1116     }
1117
1118     read_dword(ptr, &l->type->member_count);
1119     TRACE("Local buffer member count: %#x.\n", l->type->member_count);
1120
1121     skip_dword_unknown(ptr, 1);
1122
1123     read_dword(ptr, &l->annotation_count);
1124     TRACE("Local buffer has %u annotations.\n", l->annotation_count);
1125
1126     l->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, l->annotation_count * sizeof(*l->annotations));
1127     if (!l->annotations)
1128     {
1129         ERR("Failed to allocate local buffer annotations memory.\n");
1130         return E_OUTOFMEMORY;
1131     }
1132
1133     for(i = 0; i < l->annotation_count; ++i)
1134     {
1135         struct d3d10_effect_variable *a = &l->annotations[i];
1136
1137         a->effect = l->effect;
1138
1139         hr = parse_fx10_annotation(a, ptr, data);
1140         if (FAILED(hr)) return hr;
1141     }
1142
1143     l->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, l->type->member_count * sizeof(*l->members));
1144     if (!l->members)
1145     {
1146         ERR("Failed to allocate members memory.\n");
1147         return E_OUTOFMEMORY;
1148     }
1149
1150     l->type->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, l->type->member_count * sizeof(*l->type->members));
1151     if (!l->type->members)
1152     {
1153         ERR("Failed to allocate type members memory.\n");
1154         return E_OUTOFMEMORY;
1155     }
1156
1157     for (i = 0; i < l->type->member_count; ++i)
1158     {
1159         struct d3d10_effect_variable *v = &l->members[i];
1160         struct d3d10_effect_type_member *typem = &l->type->members[i];
1161
1162         v->buffer = l;
1163         v->effect = l->effect;
1164
1165         hr = parse_fx10_variable(v, ptr, data);
1166         if (FAILED(hr)) return hr;
1167
1168         /*
1169          * Copy the values from the variable type to the constant buffers type
1170          * members structure, because it is our own generated type.
1171          */
1172         typem->type = v->type;
1173
1174         if (!copy_name(v->name, &typem->name))
1175         {
1176             ERR("Failed to copy name.\n");
1177             return E_OUTOFMEMORY;
1178         }
1179         TRACE("Variable name: %s.\n", debugstr_a(typem->name));
1180
1181         if (!copy_name(v->semantic, &typem->semantic))
1182         {
1183             ERR("Failed to copy name.\n");
1184             return E_OUTOFMEMORY;
1185         }
1186         TRACE("Variable semantic: %s.\n", debugstr_a(typem->semantic));
1187
1188         typem->buffer_offset = v->buffer_offset;
1189         TRACE("Variable buffer offset: %u.\n", typem->buffer_offset);
1190
1191         l->type->size_packed += v->type->size_packed;
1192         l->type->size_unpacked += v->type->size_unpacked;
1193     }
1194     l->type->stride = l->type->size_unpacked = (l->type->size_unpacked + 0xf) & ~0xf;
1195
1196     TRACE("Constant buffer:\n");
1197     TRACE("\tType name: %s.\n", debugstr_a(l->type->name));
1198     TRACE("\tElement count: %u.\n", l->type->element_count);
1199     TRACE("\tMember count: %u.\n", l->type->member_count);
1200     TRACE("\tUnpacked size: %#x.\n", l->type->size_unpacked);
1201     TRACE("\tStride: %#x.\n", l->type->stride);
1202     TRACE("\tPacked size %#x.\n", l->type->size_packed);
1203     TRACE("\tBasetype: %s.\n", debug_d3d10_shader_variable_type(l->type->basetype));
1204     TRACE("\tTypeclass: %s.\n", debug_d3d10_shader_variable_class(l->type->type_class));
1205
1206     return S_OK;
1207 }
1208
1209 static int d3d10_effect_type_compare(const void *key, const struct wine_rb_entry *entry)
1210 {
1211     const struct d3d10_effect_type *t = WINE_RB_ENTRY_VALUE(entry, const struct d3d10_effect_type, entry);
1212     const DWORD *id = key;
1213
1214     return *id - t->id;
1215 }
1216
1217 static void d3d10_effect_type_member_destroy(struct d3d10_effect_type_member *typem)
1218 {
1219     TRACE("effect type member %p.\n", typem);
1220
1221     /* Do not release typem->type, it will be covered by d3d10_effect_type_destroy(). */
1222     HeapFree(GetProcessHeap(), 0, typem->semantic);
1223     HeapFree(GetProcessHeap(), 0, typem->name);
1224 }
1225
1226 static void d3d10_effect_type_destroy(struct wine_rb_entry *entry, void *context)
1227 {
1228     struct d3d10_effect_type *t = WINE_RB_ENTRY_VALUE(entry, struct d3d10_effect_type, entry);
1229
1230     TRACE("effect type %p.\n", t);
1231
1232     if (t->elementtype)
1233     {
1234         HeapFree(GetProcessHeap(), 0, t->elementtype->name);
1235         HeapFree(GetProcessHeap(), 0, t->elementtype);
1236     }
1237
1238     if (t->members)
1239     {
1240         unsigned int i;
1241
1242         for (i = 0; i < t->member_count; ++i)
1243         {
1244             d3d10_effect_type_member_destroy(&t->members[i]);
1245         }
1246         HeapFree(GetProcessHeap(), 0, t->members);
1247     }
1248
1249     HeapFree(GetProcessHeap(), 0, t->name);
1250     HeapFree(GetProcessHeap(), 0, t);
1251 }
1252
1253 static const struct wine_rb_functions d3d10_effect_type_rb_functions =
1254 {
1255     d3d10_rb_alloc,
1256     d3d10_rb_realloc,
1257     d3d10_rb_free,
1258     d3d10_effect_type_compare,
1259 };
1260
1261 static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD data_size)
1262 {
1263     const char *ptr = data + e->index_offset;
1264     unsigned int i;
1265     HRESULT hr;
1266
1267     if (wine_rb_init(&e->types, &d3d10_effect_type_rb_functions) == -1)
1268     {
1269         ERR("Failed to initialize type rbtree.\n");
1270         return E_FAIL;
1271     }
1272
1273     e->local_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->local_buffer_count * sizeof(*e->local_buffers));
1274     if (!e->local_buffers)
1275     {
1276         ERR("Failed to allocate local buffer memory.\n");
1277         return E_OUTOFMEMORY;
1278     }
1279
1280     e->local_variables = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->local_variable_count * sizeof(*e->local_variables));
1281     if (!e->local_variables)
1282     {
1283         ERR("Failed to allocate local variable memory.\n");
1284         return E_OUTOFMEMORY;
1285     }
1286
1287     e->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->technique_count * sizeof(*e->techniques));
1288     if (!e->techniques)
1289     {
1290         ERR("Failed to allocate techniques memory\n");
1291         return E_OUTOFMEMORY;
1292     }
1293
1294     for (i = 0; i < e->local_buffer_count; ++i)
1295     {
1296         struct d3d10_effect_variable *l = &e->local_buffers[i];
1297         l->vtbl = (ID3D10EffectVariableVtbl *)&d3d10_effect_constant_buffer_vtbl;
1298         l->effect = e;
1299         l->buffer = &null_local_buffer;
1300
1301         hr = parse_fx10_local_buffer(l, &ptr, data);
1302         if (FAILED(hr)) return hr;
1303     }
1304
1305     for (i = 0; i < e->local_variable_count; ++i)
1306     {
1307         struct d3d10_effect_variable *v = &e->local_variables[i];
1308
1309         v->effect = e;
1310         v->vtbl = &d3d10_effect_variable_vtbl;
1311
1312         hr = parse_fx10_local_variable(v, &ptr, data);
1313         if (FAILED(hr)) return hr;
1314     }
1315
1316     for (i = 0; i < e->technique_count; ++i)
1317     {
1318         struct d3d10_effect_technique *t = &e->techniques[i];
1319
1320         t->vtbl = &d3d10_effect_technique_vtbl;
1321         t->effect = e;
1322
1323         hr = parse_fx10_technique(t, &ptr, data);
1324         if (FAILED(hr)) return hr;
1325     }
1326
1327     return S_OK;
1328 }
1329
1330 static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_size)
1331 {
1332     const char *ptr = data;
1333     DWORD unknown;
1334
1335     /* Compiled target version (e.g. fx_4_0=0xfeff1001, fx_4_1=0xfeff1011). */
1336     read_dword(&ptr, &e->version);
1337     TRACE("Target: %#x\n", e->version);
1338
1339     read_dword(&ptr, &e->local_buffer_count);
1340     TRACE("Local buffer count: %u.\n", e->local_buffer_count);
1341
1342     read_dword(&ptr, &e->variable_count);
1343     TRACE("Variable count: %u\n", e->variable_count);
1344
1345     read_dword(&ptr, &e->local_variable_count);
1346     TRACE("Object count: %u\n", e->local_variable_count);
1347
1348     read_dword(&ptr, &e->sharedbuffers_count);
1349     TRACE("Sharedbuffers count: %u\n", e->sharedbuffers_count);
1350
1351     /* Number of variables in shared buffers? */
1352     read_dword(&ptr, &unknown);
1353     FIXME("Unknown 0: %u\n", unknown);
1354
1355     read_dword(&ptr, &e->sharedobjects_count);
1356     TRACE("Sharedobjects count: %u\n", e->sharedobjects_count);
1357
1358     read_dword(&ptr, &e->technique_count);
1359     TRACE("Technique count: %u\n", e->technique_count);
1360
1361     read_dword(&ptr, &e->index_offset);
1362     TRACE("Index offset: %#x\n", e->index_offset);
1363
1364     read_dword(&ptr, &unknown);
1365     FIXME("Unknown 1: %u\n", unknown);
1366
1367     read_dword(&ptr, &e->texture_count);
1368     TRACE("Texture count: %u\n", e->texture_count);
1369
1370     read_dword(&ptr, &e->dephstencilstate_count);
1371     TRACE("Depthstencilstate count: %u\n", e->dephstencilstate_count);
1372
1373     read_dword(&ptr, &e->blendstate_count);
1374     TRACE("Blendstate count: %u\n", e->blendstate_count);
1375
1376     read_dword(&ptr, &e->rasterizerstate_count);
1377     TRACE("Rasterizerstate count: %u\n", e->rasterizerstate_count);
1378
1379     read_dword(&ptr, &e->samplerstate_count);
1380     TRACE("Samplerstate count: %u\n", e->samplerstate_count);
1381
1382     read_dword(&ptr, &e->rendertargetview_count);
1383     TRACE("Rendertargetview count: %u\n", e->rendertargetview_count);
1384
1385     read_dword(&ptr, &e->depthstencilview_count);
1386     TRACE("Depthstencilview count: %u\n", e->depthstencilview_count);
1387
1388     read_dword(&ptr, &e->shader_call_count);
1389     TRACE("Shader call count: %u\n", e->shader_call_count);
1390
1391     read_dword(&ptr, &e->shader_compile_count);
1392     TRACE("Shader compile count: %u\n", e->shader_compile_count);
1393
1394     return parse_fx10_body(e, ptr, data_size - (ptr - data));
1395 }
1396
1397 static HRESULT fx10_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
1398 {
1399     struct d3d10_effect *e = ctx;
1400
1401     TRACE("tag: %s.\n", debugstr_an((const char *)&tag, 4));
1402
1403     TRACE("chunk size: %#x\n", data_size);
1404
1405     switch(tag)
1406     {
1407         case TAG_FX10:
1408             return parse_fx10(e, data, data_size);
1409
1410         default:
1411             FIXME("Unhandled chunk %s.\n", debugstr_an((const char *)&tag, 4));
1412             return S_OK;
1413     }
1414 }
1415
1416 HRESULT d3d10_effect_parse(struct d3d10_effect *This, const void *data, SIZE_T data_size)
1417 {
1418     return parse_dxbc(data, data_size, fx10_chunk_handler, This);
1419 }
1420
1421 static void d3d10_effect_object_destroy(struct d3d10_effect_object *o)
1422 {
1423     TRACE("effect object %p.\n", o);
1424
1425     switch(o->type)
1426     {
1427         case D3D10_EOT_VERTEXSHADER:
1428         case D3D10_EOT_PIXELSHADER:
1429         case D3D10_EOT_GEOMETRYSHADER:
1430             HeapFree(GetProcessHeap(), 0, ((struct d3d10_effect_shader_variable *)o->data)->input_signature);
1431             break;
1432
1433         default:
1434             break;
1435     }
1436     HeapFree(GetProcessHeap(), 0, o->data);
1437 }
1438
1439 static HRESULT d3d10_effect_object_apply(struct d3d10_effect_object *o)
1440 {
1441     ID3D10Device *device = o->pass->technique->effect->device;
1442
1443     TRACE("effect object %p, type %#x.\n", o, o->type);
1444
1445     switch(o->type)
1446     {
1447         case D3D10_EOT_VERTEXSHADER:
1448             ID3D10Device_VSSetShader(device, ((struct d3d10_effect_shader_variable *)o->data)->shader.vs);
1449             return S_OK;
1450
1451         case D3D10_EOT_PIXELSHADER:
1452             ID3D10Device_PSSetShader(device, ((struct d3d10_effect_shader_variable *)o->data)->shader.ps);
1453             return S_OK;
1454
1455         case D3D10_EOT_GEOMETRYSHADER:
1456             ID3D10Device_GSSetShader(device, ((struct d3d10_effect_shader_variable *)o->data)->shader.gs);
1457             return S_OK;
1458
1459         default:
1460             FIXME("Unhandled effect object type %#x.\n", o->type);
1461             return E_FAIL;
1462     }
1463 }
1464
1465 static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
1466 {
1467     unsigned int i;
1468
1469     TRACE("variable %p.\n", v);
1470
1471     HeapFree(GetProcessHeap(), 0, v->name);
1472     HeapFree(GetProcessHeap(), 0, v->semantic);
1473     if (v->annotations)
1474     {
1475         for (i = 0; i < v->annotation_count; ++i)
1476         {
1477             d3d10_effect_variable_destroy(&v->annotations[i]);
1478         }
1479         HeapFree(GetProcessHeap(), 0, v->annotations);
1480     }
1481
1482     if (v->members)
1483     {
1484         for (i = 0; i < v->type->member_count; ++i)
1485         {
1486             d3d10_effect_variable_destroy(&v->members[i]);
1487         }
1488         HeapFree(GetProcessHeap(), 0, v->members);
1489     }
1490
1491     if (v->elements)
1492     {
1493         for (i = 0; i < v->type->element_count; ++i)
1494         {
1495             d3d10_effect_variable_destroy(&v->elements[i]);
1496         }
1497         HeapFree(GetProcessHeap(), 0, v->elements);
1498     }
1499 }
1500
1501 static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
1502 {
1503     unsigned int i;
1504
1505     TRACE("pass %p\n", p);
1506
1507     HeapFree(GetProcessHeap(), 0, p->name);
1508     if (p->objects)
1509     {
1510         for (i = 0; i < p->object_count; ++i)
1511         {
1512             d3d10_effect_object_destroy(&p->objects[i]);
1513         }
1514         HeapFree(GetProcessHeap(), 0, p->objects);
1515     }
1516
1517     if (p->annotations)
1518     {
1519         for (i = 0; i < p->annotation_count; ++i)
1520         {
1521             d3d10_effect_variable_destroy(&p->annotations[i]);
1522         }
1523         HeapFree(GetProcessHeap(), 0, p->annotations);
1524     }
1525
1526 }
1527
1528 static void d3d10_effect_technique_destroy(struct d3d10_effect_technique *t)
1529 {
1530     unsigned int i;
1531
1532     TRACE("technique %p\n", t);
1533
1534     HeapFree(GetProcessHeap(), 0, t->name);
1535     if (t->passes)
1536     {
1537         for (i = 0; i < t->pass_count; ++i)
1538         {
1539             d3d10_effect_pass_destroy(&t->passes[i]);
1540         }
1541         HeapFree(GetProcessHeap(), 0, t->passes);
1542     }
1543
1544     if (t->annotations)
1545     {
1546         for (i = 0; i < t->annotation_count; ++i)
1547         {
1548             d3d10_effect_variable_destroy(&t->annotations[i]);
1549         }
1550         HeapFree(GetProcessHeap(), 0, t->annotations);
1551     }
1552 }
1553
1554 static void d3d10_effect_local_buffer_destroy(struct d3d10_effect_variable *l)
1555 {
1556     unsigned int i;
1557
1558     TRACE("local buffer %p.\n", l);
1559
1560     HeapFree(GetProcessHeap(), 0, l->name);
1561     if (l->members)
1562     {
1563         for (i = 0; i < l->type->member_count; ++i)
1564         {
1565             d3d10_effect_variable_destroy(&l->members[i]);
1566         }
1567         HeapFree(GetProcessHeap(), 0, l->members);
1568     }
1569
1570     if (l->type->members)
1571     {
1572         for (i = 0; i < l->type->member_count; ++i)
1573         {
1574             /* Do not release l->type->members[i].type, it will be covered by d3d10_effect_type_destroy(). */
1575             HeapFree(GetProcessHeap(), 0, l->type->members[i].semantic);
1576             HeapFree(GetProcessHeap(), 0, l->type->members[i].name);
1577         }
1578         HeapFree(GetProcessHeap(), 0, l->type->members);
1579     }
1580     HeapFree(GetProcessHeap(), 0, l->type->name);
1581     HeapFree(GetProcessHeap(), 0, l->type);
1582
1583     if (l->annotations)
1584     {
1585         for (i = 0; i < l->annotation_count; ++i)
1586         {
1587             d3d10_effect_variable_destroy(&l->annotations[i]);
1588         }
1589         HeapFree(GetProcessHeap(), 0, l->annotations);
1590     }
1591 }
1592
1593 /* IUnknown methods */
1594
1595 static HRESULT STDMETHODCALLTYPE d3d10_effect_QueryInterface(ID3D10Effect *iface, REFIID riid, void **object)
1596 {
1597     TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
1598
1599     if (IsEqualGUID(riid, &IID_ID3D10Effect)
1600             || IsEqualGUID(riid, &IID_IUnknown))
1601     {
1602         IUnknown_AddRef(iface);
1603         *object = iface;
1604         return S_OK;
1605     }
1606
1607     WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
1608
1609     *object = NULL;
1610     return E_NOINTERFACE;
1611 }
1612
1613 static ULONG STDMETHODCALLTYPE d3d10_effect_AddRef(ID3D10Effect *iface)
1614 {
1615     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1616     ULONG refcount = InterlockedIncrement(&This->refcount);
1617
1618     TRACE("%p increasing refcount to %u\n", This, refcount);
1619
1620     return refcount;
1621 }
1622
1623 static ULONG STDMETHODCALLTYPE d3d10_effect_Release(ID3D10Effect *iface)
1624 {
1625     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1626     ULONG refcount = InterlockedDecrement(&This->refcount);
1627
1628     TRACE("%p decreasing refcount to %u\n", This, refcount);
1629
1630     if (!refcount)
1631     {
1632         unsigned int i;
1633
1634         if (This->techniques)
1635         {
1636             for (i = 0; i < This->technique_count; ++i)
1637             {
1638                 d3d10_effect_technique_destroy(&This->techniques[i]);
1639             }
1640             HeapFree(GetProcessHeap(), 0, This->techniques);
1641         }
1642
1643         if (This->local_variables)
1644         {
1645             for (i = 0; i < This->local_variable_count; ++i)
1646             {
1647                 d3d10_effect_variable_destroy(&This->local_variables[i]);
1648             }
1649             HeapFree(GetProcessHeap(), 0, &This->local_variables);
1650         }
1651
1652         if (This->local_buffers)
1653         {
1654             for (i = 0; i < This->local_buffer_count; ++i)
1655             {
1656                 d3d10_effect_local_buffer_destroy(&This->local_buffers[i]);
1657             }
1658             HeapFree(GetProcessHeap(), 0, This->local_buffers);
1659         }
1660
1661         wine_rb_destroy(&This->types, d3d10_effect_type_destroy, NULL);
1662
1663         ID3D10Device_Release(This->device);
1664         HeapFree(GetProcessHeap(), 0, This);
1665     }
1666
1667     return refcount;
1668 }
1669
1670 /* ID3D10Effect methods */
1671
1672 static BOOL STDMETHODCALLTYPE d3d10_effect_IsValid(ID3D10Effect *iface)
1673 {
1674     FIXME("iface %p stub!\n", iface);
1675
1676     return FALSE;
1677 }
1678
1679 static BOOL STDMETHODCALLTYPE d3d10_effect_IsPool(ID3D10Effect *iface)
1680 {
1681     FIXME("iface %p stub!\n", iface);
1682
1683     return FALSE;
1684 }
1685
1686 static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDevice(ID3D10Effect *iface, ID3D10Device **device)
1687 {
1688     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1689
1690     TRACE("iface %p, device %p\n", iface, device);
1691
1692     ID3D10Device_AddRef(This->device);
1693     *device = This->device;
1694
1695     return S_OK;
1696 }
1697
1698 static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDesc(ID3D10Effect *iface, D3D10_EFFECT_DESC *desc)
1699 {
1700     FIXME("iface %p, desc %p stub!\n", iface, desc);
1701
1702     return E_NOTIMPL;
1703 }
1704
1705 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_GetConstantBufferByIndex(ID3D10Effect *iface,
1706         UINT index)
1707 {
1708     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1709     struct d3d10_effect_variable *l;
1710
1711     TRACE("iface %p, index %u\n", iface, index);
1712
1713     if (index >= This->local_buffer_count)
1714     {
1715         WARN("Invalid index specified\n");
1716         return (ID3D10EffectConstantBuffer *)&null_local_buffer;
1717     }
1718
1719     l = &This->local_buffers[index];
1720
1721     TRACE("Returning buffer %p, %s.\n", l, debugstr_a(l->name));
1722
1723     return (ID3D10EffectConstantBuffer *)l;
1724 }
1725
1726 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_GetConstantBufferByName(ID3D10Effect *iface,
1727         LPCSTR name)
1728 {
1729     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1730     unsigned int i;
1731
1732     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
1733
1734     for (i = 0; i < This->local_buffer_count; ++i)
1735     {
1736         struct d3d10_effect_variable *l = &This->local_buffers[i];
1737
1738         if (!strcmp(l->name, name))
1739         {
1740             TRACE("Returning buffer %p.\n", l);
1741             return (ID3D10EffectConstantBuffer *)l;
1742         }
1743     }
1744
1745     WARN("Invalid name specified\n");
1746
1747     return (ID3D10EffectConstantBuffer *)&null_local_buffer;
1748 }
1749
1750 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableByIndex(ID3D10Effect *iface, UINT index)
1751 {
1752     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1753     unsigned int i;
1754
1755     TRACE("iface %p, index %u\n", iface, index);
1756
1757     for (i = 0; i < This->local_buffer_count; ++i)
1758     {
1759         struct d3d10_effect_variable *l = &This->local_buffers[i];
1760
1761         if (index < l->type->member_count)
1762         {
1763             struct d3d10_effect_variable *v = &l->members[index];
1764
1765             TRACE("Returning variable %p.\n", v);
1766             return (ID3D10EffectVariable *)v;
1767         }
1768         index -= l->type->member_count;
1769     }
1770
1771     if (index < This->local_variable_count)
1772     {
1773         struct d3d10_effect_variable *v = &This->local_variables[index];
1774
1775         TRACE("Returning variable %p.\n", v);
1776         return (ID3D10EffectVariable *)v;
1777     }
1778
1779     WARN("Invalid index specified\n");
1780
1781     return (ID3D10EffectVariable *)&null_variable;
1782 }
1783
1784 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableByName(ID3D10Effect *iface, LPCSTR name)
1785 {
1786     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1787     unsigned int i;
1788
1789     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
1790
1791     for (i = 0; i < This->local_buffer_count; ++i)
1792     {
1793         struct d3d10_effect_variable *l = &This->local_buffers[i];
1794         unsigned int j;
1795
1796         for (j = 0; j < l->type->member_count; ++j)
1797         {
1798             struct d3d10_effect_variable *v = &l->members[j];
1799
1800             if (!strcmp(v->name, name))
1801             {
1802                 TRACE("Returning variable %p.\n", v);
1803                 return (ID3D10EffectVariable *)v;
1804             }
1805         }
1806     }
1807
1808     WARN("Invalid name specified\n");
1809
1810     return (ID3D10EffectVariable *)&null_variable;
1811 }
1812
1813 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableBySemantic(ID3D10Effect *iface,
1814         LPCSTR semantic)
1815 {
1816     FIXME("iface %p, semantic %s stub!\n", iface, debugstr_a(semantic));
1817
1818     return NULL;
1819 }
1820
1821 static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByIndex(ID3D10Effect *iface,
1822         UINT index)
1823 {
1824     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1825     struct d3d10_effect_technique *t;
1826
1827     TRACE("iface %p, index %u\n", iface, index);
1828
1829     if (index >= This->technique_count)
1830     {
1831         WARN("Invalid index specified\n");
1832         return (ID3D10EffectTechnique *)&null_technique;
1833     }
1834
1835     t = &This->techniques[index];
1836
1837     TRACE("Returning technique %p, %s.\n", t, debugstr_a(t->name));
1838
1839     return (ID3D10EffectTechnique *)t;
1840 }
1841
1842 static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByName(ID3D10Effect *iface,
1843         LPCSTR name)
1844 {
1845     struct d3d10_effect *This = (struct d3d10_effect *)iface;
1846     unsigned int i;
1847
1848     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
1849
1850     for (i = 0; i < This->technique_count; ++i)
1851     {
1852         struct d3d10_effect_technique *t = &This->techniques[i];
1853         if (!strcmp(t->name, name))
1854         {
1855             TRACE("Returning technique %p\n", t);
1856             return (ID3D10EffectTechnique *)t;
1857         }
1858     }
1859
1860     WARN("Invalid name specified\n");
1861
1862     return (ID3D10EffectTechnique *)&null_technique;
1863 }
1864
1865 static HRESULT STDMETHODCALLTYPE d3d10_effect_Optimize(ID3D10Effect *iface)
1866 {
1867     FIXME("iface %p stub!\n", iface);
1868
1869     return E_NOTIMPL;
1870 }
1871
1872 static BOOL STDMETHODCALLTYPE d3d10_effect_IsOptimized(ID3D10Effect *iface)
1873 {
1874     FIXME("iface %p stub!\n", iface);
1875
1876     return FALSE;
1877 }
1878
1879 const struct ID3D10EffectVtbl d3d10_effect_vtbl =
1880 {
1881     /* IUnknown methods */
1882     d3d10_effect_QueryInterface,
1883     d3d10_effect_AddRef,
1884     d3d10_effect_Release,
1885     /* ID3D10Effect methods */
1886     d3d10_effect_IsValid,
1887     d3d10_effect_IsPool,
1888     d3d10_effect_GetDevice,
1889     d3d10_effect_GetDesc,
1890     d3d10_effect_GetConstantBufferByIndex,
1891     d3d10_effect_GetConstantBufferByName,
1892     d3d10_effect_GetVariableByIndex,
1893     d3d10_effect_GetVariableByName,
1894     d3d10_effect_GetVariableBySemantic,
1895     d3d10_effect_GetTechniqueByIndex,
1896     d3d10_effect_GetTechniqueByName,
1897     d3d10_effect_Optimize,
1898     d3d10_effect_IsOptimized,
1899 };
1900
1901 /* ID3D10EffectTechnique methods */
1902
1903 static BOOL STDMETHODCALLTYPE d3d10_effect_technique_IsValid(ID3D10EffectTechnique *iface)
1904 {
1905     TRACE("iface %p\n", iface);
1906
1907     return (struct d3d10_effect_technique *)iface != &null_technique;
1908 }
1909
1910 static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_GetDesc(ID3D10EffectTechnique *iface,
1911         D3D10_TECHNIQUE_DESC *desc)
1912 {
1913     struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
1914
1915     TRACE("iface %p, desc %p\n", iface, desc);
1916
1917     if(This == &null_technique)
1918     {
1919         WARN("Null technique specified\n");
1920         return E_FAIL;
1921     }
1922
1923     if(!desc)
1924     {
1925         WARN("Invalid argument specified\n");
1926         return E_INVALIDARG;
1927     }
1928
1929     desc->Name = This->name;
1930     desc->Passes = This->pass_count;
1931     desc->Annotations = This->annotation_count;
1932
1933     return S_OK;
1934 }
1935
1936 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByIndex(
1937         ID3D10EffectTechnique *iface, UINT index)
1938 {
1939     struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
1940     struct d3d10_effect_variable *a;
1941
1942     TRACE("iface %p, index %u\n", iface, index);
1943
1944     if (index >= This->annotation_count)
1945     {
1946         WARN("Invalid index specified\n");
1947         return (ID3D10EffectVariable *)&null_variable;
1948     }
1949
1950     a = &This->annotations[index];
1951
1952     TRACE("Returning annotation %p, %s\n", a, debugstr_a(a->name));
1953
1954     return (ID3D10EffectVariable *)a;
1955 }
1956
1957 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByName(
1958         ID3D10EffectTechnique *iface, LPCSTR name)
1959 {
1960     struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
1961     unsigned int i;
1962
1963     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
1964
1965     for (i = 0; i < This->annotation_count; ++i)
1966     {
1967         struct d3d10_effect_variable *a = &This->annotations[i];
1968         if (!strcmp(a->name, name))
1969         {
1970             TRACE("Returning annotation %p\n", a);
1971             return (ID3D10EffectVariable *)a;
1972         }
1973     }
1974
1975     WARN("Invalid name specified\n");
1976
1977     return (ID3D10EffectVariable *)&null_variable;
1978 }
1979
1980 static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByIndex(ID3D10EffectTechnique *iface,
1981         UINT index)
1982 {
1983     struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
1984     struct d3d10_effect_pass *p;
1985
1986     TRACE("iface %p, index %u\n", iface, index);
1987
1988     if (index >= This->pass_count)
1989     {
1990         WARN("Invalid index specified\n");
1991         return (ID3D10EffectPass *)&null_pass;
1992     }
1993
1994     p = &This->passes[index];
1995
1996     TRACE("Returning pass %p, %s.\n", p, debugstr_a(p->name));
1997
1998     return (ID3D10EffectPass *)p;
1999 }
2000
2001 static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByName(ID3D10EffectTechnique *iface,
2002         LPCSTR name)
2003 {
2004     struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
2005     unsigned int i;
2006
2007     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2008
2009     for (i = 0; i < This->pass_count; ++i)
2010     {
2011         struct d3d10_effect_pass *p = &This->passes[i];
2012         if (!strcmp(p->name, name))
2013         {
2014             TRACE("Returning pass %p\n", p);
2015             return (ID3D10EffectPass *)p;
2016         }
2017     }
2018
2019     WARN("Invalid name specified\n");
2020
2021     return (ID3D10EffectPass *)&null_pass;
2022 }
2023
2024 static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_ComputeStateBlockMask(ID3D10EffectTechnique *iface,
2025         D3D10_STATE_BLOCK_MASK *mask)
2026 {
2027     FIXME("iface %p,mask %p stub!\n", iface, mask);
2028
2029     return E_NOTIMPL;
2030 }
2031
2032 static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl =
2033 {
2034     /* ID3D10EffectTechnique methods */
2035     d3d10_effect_technique_IsValid,
2036     d3d10_effect_technique_GetDesc,
2037     d3d10_effect_technique_GetAnnotationByIndex,
2038     d3d10_effect_technique_GetAnnotationByName,
2039     d3d10_effect_technique_GetPassByIndex,
2040     d3d10_effect_technique_GetPassByName,
2041     d3d10_effect_technique_ComputeStateBlockMask,
2042 };
2043
2044 /* ID3D10EffectPass methods */
2045
2046 static BOOL STDMETHODCALLTYPE d3d10_effect_pass_IsValid(ID3D10EffectPass *iface)
2047 {
2048     TRACE("iface %p\n", iface);
2049
2050     return (struct d3d10_effect_pass *)iface != &null_pass;
2051 }
2052
2053 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *iface, D3D10_PASS_DESC *desc)
2054 {
2055     struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
2056     unsigned int i;
2057
2058     FIXME("iface %p, desc %p partial stub!\n", iface, desc);
2059
2060     if(This == &null_pass)
2061     {
2062         WARN("Null pass specified\n");
2063         return E_FAIL;
2064     }
2065
2066     if(!desc)
2067     {
2068         WARN("Invalid argument specified\n");
2069         return E_INVALIDARG;
2070     }
2071
2072     memset(desc, 0, sizeof(*desc));
2073     desc->Name = This->name;
2074     for (i = 0; i < This->object_count; ++i)
2075     {
2076         struct d3d10_effect_object *o = &This->objects[i];
2077         if (o->type == D3D10_EOT_VERTEXSHADER)
2078         {
2079             struct d3d10_effect_shader_variable *s = o->data;
2080             desc->pIAInputSignature = (BYTE *)s->input_signature;
2081             desc->IAInputSignatureSize = s->input_signature_size;
2082             break;
2083         }
2084     }
2085
2086     return S_OK;
2087 }
2088
2089 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetVertexShaderDesc(ID3D10EffectPass *iface,
2090         D3D10_PASS_SHADER_DESC *desc)
2091 {
2092     FIXME("iface %p, desc %p stub!\n", iface, desc);
2093
2094     return E_NOTIMPL;
2095 }
2096
2097 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetGeometryShaderDesc(ID3D10EffectPass *iface,
2098         D3D10_PASS_SHADER_DESC *desc)
2099 {
2100     FIXME("iface %p, desc %p stub!\n", iface, desc);
2101
2102     return E_NOTIMPL;
2103 }
2104
2105 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetPixelShaderDesc(ID3D10EffectPass *iface,
2106         D3D10_PASS_SHADER_DESC *desc)
2107 {
2108     FIXME("iface %p, desc %p stub!\n", iface, desc);
2109
2110     return E_NOTIMPL;
2111 }
2112
2113 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByIndex(ID3D10EffectPass *iface,
2114         UINT index)
2115 {
2116     struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
2117     struct d3d10_effect_variable *a;
2118
2119     TRACE("iface %p, index %u\n", iface, index);
2120
2121     if (index >= This->annotation_count)
2122     {
2123         WARN("Invalid index specified\n");
2124         return (ID3D10EffectVariable *)&null_variable;
2125     }
2126
2127     a = &This->annotations[index];
2128
2129     TRACE("Returning annotation %p, %s\n", a, debugstr_a(a->name));
2130
2131     return (ID3D10EffectVariable *)a;
2132 }
2133
2134 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByName(ID3D10EffectPass *iface,
2135         LPCSTR name)
2136 {
2137     struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
2138     unsigned int i;
2139
2140     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2141
2142     for (i = 0; i < This->annotation_count; ++i)
2143     {
2144         struct d3d10_effect_variable *a = &This->annotations[i];
2145         if (!strcmp(a->name, name))
2146         {
2147             TRACE("Returning annotation %p\n", a);
2148             return (ID3D10EffectVariable *)a;
2149         }
2150     }
2151
2152     WARN("Invalid name specified\n");
2153
2154     return (ID3D10EffectVariable *)&null_variable;
2155 }
2156
2157 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_Apply(ID3D10EffectPass *iface, UINT flags)
2158 {
2159     struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
2160     HRESULT hr = S_OK;
2161     unsigned int i;
2162
2163     TRACE("iface %p, flags %#x\n", iface, flags);
2164
2165     if (flags) FIXME("Ignoring flags (%#x)\n", flags);
2166
2167     for (i = 0; i < This->object_count; ++i)
2168     {
2169         hr = d3d10_effect_object_apply(&This->objects[i]);
2170         if (FAILED(hr)) break;
2171     }
2172
2173     return hr;
2174 }
2175
2176 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_ComputeStateBlockMask(ID3D10EffectPass *iface,
2177         D3D10_STATE_BLOCK_MASK *mask)
2178 {
2179     FIXME("iface %p, mask %p stub!\n", iface, mask);
2180
2181     return E_NOTIMPL;
2182 }
2183
2184 static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl =
2185 {
2186     /* ID3D10EffectPass methods */
2187     d3d10_effect_pass_IsValid,
2188     d3d10_effect_pass_GetDesc,
2189     d3d10_effect_pass_GetVertexShaderDesc,
2190     d3d10_effect_pass_GetGeometryShaderDesc,
2191     d3d10_effect_pass_GetPixelShaderDesc,
2192     d3d10_effect_pass_GetAnnotationByIndex,
2193     d3d10_effect_pass_GetAnnotationByName,
2194     d3d10_effect_pass_Apply,
2195     d3d10_effect_pass_ComputeStateBlockMask,
2196 };
2197
2198 /* ID3D10EffectVariable methods */
2199
2200 static BOOL STDMETHODCALLTYPE d3d10_effect_variable_IsValid(ID3D10EffectVariable *iface)
2201 {
2202     TRACE("iface %p\n", iface);
2203
2204     return (struct d3d10_effect_variable *)iface != &null_variable;
2205 }
2206
2207 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_variable_GetType(ID3D10EffectVariable *iface)
2208 {
2209     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2210
2211     TRACE("iface %p\n", iface);
2212
2213     return (ID3D10EffectType *)This->type;
2214 }
2215
2216 static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_GetDesc(ID3D10EffectVariable *iface,
2217         D3D10_EFFECT_VARIABLE_DESC *desc)
2218 {
2219     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2220
2221     TRACE("iface %p, desc %p\n", iface, desc);
2222
2223     if(This == &null_variable)
2224     {
2225         WARN("Null variable specified\n");
2226         return E_FAIL;
2227     }
2228
2229     if(!desc)
2230     {
2231         WARN("Invalid argument specified\n");
2232         return E_INVALIDARG;
2233     }
2234
2235     memset(desc, 0, sizeof(*desc));
2236     desc->Name = This->name;
2237     desc->Semantic = This->semantic;
2238     desc->Flags = This->flag;
2239     desc->Annotations = This->annotation_count;
2240     desc->BufferOffset = This->buffer_offset;
2241
2242     if( This->flag == D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
2243     {
2244         desc->ExplicitBindPoint = This->buffer_offset;
2245     }
2246     else if(This->flag)
2247     {
2248         FIXME("Unhandled flag %#x!\n", This->flag);
2249     }
2250
2251     return S_OK;
2252 }
2253
2254 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetAnnotationByIndex(
2255         ID3D10EffectVariable *iface, UINT index)
2256 {
2257     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2258     struct d3d10_effect_variable *a;
2259
2260     TRACE("iface %p, index %u\n", iface, index);
2261
2262     if (index >= This->annotation_count)
2263     {
2264         WARN("Invalid index specified\n");
2265         return (ID3D10EffectVariable *)&null_variable;
2266     }
2267
2268     a = &This->annotations[index];
2269
2270     TRACE("Returning annotation %p, %s\n", a, debugstr_a(a->name));
2271
2272     return (ID3D10EffectVariable *)a;
2273 }
2274
2275 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetAnnotationByName(
2276         ID3D10EffectVariable *iface, LPCSTR name)
2277 {
2278     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2279     unsigned int i;
2280
2281     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2282
2283     for (i = 0; i < This->annotation_count; ++i)
2284     {
2285         struct d3d10_effect_variable *a = &This->annotations[i];
2286         if (!strcmp(a->name, name))
2287         {
2288             TRACE("Returning annotation %p\n", a);
2289             return (ID3D10EffectVariable *)a;
2290         }
2291     }
2292
2293     WARN("Invalid name specified\n");
2294
2295     return (ID3D10EffectVariable *)&null_variable;
2296 }
2297
2298 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetMemberByIndex(
2299         ID3D10EffectVariable *iface, UINT index)
2300 {
2301     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2302     struct d3d10_effect_variable *m;
2303
2304     TRACE("iface %p, index %u\n", iface, index);
2305
2306     if (index >= This->type->member_count)
2307     {
2308         WARN("Invalid index specified\n");
2309         return (ID3D10EffectVariable *)&null_variable;
2310     }
2311
2312     m = &This->members[index];
2313
2314     TRACE("Returning member %p, %s\n", m, debugstr_a(m->name));
2315
2316     return (ID3D10EffectVariable *)m;
2317 }
2318
2319 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetMemberByName(
2320         ID3D10EffectVariable *iface, LPCSTR name)
2321 {
2322     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2323     unsigned int i;
2324
2325     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2326
2327     if (!name)
2328     {
2329         WARN("Invalid name specified\n");
2330         return (ID3D10EffectVariable *)&null_variable;
2331     }
2332
2333     for (i = 0; i < This->type->member_count; ++i)
2334     {
2335         struct d3d10_effect_variable *m = &This->members[i];
2336
2337         if (m->name)
2338         {
2339             if (!strcmp(m->name, name))
2340             {
2341                 TRACE("Returning member %p\n", m);
2342                 return (ID3D10EffectVariable *)m;
2343             }
2344         }
2345     }
2346
2347     WARN("Invalid name specified\n");
2348
2349     return (ID3D10EffectVariable *)&null_variable;
2350 }
2351
2352 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetMemberBySemantic(
2353         ID3D10EffectVariable *iface, LPCSTR semantic)
2354 {
2355     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2356     unsigned int i;
2357
2358     TRACE("iface %p, semantic %s.\n", iface, debugstr_a(semantic));
2359
2360     if (!semantic)
2361     {
2362         WARN("Invalid semantic specified\n");
2363         return (ID3D10EffectVariable *)&null_variable;
2364     }
2365
2366     for (i = 0; i < This->type->member_count; ++i)
2367     {
2368         struct d3d10_effect_variable *m = &This->members[i];
2369
2370         if (m->semantic)
2371         {
2372             if (!strcmp(m->semantic, semantic))
2373             {
2374                 TRACE("Returning member %p\n", m);
2375                 return (ID3D10EffectVariable *)m;
2376             }
2377         }
2378     }
2379
2380     WARN("Invalid semantic specified\n");
2381
2382     return (ID3D10EffectVariable *)&null_variable;
2383 }
2384
2385 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_variable_GetElement(
2386         ID3D10EffectVariable *iface, UINT index)
2387 {
2388     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2389     struct d3d10_effect_variable *v;
2390
2391     TRACE("iface %p, index %u\n", iface, index);
2392
2393     if (index >= This->type->element_count)
2394     {
2395         WARN("Invalid index specified\n");
2396         return (ID3D10EffectVariable *)&null_variable;
2397     }
2398
2399     v = &This->elements[index];
2400
2401     TRACE("Returning element %p, %s\n", v, debugstr_a(v->name));
2402
2403     return (ID3D10EffectVariable *)v;
2404 }
2405
2406 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_variable_GetParentConstantBuffer(
2407         ID3D10EffectVariable *iface)
2408 {
2409     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2410
2411     TRACE("iface %p\n", iface);
2412
2413     return (ID3D10EffectConstantBuffer *)This->buffer;
2414 }
2415
2416 static struct ID3D10EffectScalarVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsScalar(
2417         ID3D10EffectVariable *iface)
2418 {
2419     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2420
2421     TRACE("iface %p\n", iface);
2422
2423     if (This->vtbl == (ID3D10EffectVariableVtbl *)&d3d10_effect_scalar_variable_vtbl)
2424         return (ID3D10EffectScalarVariable *)This;
2425
2426     return (ID3D10EffectScalarVariable *)&null_scalar_variable;
2427 }
2428
2429 static struct ID3D10EffectVectorVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsVector(
2430         ID3D10EffectVariable *iface)
2431 {
2432     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2433
2434     TRACE("iface %p\n", iface);
2435
2436     if (This->vtbl == (ID3D10EffectVariableVtbl *)&d3d10_effect_vector_variable_vtbl)
2437         return (ID3D10EffectVectorVariable *)This;
2438
2439     return (ID3D10EffectVectorVariable *)&null_vector_variable;
2440 }
2441
2442 static struct ID3D10EffectMatrixVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsMatrix(
2443         ID3D10EffectVariable *iface)
2444 {
2445     struct d3d10_effect_variable *This = (struct d3d10_effect_variable *)iface;
2446
2447     TRACE("iface %p\n", iface);
2448
2449     if (This->vtbl == (ID3D10EffectVariableVtbl *)&d3d10_effect_matrix_variable_vtbl)
2450         return (ID3D10EffectMatrixVariable *)This;
2451
2452     return (ID3D10EffectMatrixVariable *)&null_matrix_variable;
2453 }
2454
2455 static struct ID3D10EffectStringVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsString(
2456         ID3D10EffectVariable *iface)
2457 {
2458     FIXME("iface %p stub!\n", iface);
2459
2460     return NULL;
2461 }
2462
2463 static struct ID3D10EffectShaderResourceVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsShaderResource(
2464         ID3D10EffectVariable *iface)
2465 {
2466     FIXME("iface %p stub!\n", iface);
2467
2468     return NULL;
2469 }
2470
2471 static struct ID3D10EffectRenderTargetViewVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsRenderTargetView(
2472         ID3D10EffectVariable *iface)
2473 {
2474     FIXME("iface %p stub!\n", iface);
2475
2476     return NULL;
2477 }
2478
2479 static struct ID3D10EffectDepthStencilViewVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsDepthStencilView(
2480         ID3D10EffectVariable *iface)
2481 {
2482     FIXME("iface %p stub!\n", iface);
2483
2484     return NULL;
2485 }
2486
2487 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_variable_AsConstantBuffer(
2488         ID3D10EffectVariable *iface)
2489 {
2490     FIXME("iface %p stub!\n", iface);
2491
2492     return NULL;
2493 }
2494
2495 static struct ID3D10EffectShaderVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsShader(
2496         ID3D10EffectVariable *iface)
2497 {
2498     FIXME("iface %p stub!\n", iface);
2499
2500     return NULL;
2501 }
2502
2503 static struct ID3D10EffectBlendVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsBlend(ID3D10EffectVariable *iface)
2504 {
2505     FIXME("iface %p stub!\n", iface);
2506
2507     return NULL;
2508 }
2509
2510 static struct ID3D10EffectDepthStencilVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsDepthStencil(
2511         ID3D10EffectVariable *iface)
2512 {
2513     FIXME("iface %p stub!\n", iface);
2514
2515     return NULL;
2516 }
2517
2518 static struct ID3D10EffectRasterizerVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsRasterizer(
2519         ID3D10EffectVariable *iface)
2520 {
2521     FIXME("iface %p stub!\n", iface);
2522
2523     return NULL;
2524 }
2525
2526 static struct ID3D10EffectSamplerVariable * STDMETHODCALLTYPE d3d10_effect_variable_AsSampler(
2527         ID3D10EffectVariable *iface)
2528 {
2529     FIXME("iface %p stub!\n", iface);
2530
2531     return NULL;
2532 }
2533
2534 static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_SetRawValue(ID3D10EffectVariable *iface,
2535         void *data, UINT offset, UINT count)
2536 {
2537     FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface, data, offset, count);
2538
2539     return E_NOTIMPL;
2540 }
2541
2542 static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_GetRawValue(ID3D10EffectVariable *iface,
2543         void *data, UINT offset, UINT count)
2544 {
2545     FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface, data, offset, count);
2546
2547     return E_NOTIMPL;
2548 }
2549
2550 static const struct ID3D10EffectVariableVtbl d3d10_effect_variable_vtbl =
2551 {
2552     /* ID3D10EffectVariable methods */
2553     d3d10_effect_variable_IsValid,
2554     d3d10_effect_variable_GetType,
2555     d3d10_effect_variable_GetDesc,
2556     d3d10_effect_variable_GetAnnotationByIndex,
2557     d3d10_effect_variable_GetAnnotationByName,
2558     d3d10_effect_variable_GetMemberByIndex,
2559     d3d10_effect_variable_GetMemberByName,
2560     d3d10_effect_variable_GetMemberBySemantic,
2561     d3d10_effect_variable_GetElement,
2562     d3d10_effect_variable_GetParentConstantBuffer,
2563     d3d10_effect_variable_AsScalar,
2564     d3d10_effect_variable_AsVector,
2565     d3d10_effect_variable_AsMatrix,
2566     d3d10_effect_variable_AsString,
2567     d3d10_effect_variable_AsShaderResource,
2568     d3d10_effect_variable_AsRenderTargetView,
2569     d3d10_effect_variable_AsDepthStencilView,
2570     d3d10_effect_variable_AsConstantBuffer,
2571     d3d10_effect_variable_AsShader,
2572     d3d10_effect_variable_AsBlend,
2573     d3d10_effect_variable_AsDepthStencil,
2574     d3d10_effect_variable_AsRasterizer,
2575     d3d10_effect_variable_AsSampler,
2576     d3d10_effect_variable_SetRawValue,
2577     d3d10_effect_variable_GetRawValue,
2578 };
2579
2580 /* ID3D10EffectVariable methods */
2581 static BOOL STDMETHODCALLTYPE d3d10_effect_constant_buffer_IsValid(ID3D10EffectConstantBuffer *iface)
2582 {
2583     TRACE("iface %p\n", iface);
2584
2585     return (struct d3d10_effect_variable *)iface != &null_local_buffer;
2586 }
2587
2588 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetType(ID3D10EffectConstantBuffer *iface)
2589 {
2590     return d3d10_effect_variable_GetType((ID3D10EffectVariable *)iface);
2591 }
2592
2593 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetDesc(ID3D10EffectConstantBuffer *iface,
2594         D3D10_EFFECT_VARIABLE_DESC *desc)
2595 {
2596     return d3d10_effect_variable_GetDesc((ID3D10EffectVariable *)iface, desc);
2597 }
2598
2599 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetAnnotationByIndex(
2600         ID3D10EffectConstantBuffer *iface, UINT index)
2601 {
2602     return d3d10_effect_variable_GetAnnotationByIndex((ID3D10EffectVariable *)iface, index);
2603 }
2604
2605 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetAnnotationByName(
2606         ID3D10EffectConstantBuffer *iface, LPCSTR name)
2607 {
2608     return d3d10_effect_variable_GetAnnotationByName((ID3D10EffectVariable *)iface, name);
2609 }
2610
2611 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetMemberByIndex(
2612         ID3D10EffectConstantBuffer *iface, UINT index)
2613 {
2614     return d3d10_effect_variable_GetMemberByIndex((ID3D10EffectVariable *)iface, index);
2615 }
2616
2617 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetMemberByName(
2618         ID3D10EffectConstantBuffer *iface, LPCSTR name)
2619 {
2620     return d3d10_effect_variable_GetMemberByName((ID3D10EffectVariable *)iface, name);
2621 }
2622
2623 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetMemberBySemantic(
2624         ID3D10EffectConstantBuffer *iface, LPCSTR semantic)
2625 {
2626     return d3d10_effect_variable_GetMemberBySemantic((ID3D10EffectVariable *)iface, semantic);
2627 }
2628
2629 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetElement(
2630         ID3D10EffectConstantBuffer *iface, UINT index)
2631 {
2632     return d3d10_effect_variable_GetElement((ID3D10EffectVariable *)iface, index);
2633 }
2634
2635 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetParentConstantBuffer(
2636         ID3D10EffectConstantBuffer *iface)
2637 {
2638     return d3d10_effect_variable_GetParentConstantBuffer((ID3D10EffectVariable *)iface);
2639 }
2640
2641 static struct ID3D10EffectScalarVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsScalar(
2642         ID3D10EffectConstantBuffer *iface)
2643 {
2644     return d3d10_effect_variable_AsScalar((ID3D10EffectVariable *)iface);
2645 }
2646
2647 static struct ID3D10EffectVectorVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsVector(
2648         ID3D10EffectConstantBuffer *iface)
2649 {
2650     return d3d10_effect_variable_AsVector((ID3D10EffectVariable *)iface);
2651 }
2652
2653 static struct ID3D10EffectMatrixVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsMatrix(
2654         ID3D10EffectConstantBuffer *iface)
2655 {
2656     return d3d10_effect_variable_AsMatrix((ID3D10EffectVariable *)iface);
2657 }
2658
2659 static struct ID3D10EffectStringVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsString(
2660         ID3D10EffectConstantBuffer *iface)
2661 {
2662     return d3d10_effect_variable_AsString((ID3D10EffectVariable *)iface);
2663 }
2664
2665 static struct ID3D10EffectShaderResourceVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsShaderResource(
2666         ID3D10EffectConstantBuffer *iface)
2667 {
2668     return d3d10_effect_variable_AsShaderResource((ID3D10EffectVariable *)iface);
2669 }
2670
2671 static struct ID3D10EffectRenderTargetViewVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsRenderTargetView(
2672         ID3D10EffectConstantBuffer *iface)
2673 {
2674     return d3d10_effect_variable_AsRenderTargetView((ID3D10EffectVariable *)iface);
2675 }
2676
2677 static struct ID3D10EffectDepthStencilViewVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsDepthStencilView(
2678         ID3D10EffectConstantBuffer *iface)
2679 {
2680     return d3d10_effect_variable_AsDepthStencilView((ID3D10EffectVariable *)iface);
2681 }
2682
2683 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsConstantBuffer(
2684         ID3D10EffectConstantBuffer *iface)
2685 {
2686     return d3d10_effect_variable_AsConstantBuffer((ID3D10EffectVariable *)iface);
2687 }
2688
2689 static struct ID3D10EffectShaderVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsShader(
2690         ID3D10EffectConstantBuffer *iface)
2691 {
2692     return d3d10_effect_variable_AsShader((ID3D10EffectVariable *)iface);
2693 }
2694
2695 static struct ID3D10EffectBlendVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsBlend(ID3D10EffectConstantBuffer *iface)
2696 {
2697     return d3d10_effect_variable_AsBlend((ID3D10EffectVariable *)iface);
2698 }
2699
2700 static struct ID3D10EffectDepthStencilVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsDepthStencil(
2701         ID3D10EffectConstantBuffer *iface)
2702 {
2703     return d3d10_effect_variable_AsDepthStencil((ID3D10EffectVariable *)iface);
2704 }
2705
2706 static struct ID3D10EffectRasterizerVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsRasterizer(
2707         ID3D10EffectConstantBuffer *iface)
2708 {
2709     return d3d10_effect_variable_AsRasterizer((ID3D10EffectVariable *)iface);
2710 }
2711
2712 static struct ID3D10EffectSamplerVariable * STDMETHODCALLTYPE d3d10_effect_constant_buffer_AsSampler(
2713         ID3D10EffectConstantBuffer *iface)
2714 {
2715     return d3d10_effect_variable_AsSampler((ID3D10EffectVariable *)iface);
2716 }
2717
2718 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_SetRawValue(ID3D10EffectConstantBuffer *iface,
2719         void *data, UINT offset, UINT count)
2720 {
2721     return d3d10_effect_variable_SetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
2722 }
2723
2724 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetRawValue(ID3D10EffectConstantBuffer *iface,
2725         void *data, UINT offset, UINT count)
2726 {
2727     return d3d10_effect_variable_GetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
2728 }
2729
2730 /* ID3D10EffectConstantBuffer methods */
2731 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_SetConstantBuffer(ID3D10EffectConstantBuffer *iface,
2732         ID3D10Buffer *buffer)
2733 {
2734     FIXME("iface %p, buffer %p stub!\n", iface, buffer);
2735
2736     return E_NOTIMPL;
2737 }
2738
2739 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetConstantBuffer(ID3D10EffectConstantBuffer *iface,
2740         ID3D10Buffer **buffer)
2741 {
2742     FIXME("iface %p, buffer %p stub!\n", iface, buffer);
2743
2744     return E_NOTIMPL;
2745 }
2746
2747 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_SetTextureBuffer(ID3D10EffectConstantBuffer *iface,
2748         ID3D10ShaderResourceView *view)
2749 {
2750     FIXME("iface %p, view %p stub!\n", iface, view);
2751
2752     return E_NOTIMPL;
2753 }
2754
2755 static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetTextureBuffer(ID3D10EffectConstantBuffer *iface,
2756         ID3D10ShaderResourceView **view)
2757 {
2758     FIXME("iface %p, view %p stub!\n", iface, view);
2759
2760     return E_NOTIMPL;
2761 }
2762
2763 static const struct ID3D10EffectConstantBufferVtbl d3d10_effect_constant_buffer_vtbl =
2764 {
2765     /* ID3D10EffectVariable methods */
2766     d3d10_effect_constant_buffer_IsValid,
2767     d3d10_effect_constant_buffer_GetType,
2768     d3d10_effect_constant_buffer_GetDesc,
2769     d3d10_effect_constant_buffer_GetAnnotationByIndex,
2770     d3d10_effect_constant_buffer_GetAnnotationByName,
2771     d3d10_effect_constant_buffer_GetMemberByIndex,
2772     d3d10_effect_constant_buffer_GetMemberByName,
2773     d3d10_effect_constant_buffer_GetMemberBySemantic,
2774     d3d10_effect_constant_buffer_GetElement,
2775     d3d10_effect_constant_buffer_GetParentConstantBuffer,
2776     d3d10_effect_constant_buffer_AsScalar,
2777     d3d10_effect_constant_buffer_AsVector,
2778     d3d10_effect_constant_buffer_AsMatrix,
2779     d3d10_effect_constant_buffer_AsString,
2780     d3d10_effect_constant_buffer_AsShaderResource,
2781     d3d10_effect_constant_buffer_AsRenderTargetView,
2782     d3d10_effect_constant_buffer_AsDepthStencilView,
2783     d3d10_effect_constant_buffer_AsConstantBuffer,
2784     d3d10_effect_constant_buffer_AsShader,
2785     d3d10_effect_constant_buffer_AsBlend,
2786     d3d10_effect_constant_buffer_AsDepthStencil,
2787     d3d10_effect_constant_buffer_AsRasterizer,
2788     d3d10_effect_constant_buffer_AsSampler,
2789     d3d10_effect_constant_buffer_SetRawValue,
2790     d3d10_effect_constant_buffer_GetRawValue,
2791     /* ID3D10EffectConstantBuffer methods */
2792     d3d10_effect_constant_buffer_SetConstantBuffer,
2793     d3d10_effect_constant_buffer_GetConstantBuffer,
2794     d3d10_effect_constant_buffer_SetTextureBuffer,
2795     d3d10_effect_constant_buffer_GetTextureBuffer,
2796 };
2797
2798 /* ID3D10EffectVariable methods */
2799
2800 static BOOL STDMETHODCALLTYPE d3d10_effect_scalar_variable_IsValid(ID3D10EffectScalarVariable *iface)
2801 {
2802     TRACE("iface %p\n", iface);
2803
2804     return (struct d3d10_effect_variable *)iface != &null_scalar_variable;
2805 }
2806
2807 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetType(
2808         ID3D10EffectScalarVariable *iface)
2809 {
2810     return d3d10_effect_variable_GetType((ID3D10EffectVariable *)iface);
2811 }
2812
2813 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetDesc(ID3D10EffectScalarVariable *iface,
2814         D3D10_EFFECT_VARIABLE_DESC *desc)
2815 {
2816     return d3d10_effect_variable_GetDesc((ID3D10EffectVariable *)iface, desc);
2817 }
2818
2819 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetAnnotationByIndex(
2820         ID3D10EffectScalarVariable *iface, UINT index)
2821 {
2822     return d3d10_effect_variable_GetAnnotationByIndex((ID3D10EffectVariable *)iface, index);
2823 }
2824
2825 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetAnnotationByName(
2826         ID3D10EffectScalarVariable *iface, LPCSTR name)
2827 {
2828     return d3d10_effect_variable_GetAnnotationByName((ID3D10EffectVariable *)iface, name);
2829 }
2830
2831 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetMemberByIndex(
2832         ID3D10EffectScalarVariable *iface, UINT index)
2833 {
2834     return d3d10_effect_variable_GetMemberByIndex((ID3D10EffectVariable *)iface, index);
2835 }
2836
2837 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetMemberByName(
2838         ID3D10EffectScalarVariable *iface, LPCSTR name)
2839 {
2840     return d3d10_effect_variable_GetMemberByName((ID3D10EffectVariable *)iface, name);
2841 }
2842
2843 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetMemberBySemantic(
2844         ID3D10EffectScalarVariable *iface, LPCSTR semantic)
2845 {
2846     return d3d10_effect_variable_GetMemberBySemantic((ID3D10EffectVariable *)iface, semantic);
2847 }
2848
2849 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetElement(
2850         ID3D10EffectScalarVariable *iface, UINT index)
2851 {
2852     return d3d10_effect_variable_GetElement((ID3D10EffectVariable *)iface, index);
2853 }
2854
2855 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetParentConstantBuffer(
2856         ID3D10EffectScalarVariable *iface)
2857 {
2858     return d3d10_effect_variable_GetParentConstantBuffer((ID3D10EffectVariable *)iface);
2859 }
2860
2861 static struct ID3D10EffectScalarVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsScalar(
2862         ID3D10EffectScalarVariable *iface)
2863 {
2864     return d3d10_effect_variable_AsScalar((ID3D10EffectVariable *)iface);
2865 }
2866
2867 static struct ID3D10EffectVectorVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsVector(
2868         ID3D10EffectScalarVariable *iface)
2869 {
2870     return d3d10_effect_variable_AsVector((ID3D10EffectVariable *)iface);
2871 }
2872
2873 static struct ID3D10EffectMatrixVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsMatrix(
2874         ID3D10EffectScalarVariable *iface)
2875 {
2876     return d3d10_effect_variable_AsMatrix((ID3D10EffectVariable *)iface);
2877 }
2878
2879 static struct ID3D10EffectStringVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsString(
2880         ID3D10EffectScalarVariable *iface)
2881 {
2882     return d3d10_effect_variable_AsString((ID3D10EffectVariable *)iface);
2883 }
2884
2885 static struct ID3D10EffectShaderResourceVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsShaderResource(
2886         ID3D10EffectScalarVariable *iface)
2887 {
2888     return d3d10_effect_variable_AsShaderResource((ID3D10EffectVariable *)iface);
2889 }
2890
2891 static struct ID3D10EffectRenderTargetViewVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsRenderTargetView(
2892         ID3D10EffectScalarVariable *iface)
2893 {
2894     return d3d10_effect_variable_AsRenderTargetView((ID3D10EffectVariable *)iface);
2895 }
2896
2897 static struct ID3D10EffectDepthStencilViewVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsDepthStencilView(
2898         ID3D10EffectScalarVariable *iface)
2899 {
2900     return d3d10_effect_variable_AsDepthStencilView((ID3D10EffectVariable *)iface);
2901 }
2902
2903 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsConstantBuffer(
2904         ID3D10EffectScalarVariable *iface)
2905 {
2906     return d3d10_effect_variable_AsConstantBuffer((ID3D10EffectVariable *)iface);
2907 }
2908
2909 static struct ID3D10EffectShaderVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsShader(
2910         ID3D10EffectScalarVariable *iface)
2911 {
2912     return d3d10_effect_variable_AsShader((ID3D10EffectVariable *)iface);
2913 }
2914
2915 static struct ID3D10EffectBlendVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsBlend(
2916         ID3D10EffectScalarVariable *iface)
2917 {
2918     return d3d10_effect_variable_AsBlend((ID3D10EffectVariable *)iface);
2919 }
2920
2921 static struct ID3D10EffectDepthStencilVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsDepthStencil(
2922         ID3D10EffectScalarVariable *iface)
2923 {
2924     return d3d10_effect_variable_AsDepthStencil((ID3D10EffectVariable *)iface);
2925 }
2926
2927 static struct ID3D10EffectRasterizerVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsRasterizer(
2928         ID3D10EffectScalarVariable *iface)
2929 {
2930     return d3d10_effect_variable_AsRasterizer((ID3D10EffectVariable *)iface);
2931 }
2932
2933 static struct ID3D10EffectSamplerVariable * STDMETHODCALLTYPE d3d10_effect_scalar_variable_AsSampler(
2934         ID3D10EffectScalarVariable *iface)
2935 {
2936     return d3d10_effect_variable_AsSampler((ID3D10EffectVariable *)iface);
2937 }
2938
2939 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetRawValue(ID3D10EffectScalarVariable *iface,
2940         void *data, UINT offset, UINT count)
2941 {
2942     return d3d10_effect_variable_SetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
2943 }
2944
2945 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetRawValue(ID3D10EffectScalarVariable *iface,
2946         void *data, UINT offset, UINT count)
2947 {
2948     return d3d10_effect_variable_GetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
2949 }
2950
2951 /* ID3D10EffectScalarVariable methods */
2952
2953 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetFloat(ID3D10EffectScalarVariable *iface,
2954         float value)
2955 {
2956     FIXME("iface %p, value %.8e stub!\n", iface, value);
2957
2958     return E_NOTIMPL;
2959 }
2960
2961 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetFloat(ID3D10EffectScalarVariable *iface,
2962         float *value)
2963 {
2964     FIXME("iface %p, value %p stub!\n", iface, value);
2965
2966     return E_NOTIMPL;
2967 }
2968
2969 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetFloatArray(ID3D10EffectScalarVariable *iface,
2970         float *values, UINT offset, UINT count)
2971 {
2972     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
2973
2974     return E_NOTIMPL;
2975 }
2976
2977 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetFloatArray(ID3D10EffectScalarVariable *iface,
2978         float *values, UINT offset, UINT count)
2979 {
2980     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
2981
2982     return E_NOTIMPL;
2983 }
2984
2985 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetInt(ID3D10EffectScalarVariable *iface,
2986         int value)
2987 {
2988     FIXME("iface %p, value %d stub!\n", iface, value);
2989
2990     return E_NOTIMPL;
2991 }
2992
2993 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetInt(ID3D10EffectScalarVariable *iface,
2994         int *value)
2995 {
2996     FIXME("iface %p, value %p stub!\n", iface, value);
2997
2998     return E_NOTIMPL;
2999 }
3000
3001 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetIntArray(ID3D10EffectScalarVariable *iface,
3002         int *values, UINT offset, UINT count)
3003 {
3004     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3005
3006     return E_NOTIMPL;
3007 }
3008
3009 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetIntArray(ID3D10EffectScalarVariable *iface,
3010         int *values, UINT offset, UINT count)
3011 {
3012     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3013
3014     return E_NOTIMPL;
3015 }
3016
3017 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetBool(ID3D10EffectScalarVariable *iface,
3018         BOOL value)
3019 {
3020     FIXME("iface %p, value %d stub!\n", iface, value);
3021
3022     return E_NOTIMPL;
3023 }
3024
3025 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetBool(ID3D10EffectScalarVariable *iface,
3026         BOOL *value)
3027 {
3028     FIXME("iface %p, value %p stub!\n", iface, value);
3029
3030     return E_NOTIMPL;
3031 }
3032
3033 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_SetBoolArray(ID3D10EffectScalarVariable *iface,
3034         BOOL *values, UINT offset, UINT count)
3035 {
3036     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3037
3038     return E_NOTIMPL;
3039 }
3040
3041 static HRESULT STDMETHODCALLTYPE d3d10_effect_scalar_variable_GetBoolArray(ID3D10EffectScalarVariable *iface,
3042         BOOL *values, UINT offset, UINT count)
3043 {
3044     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3045
3046     return E_NOTIMPL;
3047 }
3048
3049 static const struct ID3D10EffectScalarVariableVtbl d3d10_effect_scalar_variable_vtbl =
3050 {
3051     /* ID3D10EffectVariable methods */
3052     d3d10_effect_scalar_variable_IsValid,
3053     d3d10_effect_scalar_variable_GetType,
3054     d3d10_effect_scalar_variable_GetDesc,
3055     d3d10_effect_scalar_variable_GetAnnotationByIndex,
3056     d3d10_effect_scalar_variable_GetAnnotationByName,
3057     d3d10_effect_scalar_variable_GetMemberByIndex,
3058     d3d10_effect_scalar_variable_GetMemberByName,
3059     d3d10_effect_scalar_variable_GetMemberBySemantic,
3060     d3d10_effect_scalar_variable_GetElement,
3061     d3d10_effect_scalar_variable_GetParentConstantBuffer,
3062     d3d10_effect_scalar_variable_AsScalar,
3063     d3d10_effect_scalar_variable_AsVector,
3064     d3d10_effect_scalar_variable_AsMatrix,
3065     d3d10_effect_scalar_variable_AsString,
3066     d3d10_effect_scalar_variable_AsShaderResource,
3067     d3d10_effect_scalar_variable_AsRenderTargetView,
3068     d3d10_effect_scalar_variable_AsDepthStencilView,
3069     d3d10_effect_scalar_variable_AsConstantBuffer,
3070     d3d10_effect_scalar_variable_AsShader,
3071     d3d10_effect_scalar_variable_AsBlend,
3072     d3d10_effect_scalar_variable_AsDepthStencil,
3073     d3d10_effect_scalar_variable_AsRasterizer,
3074     d3d10_effect_scalar_variable_AsSampler,
3075     d3d10_effect_scalar_variable_SetRawValue,
3076     d3d10_effect_scalar_variable_GetRawValue,
3077     /* ID3D10EffectScalarVariable methods */
3078     d3d10_effect_scalar_variable_SetFloat,
3079     d3d10_effect_scalar_variable_GetFloat,
3080     d3d10_effect_scalar_variable_SetFloatArray,
3081     d3d10_effect_scalar_variable_GetFloatArray,
3082     d3d10_effect_scalar_variable_SetInt,
3083     d3d10_effect_scalar_variable_GetInt,
3084     d3d10_effect_scalar_variable_SetIntArray,
3085     d3d10_effect_scalar_variable_GetIntArray,
3086     d3d10_effect_scalar_variable_SetBool,
3087     d3d10_effect_scalar_variable_GetBool,
3088     d3d10_effect_scalar_variable_SetBoolArray,
3089     d3d10_effect_scalar_variable_GetBoolArray,
3090 };
3091
3092 /* ID3D10EffectVariable methods */
3093
3094 static BOOL STDMETHODCALLTYPE d3d10_effect_vector_variable_IsValid(ID3D10EffectVectorVariable *iface)
3095 {
3096     TRACE("iface %p\n", iface);
3097
3098     return (struct d3d10_effect_variable *)iface != &null_vector_variable;
3099 }
3100
3101 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetType(
3102         ID3D10EffectVectorVariable *iface)
3103 {
3104     return d3d10_effect_variable_GetType((ID3D10EffectVariable *)iface);
3105 }
3106
3107 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetDesc(ID3D10EffectVectorVariable *iface,
3108         D3D10_EFFECT_VARIABLE_DESC *desc)
3109 {
3110     return d3d10_effect_variable_GetDesc((ID3D10EffectVariable *)iface, desc);
3111 }
3112
3113 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetAnnotationByIndex(
3114         ID3D10EffectVectorVariable *iface, UINT index)
3115 {
3116     return d3d10_effect_variable_GetAnnotationByIndex((ID3D10EffectVariable *)iface, index);
3117 }
3118
3119 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetAnnotationByName(
3120         ID3D10EffectVectorVariable *iface, LPCSTR name)
3121 {
3122     return d3d10_effect_variable_GetAnnotationByName((ID3D10EffectVariable *)iface, name);
3123 }
3124
3125 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetMemberByIndex(
3126         ID3D10EffectVectorVariable *iface, UINT index)
3127 {
3128     return d3d10_effect_variable_GetMemberByIndex((ID3D10EffectVariable *)iface, index);
3129 }
3130
3131 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetMemberByName(
3132         ID3D10EffectVectorVariable *iface, LPCSTR name)
3133 {
3134     return d3d10_effect_variable_GetMemberByName((ID3D10EffectVariable *)iface, name);
3135 }
3136
3137 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetMemberBySemantic(
3138         ID3D10EffectVectorVariable *iface, LPCSTR semantic)
3139 {
3140     return d3d10_effect_variable_GetMemberBySemantic((ID3D10EffectVariable *)iface, semantic);
3141 }
3142
3143 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetElement(
3144         ID3D10EffectVectorVariable *iface, UINT index)
3145 {
3146     return d3d10_effect_variable_GetElement((ID3D10EffectVariable *)iface, index);
3147 }
3148
3149 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_vector_variable_GetParentConstantBuffer(
3150         ID3D10EffectVectorVariable *iface)
3151 {
3152     return d3d10_effect_variable_GetParentConstantBuffer((ID3D10EffectVariable *)iface);
3153 }
3154
3155 static struct ID3D10EffectScalarVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsScalar(
3156         ID3D10EffectVectorVariable *iface)
3157 {
3158     return d3d10_effect_variable_AsScalar((ID3D10EffectVariable *)iface);
3159 }
3160
3161 static struct ID3D10EffectVectorVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsVector(
3162         ID3D10EffectVectorVariable *iface)
3163 {
3164     return d3d10_effect_variable_AsVector((ID3D10EffectVariable *)iface);
3165 }
3166
3167 static struct ID3D10EffectMatrixVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsMatrix(
3168         ID3D10EffectVectorVariable *iface)
3169 {
3170     return d3d10_effect_variable_AsMatrix((ID3D10EffectVariable *)iface);
3171 }
3172
3173 static struct ID3D10EffectStringVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsString(
3174         ID3D10EffectVectorVariable *iface)
3175 {
3176     return d3d10_effect_variable_AsString((ID3D10EffectVariable *)iface);
3177 }
3178
3179 static struct ID3D10EffectShaderResourceVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsShaderResource(
3180         ID3D10EffectVectorVariable *iface)
3181 {
3182     return d3d10_effect_variable_AsShaderResource((ID3D10EffectVariable *)iface);
3183 }
3184
3185 static struct ID3D10EffectRenderTargetViewVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsRenderTargetView(
3186         ID3D10EffectVectorVariable *iface)
3187 {
3188     return d3d10_effect_variable_AsRenderTargetView((ID3D10EffectVariable *)iface);
3189 }
3190
3191 static struct ID3D10EffectDepthStencilViewVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsDepthStencilView(
3192         ID3D10EffectVectorVariable *iface)
3193 {
3194     return d3d10_effect_variable_AsDepthStencilView((ID3D10EffectVariable *)iface);
3195 }
3196
3197 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsConstantBuffer(
3198         ID3D10EffectVectorVariable *iface)
3199 {
3200     return d3d10_effect_variable_AsConstantBuffer((ID3D10EffectVariable *)iface);
3201 }
3202
3203 static struct ID3D10EffectShaderVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsShader(
3204         ID3D10EffectVectorVariable *iface)
3205 {
3206     return d3d10_effect_variable_AsShader((ID3D10EffectVariable *)iface);
3207 }
3208
3209 static struct ID3D10EffectBlendVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsBlend(
3210         ID3D10EffectVectorVariable *iface)
3211 {
3212     return d3d10_effect_variable_AsBlend((ID3D10EffectVariable *)iface);
3213 }
3214
3215 static struct ID3D10EffectDepthStencilVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsDepthStencil(
3216         ID3D10EffectVectorVariable *iface)
3217 {
3218     return d3d10_effect_variable_AsDepthStencil((ID3D10EffectVariable *)iface);
3219 }
3220
3221 static struct ID3D10EffectRasterizerVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsRasterizer(
3222         ID3D10EffectVectorVariable *iface)
3223 {
3224     return d3d10_effect_variable_AsRasterizer((ID3D10EffectVariable *)iface);
3225 }
3226
3227 static struct ID3D10EffectSamplerVariable * STDMETHODCALLTYPE d3d10_effect_vector_variable_AsSampler(
3228         ID3D10EffectVectorVariable *iface)
3229 {
3230     return d3d10_effect_variable_AsSampler((ID3D10EffectVariable *)iface);
3231 }
3232
3233 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetRawValue(ID3D10EffectVectorVariable *iface,
3234         void *data, UINT offset, UINT count)
3235 {
3236     return d3d10_effect_variable_SetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
3237 }
3238
3239 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetRawValue(ID3D10EffectVectorVariable *iface,
3240         void *data, UINT offset, UINT count)
3241 {
3242     return d3d10_effect_variable_GetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
3243 }
3244
3245 /* ID3D10EffectVectorVariable methods */
3246
3247 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetBoolVector(ID3D10EffectVectorVariable *iface,
3248         BOOL *value)
3249 {
3250     FIXME("iface %p, value %p stub!\n", iface, value);
3251
3252     return E_NOTIMPL;
3253 }
3254
3255 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetIntVector(ID3D10EffectVectorVariable *iface,
3256         int *value)
3257 {
3258     FIXME("iface %p, value %p stub!\n", iface, value);
3259
3260     return E_NOTIMPL;
3261 }
3262
3263 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetFloatVector(ID3D10EffectVectorVariable *iface,
3264         float *value)
3265 {
3266     FIXME("iface %p, value %p stub!\n", iface, value);
3267
3268     return E_NOTIMPL;
3269 }
3270
3271 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetBoolVector(ID3D10EffectVectorVariable *iface,
3272         BOOL *value)
3273 {
3274     FIXME("iface %p, value %p stub!\n", iface, value);
3275
3276     return E_NOTIMPL;
3277 }
3278
3279 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetIntVector(ID3D10EffectVectorVariable *iface,
3280         int *value)
3281 {
3282     FIXME("iface %p, value %p stub!\n", iface, value);
3283
3284     return E_NOTIMPL;
3285 }
3286
3287 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetFloatVector(ID3D10EffectVectorVariable *iface,
3288         float *value)
3289 {
3290     FIXME("iface %p, value %p stub!\n", iface, value);
3291
3292     return E_NOTIMPL;
3293 }
3294
3295 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetBoolVectorArray(ID3D10EffectVectorVariable *iface,
3296         BOOL *values, UINT offset, UINT count)
3297 {
3298     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3299
3300     return E_NOTIMPL;
3301 }
3302
3303 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetIntVectorArray(ID3D10EffectVectorVariable *iface,
3304         int *values, UINT offset, UINT count)
3305 {
3306     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3307
3308     return E_NOTIMPL;
3309 }
3310
3311 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_SetFloatVectorArray(ID3D10EffectVectorVariable *iface,
3312         float *values, UINT offset, UINT count)
3313 {
3314     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3315
3316     return E_NOTIMPL;
3317 }
3318
3319 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetBoolVectorArray(ID3D10EffectVectorVariable *iface,
3320         BOOL *values, UINT offset, UINT count)
3321 {
3322     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3323
3324     return E_NOTIMPL;
3325 }
3326
3327 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetIntVectorArray(ID3D10EffectVectorVariable *iface,
3328         int *values, UINT offset, UINT count)
3329 {
3330     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3331
3332     return E_NOTIMPL;
3333 }
3334
3335 static HRESULT STDMETHODCALLTYPE d3d10_effect_vector_variable_GetFloatVectorArray(ID3D10EffectVectorVariable *iface,
3336         float *values, UINT offset, UINT count)
3337 {
3338     FIXME("iface %p, values %p, offset %u, count %u stub!\n", iface, values, offset, count);
3339
3340     return E_NOTIMPL;
3341 }
3342
3343 static const struct ID3D10EffectVectorVariableVtbl d3d10_effect_vector_variable_vtbl =
3344 {
3345     /* ID3D10EffectVariable methods */
3346     d3d10_effect_vector_variable_IsValid,
3347     d3d10_effect_vector_variable_GetType,
3348     d3d10_effect_vector_variable_GetDesc,
3349     d3d10_effect_vector_variable_GetAnnotationByIndex,
3350     d3d10_effect_vector_variable_GetAnnotationByName,
3351     d3d10_effect_vector_variable_GetMemberByIndex,
3352     d3d10_effect_vector_variable_GetMemberByName,
3353     d3d10_effect_vector_variable_GetMemberBySemantic,
3354     d3d10_effect_vector_variable_GetElement,
3355     d3d10_effect_vector_variable_GetParentConstantBuffer,
3356     d3d10_effect_vector_variable_AsScalar,
3357     d3d10_effect_vector_variable_AsVector,
3358     d3d10_effect_vector_variable_AsMatrix,
3359     d3d10_effect_vector_variable_AsString,
3360     d3d10_effect_vector_variable_AsShaderResource,
3361     d3d10_effect_vector_variable_AsRenderTargetView,
3362     d3d10_effect_vector_variable_AsDepthStencilView,
3363     d3d10_effect_vector_variable_AsConstantBuffer,
3364     d3d10_effect_vector_variable_AsShader,
3365     d3d10_effect_vector_variable_AsBlend,
3366     d3d10_effect_vector_variable_AsDepthStencil,
3367     d3d10_effect_vector_variable_AsRasterizer,
3368     d3d10_effect_vector_variable_AsSampler,
3369     d3d10_effect_vector_variable_SetRawValue,
3370     d3d10_effect_vector_variable_GetRawValue,
3371     /* ID3D10EffectVectorVariable methods */
3372     d3d10_effect_vector_variable_SetBoolVector,
3373     d3d10_effect_vector_variable_SetIntVector,
3374     d3d10_effect_vector_variable_SetFloatVector,
3375     d3d10_effect_vector_variable_GetBoolVector,
3376     d3d10_effect_vector_variable_GetIntVector,
3377     d3d10_effect_vector_variable_GetFloatVector,
3378     d3d10_effect_vector_variable_SetBoolVectorArray,
3379     d3d10_effect_vector_variable_SetIntVectorArray,
3380     d3d10_effect_vector_variable_SetFloatVectorArray,
3381     d3d10_effect_vector_variable_GetBoolVectorArray,
3382     d3d10_effect_vector_variable_GetIntVectorArray,
3383     d3d10_effect_vector_variable_GetFloatVectorArray,
3384 };
3385
3386 /* ID3D10EffectVariable methods */
3387
3388 static BOOL STDMETHODCALLTYPE d3d10_effect_matrix_variable_IsValid(ID3D10EffectMatrixVariable *iface)
3389 {
3390     TRACE("iface %p\n", iface);
3391
3392     return (struct d3d10_effect_variable *)iface != &null_matrix_variable;
3393 }
3394
3395 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetType(
3396         ID3D10EffectMatrixVariable *iface)
3397 {
3398     return d3d10_effect_variable_GetType((ID3D10EffectVariable *)iface);
3399 }
3400
3401 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetDesc(ID3D10EffectMatrixVariable *iface,
3402         D3D10_EFFECT_VARIABLE_DESC *desc)
3403 {
3404     return d3d10_effect_variable_GetDesc((ID3D10EffectVariable *)iface, desc);
3405 }
3406
3407 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetAnnotationByIndex(
3408         ID3D10EffectMatrixVariable *iface, UINT index)
3409 {
3410     return d3d10_effect_variable_GetAnnotationByIndex((ID3D10EffectVariable *)iface, index);
3411 }
3412
3413 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetAnnotationByName(
3414         ID3D10EffectMatrixVariable *iface, LPCSTR name)
3415 {
3416     return d3d10_effect_variable_GetAnnotationByName((ID3D10EffectVariable *)iface, name);
3417 }
3418
3419 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMemberByIndex(
3420         ID3D10EffectMatrixVariable *iface, UINT index)
3421 {
3422     return d3d10_effect_variable_GetMemberByIndex((ID3D10EffectVariable *)iface, index);
3423 }
3424
3425 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMemberByName(
3426         ID3D10EffectMatrixVariable *iface, LPCSTR name)
3427 {
3428     return d3d10_effect_variable_GetMemberByName((ID3D10EffectVariable *)iface, name);
3429 }
3430
3431 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMemberBySemantic(
3432         ID3D10EffectMatrixVariable *iface, LPCSTR semantic)
3433 {
3434     return d3d10_effect_variable_GetMemberBySemantic((ID3D10EffectVariable *)iface, semantic);
3435 }
3436
3437 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetElement(
3438         ID3D10EffectMatrixVariable *iface, UINT index)
3439 {
3440     return d3d10_effect_variable_GetElement((ID3D10EffectVariable *)iface, index);
3441 }
3442
3443 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetParentConstantBuffer(
3444         ID3D10EffectMatrixVariable *iface)
3445 {
3446     return d3d10_effect_variable_GetParentConstantBuffer((ID3D10EffectVariable *)iface);
3447 }
3448
3449 static struct ID3D10EffectScalarVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsScalar(
3450         ID3D10EffectMatrixVariable *iface)
3451 {
3452     return d3d10_effect_variable_AsScalar((ID3D10EffectVariable *)iface);
3453 }
3454
3455 static struct ID3D10EffectVectorVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsVector(
3456         ID3D10EffectMatrixVariable *iface)
3457 {
3458     return d3d10_effect_variable_AsVector((ID3D10EffectVariable *)iface);
3459 }
3460
3461 static struct ID3D10EffectMatrixVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsMatrix(
3462         ID3D10EffectMatrixVariable *iface)
3463 {
3464     return d3d10_effect_variable_AsMatrix((ID3D10EffectVariable *)iface);
3465 }
3466
3467 static struct ID3D10EffectStringVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsString(
3468         ID3D10EffectMatrixVariable *iface)
3469 {
3470     return d3d10_effect_variable_AsString((ID3D10EffectVariable *)iface);
3471 }
3472
3473 static struct ID3D10EffectShaderResourceVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsShaderResource(
3474         ID3D10EffectMatrixVariable *iface)
3475 {
3476     return d3d10_effect_variable_AsShaderResource((ID3D10EffectVariable *)iface);
3477 }
3478
3479 static struct ID3D10EffectRenderTargetViewVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsRenderTargetView(
3480         ID3D10EffectMatrixVariable *iface)
3481 {
3482     return d3d10_effect_variable_AsRenderTargetView((ID3D10EffectVariable *)iface);
3483 }
3484
3485 static struct ID3D10EffectDepthStencilViewVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsDepthStencilView(
3486         ID3D10EffectMatrixVariable *iface)
3487 {
3488     return d3d10_effect_variable_AsDepthStencilView((ID3D10EffectVariable *)iface);
3489 }
3490
3491 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsConstantBuffer(
3492         ID3D10EffectMatrixVariable *iface)
3493 {
3494     return d3d10_effect_variable_AsConstantBuffer((ID3D10EffectVariable *)iface);
3495 }
3496
3497 static struct ID3D10EffectShaderVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsShader(
3498         ID3D10EffectMatrixVariable *iface)
3499 {
3500     return d3d10_effect_variable_AsShader((ID3D10EffectVariable *)iface);
3501 }
3502
3503 static struct ID3D10EffectBlendVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsBlend(
3504         ID3D10EffectMatrixVariable *iface)
3505 {
3506     return d3d10_effect_variable_AsBlend((ID3D10EffectVariable *)iface);
3507 }
3508
3509 static struct ID3D10EffectDepthStencilVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsDepthStencil(
3510         ID3D10EffectMatrixVariable *iface)
3511 {
3512     return d3d10_effect_variable_AsDepthStencil((ID3D10EffectVariable *)iface);
3513 }
3514
3515 static struct ID3D10EffectRasterizerVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsRasterizer(
3516         ID3D10EffectMatrixVariable *iface)
3517 {
3518     return d3d10_effect_variable_AsRasterizer((ID3D10EffectVariable *)iface);
3519 }
3520
3521 static struct ID3D10EffectSamplerVariable * STDMETHODCALLTYPE d3d10_effect_matrix_variable_AsSampler(
3522         ID3D10EffectMatrixVariable *iface)
3523 {
3524     return d3d10_effect_variable_AsSampler((ID3D10EffectVariable *)iface);
3525 }
3526
3527 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_SetRawValue(ID3D10EffectMatrixVariable *iface,
3528         void *data, UINT offset, UINT count)
3529 {
3530     return d3d10_effect_variable_SetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
3531 }
3532
3533 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetRawValue(ID3D10EffectMatrixVariable *iface,
3534         void *data, UINT offset, UINT count)
3535 {
3536     return d3d10_effect_variable_GetRawValue((ID3D10EffectVariable *)iface, data, offset, count);
3537 }
3538
3539 /* ID3D10EffectMatrixVariable methods */
3540
3541 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_SetMatrix(ID3D10EffectMatrixVariable *iface,
3542         float *data)
3543 {
3544     FIXME("iface %p, data %p stub!\n", iface, data);
3545
3546     return E_NOTIMPL;
3547 }
3548
3549 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMatrix(ID3D10EffectMatrixVariable *iface,
3550         float *data)
3551 {
3552     FIXME("iface %p, data %p stub!\n", iface, data);
3553
3554     return E_NOTIMPL;
3555 }
3556
3557 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_SetMatrixArray(ID3D10EffectMatrixVariable *iface,
3558         float *data, UINT offset, UINT count)
3559 {
3560     FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface, data, offset, count);
3561
3562     return E_NOTIMPL;
3563 }
3564
3565 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMatrixArray(ID3D10EffectMatrixVariable *iface,
3566         float *data, UINT offset, UINT count)
3567 {
3568     FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface, data, offset, count);
3569
3570     return E_NOTIMPL;
3571 }
3572
3573 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_SetMatrixTranspose(ID3D10EffectMatrixVariable *iface,
3574         float *data)
3575 {
3576     FIXME("iface %p, data %p stub!\n", iface, data);
3577
3578     return E_NOTIMPL;
3579 }
3580
3581 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMatrixTranspose(ID3D10EffectMatrixVariable *iface,
3582         float *data)
3583 {
3584     FIXME("iface %p, data %p stub!\n", iface, data);
3585
3586     return E_NOTIMPL;
3587 }
3588
3589 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_SetMatrixTransposeArray(ID3D10EffectMatrixVariable *iface,
3590         float *data, UINT offset, UINT count)
3591 {
3592     FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface, data, offset, count);
3593
3594     return E_NOTIMPL;
3595 }
3596
3597 static HRESULT STDMETHODCALLTYPE d3d10_effect_matrix_variable_GetMatrixTransposeArray(ID3D10EffectMatrixVariable *iface,
3598         float *data, UINT offset, UINT count)
3599 {
3600     FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface, data, offset, count);
3601
3602     return E_NOTIMPL;
3603 }
3604
3605
3606 static const struct ID3D10EffectMatrixVariableVtbl d3d10_effect_matrix_variable_vtbl =
3607 {
3608     /* ID3D10EffectVariable methods */
3609     d3d10_effect_matrix_variable_IsValid,
3610     d3d10_effect_matrix_variable_GetType,
3611     d3d10_effect_matrix_variable_GetDesc,
3612     d3d10_effect_matrix_variable_GetAnnotationByIndex,
3613     d3d10_effect_matrix_variable_GetAnnotationByName,
3614     d3d10_effect_matrix_variable_GetMemberByIndex,
3615     d3d10_effect_matrix_variable_GetMemberByName,
3616     d3d10_effect_matrix_variable_GetMemberBySemantic,
3617     d3d10_effect_matrix_variable_GetElement,
3618     d3d10_effect_matrix_variable_GetParentConstantBuffer,
3619     d3d10_effect_matrix_variable_AsScalar,
3620     d3d10_effect_matrix_variable_AsVector,
3621     d3d10_effect_matrix_variable_AsMatrix,
3622     d3d10_effect_matrix_variable_AsString,
3623     d3d10_effect_matrix_variable_AsShaderResource,
3624     d3d10_effect_matrix_variable_AsRenderTargetView,
3625     d3d10_effect_matrix_variable_AsDepthStencilView,
3626     d3d10_effect_matrix_variable_AsConstantBuffer,
3627     d3d10_effect_matrix_variable_AsShader,
3628     d3d10_effect_matrix_variable_AsBlend,
3629     d3d10_effect_matrix_variable_AsDepthStencil,
3630     d3d10_effect_matrix_variable_AsRasterizer,
3631     d3d10_effect_matrix_variable_AsSampler,
3632     d3d10_effect_matrix_variable_SetRawValue,
3633     d3d10_effect_matrix_variable_GetRawValue,
3634     /* ID3D10EffectMatrixVariable methods */
3635     d3d10_effect_matrix_variable_SetMatrix,
3636     d3d10_effect_matrix_variable_GetMatrix,
3637     d3d10_effect_matrix_variable_SetMatrixArray,
3638     d3d10_effect_matrix_variable_GetMatrixArray,
3639     d3d10_effect_matrix_variable_SetMatrixTranspose,
3640     d3d10_effect_matrix_variable_GetMatrixTranspose,
3641     d3d10_effect_matrix_variable_SetMatrixTransposeArray,
3642     d3d10_effect_matrix_variable_GetMatrixTransposeArray,
3643 };
3644
3645 static BOOL STDMETHODCALLTYPE d3d10_effect_type_IsValid(ID3D10EffectType *iface)
3646 {
3647     FIXME("iface %p stub!\n", iface);
3648
3649     return FALSE;
3650 }
3651
3652 static HRESULT STDMETHODCALLTYPE d3d10_effect_type_GetDesc(ID3D10EffectType *iface, D3D10_EFFECT_TYPE_DESC *desc)
3653 {
3654     struct d3d10_effect_type *This = (struct d3d10_effect_type *)iface;
3655
3656     TRACE("iface %p, desc %p\n", iface, desc);
3657
3658     if (This == &null_type)
3659     {
3660         WARN("Null type specified\n");
3661         return E_FAIL;
3662     }
3663
3664     if (!desc)
3665     {
3666         WARN("Invalid argument specified\n");
3667         return E_INVALIDARG;
3668     }
3669
3670     desc->TypeName = This->name;
3671     desc->Class = This->type_class;
3672     desc->Type = This->basetype;
3673     desc->Elements = This->element_count;
3674     desc->Members = This->member_count;
3675     desc->Rows = This->row_count;
3676     desc->Columns = This->column_count;
3677     desc->PackedSize = This->size_packed;
3678     desc->UnpackedSize = This->size_unpacked;
3679     desc->Stride = This->stride;
3680
3681     return S_OK;
3682 }
3683
3684 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_type_GetMemberTypeByIndex(ID3D10EffectType *iface,
3685         UINT index)
3686 {
3687     struct d3d10_effect_type *This = (struct d3d10_effect_type *)iface;
3688     struct d3d10_effect_type *t;
3689
3690     TRACE("iface %p, index %u\n", iface, index);
3691
3692     if (index >= This->member_count)
3693     {
3694         WARN("Invalid index specified\n");
3695         return (ID3D10EffectType *)&null_type;
3696     }
3697
3698     t = (&This->members[index])->type;
3699
3700     TRACE("Returning member %p, %s\n", t, debugstr_a(t->name));
3701
3702     return (ID3D10EffectType *)t;
3703 }
3704
3705 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_type_GetMemberTypeByName(ID3D10EffectType *iface,
3706         LPCSTR name)
3707 {
3708     struct d3d10_effect_type *This = (struct d3d10_effect_type *)iface;
3709     unsigned int i;
3710
3711     TRACE("iface %p, name %s\n", iface, debugstr_a(name));
3712
3713     if (!name)
3714     {
3715         WARN("Invalid name specified\n");
3716         return (ID3D10EffectType *)&null_type;
3717     }
3718
3719     for (i = 0; i < This->member_count; ++i)
3720     {
3721         struct d3d10_effect_type_member *typem = &This->members[i];
3722
3723         if (typem->name)
3724         {
3725             if (!strcmp(typem->name, name))
3726             {
3727                 TRACE("Returning type %p.\n", typem->type);
3728                 return (ID3D10EffectType *)typem->type;
3729             }
3730         }
3731     }
3732
3733     WARN("Invalid name specified\n");
3734
3735     return (ID3D10EffectType *)&null_type;
3736 }
3737
3738 static struct ID3D10EffectType * STDMETHODCALLTYPE d3d10_effect_type_GetMemberTypeBySemantic(ID3D10EffectType *iface,
3739         LPCSTR semantic)
3740 {
3741     struct d3d10_effect_type *This = (struct d3d10_effect_type *)iface;
3742     unsigned int i;
3743
3744     TRACE("iface %p, semantic %s\n", iface, debugstr_a(semantic));
3745
3746     if (!semantic)
3747     {
3748         WARN("Invalid semantic specified\n");
3749         return (ID3D10EffectType *)&null_type;
3750     }
3751
3752     for (i = 0; i < This->member_count; ++i)
3753     {
3754         struct d3d10_effect_type_member *typem = &This->members[i];
3755
3756         if (typem->semantic)
3757         {
3758             if (!strcmp(typem->semantic, semantic))
3759             {
3760                 TRACE("Returning type %p.\n", typem->type);
3761                 return (ID3D10EffectType *)typem->type;
3762             }
3763         }
3764     }
3765
3766     WARN("Invalid semantic specified\n");
3767
3768     return (ID3D10EffectType *)&null_type;
3769 }
3770
3771 static LPCSTR STDMETHODCALLTYPE d3d10_effect_type_GetMemberName(ID3D10EffectType *iface, UINT index)
3772 {
3773     struct d3d10_effect_type *This = (struct d3d10_effect_type *)iface;
3774     struct d3d10_effect_type_member *typem;
3775
3776     TRACE("iface %p, index %u\n", iface, index);
3777
3778     if (index >= This->member_count)
3779     {
3780         WARN("Invalid index specified\n");
3781         return NULL;
3782     }
3783
3784     typem = &This->members[index];
3785
3786     TRACE("Returning name %s\n", debugstr_a(typem->name));
3787
3788     return typem->name;
3789 }
3790
3791 static LPCSTR STDMETHODCALLTYPE d3d10_effect_type_GetMemberSemantic(ID3D10EffectType *iface, UINT index)
3792 {
3793     struct d3d10_effect_type *This = (struct d3d10_effect_type *)iface;
3794     struct d3d10_effect_type_member *typem;
3795
3796     TRACE("iface %p, index %u\n", iface, index);
3797
3798     if (index >= This->member_count)
3799     {
3800         WARN("Invalid index specified\n");
3801         return NULL;
3802     }
3803
3804     typem = &This->members[index];
3805
3806     TRACE("Returning semantic %s\n", debugstr_a(typem->semantic));
3807
3808     return typem->semantic;
3809 }
3810
3811 static const struct ID3D10EffectTypeVtbl d3d10_effect_type_vtbl =
3812 {
3813     /* ID3D10EffectType */
3814     d3d10_effect_type_IsValid,
3815     d3d10_effect_type_GetDesc,
3816     d3d10_effect_type_GetMemberTypeByIndex,
3817     d3d10_effect_type_GetMemberTypeByName,
3818     d3d10_effect_type_GetMemberTypeBySemantic,
3819     d3d10_effect_type_GetMemberName,
3820     d3d10_effect_type_GetMemberSemantic,
3821 };