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
;
36 static const struct ID3D10EffectVariableVtbl d3d10_effect_variable_vtbl
;
38 static inline void read_dword(const char **ptr
, DWORD
*d
)
40 memcpy(d
, *ptr
, sizeof(*d
));
44 static inline void skip_dword_unknown(const char **ptr
, unsigned int count
)
49 FIXME("Skipping %u unknown DWORDs:\n", count
);
50 for (i
= 0; i
< count
; ++i
)
53 FIXME("\t0x%08x\n", d
);
57 static inline void write_dword(char **ptr
, DWORD d
)
59 memcpy(*ptr
, &d
, sizeof(d
));
63 static inline void write_dword_unknown(char **ptr
, DWORD d
)
65 FIXME("Writing unknown DWORD 0x%08x\n", d
);
69 static inline void read_tag(const char **ptr
, DWORD
*t
, char t_str
[5])
76 static HRESULT
parse_dxbc(const char *data
, SIZE_T data_size
,
77 HRESULT (*chunk_handler
)(const char *data
, DWORD data_size
, DWORD tag
, void *ctx
), void *ctx
)
79 const char *ptr
= data
;
87 read_tag(&ptr
, &tag
, tag_str
);
88 TRACE("tag: %s\n", tag_str
);
97 skip_dword_unknown(&ptr
, 4);
99 skip_dword_unknown(&ptr
, 1);
101 read_dword(&ptr
, &total_size
);
102 TRACE("total size: %#x\n", total_size
);
104 read_dword(&ptr
, &chunk_count
);
105 TRACE("chunk count: %#x\n", chunk_count
);
107 for (i
= 0; i
< chunk_count
; ++i
)
109 DWORD chunk_tag
, chunk_size
;
110 const char *chunk_ptr
;
113 read_dword(&ptr
, &chunk_offset
);
114 TRACE("chunk %u at offset %#x\n", i
, chunk_offset
);
116 chunk_ptr
= data
+ chunk_offset
;
118 read_dword(&chunk_ptr
, &chunk_tag
);
119 read_dword(&chunk_ptr
, &chunk_size
);
121 hr
= chunk_handler(chunk_ptr
, chunk_size
, chunk_tag
, ctx
);
122 if (FAILED(hr
)) break;
128 static char *copy_name(const char *ptr
)
133 name_len
= strlen(ptr
) + 1;
134 name
= HeapAlloc(GetProcessHeap(), 0, name_len
);
137 ERR("Failed to allocate name memory.\n");
141 memcpy(name
, ptr
, name_len
);
146 static HRESULT
shader_chunk_handler(const char *data
, DWORD data_size
, DWORD tag
, void *ctx
)
148 struct d3d10_effect_shader_variable
*s
= ctx
;
151 memcpy(tag_str
, &tag
, 4);
153 TRACE("tag: %s\n", tag_str
);
155 TRACE("chunk size: %#x\n", data_size
);
161 /* 32 (DXBC header) + 1 * 4 (chunk index) + 2 * 4 (chunk header) + data_size (chunk data) */
162 UINT size
= 44 + data_size
;
165 s
->input_signature
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, size
);
166 if (!s
->input_signature
)
168 ERR("Failed to allocate input signature data\n");
169 return E_OUTOFMEMORY
;
171 s
->input_signature_size
= size
;
173 ptr
= s
->input_signature
;
175 write_dword(&ptr
, TAG_DXBC
);
178 write_dword_unknown(&ptr
, 0);
179 write_dword_unknown(&ptr
, 0);
180 write_dword_unknown(&ptr
, 0);
181 write_dword_unknown(&ptr
, 0);
183 /* seems to be always 1 */
184 write_dword_unknown(&ptr
, 1);
187 write_dword(&ptr
, size
);
190 write_dword(&ptr
, 1);
193 write_dword(&ptr
, (ptr
- s
->input_signature
) + 4);
196 write_dword(&ptr
, TAG_ISGN
);
197 write_dword(&ptr
, data_size
);
198 memcpy(ptr
, data
, data_size
);
203 FIXME("Unhandled chunk %s\n", tag_str
);
210 static HRESULT
parse_shader(struct d3d10_effect_object
*o
, const char *data
)
212 ID3D10Device
*device
= o
->pass
->technique
->effect
->device
;
213 struct d3d10_effect_shader_variable
*s
;
214 const char *ptr
= data
;
218 o
->data
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(struct d3d10_effect_shader_variable
));
221 ERR("Failed to allocate shader variable memory\n");
222 return E_OUTOFMEMORY
;
225 if (!ptr
) return S_OK
;
229 read_dword(&ptr
, &dxbc_size
);
230 TRACE("dxbc size: %#x\n", dxbc_size
);
234 case D3D10_EOT_VERTEXSHADER
:
235 hr
= ID3D10Device_CreateVertexShader(device
, ptr
, dxbc_size
, &s
->shader
.vs
);
236 if (FAILED(hr
)) return hr
;
239 case D3D10_EOT_PIXELSHADER
:
240 hr
= ID3D10Device_CreatePixelShader(device
, ptr
, dxbc_size
, &s
->shader
.ps
);
241 if (FAILED(hr
)) return hr
;
243 case D3D10_EOT_GEOMETRYSHADER
:
244 hr
= ID3D10Device_CreateGeometryShader(device
, ptr
, dxbc_size
, &s
->shader
.gs
);
245 if (FAILED(hr
)) return hr
;
249 return parse_dxbc(ptr
, dxbc_size
, shader_chunk_handler
, s
);
252 static HRESULT
parse_fx10_object(struct d3d10_effect_object
*o
, const char **ptr
, const char *data
)
254 const char *data_ptr
;
258 read_dword(ptr
, &o
->type
);
259 TRACE("Effect object is of type %#x.\n", o
->type
);
261 skip_dword_unknown(ptr
, 2);
263 read_dword(ptr
, &offset
);
264 TRACE("Effect object idx is at offset %#x.\n", offset
);
266 data_ptr
= data
+ offset
;
267 read_dword(&data_ptr
, &offset
);
269 TRACE("Effect object starts at offset %#x.\n", offset
);
271 /* FIXME: This probably isn't completely correct. */
274 WARN("Skipping effect object.\n");
279 data_ptr
= data
+ offset
;
284 case D3D10_EOT_VERTEXSHADER
:
285 TRACE("Vertex shader\n");
286 hr
= parse_shader(o
, data_ptr
);
289 case D3D10_EOT_PIXELSHADER
:
290 TRACE("Pixel shader\n");
291 hr
= parse_shader(o
, data_ptr
);
294 case D3D10_EOT_GEOMETRYSHADER
:
295 TRACE("Geometry shader\n");
296 hr
= parse_shader(o
, data_ptr
);
300 FIXME("Unhandled object type %#x\n", o
->type
);
308 static HRESULT
parse_fx10_pass(struct d3d10_effect_pass
*p
, const char **ptr
, const char *data
)
314 read_dword(ptr
, &offset
);
315 TRACE("Pass name at offset %#x.\n", offset
);
317 p
->name
= copy_name(data
+ offset
);
320 ERR("Failed to copy name.\n");
321 return E_OUTOFMEMORY
;
323 TRACE("Pass name: %s.\n", p
->name
);
325 read_dword(ptr
, &p
->object_count
);
326 TRACE("Pass has %u effect objects.\n", p
->object_count
);
328 skip_dword_unknown(ptr
, 1);
330 p
->objects
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, p
->object_count
* sizeof(*p
->objects
));
333 ERR("Failed to allocate effect objects memory.\n");
334 return E_OUTOFMEMORY
;
337 for (i
= 0; i
< p
->object_count
; ++i
)
339 struct d3d10_effect_object
*o
= &p
->objects
[i
];
343 hr
= parse_fx10_object(o
, ptr
, data
);
344 if (FAILED(hr
)) return hr
;
350 static HRESULT
parse_fx10_technique(struct d3d10_effect_technique
*t
, const char **ptr
, const char *data
)
355 read_dword(ptr
, &offset
);
356 TRACE("Technique name at offset %#x.\n", offset
);
358 t
->name
= copy_name(data
+ offset
);
361 ERR("Failed to copy name.\n");
362 return E_OUTOFMEMORY
;
364 TRACE("Technique name: %s.\n", t
->name
);
366 read_dword(ptr
, &t
->pass_count
);
367 TRACE("Technique has %u passes\n", t
->pass_count
);
369 skip_dword_unknown(ptr
, 1);
371 t
->passes
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, t
->pass_count
* sizeof(*t
->passes
));
374 ERR("Failed to allocate passes memory\n");
375 return E_OUTOFMEMORY
;
378 for (i
= 0; i
< t
->pass_count
; ++i
)
380 struct d3d10_effect_pass
*p
= &t
->passes
[i
];
383 p
->vtbl
= &d3d10_effect_pass_vtbl
;
386 hr
= parse_fx10_pass(p
, ptr
, data
);
387 if (FAILED(hr
)) return hr
;
393 static HRESULT
parse_fx10_variable(struct d3d10_effect_variable
*v
, const char **ptr
, const char *data
)
397 read_dword(ptr
, &offset
);
398 TRACE("Variable name at offset %#x.\n", offset
);
400 v
->name
= copy_name(data
+ offset
);
403 ERR("Failed to copy name.\n");
404 return E_OUTOFMEMORY
;
406 TRACE("Variable name: %s.\n", v
->name
);
408 read_dword(ptr
, &offset
);
409 TRACE("Variable type info at offset %#x.\n", offset
);
411 skip_dword_unknown(ptr
, 1);
413 read_dword(ptr
, &v
->buffer_offset
);
414 TRACE("Variable offset in buffer: %#x.\n", v
->buffer_offset
);
416 skip_dword_unknown(ptr
, 3);
421 static HRESULT
parse_fx10_local_buffer(struct d3d10_effect_local_buffer
*l
, const char **ptr
, const char *data
)
426 read_dword(ptr
, &offset
);
427 TRACE("Local buffer name at offset %#x.\n", offset
);
429 l
->name
= copy_name(data
+ offset
);
432 ERR("Failed to copy name.\n");
433 return E_OUTOFMEMORY
;
435 TRACE("Local buffer name: %s.\n", l
->name
);
437 read_dword(ptr
, &l
->data_size
);
438 TRACE("Local buffer data size: %#x.\n", l
->data_size
);
440 skip_dword_unknown(ptr
, 1);
442 read_dword(ptr
, &l
->variable_count
);
443 TRACE("Local buffer variable count: %#x.\n", l
->variable_count
);
445 skip_dword_unknown(ptr
, 2);
447 l
->variables
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, l
->variable_count
* sizeof(*l
->variables
));
450 ERR("Failed to allocate variables memory.\n");
451 return E_OUTOFMEMORY
;
454 for (i
= 0; i
< l
->variable_count
; ++i
)
456 struct d3d10_effect_variable
*v
= &l
->variables
[i
];
459 v
->vtbl
= &d3d10_effect_variable_vtbl
;
461 hr
= parse_fx10_variable(v
, ptr
, data
);
462 if (FAILED(hr
)) return hr
;
468 static HRESULT
parse_fx10_body(struct d3d10_effect
*e
, const char *data
, DWORD data_size
)
470 const char *ptr
= data
+ e
->index_offset
;
474 e
->local_buffers
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, e
->local_buffer_count
* sizeof(*e
->local_buffers
));
475 if (!e
->local_buffers
)
477 ERR("Failed to allocate local buffer memory.\n");
478 return E_OUTOFMEMORY
;
481 e
->techniques
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, e
->technique_count
* sizeof(*e
->techniques
));
484 ERR("Failed to allocate techniques memory\n");
485 return E_OUTOFMEMORY
;
488 for (i
= 0; i
< e
->local_buffer_count
; ++i
)
490 struct d3d10_effect_local_buffer
*l
= &e
->local_buffers
[i
];
492 hr
= parse_fx10_local_buffer(l
, &ptr
, data
);
493 if (FAILED(hr
)) return hr
;
496 for (i
= 0; i
< e
->technique_count
; ++i
)
498 struct d3d10_effect_technique
*t
= &e
->techniques
[i
];
500 t
->vtbl
= &d3d10_effect_technique_vtbl
;
503 hr
= parse_fx10_technique(t
, &ptr
, data
);
504 if (FAILED(hr
)) return hr
;
510 static HRESULT
parse_fx10(struct d3d10_effect
*e
, const char *data
, DWORD data_size
)
512 const char *ptr
= data
;
515 /* Compiled target version (e.g. fx_4_0=0xfeff1001, fx_4_1=0xfeff1011). */
516 read_dword(&ptr
, &e
->version
);
517 TRACE("Target: %#x\n", e
->version
);
519 read_dword(&ptr
, &e
->local_buffer_count
);
520 TRACE("Local buffer count: %u.\n", e
->local_buffer_count
);
522 /* Number of variables in local buffers? */
523 read_dword(&ptr
, &unknown
);
524 FIXME("Unknown 0: %u\n", unknown
);
526 read_dword(&ptr
, &e
->localobjects_count
);
527 TRACE("Localobjects count: %u\n", e
->localobjects_count
);
529 read_dword(&ptr
, &e
->sharedbuffers_count
);
530 TRACE("Sharedbuffers count: %u\n", e
->sharedbuffers_count
);
532 /* Number of variables in shared buffers? */
533 read_dword(&ptr
, &unknown
);
534 FIXME("Unknown 1: %u\n", unknown
);
536 read_dword(&ptr
, &e
->sharedobjects_count
);
537 TRACE("Sharedobjects count: %u\n", e
->sharedobjects_count
);
539 read_dword(&ptr
, &e
->technique_count
);
540 TRACE("Technique count: %u\n", e
->technique_count
);
542 read_dword(&ptr
, &e
->index_offset
);
543 TRACE("Index offset: %#x\n", e
->index_offset
);
545 read_dword(&ptr
, &unknown
);
546 FIXME("Unknown 2: %u\n", unknown
);
547 read_dword(&ptr
, &unknown
);
548 FIXME("Unknown 3: %u\n", unknown
);
550 read_dword(&ptr
, &e
->dephstencilstate_count
);
551 TRACE("Depthstencilstate count: %u\n", e
->dephstencilstate_count
);
553 read_dword(&ptr
, &e
->blendstate_count
);
554 TRACE("Blendstate count: %u\n", e
->blendstate_count
);
556 read_dword(&ptr
, &e
->rasterizerstate_count
);
557 TRACE("Rasterizerstate count: %u\n", e
->rasterizerstate_count
);
559 read_dword(&ptr
, &e
->samplerstate_count
);
560 TRACE("Samplerstate count: %u\n", e
->samplerstate_count
);
562 read_dword(&ptr
, &unknown
);
563 FIXME("Unknown 4: %u\n", unknown
);
564 read_dword(&ptr
, &unknown
);
565 FIXME("Unknown 5: %u\n", unknown
);
567 /* Number of function calls in all passes? */
568 read_dword(&ptr
, &unknown
);
569 FIXME("Unknown 6: %u\n", unknown
);
570 read_dword(&ptr
, &unknown
);
571 FIXME("Unknown 7: %u\n", unknown
);
573 return parse_fx10_body(e
, ptr
, data_size
- (ptr
- data
));
576 static HRESULT
fx10_chunk_handler(const char *data
, DWORD data_size
, DWORD tag
, void *ctx
)
578 struct d3d10_effect
*e
= ctx
;
581 memcpy(tag_str
, &tag
, 4);
583 TRACE("tag: %s\n", tag_str
);
585 TRACE("chunk size: %#x\n", data_size
);
590 return parse_fx10(e
, data
, data_size
);
593 FIXME("Unhandled chunk %s\n", tag_str
);
598 HRESULT
d3d10_effect_parse(struct d3d10_effect
*This
, const void *data
, SIZE_T data_size
)
600 return parse_dxbc(data
, data_size
, fx10_chunk_handler
, This
);
603 static void d3d10_effect_object_destroy(struct d3d10_effect_object
*o
)
605 TRACE("effect object %p.\n", o
);
609 case D3D10_EOT_VERTEXSHADER
:
610 case D3D10_EOT_PIXELSHADER
:
611 case D3D10_EOT_GEOMETRYSHADER
:
612 HeapFree(GetProcessHeap(), 0, ((struct d3d10_effect_shader_variable
*)o
->data
)->input_signature
);
618 HeapFree(GetProcessHeap(), 0, o
->data
);
621 static HRESULT
d3d10_effect_object_apply(struct d3d10_effect_object
*o
)
623 ID3D10Device
*device
= o
->pass
->technique
->effect
->device
;
625 TRACE("effect object %p, type %#x.\n", o
, o
->type
);
629 case D3D10_EOT_VERTEXSHADER
:
630 ID3D10Device_VSSetShader(device
, ((struct d3d10_effect_shader_variable
*)o
->data
)->shader
.vs
);
633 case D3D10_EOT_PIXELSHADER
:
634 ID3D10Device_PSSetShader(device
, ((struct d3d10_effect_shader_variable
*)o
->data
)->shader
.ps
);
637 case D3D10_EOT_GEOMETRYSHADER
:
638 ID3D10Device_GSSetShader(device
, ((struct d3d10_effect_shader_variable
*)o
->data
)->shader
.gs
);
642 FIXME("Unhandled effect object type %#x.\n", o
->type
);
647 static void d3d10_effect_pass_destroy(struct d3d10_effect_pass
*p
)
649 TRACE("pass %p\n", p
);
651 HeapFree(GetProcessHeap(), 0, p
->name
);
655 for (i
= 0; i
< p
->object_count
; ++i
)
657 d3d10_effect_object_destroy(&p
->objects
[i
]);
659 HeapFree(GetProcessHeap(), 0, p
->objects
);
663 static void d3d10_effect_technique_destroy(struct d3d10_effect_technique
*t
)
665 TRACE("technique %p\n", t
);
667 HeapFree(GetProcessHeap(), 0, t
->name
);
671 for (i
= 0; i
< t
->pass_count
; ++i
)
673 d3d10_effect_pass_destroy(&t
->passes
[i
]);
675 HeapFree(GetProcessHeap(), 0, t
->passes
);
679 static void d3d10_effect_variable_destroy(struct d3d10_effect_variable
*v
)
681 TRACE("variable %p.\n", v
);
683 HeapFree(GetProcessHeap(), 0, v
->name
);
686 static void d3d10_effect_local_buffer_destroy(struct d3d10_effect_local_buffer
*l
)
688 TRACE("local buffer %p.\n", l
);
690 HeapFree(GetProcessHeap(), 0, l
->name
);
694 for (i
= 0; i
< l
->variable_count
; ++i
)
696 d3d10_effect_variable_destroy(&l
->variables
[i
]);
698 HeapFree(GetProcessHeap(), 0, l
->variables
);
702 /* IUnknown methods */
704 static HRESULT STDMETHODCALLTYPE
d3d10_effect_QueryInterface(ID3D10Effect
*iface
, REFIID riid
, void **object
)
706 TRACE("iface %p, riid %s, object %p\n", iface
, debugstr_guid(riid
), object
);
708 if (IsEqualGUID(riid
, &IID_ID3D10Effect
)
709 || IsEqualGUID(riid
, &IID_IUnknown
))
711 IUnknown_AddRef(iface
);
716 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid
));
719 return E_NOINTERFACE
;
722 static ULONG STDMETHODCALLTYPE
d3d10_effect_AddRef(ID3D10Effect
*iface
)
724 struct d3d10_effect
*This
= (struct d3d10_effect
*)iface
;
725 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
727 TRACE("%p increasing refcount to %u\n", This
, refcount
);
732 static ULONG STDMETHODCALLTYPE
d3d10_effect_Release(ID3D10Effect
*iface
)
734 struct d3d10_effect
*This
= (struct d3d10_effect
*)iface
;
735 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
737 TRACE("%p decreasing refcount to %u\n", This
, refcount
);
743 if (This
->techniques
)
745 for (i
= 0; i
< This
->technique_count
; ++i
)
747 d3d10_effect_technique_destroy(&This
->techniques
[i
]);
749 HeapFree(GetProcessHeap(), 0, This
->techniques
);
752 if (This
->local_buffers
)
754 for (i
= 0; i
< This
->local_buffer_count
; ++i
)
756 d3d10_effect_local_buffer_destroy(&This
->local_buffers
[i
]);
758 HeapFree(GetProcessHeap(), 0, This
->local_buffers
);
761 ID3D10Device_Release(This
->device
);
762 HeapFree(GetProcessHeap(), 0, This
);
768 /* ID3D10Effect methods */
770 static BOOL STDMETHODCALLTYPE
d3d10_effect_IsValid(ID3D10Effect
*iface
)
772 FIXME("iface %p stub!\n", iface
);
777 static BOOL STDMETHODCALLTYPE
d3d10_effect_IsPool(ID3D10Effect
*iface
)
779 FIXME("iface %p stub!\n", iface
);
784 static HRESULT STDMETHODCALLTYPE
d3d10_effect_GetDevice(ID3D10Effect
*iface
, ID3D10Device
**device
)
786 struct d3d10_effect
*This
= (struct d3d10_effect
*)iface
;
788 TRACE("iface %p, device %p\n", iface
, device
);
790 ID3D10Device_AddRef(This
->device
);
791 *device
= This
->device
;
796 static HRESULT STDMETHODCALLTYPE
d3d10_effect_GetDesc(ID3D10Effect
*iface
, D3D10_EFFECT_DESC
*desc
)
798 FIXME("iface %p, desc %p stub!\n", iface
, desc
);
803 static struct ID3D10EffectConstantBuffer
* STDMETHODCALLTYPE
d3d10_effect_GetConstantBufferByIndex(ID3D10Effect
*iface
,
806 FIXME("iface %p, index %u stub!\n", iface
, index
);
811 static struct ID3D10EffectConstantBuffer
* STDMETHODCALLTYPE
d3d10_effect_GetConstantBufferByName(ID3D10Effect
*iface
,
814 FIXME("iface %p, name \"%s\" stub!\n", iface
, name
);
819 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_GetVariableByIndex(ID3D10Effect
*iface
, UINT index
)
821 FIXME("iface %p, index %u stub!\n", iface
, index
);
826 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_GetVariableByName(ID3D10Effect
*iface
, LPCSTR name
)
828 struct d3d10_effect
*This
= (struct d3d10_effect
*)iface
;
831 TRACE("iface %p, name \"%s\"\n", iface
, name
);
833 for (i
= 0; i
< This
->local_buffer_count
; ++i
)
835 struct d3d10_effect_local_buffer
*l
= &This
->local_buffers
[i
];
838 for (j
= 0; j
< l
->variable_count
; ++j
)
840 struct d3d10_effect_variable
*v
= &l
->variables
[j
];
842 if (!strcmp(v
->name
, name
))
844 TRACE("Returning variable %p.\n", v
);
845 return (ID3D10EffectVariable
*)v
;
853 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_GetVariableBySemantic(ID3D10Effect
*iface
,
856 FIXME("iface %p, semantic \"%s\" stub!\n", iface
, semantic
);
861 static struct ID3D10EffectTechnique
* STDMETHODCALLTYPE
d3d10_effect_GetTechniqueByIndex(ID3D10Effect
*iface
,
864 struct d3d10_effect
*This
= (struct d3d10_effect
*)iface
;
865 struct d3d10_effect_technique
*t
;
867 TRACE("iface %p, index %u\n", iface
, index
);
869 if (index
>= This
->technique_count
)
871 WARN("Invalid index specified\n");
875 t
= &This
->techniques
[index
];
877 TRACE("Returning technique %p, \"%s\"\n", t
, t
->name
);
879 return (ID3D10EffectTechnique
*)t
;
882 static struct ID3D10EffectTechnique
* STDMETHODCALLTYPE
d3d10_effect_GetTechniqueByName(ID3D10Effect
*iface
,
885 struct d3d10_effect
*This
= (struct d3d10_effect
*)iface
;
888 TRACE("iface %p, name \"%s\"\n", iface
, name
);
890 for (i
= 0; i
< This
->technique_count
; ++i
)
892 struct d3d10_effect_technique
*t
= &This
->techniques
[i
];
893 if (!strcmp(t
->name
, name
))
895 TRACE("Returning technique %p\n", t
);
896 return (ID3D10EffectTechnique
*)t
;
903 static HRESULT STDMETHODCALLTYPE
d3d10_effect_Optimize(ID3D10Effect
*iface
)
905 FIXME("iface %p stub!\n", iface
);
910 static BOOL STDMETHODCALLTYPE
d3d10_effect_IsOptimized(ID3D10Effect
*iface
)
912 FIXME("iface %p stub!\n", iface
);
917 const struct ID3D10EffectVtbl d3d10_effect_vtbl
=
919 /* IUnknown methods */
920 d3d10_effect_QueryInterface
,
922 d3d10_effect_Release
,
923 /* ID3D10Effect methods */
924 d3d10_effect_IsValid
,
926 d3d10_effect_GetDevice
,
927 d3d10_effect_GetDesc
,
928 d3d10_effect_GetConstantBufferByIndex
,
929 d3d10_effect_GetConstantBufferByName
,
930 d3d10_effect_GetVariableByIndex
,
931 d3d10_effect_GetVariableByName
,
932 d3d10_effect_GetVariableBySemantic
,
933 d3d10_effect_GetTechniqueByIndex
,
934 d3d10_effect_GetTechniqueByName
,
935 d3d10_effect_Optimize
,
936 d3d10_effect_IsOptimized
,
939 /* ID3D10EffectTechnique methods */
941 static BOOL STDMETHODCALLTYPE
d3d10_effect_technique_IsValid(ID3D10EffectTechnique
*iface
)
943 FIXME("iface %p stub!\n", iface
);
948 static HRESULT STDMETHODCALLTYPE
d3d10_effect_technique_GetDesc(ID3D10EffectTechnique
*iface
,
949 D3D10_TECHNIQUE_DESC
*desc
)
951 struct d3d10_effect_technique
*This
= (struct d3d10_effect_technique
*)iface
;
953 TRACE("iface %p, desc %p\n", iface
, desc
);
955 desc
->Name
= This
->name
;
956 desc
->Passes
= This
->pass_count
;
957 WARN("Annotations not implemented\n");
958 desc
->Annotations
= 0;
963 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_technique_GetAnnotationByIndex(
964 ID3D10EffectTechnique
*iface
, UINT index
)
966 FIXME("iface %p, index %u stub!\n", iface
, index
);
971 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_technique_GetAnnotationByName(
972 ID3D10EffectTechnique
*iface
, LPCSTR name
)
974 FIXME("iface %p, name \"%s\" stub!\n", iface
, name
);
979 static struct ID3D10EffectPass
* STDMETHODCALLTYPE
d3d10_effect_technique_GetPassByIndex(ID3D10EffectTechnique
*iface
,
982 struct d3d10_effect_technique
*This
= (struct d3d10_effect_technique
*)iface
;
983 struct d3d10_effect_pass
*p
;
985 TRACE("iface %p, index %u\n", iface
, index
);
987 if (index
>= This
->pass_count
)
989 WARN("Invalid index specified\n");
993 p
= &This
->passes
[index
];
995 TRACE("Returning pass %p, \"%s\"\n", p
, p
->name
);
997 return (ID3D10EffectPass
*)p
;
1000 static struct ID3D10EffectPass
* STDMETHODCALLTYPE
d3d10_effect_technique_GetPassByName(ID3D10EffectTechnique
*iface
,
1003 struct d3d10_effect_technique
*This
= (struct d3d10_effect_technique
*)iface
;
1006 TRACE("iface %p, name \"%s\"\n", iface
, name
);
1008 for (i
= 0; i
< This
->pass_count
; ++i
)
1010 struct d3d10_effect_pass
*p
= &This
->passes
[i
];
1011 if (!strcmp(p
->name
, name
))
1013 TRACE("Returning pass %p\n", p
);
1014 return (ID3D10EffectPass
*)p
;
1021 static HRESULT STDMETHODCALLTYPE
d3d10_effect_technique_ComputeStateBlockMask(ID3D10EffectTechnique
*iface
,
1022 D3D10_STATE_BLOCK_MASK
*mask
)
1024 FIXME("iface %p,mask %p stub!\n", iface
, mask
);
1029 static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl
=
1031 /* ID3D10EffectTechnique methods */
1032 d3d10_effect_technique_IsValid
,
1033 d3d10_effect_technique_GetDesc
,
1034 d3d10_effect_technique_GetAnnotationByIndex
,
1035 d3d10_effect_technique_GetAnnotationByName
,
1036 d3d10_effect_technique_GetPassByIndex
,
1037 d3d10_effect_technique_GetPassByName
,
1038 d3d10_effect_technique_ComputeStateBlockMask
,
1041 /* ID3D10EffectPass methods */
1043 static BOOL STDMETHODCALLTYPE
d3d10_effect_pass_IsValid(ID3D10EffectPass
*iface
)
1045 FIXME("iface %p stub!\n", iface
);
1050 static HRESULT STDMETHODCALLTYPE
d3d10_effect_pass_GetDesc(ID3D10EffectPass
*iface
, D3D10_PASS_DESC
*desc
)
1052 struct d3d10_effect_pass
*This
= (struct d3d10_effect_pass
*)iface
;
1055 FIXME("iface %p, desc %p partial stub!\n", iface
, desc
);
1057 memset(desc
, 0, sizeof(*desc
));
1058 desc
->Name
= This
->name
;
1059 for (i
= 0; i
< This
->object_count
; ++i
)
1061 struct d3d10_effect_object
*o
= &This
->objects
[i
];
1062 if (o
->type
== D3D10_EOT_VERTEXSHADER
)
1064 struct d3d10_effect_shader_variable
*s
= o
->data
;
1065 desc
->pIAInputSignature
= (BYTE
*)s
->input_signature
;
1066 desc
->IAInputSignatureSize
= s
->input_signature_size
;
1074 static HRESULT STDMETHODCALLTYPE
d3d10_effect_pass_GetVertexShaderDesc(ID3D10EffectPass
*iface
,
1075 D3D10_PASS_SHADER_DESC
*desc
)
1077 FIXME("iface %p, desc %p stub!\n", iface
, desc
);
1082 static HRESULT STDMETHODCALLTYPE
d3d10_effect_pass_GetGeometryShaderDesc(ID3D10EffectPass
*iface
,
1083 D3D10_PASS_SHADER_DESC
*desc
)
1085 FIXME("iface %p, desc %p stub!\n", iface
, desc
);
1090 static HRESULT STDMETHODCALLTYPE
d3d10_effect_pass_GetPixelShaderDesc(ID3D10EffectPass
*iface
,
1091 D3D10_PASS_SHADER_DESC
*desc
)
1093 FIXME("iface %p, desc %p stub!\n", iface
, desc
);
1098 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_pass_GetAnnotationByIndex(ID3D10EffectPass
*iface
,
1101 FIXME("iface %p, index %u stub!\n", iface
, index
);
1106 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_pass_GetAnnotationByName(ID3D10EffectPass
*iface
,
1109 FIXME("iface %p, name \"%s\" stub!\n", iface
, name
);
1114 static HRESULT STDMETHODCALLTYPE
d3d10_effect_pass_Apply(ID3D10EffectPass
*iface
, UINT flags
)
1116 struct d3d10_effect_pass
*This
= (struct d3d10_effect_pass
*)iface
;
1120 TRACE("iface %p, flags %#x\n", iface
, flags
);
1122 if (flags
) FIXME("Ignoring flags (%#x)\n", flags
);
1124 for (i
= 0; i
< This
->object_count
; ++i
)
1126 hr
= d3d10_effect_object_apply(&This
->objects
[i
]);
1127 if (FAILED(hr
)) break;
1133 static HRESULT STDMETHODCALLTYPE
d3d10_effect_pass_ComputeStateBlockMask(ID3D10EffectPass
*iface
,
1134 D3D10_STATE_BLOCK_MASK
*mask
)
1136 FIXME("iface %p, mask %p stub!\n", iface
, mask
);
1141 static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl
=
1143 /* ID3D10EffectPass methods */
1144 d3d10_effect_pass_IsValid
,
1145 d3d10_effect_pass_GetDesc
,
1146 d3d10_effect_pass_GetVertexShaderDesc
,
1147 d3d10_effect_pass_GetGeometryShaderDesc
,
1148 d3d10_effect_pass_GetPixelShaderDesc
,
1149 d3d10_effect_pass_GetAnnotationByIndex
,
1150 d3d10_effect_pass_GetAnnotationByName
,
1151 d3d10_effect_pass_Apply
,
1152 d3d10_effect_pass_ComputeStateBlockMask
,
1155 /* ID3D10EffectVariable methods */
1157 static BOOL STDMETHODCALLTYPE
d3d10_effect_variable_IsValid(ID3D10EffectVariable
*iface
)
1159 FIXME("iface %p stub!\n", iface
);
1164 static struct ID3D10EffectType
* STDMETHODCALLTYPE
d3d10_effect_variable_GetType(ID3D10EffectVariable
*iface
)
1166 FIXME("iface %p stub!\n", iface
);
1171 static HRESULT STDMETHODCALLTYPE
d3d10_effect_variable_GetDesc(ID3D10EffectVariable
*iface
,
1172 D3D10_EFFECT_VARIABLE_DESC
*desc
)
1174 FIXME("iface %p, desc %p stub!\n", iface
, desc
);
1179 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_GetAnnotationByIndex(
1180 ID3D10EffectVariable
*iface
, UINT index
)
1182 FIXME("iface %p, index %u stub!\n", iface
, index
);
1187 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_GetAnnotationByName(
1188 ID3D10EffectVariable
*iface
, LPCSTR name
)
1190 FIXME("iface %p, name \"%s\" stub!\n", iface
, name
);
1195 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_GetMemberByIndex(
1196 ID3D10EffectVariable
*iface
, UINT index
)
1198 FIXME("iface %p, index %u stub!\n", iface
, index
);
1203 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_GetMemberByName(
1204 ID3D10EffectVariable
*iface
, LPCSTR name
)
1206 FIXME("iface %p, name \"%s\" stub!\n", iface
, name
);
1211 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_GetMemberBySemantic(
1212 ID3D10EffectVariable
*iface
, LPCSTR semantic
)
1214 FIXME("iface %p, semantic \"%s\" stub!\n", iface
, semantic
);
1219 static struct ID3D10EffectVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_GetElement(
1220 ID3D10EffectVariable
*iface
, UINT index
)
1222 FIXME("iface %p, index %u stub!\n", iface
, index
);
1227 static struct ID3D10EffectConstantBuffer
* STDMETHODCALLTYPE
d3d10_effect_variable_GetParentConstantBuffer(
1228 ID3D10EffectVariable
*iface
)
1230 FIXME("iface %p stub!\n", iface
);
1235 static struct ID3D10EffectScalarVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsScalar(
1236 ID3D10EffectVariable
*iface
)
1238 FIXME("iface %p stub!\n", iface
);
1243 static struct ID3D10EffectVectorVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsVector(
1244 ID3D10EffectVariable
*iface
)
1246 FIXME("iface %p stub!\n", iface
);
1251 static struct ID3D10EffectMatrixVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsMatrix(
1252 ID3D10EffectVariable
*iface
)
1254 FIXME("iface %p stub!\n", iface
);
1259 static struct ID3D10EffectStringVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsString(
1260 ID3D10EffectVariable
*iface
)
1262 FIXME("iface %p stub!\n", iface
);
1267 static struct ID3D10EffectShaderResourceVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsShaderResource(
1268 ID3D10EffectVariable
*iface
)
1270 FIXME("iface %p stub!\n", iface
);
1275 static struct ID3D10EffectRenderTargetViewVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsRenderTargetView(
1276 ID3D10EffectVariable
*iface
)
1278 FIXME("iface %p stub!\n", iface
);
1283 static struct ID3D10EffectDepthStencilViewVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsDepthStencilView(
1284 ID3D10EffectVariable
*iface
)
1286 FIXME("iface %p stub!\n", iface
);
1291 static struct ID3D10EffectConstantBuffer
* STDMETHODCALLTYPE
d3d10_effect_variable_AsConstantBuffer(
1292 ID3D10EffectVariable
*iface
)
1294 FIXME("iface %p stub!\n", iface
);
1299 static struct ID3D10EffectShaderVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsShader(
1300 ID3D10EffectVariable
*iface
)
1302 FIXME("iface %p stub!\n", iface
);
1307 static struct ID3D10EffectBlendVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsBlend(ID3D10EffectVariable
*iface
)
1309 FIXME("iface %p stub!\n", iface
);
1314 static struct ID3D10EffectDepthStencilVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsDepthStencil(
1315 ID3D10EffectVariable
*iface
)
1317 FIXME("iface %p stub!\n", iface
);
1322 static struct ID3D10EffectRasterizerVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsRasterizer(
1323 ID3D10EffectVariable
*iface
)
1325 FIXME("iface %p stub!\n", iface
);
1330 static struct ID3D10EffectSamplerVariable
* STDMETHODCALLTYPE
d3d10_effect_variable_AsSampler(
1331 ID3D10EffectVariable
*iface
)
1333 FIXME("iface %p stub!\n", iface
);
1338 static HRESULT STDMETHODCALLTYPE
d3d10_effect_variable_SetRawValue(ID3D10EffectVariable
*iface
,
1339 void *data
, UINT offset
, UINT count
)
1341 FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface
, data
, offset
, count
);
1346 static HRESULT STDMETHODCALLTYPE
d3d10_effect_variable_GetRawValue(ID3D10EffectVariable
*iface
,
1347 void *data
, UINT offset
, UINT count
)
1349 FIXME("iface %p, data %p, offset %u, count %u stub!\n", iface
, data
, offset
, count
);
1354 static const struct ID3D10EffectVariableVtbl d3d10_effect_variable_vtbl
=
1356 /* ID3D10EffectVariable methods */
1357 d3d10_effect_variable_IsValid
,
1358 d3d10_effect_variable_GetType
,
1359 d3d10_effect_variable_GetDesc
,
1360 d3d10_effect_variable_GetAnnotationByIndex
,
1361 d3d10_effect_variable_GetAnnotationByName
,
1362 d3d10_effect_variable_GetMemberByIndex
,
1363 d3d10_effect_variable_GetMemberByName
,
1364 d3d10_effect_variable_GetMemberBySemantic
,
1365 d3d10_effect_variable_GetElement
,
1366 d3d10_effect_variable_GetParentConstantBuffer
,
1367 d3d10_effect_variable_AsScalar
,
1368 d3d10_effect_variable_AsVector
,
1369 d3d10_effect_variable_AsMatrix
,
1370 d3d10_effect_variable_AsString
,
1371 d3d10_effect_variable_AsShaderResource
,
1372 d3d10_effect_variable_AsRenderTargetView
,
1373 d3d10_effect_variable_AsDepthStencilView
,
1374 d3d10_effect_variable_AsConstantBuffer
,
1375 d3d10_effect_variable_AsShader
,
1376 d3d10_effect_variable_AsBlend
,
1377 d3d10_effect_variable_AsDepthStencil
,
1378 d3d10_effect_variable_AsRasterizer
,
1379 d3d10_effect_variable_AsSampler
,
1380 d3d10_effect_variable_SetRawValue
,
1381 d3d10_effect_variable_GetRawValue
,