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