gdi32: PATH_ExtTextOut remove incorrect shift to DC origin.
[wine/hacks.git] / dlls / d3d10 / effect.c
blobeecf511ba77f1dc19376200a979b3669ea8d5f25
1 /*
2 * Copyright 2009 Henri Verbeet for CodeWeavers
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.
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.
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
20 #include "config.h"
21 #include "wine/port.h"
23 #include "d3d10_private.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d10);
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')
34 static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl;
35 static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl;
37 static inline void read_dword(const char **ptr, DWORD *d)
39 memcpy(d, *ptr, sizeof(*d));
40 *ptr += sizeof(*d);
43 static inline void skip_dword_unknown(const char **ptr, unsigned int count)
45 unsigned int i;
46 DWORD d;
48 FIXME("Skipping %u unknown DWORDs:\n", count);
49 for (i = 0; i < count; ++i)
51 read_dword(ptr, &d);
52 FIXME("\t0x%08x\n", d);
56 static inline void write_dword(char **ptr, DWORD d)
58 memcpy(*ptr, &d, sizeof(d));
59 *ptr += sizeof(d);
62 static inline void write_dword_unknown(char **ptr, DWORD d)
64 FIXME("Writing unknown DWORD 0x%08x\n", d);
65 write_dword(ptr, d);
68 static inline void read_tag(const char **ptr, DWORD *t, char t_str[5])
70 read_dword(ptr, t);
71 memcpy(t_str, t, 4);
72 t_str[4] = '\0';
75 static HRESULT parse_dxbc(const char *data, SIZE_T data_size,
76 HRESULT (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx)
78 const char *ptr = data;
79 HRESULT hr = S_OK;
80 DWORD chunk_count;
81 DWORD total_size;
82 char tag_str[5];
83 unsigned int i;
84 DWORD tag;
86 read_tag(&ptr, &tag, tag_str);
87 TRACE("tag: %s\n", tag_str);
89 if (tag != TAG_DXBC)
91 WARN("Wrong tag.\n");
92 return E_FAIL;
95 /* checksum? */
96 skip_dword_unknown(&ptr, 4);
98 skip_dword_unknown(&ptr, 1);
100 read_dword(&ptr, &total_size);
101 TRACE("total size: %#x\n", total_size);
103 read_dword(&ptr, &chunk_count);
104 TRACE("chunk count: %#x\n", chunk_count);
106 for (i = 0; i < chunk_count; ++i)
108 DWORD chunk_tag, chunk_size;
109 const char *chunk_ptr;
110 DWORD chunk_offset;
112 read_dword(&ptr, &chunk_offset);
113 TRACE("chunk %u at offset %#x\n", i, chunk_offset);
115 chunk_ptr = data + chunk_offset;
117 read_dword(&chunk_ptr, &chunk_tag);
118 read_dword(&chunk_ptr, &chunk_size);
120 hr = chunk_handler(chunk_ptr, chunk_size, chunk_tag, ctx);
121 if (FAILED(hr)) break;
124 return hr;
127 static HRESULT parse_fx10_pass_index(struct d3d10_effect_pass *p, const char **ptr)
129 unsigned int i;
131 read_dword(ptr, &p->start);
132 TRACE("Pass starts at offset %#x\n", p->start);
134 read_dword(ptr, &p->variable_count);
135 TRACE("Pass has %u variables\n", p->variable_count);
137 skip_dword_unknown(ptr, 1);
139 p->variables = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, p->variable_count * sizeof(*p->variables));
140 if (!p->variables)
142 ERR("Failed to allocate variables memory\n");
143 return E_OUTOFMEMORY;
146 for (i = 0; i < p->variable_count; ++i)
148 struct d3d10_effect_variable *v = &p->variables[i];
150 v->pass = p;
152 read_dword(ptr, &v->type);
153 TRACE("Variable %u is of type %#x\n", i, v->type);
155 skip_dword_unknown(ptr, 2);
157 read_dword(ptr, &v->idx_offset);
158 TRACE("Variable %u idx is at offset %#x\n", i, v->idx_offset);
161 return S_OK;
164 static HRESULT parse_fx10_technique_index(struct d3d10_effect_technique *t, const char **ptr)
166 HRESULT hr = S_OK;
167 unsigned int i;
169 read_dword(ptr, &t->start);
170 TRACE("Technique starts at offset %#x\n", t->start);
172 read_dword(ptr, &t->pass_count);
173 TRACE("Technique has %u passes\n", t->pass_count);
175 skip_dword_unknown(ptr, 1);
177 t->passes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, t->pass_count * sizeof(*t->passes));
178 if (!t->passes)
180 ERR("Failed to allocate passes memory\n");
181 return E_OUTOFMEMORY;
184 for (i = 0; i < t->pass_count; ++i)
186 struct d3d10_effect_pass *p = &t->passes[i];
188 p->vtbl = &d3d10_effect_pass_vtbl;
189 p->technique = t;
191 hr = parse_fx10_pass_index(p, ptr);
192 if (FAILED(hr)) break;
195 return hr;
198 static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
200 struct d3d10_effect_shader_variable *s = ctx;
201 char tag_str[5];
203 memcpy(tag_str, &tag, 4);
204 tag_str[4] = '\0';
205 TRACE("tag: %s\n", tag_str);
207 TRACE("chunk size: %#x\n", data_size);
209 switch(tag)
211 case TAG_ISGN:
213 /* 32 (DXBC header) + 1 * 4 (chunk index) + 2 * 4 (chunk header) + data_size (chunk data) */
214 UINT size = 44 + data_size;
215 char *ptr;
217 s->input_signature = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
218 if (!s->input_signature)
220 ERR("Failed to allocate input signature data\n");
221 return E_OUTOFMEMORY;
223 s->input_signature_size = size;
225 ptr = s->input_signature;
227 write_dword(&ptr, TAG_DXBC);
229 /* signature(?) */
230 write_dword_unknown(&ptr, 0);
231 write_dword_unknown(&ptr, 0);
232 write_dword_unknown(&ptr, 0);
233 write_dword_unknown(&ptr, 0);
235 /* seems to be always 1 */
236 write_dword_unknown(&ptr, 1);
238 /* DXBC size */
239 write_dword(&ptr, size);
241 /* chunk count */
242 write_dword(&ptr, 1);
244 /* chunk index */
245 write_dword(&ptr, (ptr - s->input_signature) + 4);
247 /* chunk */
248 write_dword(&ptr, TAG_ISGN);
249 write_dword(&ptr, data_size);
250 memcpy(ptr, data, data_size);
251 break;
254 default:
255 FIXME("Unhandled chunk %s\n", tag_str);
256 break;
259 return S_OK;
262 static HRESULT parse_shader(struct d3d10_effect_variable *v, const char *data)
264 ID3D10Device *device = v->pass->technique->effect->device;
265 struct d3d10_effect_shader_variable *s;
266 const char *ptr = data;
267 DWORD dxbc_size;
268 HRESULT hr;
270 v->data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct d3d10_effect_shader_variable));
271 if (!v->data)
273 ERR("Failed to allocate shader variable memory\n");
274 return E_OUTOFMEMORY;
277 if (!ptr) return S_OK;
279 s = v->data;
281 read_dword(&ptr, &dxbc_size);
282 TRACE("dxbc size: %#x\n", dxbc_size);
284 switch (v->type)
286 case D3D10_EVT_VERTEXSHADER:
287 hr = ID3D10Device_CreateVertexShader(device, ptr, dxbc_size, &s->shader.vs);
288 if (FAILED(hr)) return hr;
289 break;
291 case D3D10_EVT_PIXELSHADER:
292 hr = ID3D10Device_CreatePixelShader(device, ptr, dxbc_size, &s->shader.ps);
293 if (FAILED(hr)) return hr;
294 break;
295 case D3D10_EVT_GEOMETRYSHADER:
296 hr = ID3D10Device_CreateGeometryShader(device, ptr, dxbc_size, &s->shader.gs);
297 if (FAILED(hr)) return hr;
298 break;
301 return parse_dxbc(ptr, dxbc_size, shader_chunk_handler, s);
304 static HRESULT parse_fx10_variable(struct d3d10_effect_variable *v, const char *data)
306 const char *ptr;
307 DWORD offset;
308 HRESULT hr;
310 ptr = data + v->idx_offset;
311 read_dword(&ptr, &offset);
313 TRACE("Variable of type %#x starts at offset %#x\n", v->type, offset);
315 /* FIXME: This probably isn't completely correct. */
316 if (offset == 1)
318 WARN("Skipping variable\n");
319 ptr = NULL;
321 else
323 ptr = data + offset;
326 switch (v->type)
328 case D3D10_EVT_VERTEXSHADER:
329 TRACE("Vertex shader\n");
330 hr = parse_shader(v, ptr);
331 break;
333 case D3D10_EVT_PIXELSHADER:
334 TRACE("Pixel shader\n");
335 hr = parse_shader(v, ptr);
336 break;
338 case D3D10_EVT_GEOMETRYSHADER:
339 TRACE("Geometry shader\n");
340 hr = parse_shader(v, ptr);
341 break;
343 default:
344 FIXME("Unhandled variable type %#x\n", v->type);
345 hr = E_FAIL;
346 break;
349 return hr;
352 static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char *data)
354 HRESULT hr = S_OK;
355 const char *ptr;
356 size_t name_len;
357 unsigned int i;
359 ptr = data + p->start;
361 name_len = strlen(ptr) + 1;
362 p->name = HeapAlloc(GetProcessHeap(), 0, name_len);
363 if (!p->name)
365 ERR("Failed to allocate name memory\n");
366 return E_OUTOFMEMORY;
369 memcpy(p->name, ptr, name_len);
370 ptr += name_len;
372 TRACE("pass name: %s\n", p->name);
374 for (i = 0; i < p->variable_count; ++i)
376 hr = parse_fx10_variable(&p->variables[i], data);
377 if (FAILED(hr)) break;
380 return hr;
383 static HRESULT parse_fx10_technique(struct d3d10_effect_technique *t, const char *data)
385 HRESULT hr = S_OK;
386 const char *ptr;
387 size_t name_len;
388 unsigned int i;
390 ptr = data + t->start;
392 name_len = strlen(ptr) + 1;
393 t->name = HeapAlloc(GetProcessHeap(), 0, name_len);
394 if (!t->name)
396 ERR("Failed to allocate name memory\n");
397 return E_OUTOFMEMORY;
400 memcpy(t->name, ptr, name_len);
401 ptr += name_len;
403 TRACE("technique name: %s\n", t->name);
405 for (i = 0; i < t->pass_count; ++i)
407 hr = parse_fx10_pass(&t->passes[i], data);
408 if (FAILED(hr)) break;
411 return hr;
414 static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD data_size)
416 const char *ptr = data + e->index_offset;
417 HRESULT hr = S_OK;
418 unsigned int i;
420 skip_dword_unknown(&ptr, 6);
422 e->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->technique_count * sizeof(*e->techniques));
423 if (!e->techniques)
425 ERR("Failed to allocate techniques memory\n");
426 return E_OUTOFMEMORY;
429 for (i = 0; i < e->technique_count; ++i)
431 struct d3d10_effect_technique *t = &e->techniques[i];
433 t->vtbl = &d3d10_effect_technique_vtbl;
434 t->effect = e;
436 hr = parse_fx10_technique_index(t, &ptr);
437 if (FAILED(hr)) break;
439 hr = parse_fx10_technique(t, data);
440 if (FAILED(hr)) break;
443 return hr;
446 static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_size)
448 const char *ptr = data;
449 DWORD unknown;
451 /* version info? */
452 skip_dword_unknown(&ptr, 2);
454 read_dword(&ptr, &unknown);
455 FIXME("Unknown 0: %u\n", unknown);
456 read_dword(&ptr, &unknown);
457 FIXME("Unknown 1: %u\n", unknown);
458 read_dword(&ptr, &unknown);
459 FIXME("Unknown 2: %u\n", unknown);
460 read_dword(&ptr, &unknown);
461 FIXME("Unknown 3: %u\n", unknown);
462 read_dword(&ptr, &unknown);
463 FIXME("Unknown 4: %u\n", unknown);
465 read_dword(&ptr, &e->technique_count);
466 TRACE("Technique count: %u\n", e->technique_count);
468 read_dword(&ptr, &e->index_offset);
469 TRACE("Index offset: %#x\n", e->index_offset);
471 read_dword(&ptr, &unknown);
472 FIXME("Unknown 5: %u\n", unknown);
473 read_dword(&ptr, &unknown);
474 FIXME("Unknown 6: %u\n", unknown);
475 read_dword(&ptr, &unknown);
476 FIXME("Unknown 7: %u\n", unknown);
478 read_dword(&ptr, &e->blendstate_count);
479 TRACE("Blendstate count: %u\n", e->blendstate_count);
481 read_dword(&ptr, &unknown);
482 FIXME("Unknown 8: %u\n", unknown);
483 read_dword(&ptr, &unknown);
484 FIXME("Unknown 9: %u\n", unknown);
485 read_dword(&ptr, &unknown);
486 FIXME("Unknown 10: %u\n", unknown);
487 read_dword(&ptr, &unknown);
488 FIXME("Unknown 11: %u\n", unknown);
489 read_dword(&ptr, &unknown);
490 FIXME("Unknown 12: %u\n", unknown);
491 read_dword(&ptr, &unknown);
492 FIXME("Unknown 13: %u\n", unknown);
494 return parse_fx10_body(e, ptr, data_size - (ptr - data));
497 static HRESULT fx10_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
499 struct d3d10_effect *e = ctx;
500 char tag_str[5];
502 memcpy(tag_str, &tag, 4);
503 tag_str[4] = '\0';
504 TRACE("tag: %s\n", tag_str);
506 TRACE("chunk size: %#x\n", data_size);
508 switch(tag)
510 case TAG_FX10:
511 return parse_fx10(e, data, data_size);
513 default:
514 FIXME("Unhandled chunk %s\n", tag_str);
515 return S_OK;
519 HRESULT d3d10_effect_parse(struct d3d10_effect *This, const void *data, SIZE_T data_size)
521 return parse_dxbc(data, data_size, fx10_chunk_handler, This);
524 static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
526 TRACE("variable %p\n", v);
528 switch(v->type)
530 case D3D10_EVT_VERTEXSHADER:
531 case D3D10_EVT_PIXELSHADER:
532 case D3D10_EVT_GEOMETRYSHADER:
533 HeapFree(GetProcessHeap(), 0, ((struct d3d10_effect_shader_variable *)v->data)->input_signature);
534 break;
536 default:
537 break;
539 HeapFree(GetProcessHeap(), 0, v->data);
542 static HRESULT d3d10_effect_variable_apply(struct d3d10_effect_variable *v)
544 ID3D10Device *device = v->pass->technique->effect->device;
546 TRACE("variable %p, type %#x\n", v, v->type);
548 switch(v->type)
550 case D3D10_EVT_VERTEXSHADER:
551 ID3D10Device_VSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.vs);
552 return S_OK;
554 case D3D10_EVT_PIXELSHADER:
555 ID3D10Device_PSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.ps);
556 return S_OK;
558 case D3D10_EVT_GEOMETRYSHADER:
559 ID3D10Device_GSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.gs);
560 return S_OK;
562 default:
563 FIXME("Unhandled variable type %#x\n", v->type);
564 return E_FAIL;
568 static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
570 TRACE("pass %p\n", p);
572 HeapFree(GetProcessHeap(), 0, p->name);
573 if (p->variables)
575 unsigned int i;
576 for (i = 0; i < p->variable_count; ++i)
578 d3d10_effect_variable_destroy(&p->variables[i]);
580 HeapFree(GetProcessHeap(), 0, p->variables);
584 static void d3d10_effect_technique_destroy(struct d3d10_effect_technique *t)
586 TRACE("technique %p\n", t);
588 HeapFree(GetProcessHeap(), 0, t->name);
589 if (t->passes)
591 unsigned int i;
592 for (i = 0; i < t->pass_count; ++i)
594 d3d10_effect_pass_destroy(&t->passes[i]);
596 HeapFree(GetProcessHeap(), 0, t->passes);
600 /* IUnknown methods */
602 static HRESULT STDMETHODCALLTYPE d3d10_effect_QueryInterface(ID3D10Effect *iface, REFIID riid, void **object)
604 TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
606 if (IsEqualGUID(riid, &IID_ID3D10Effect)
607 || IsEqualGUID(riid, &IID_IUnknown))
609 IUnknown_AddRef(iface);
610 *object = iface;
611 return S_OK;
614 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
616 *object = NULL;
617 return E_NOINTERFACE;
620 static ULONG STDMETHODCALLTYPE d3d10_effect_AddRef(ID3D10Effect *iface)
622 struct d3d10_effect *This = (struct d3d10_effect *)iface;
623 ULONG refcount = InterlockedIncrement(&This->refcount);
625 TRACE("%p increasing refcount to %u\n", This, refcount);
627 return refcount;
630 static ULONG STDMETHODCALLTYPE d3d10_effect_Release(ID3D10Effect *iface)
632 struct d3d10_effect *This = (struct d3d10_effect *)iface;
633 ULONG refcount = InterlockedDecrement(&This->refcount);
635 TRACE("%p decreasing refcount to %u\n", This, refcount);
637 if (!refcount)
639 if (This->techniques)
641 unsigned int i;
642 for (i = 0; i < This->technique_count; ++i)
644 d3d10_effect_technique_destroy(&This->techniques[i]);
646 HeapFree(GetProcessHeap(), 0, This->techniques);
648 ID3D10Device_Release(This->device);
649 HeapFree(GetProcessHeap(), 0, This);
652 return refcount;
655 /* ID3D10Effect methods */
657 static BOOL STDMETHODCALLTYPE d3d10_effect_IsValid(ID3D10Effect *iface)
659 FIXME("iface %p stub!\n", iface);
661 return FALSE;
664 static BOOL STDMETHODCALLTYPE d3d10_effect_IsPool(ID3D10Effect *iface)
666 FIXME("iface %p stub!\n", iface);
668 return FALSE;
671 static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDevice(ID3D10Effect *iface, ID3D10Device **device)
673 struct d3d10_effect *This = (struct d3d10_effect *)iface;
675 TRACE("iface %p, device %p\n", iface, device);
677 ID3D10Device_AddRef(This->device);
678 *device = This->device;
680 return S_OK;
683 static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDesc(ID3D10Effect *iface, D3D10_EFFECT_DESC *desc)
685 FIXME("iface %p, desc %p stub!\n", iface, desc);
687 return E_NOTIMPL;
690 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_GetConstantBufferByIndex(ID3D10Effect *iface,
691 UINT index)
693 FIXME("iface %p, index %u stub!\n", iface, index);
695 return NULL;
698 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_GetConstantBufferByName(ID3D10Effect *iface,
699 LPCSTR name)
701 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
703 return NULL;
706 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableByIndex(ID3D10Effect *iface, UINT index)
708 FIXME("iface %p, index %u stub!\n", iface, index);
710 return NULL;
713 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableByName(ID3D10Effect *iface, LPCSTR name)
715 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
717 return NULL;
720 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableBySemantic(ID3D10Effect *iface,
721 LPCSTR semantic)
723 FIXME("iface %p, semantic \"%s\" stub!\n", iface, semantic);
725 return NULL;
728 static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByIndex(ID3D10Effect *iface,
729 UINT index)
731 struct d3d10_effect *This = (struct d3d10_effect *)iface;
732 struct d3d10_effect_technique *t;
734 TRACE("iface %p, index %u\n", iface, index);
736 if (index >= This->technique_count)
738 WARN("Invalid index specified\n");
739 return NULL;
742 t = &This->techniques[index];
744 TRACE("Returning technique %p, \"%s\"\n", t, t->name);
746 return (ID3D10EffectTechnique *)t;
749 static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByName(ID3D10Effect *iface,
750 LPCSTR name)
752 struct d3d10_effect *This = (struct d3d10_effect *)iface;
753 unsigned int i;
755 TRACE("iface %p, name \"%s\"\n", iface, name);
757 for (i = 0; i < This->technique_count; ++i)
759 struct d3d10_effect_technique *t = &This->techniques[i];
760 if (!strcmp(t->name, name))
762 TRACE("Returning technique %p\n", t);
763 return (ID3D10EffectTechnique *)t;
767 return NULL;
770 static HRESULT STDMETHODCALLTYPE d3d10_effect_Optimize(ID3D10Effect *iface)
772 FIXME("iface %p stub!\n", iface);
774 return E_NOTIMPL;
777 static BOOL STDMETHODCALLTYPE d3d10_effect_IsOptimized(ID3D10Effect *iface)
779 FIXME("iface %p stub!\n", iface);
781 return FALSE;
784 const struct ID3D10EffectVtbl d3d10_effect_vtbl =
786 /* IUnknown methods */
787 d3d10_effect_QueryInterface,
788 d3d10_effect_AddRef,
789 d3d10_effect_Release,
790 /* ID3D10Effect methods */
791 d3d10_effect_IsValid,
792 d3d10_effect_IsPool,
793 d3d10_effect_GetDevice,
794 d3d10_effect_GetDesc,
795 d3d10_effect_GetConstantBufferByIndex,
796 d3d10_effect_GetConstantBufferByName,
797 d3d10_effect_GetVariableByIndex,
798 d3d10_effect_GetVariableByName,
799 d3d10_effect_GetVariableBySemantic,
800 d3d10_effect_GetTechniqueByIndex,
801 d3d10_effect_GetTechniqueByName,
802 d3d10_effect_Optimize,
803 d3d10_effect_IsOptimized,
806 /* ID3D10EffectTechnique methods */
808 static BOOL STDMETHODCALLTYPE d3d10_effect_technique_IsValid(ID3D10EffectTechnique *iface)
810 FIXME("iface %p stub!\n", iface);
812 return FALSE;
815 static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_GetDesc(ID3D10EffectTechnique *iface,
816 D3D10_TECHNIQUE_DESC *desc)
818 struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
820 TRACE("iface %p, desc %p\n", iface, desc);
822 desc->Name = This->name;
823 desc->Passes = This->pass_count;
824 WARN("Annotations not implemented\n");
825 desc->Annotations = 0;
827 return S_OK;
830 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByIndex(
831 ID3D10EffectTechnique *iface, UINT index)
833 FIXME("iface %p, index %u stub!\n", iface, index);
835 return NULL;
838 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByName(
839 ID3D10EffectTechnique *iface, LPCSTR name)
841 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
843 return NULL;
846 static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByIndex(ID3D10EffectTechnique *iface,
847 UINT index)
849 struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
850 struct d3d10_effect_pass *p;
852 TRACE("iface %p, index %u\n", iface, index);
854 if (index >= This->pass_count)
856 WARN("Invalid index specified\n");
857 return NULL;
860 p = &This->passes[index];
862 TRACE("Returning pass %p, \"%s\"\n", p, p->name);
864 return (ID3D10EffectPass *)p;
867 static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByName(ID3D10EffectTechnique *iface,
868 LPCSTR name)
870 struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
871 unsigned int i;
873 TRACE("iface %p, name \"%s\"\n", iface, name);
875 for (i = 0; i < This->pass_count; ++i)
877 struct d3d10_effect_pass *p = &This->passes[i];
878 if (!strcmp(p->name, name))
880 TRACE("Returning pass %p\n", p);
881 return (ID3D10EffectPass *)p;
885 return NULL;
888 static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_ComputeStateBlockMask(ID3D10EffectTechnique *iface,
889 D3D10_STATE_BLOCK_MASK *mask)
891 FIXME("iface %p,mask %p stub!\n", iface, mask);
893 return E_NOTIMPL;
896 static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl =
898 /* ID3D10EffectTechnique methods */
899 d3d10_effect_technique_IsValid,
900 d3d10_effect_technique_GetDesc,
901 d3d10_effect_technique_GetAnnotationByIndex,
902 d3d10_effect_technique_GetAnnotationByName,
903 d3d10_effect_technique_GetPassByIndex,
904 d3d10_effect_technique_GetPassByName,
905 d3d10_effect_technique_ComputeStateBlockMask,
908 /* ID3D10EffectPass methods */
910 static BOOL STDMETHODCALLTYPE d3d10_effect_pass_IsValid(ID3D10EffectPass *iface)
912 FIXME("iface %p stub!\n", iface);
914 return FALSE;
917 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *iface, D3D10_PASS_DESC *desc)
919 struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
920 unsigned int i;
922 FIXME("iface %p, desc %p partial stub!\n", iface, desc);
924 memset(desc, 0, sizeof(*desc));
925 desc->Name = This->name;
926 for (i = 0; i < This->variable_count; ++i)
928 struct d3d10_effect_variable *v = &This->variables[i];
929 if (v->type == D3D10_EVT_VERTEXSHADER)
931 struct d3d10_effect_shader_variable *s = v->data;
932 desc->pIAInputSignature = (BYTE *)s->input_signature;
933 desc->IAInputSignatureSize = s->input_signature_size;
934 break;
938 return S_OK;
941 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetVertexShaderDesc(ID3D10EffectPass *iface,
942 D3D10_PASS_SHADER_DESC *desc)
944 FIXME("iface %p, desc %p stub!\n", iface, desc);
946 return E_NOTIMPL;
949 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetGeometryShaderDesc(ID3D10EffectPass *iface,
950 D3D10_PASS_SHADER_DESC *desc)
952 FIXME("iface %p, desc %p stub!\n", iface, desc);
954 return E_NOTIMPL;
957 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetPixelShaderDesc(ID3D10EffectPass *iface,
958 D3D10_PASS_SHADER_DESC *desc)
960 FIXME("iface %p, desc %p stub!\n", iface, desc);
962 return E_NOTIMPL;
965 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByIndex(ID3D10EffectPass *iface,
966 UINT index)
968 FIXME("iface %p, index %u stub!\n", iface, index);
970 return NULL;
973 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByName(ID3D10EffectPass *iface,
974 LPCSTR name)
976 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
978 return NULL;
981 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_Apply(ID3D10EffectPass *iface, UINT flags)
983 struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
984 HRESULT hr = S_OK;
985 unsigned int i;
987 TRACE("iface %p, flags %#x\n", iface, flags);
989 if (flags) FIXME("Ignoring flags (%#x)\n", flags);
991 for (i = 0; i < This->variable_count; ++i)
993 hr = d3d10_effect_variable_apply(&This->variables[i]);
994 if (FAILED(hr)) break;
997 return hr;
1000 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_ComputeStateBlockMask(ID3D10EffectPass *iface,
1001 D3D10_STATE_BLOCK_MASK *mask)
1003 FIXME("iface %p, mask %p stub!\n", iface, mask);
1005 return E_NOTIMPL;
1008 static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl =
1010 /* ID3D10EffectPass methods */
1011 d3d10_effect_pass_IsValid,
1012 d3d10_effect_pass_GetDesc,
1013 d3d10_effect_pass_GetVertexShaderDesc,
1014 d3d10_effect_pass_GetGeometryShaderDesc,
1015 d3d10_effect_pass_GetPixelShaderDesc,
1016 d3d10_effect_pass_GetAnnotationByIndex,
1017 d3d10_effect_pass_GetAnnotationByName,
1018 d3d10_effect_pass_Apply,
1019 d3d10_effect_pass_ComputeStateBlockMask,