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
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));
43 static inline void skip_dword_unknown(const char **ptr, unsigned int count)
48 FIXME("Skipping %u unknown DWORDs:\n", count);
49 for (i = 0; i < count; ++i)
52 FIXME("\t0x%08x\n", d);
56 static inline void write_dword(char **ptr, DWORD d)
58 memcpy(*ptr, &d, sizeof(d));
62 static inline void write_dword_unknown(char **ptr, DWORD d)
64 FIXME("Writing unknown DWORD 0x%08x\n", d);
68 static inline void read_tag(const char **ptr, DWORD *t, char t_str[5])
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;
86 read_tag(&ptr, &tag, tag_str);
87 TRACE("tag: %s\n", tag_str);
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;
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;
127 static HRESULT parse_fx10_pass_index(struct d3d10_effect_pass *p, const char **ptr)
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));
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];
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);
164 static HRESULT parse_fx10_technique_index(struct d3d10_effect_technique *t, const char **ptr)
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));
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;
191 hr = parse_fx10_pass_index(p, ptr);
192 if (FAILED(hr)) break;
198 static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
200 struct d3d10_effect_shader_variable *s = ctx;
203 memcpy(tag_str, &tag, 4);
205 TRACE("tag: %s\n", tag_str);
207 TRACE("chunk size: %#x\n", data_size);
213 /* 32 (DXBC header) + 1 * 4 (chunk index) + 2 * 4 (chunk header) + data_size (chunk data) */
214 UINT size = 44 + data_size;
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);
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);
239 write_dword(&ptr, size);
242 write_dword(&ptr, 1);
245 write_dword(&ptr, (ptr - s->input_signature) + 4);
248 write_dword(&ptr, TAG_ISGN);
249 write_dword(&ptr, data_size);
250 memcpy(ptr, data, data_size);
255 FIXME("Unhandled chunk %s\n", tag_str);
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;
270 v->data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct d3d10_effect_shader_variable));
273 ERR("Failed to allocate shader variable memory\n");
274 return E_OUTOFMEMORY;
277 if (!ptr) return S_OK;
281 read_dword(&ptr, &dxbc_size);
282 TRACE("dxbc size: %#x\n", dxbc_size);
286 case D3D10_EVT_VERTEXSHADER:
287 hr = ID3D10Device_CreateVertexShader(device, ptr, dxbc_size, &s->shader.vs);
288 if (FAILED(hr)) return hr;
291 case D3D10_EVT_PIXELSHADER:
292 hr = ID3D10Device_CreatePixelShader(device, ptr, dxbc_size, &s->shader.ps);
293 if (FAILED(hr)) return hr;
295 case D3D10_EVT_GEOMETRYSHADER:
296 hr = ID3D10Device_CreateGeometryShader(device, ptr, dxbc_size, &s->shader.gs);
297 if (FAILED(hr)) return hr;
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)
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. */
318 WARN("Skipping variable\n");
328 case D3D10_EVT_VERTEXSHADER:
329 TRACE("Vertex shader\n");
330 hr = parse_shader(v, ptr);
333 case D3D10_EVT_PIXELSHADER:
334 TRACE("Pixel shader\n");
335 hr = parse_shader(v, ptr);
338 case D3D10_EVT_GEOMETRYSHADER:
339 TRACE("Geometry shader\n");
340 hr = parse_shader(v, ptr);
344 FIXME("Unhandled variable type %#x\n", v->type);
352 static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char *data)
359 ptr = data + p->start;
361 name_len = strlen(ptr) + 1;
362 p->name = HeapAlloc(GetProcessHeap(), 0, name_len);
365 ERR("Failed to allocate name memory\n");
366 return E_OUTOFMEMORY;
369 memcpy(p->name, 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;
383 static HRESULT parse_fx10_technique(struct d3d10_effect_technique *t, const char *data)
390 ptr = data + t->start;
392 name_len = strlen(ptr) + 1;
393 t->name = HeapAlloc(GetProcessHeap(), 0, name_len);
396 ERR("Failed to allocate name memory\n");
397 return E_OUTOFMEMORY;
400 memcpy(t->name, 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;
414 static HRESULT parse_fx10_body(struct d3d10_effect *e, const char *data, DWORD data_size)
416 const char *ptr = data + e->index_offset;
420 skip_dword_unknown(&ptr, 6);
422 e->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, e->technique_count * sizeof(*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;
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;
446 static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_size)
448 const char *ptr = data;
451 /* Compiled target version (e.g. fx_4_0=0xfeff1001, fx_4_1=0xfeff1011). */
452 read_dword(&ptr, &e->version);
453 TRACE("Target: %#x\n", e->version);
455 read_dword(&ptr, &e->localbuffers_count);
456 TRACE("Localbuffers count: %u\n", e->localbuffers_count);
458 /* Number of variables in local buffers? */
459 read_dword(&ptr, &unknown);
460 FIXME("Unknown 0: %u\n", unknown);
462 read_dword(&ptr, &e->localobjects_count);
463 TRACE("Localobjects count: %u\n", e->localobjects_count);
465 read_dword(&ptr, &e->sharedbuffers_count);
466 TRACE("Sharedbuffers count: %u\n", e->sharedbuffers_count);
468 /* Number of variables in shared buffers? */
469 read_dword(&ptr, &unknown);
470 FIXME("Unknown 1: %u\n", unknown);
472 read_dword(&ptr, &e->sharedobjects_count);
473 TRACE("Sharedobjects count: %u\n", e->sharedobjects_count);
475 read_dword(&ptr, &e->technique_count);
476 TRACE("Technique count: %u\n", e->technique_count);
478 read_dword(&ptr, &e->index_offset);
479 TRACE("Index offset: %#x\n", e->index_offset);
481 read_dword(&ptr, &unknown);
482 FIXME("Unknown 2: %u\n", unknown);
483 read_dword(&ptr, &unknown);
484 FIXME("Unknown 3: %u\n", unknown);
486 read_dword(&ptr, &e->dephstencilstate_count);
487 TRACE("Depthstencilstate count: %u\n", e->dephstencilstate_count);
489 read_dword(&ptr, &e->blendstate_count);
490 TRACE("Blendstate count: %u\n", e->blendstate_count);
492 read_dword(&ptr, &e->rasterizerstate_count);
493 TRACE("Rasterizerstate count: %u\n", e->rasterizerstate_count);
495 read_dword(&ptr, &e->samplerstate_count);
496 TRACE("Samplerstate count: %u\n", e->samplerstate_count);
498 read_dword(&ptr, &unknown);
499 FIXME("Unknown 4: %u\n", unknown);
500 read_dword(&ptr, &unknown);
501 FIXME("Unknown 5: %u\n", unknown);
503 /* Number of function calls in all passes? */
504 read_dword(&ptr, &unknown);
505 FIXME("Unknown 6: %u\n", unknown);
506 read_dword(&ptr, &unknown);
507 FIXME("Unknown 7: %u\n", unknown);
509 return parse_fx10_body(e, ptr, data_size - (ptr - data));
512 static HRESULT fx10_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
514 struct d3d10_effect *e = ctx;
517 memcpy(tag_str, &tag, 4);
519 TRACE("tag: %s\n", tag_str);
521 TRACE("chunk size: %#x\n", data_size);
526 return parse_fx10(e, data, data_size);
529 FIXME("Unhandled chunk %s\n", tag_str);
534 HRESULT d3d10_effect_parse(struct d3d10_effect *This, const void *data, SIZE_T data_size)
536 return parse_dxbc(data, data_size, fx10_chunk_handler, This);
539 static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
541 TRACE("variable %p\n", v);
545 case D3D10_EVT_VERTEXSHADER:
546 case D3D10_EVT_PIXELSHADER:
547 case D3D10_EVT_GEOMETRYSHADER:
548 HeapFree(GetProcessHeap(), 0, ((struct d3d10_effect_shader_variable *)v->data)->input_signature);
554 HeapFree(GetProcessHeap(), 0, v->data);
557 static HRESULT d3d10_effect_variable_apply(struct d3d10_effect_variable *v)
559 ID3D10Device *device = v->pass->technique->effect->device;
561 TRACE("variable %p, type %#x\n", v, v->type);
565 case D3D10_EVT_VERTEXSHADER:
566 ID3D10Device_VSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.vs);
569 case D3D10_EVT_PIXELSHADER:
570 ID3D10Device_PSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.ps);
573 case D3D10_EVT_GEOMETRYSHADER:
574 ID3D10Device_GSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.gs);
578 FIXME("Unhandled variable type %#x\n", v->type);
583 static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
585 TRACE("pass %p\n", p);
587 HeapFree(GetProcessHeap(), 0, p->name);
591 for (i = 0; i < p->variable_count; ++i)
593 d3d10_effect_variable_destroy(&p->variables[i]);
595 HeapFree(GetProcessHeap(), 0, p->variables);
599 static void d3d10_effect_technique_destroy(struct d3d10_effect_technique *t)
601 TRACE("technique %p\n", t);
603 HeapFree(GetProcessHeap(), 0, t->name);
607 for (i = 0; i < t->pass_count; ++i)
609 d3d10_effect_pass_destroy(&t->passes[i]);
611 HeapFree(GetProcessHeap(), 0, t->passes);
615 /* IUnknown methods */
617 static HRESULT STDMETHODCALLTYPE d3d10_effect_QueryInterface(ID3D10Effect *iface, REFIID riid, void **object)
619 TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
621 if (IsEqualGUID(riid, &IID_ID3D10Effect)
622 || IsEqualGUID(riid, &IID_IUnknown))
624 IUnknown_AddRef(iface);
629 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
632 return E_NOINTERFACE;
635 static ULONG STDMETHODCALLTYPE d3d10_effect_AddRef(ID3D10Effect *iface)
637 struct d3d10_effect *This = (struct d3d10_effect *)iface;
638 ULONG refcount = InterlockedIncrement(&This->refcount);
640 TRACE("%p increasing refcount to %u\n", This, refcount);
645 static ULONG STDMETHODCALLTYPE d3d10_effect_Release(ID3D10Effect *iface)
647 struct d3d10_effect *This = (struct d3d10_effect *)iface;
648 ULONG refcount = InterlockedDecrement(&This->refcount);
650 TRACE("%p decreasing refcount to %u\n", This, refcount);
654 if (This->techniques)
657 for (i = 0; i < This->technique_count; ++i)
659 d3d10_effect_technique_destroy(&This->techniques[i]);
661 HeapFree(GetProcessHeap(), 0, This->techniques);
663 ID3D10Device_Release(This->device);
664 HeapFree(GetProcessHeap(), 0, This);
670 /* ID3D10Effect methods */
672 static BOOL STDMETHODCALLTYPE d3d10_effect_IsValid(ID3D10Effect *iface)
674 FIXME("iface %p stub!\n", iface);
679 static BOOL STDMETHODCALLTYPE d3d10_effect_IsPool(ID3D10Effect *iface)
681 FIXME("iface %p stub!\n", iface);
686 static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDevice(ID3D10Effect *iface, ID3D10Device **device)
688 struct d3d10_effect *This = (struct d3d10_effect *)iface;
690 TRACE("iface %p, device %p\n", iface, device);
692 ID3D10Device_AddRef(This->device);
693 *device = This->device;
698 static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDesc(ID3D10Effect *iface, D3D10_EFFECT_DESC *desc)
700 FIXME("iface %p, desc %p stub!\n", iface, desc);
705 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_GetConstantBufferByIndex(ID3D10Effect *iface,
708 FIXME("iface %p, index %u stub!\n", iface, index);
713 static struct ID3D10EffectConstantBuffer * STDMETHODCALLTYPE d3d10_effect_GetConstantBufferByName(ID3D10Effect *iface,
716 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
721 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableByIndex(ID3D10Effect *iface, UINT index)
723 FIXME("iface %p, index %u stub!\n", iface, index);
728 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableByName(ID3D10Effect *iface, LPCSTR name)
730 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
735 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_GetVariableBySemantic(ID3D10Effect *iface,
738 FIXME("iface %p, semantic \"%s\" stub!\n", iface, semantic);
743 static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByIndex(ID3D10Effect *iface,
746 struct d3d10_effect *This = (struct d3d10_effect *)iface;
747 struct d3d10_effect_technique *t;
749 TRACE("iface %p, index %u\n", iface, index);
751 if (index >= This->technique_count)
753 WARN("Invalid index specified\n");
757 t = &This->techniques[index];
759 TRACE("Returning technique %p, \"%s\"\n", t, t->name);
761 return (ID3D10EffectTechnique *)t;
764 static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqueByName(ID3D10Effect *iface,
767 struct d3d10_effect *This = (struct d3d10_effect *)iface;
770 TRACE("iface %p, name \"%s\"\n", iface, name);
772 for (i = 0; i < This->technique_count; ++i)
774 struct d3d10_effect_technique *t = &This->techniques[i];
775 if (!strcmp(t->name, name))
777 TRACE("Returning technique %p\n", t);
778 return (ID3D10EffectTechnique *)t;
785 static HRESULT STDMETHODCALLTYPE d3d10_effect_Optimize(ID3D10Effect *iface)
787 FIXME("iface %p stub!\n", iface);
792 static BOOL STDMETHODCALLTYPE d3d10_effect_IsOptimized(ID3D10Effect *iface)
794 FIXME("iface %p stub!\n", iface);
799 const struct ID3D10EffectVtbl d3d10_effect_vtbl =
801 /* IUnknown methods */
802 d3d10_effect_QueryInterface,
804 d3d10_effect_Release,
805 /* ID3D10Effect methods */
806 d3d10_effect_IsValid,
808 d3d10_effect_GetDevice,
809 d3d10_effect_GetDesc,
810 d3d10_effect_GetConstantBufferByIndex,
811 d3d10_effect_GetConstantBufferByName,
812 d3d10_effect_GetVariableByIndex,
813 d3d10_effect_GetVariableByName,
814 d3d10_effect_GetVariableBySemantic,
815 d3d10_effect_GetTechniqueByIndex,
816 d3d10_effect_GetTechniqueByName,
817 d3d10_effect_Optimize,
818 d3d10_effect_IsOptimized,
821 /* ID3D10EffectTechnique methods */
823 static BOOL STDMETHODCALLTYPE d3d10_effect_technique_IsValid(ID3D10EffectTechnique *iface)
825 FIXME("iface %p stub!\n", iface);
830 static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_GetDesc(ID3D10EffectTechnique *iface,
831 D3D10_TECHNIQUE_DESC *desc)
833 struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
835 TRACE("iface %p, desc %p\n", iface, desc);
837 desc->Name = This->name;
838 desc->Passes = This->pass_count;
839 WARN("Annotations not implemented\n");
840 desc->Annotations = 0;
845 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByIndex(
846 ID3D10EffectTechnique *iface, UINT index)
848 FIXME("iface %p, index %u stub!\n", iface, index);
853 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_technique_GetAnnotationByName(
854 ID3D10EffectTechnique *iface, LPCSTR name)
856 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
861 static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByIndex(ID3D10EffectTechnique *iface,
864 struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
865 struct d3d10_effect_pass *p;
867 TRACE("iface %p, index %u\n", iface, index);
869 if (index >= This->pass_count)
871 WARN("Invalid index specified\n");
875 p = &This->passes[index];
877 TRACE("Returning pass %p, \"%s\"\n", p, p->name);
879 return (ID3D10EffectPass *)p;
882 static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPassByName(ID3D10EffectTechnique *iface,
885 struct d3d10_effect_technique *This = (struct d3d10_effect_technique *)iface;
888 TRACE("iface %p, name \"%s\"\n", iface, name);
890 for (i = 0; i < This->pass_count; ++i)
892 struct d3d10_effect_pass *p = &This->passes[i];
893 if (!strcmp(p->name, name))
895 TRACE("Returning pass %p\n", p);
896 return (ID3D10EffectPass *)p;
903 static HRESULT STDMETHODCALLTYPE d3d10_effect_technique_ComputeStateBlockMask(ID3D10EffectTechnique *iface,
904 D3D10_STATE_BLOCK_MASK *mask)
906 FIXME("iface %p,mask %p stub!\n", iface, mask);
911 static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl =
913 /* ID3D10EffectTechnique methods */
914 d3d10_effect_technique_IsValid,
915 d3d10_effect_technique_GetDesc,
916 d3d10_effect_technique_GetAnnotationByIndex,
917 d3d10_effect_technique_GetAnnotationByName,
918 d3d10_effect_technique_GetPassByIndex,
919 d3d10_effect_technique_GetPassByName,
920 d3d10_effect_technique_ComputeStateBlockMask,
923 /* ID3D10EffectPass methods */
925 static BOOL STDMETHODCALLTYPE d3d10_effect_pass_IsValid(ID3D10EffectPass *iface)
927 FIXME("iface %p stub!\n", iface);
932 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *iface, D3D10_PASS_DESC *desc)
934 struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
937 FIXME("iface %p, desc %p partial stub!\n", iface, desc);
939 memset(desc, 0, sizeof(*desc));
940 desc->Name = This->name;
941 for (i = 0; i < This->variable_count; ++i)
943 struct d3d10_effect_variable *v = &This->variables[i];
944 if (v->type == D3D10_EVT_VERTEXSHADER)
946 struct d3d10_effect_shader_variable *s = v->data;
947 desc->pIAInputSignature = (BYTE *)s->input_signature;
948 desc->IAInputSignatureSize = s->input_signature_size;
956 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetVertexShaderDesc(ID3D10EffectPass *iface,
957 D3D10_PASS_SHADER_DESC *desc)
959 FIXME("iface %p, desc %p stub!\n", iface, desc);
964 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetGeometryShaderDesc(ID3D10EffectPass *iface,
965 D3D10_PASS_SHADER_DESC *desc)
967 FIXME("iface %p, desc %p stub!\n", iface, desc);
972 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetPixelShaderDesc(ID3D10EffectPass *iface,
973 D3D10_PASS_SHADER_DESC *desc)
975 FIXME("iface %p, desc %p stub!\n", iface, desc);
980 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByIndex(ID3D10EffectPass *iface,
983 FIXME("iface %p, index %u stub!\n", iface, index);
988 static struct ID3D10EffectVariable * STDMETHODCALLTYPE d3d10_effect_pass_GetAnnotationByName(ID3D10EffectPass *iface,
991 FIXME("iface %p, name \"%s\" stub!\n", iface, name);
996 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_Apply(ID3D10EffectPass *iface, UINT flags)
998 struct d3d10_effect_pass *This = (struct d3d10_effect_pass *)iface;
1002 TRACE("iface %p, flags %#x\n", iface, flags);
1004 if (flags) FIXME("Ignoring flags (%#x)\n", flags);
1006 for (i = 0; i < This->variable_count; ++i)
1008 hr = d3d10_effect_variable_apply(&This->variables[i]);
1009 if (FAILED(hr)) break;
1015 static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_ComputeStateBlockMask(ID3D10EffectPass *iface,
1016 D3D10_STATE_BLOCK_MASK *mask)
1018 FIXME("iface %p, mask %p stub!\n", iface, mask);
1023 static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl =
1025 /* ID3D10EffectPass methods */
1026 d3d10_effect_pass_IsValid,
1027 d3d10_effect_pass_GetDesc,
1028 d3d10_effect_pass_GetVertexShaderDesc,
1029 d3d10_effect_pass_GetGeometryShaderDesc,
1030 d3d10_effect_pass_GetPixelShaderDesc,
1031 d3d10_effect_pass_GetAnnotationByIndex,
1032 d3d10_effect_pass_GetAnnotationByName,
1033 d3d10_effect_pass_Apply,
1034 d3d10_effect_pass_ComputeStateBlockMask,