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
,