d3dx9_36: Implement D3DXCreateEffectEx and make D3DXCreateEffect use it.
[wine] / dlls / d3dx9_36 / effect.c
1 /*
2  * Copyright 2010 Christian Costa
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "config.h"
20 #include "wine/port.h"
21 #include "wine/debug.h"
22 #include "wine/unicode.h"
23 #include "windef.h"
24 #include "wingdi.h"
25 #include "d3dx9_36_private.h"
26
27 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
28
29 static const struct ID3DXEffectVtbl ID3DXEffect_Vtbl;
30
31 typedef struct ID3DXEffectImpl {
32     const ID3DXEffectVtbl *lpVtbl;
33     LONG ref;
34 } ID3DXEffectImpl;
35
36 /*** IUnknown methods ***/
37 static HRESULT WINAPI ID3DXEffectImpl_QueryInterface(ID3DXEffect* iface, REFIID riid, void** object)
38 {
39     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
40
41     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), object);
42
43     if (IsEqualGUID(riid, &IID_IUnknown) ||
44         IsEqualGUID(riid, &IID_ID3DXBaseEffect) ||
45         IsEqualGUID(riid, &IID_ID3DXEffect))
46     {
47         This->lpVtbl->AddRef(iface);
48         *object = This;
49         return S_OK;
50     }
51
52     ERR("Interface %s not found\n", debugstr_guid(riid));
53
54     return E_NOINTERFACE;
55 }
56
57 static ULONG WINAPI ID3DXEffectImpl_AddRef(ID3DXEffect* iface)
58 {
59     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
60
61     TRACE("(%p)->(): AddRef from %u\n", This, This->ref);
62
63     return InterlockedIncrement(&This->ref);
64 }
65
66 static ULONG WINAPI ID3DXEffectImpl_Release(ID3DXEffect* iface)
67 {
68     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
69     ULONG ref = InterlockedDecrement(&This->ref);
70
71     TRACE("(%p)->(): Release from %u\n", This, ref + 1);
72
73     if (!ref)
74         HeapFree(GetProcessHeap(), 0, This);
75
76     return ref;
77 }
78
79 /*** ID3DXBaseEffect methods ***/
80 static HRESULT WINAPI ID3DXEffectImpl_GetDesc(ID3DXEffect* iface, D3DXEFFECT_DESC* desc)
81 {
82     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
83
84     FIXME("(%p)->(%p): stub\n", This, desc);
85
86     return E_NOTIMPL;
87 }
88
89 static HRESULT WINAPI ID3DXEffectImpl_GetParameterDesc(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXPARAMETER_DESC* desc)
90 {
91     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
92
93     FIXME("(%p)->(%p, %p): stub\n", This, parameter, desc);
94
95     return E_NOTIMPL;
96 }
97
98 static HRESULT WINAPI ID3DXEffectImpl_GetTechniqueDesc(ID3DXEffect* iface, D3DXHANDLE technique, D3DXTECHNIQUE_DESC* desc)
99 {
100     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
101
102     FIXME("(%p)->(%p, %p): stub\n", This, technique, desc);
103
104     return E_NOTIMPL;
105 }
106
107 static HRESULT WINAPI ID3DXEffectImpl_GetPassDesc(ID3DXEffect* iface, D3DXHANDLE pass, D3DXPASS_DESC* desc)
108 {
109     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
110
111     FIXME("(%p)->(%p, %p): stub\n", This, pass, desc);
112
113     return E_NOTIMPL;
114 }
115
116 static HRESULT WINAPI ID3DXEffectImpl_GetFunctionDesc(ID3DXEffect* iface, D3DXHANDLE shader, D3DXFUNCTION_DESC* desc)
117 {
118     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
119
120     FIXME("(%p)->(%p, %p): stub\n", This, shader, desc);
121
122     return E_NOTIMPL;
123 }
124
125 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameter(ID3DXEffect* iface, D3DXHANDLE parameter, UINT index)
126 {
127     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
128
129     FIXME("(%p)->(%p, %u): stub\n", This, parameter, index);
130
131     return NULL;
132 }
133
134 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameterByName(ID3DXEffect* iface, D3DXHANDLE parameter, LPCSTR name)
135 {
136     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
137
138     FIXME("(%p)->(%p, %s): stub\n", This, parameter, name);
139
140     return NULL;
141 }
142
143 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameterBySemantic(ID3DXEffect* iface, D3DXHANDLE parameter, LPCSTR semantic)
144 {
145     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
146
147     FIXME("(%p)->(%p, %s): stub\n", This, parameter, semantic);
148
149     return NULL;
150 }
151
152 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameterElement(ID3DXEffect* iface, D3DXHANDLE parameter, UINT index)
153 {
154     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
155
156     FIXME("(%p)->(%p, %u): stub\n", This, parameter, index);
157
158     return NULL;
159 }
160
161 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetTechnique(ID3DXEffect* iface, UINT index)
162 {
163     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
164
165     FIXME("(%p)->(%u): stub\n", This, index);
166
167     return NULL;
168 }
169
170 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetTechniqueByName(ID3DXEffect* iface, LPCSTR name)
171 {
172     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
173
174     FIXME("(%p)->(%s): stub\n", This, name);
175
176     return NULL;
177 }
178
179 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetPass(ID3DXEffect* iface, D3DXHANDLE technique, UINT index)
180 {
181     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
182
183     FIXME("(%p)->(%p, %u): stub\n", This, technique, index);
184
185     return NULL;
186 }
187
188 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetPassByName(ID3DXEffect* iface, D3DXHANDLE technique, LPCSTR name)
189 {
190     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
191
192     FIXME("(%p)->(%p, %s): stub\n", This, technique, name);
193
194     return NULL;
195 }
196
197 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetFunction(ID3DXEffect* iface, UINT index)
198 {
199     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
200
201     FIXME("(%p)->(%u): stub\n", This, index);
202
203     return NULL;
204 }
205
206 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetFunctionByName(ID3DXEffect* iface, LPCSTR name)
207 {
208     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
209
210     FIXME("(%p)->(%s): stub\n", This, name);
211
212     return NULL;
213 }
214
215 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetAnnotation(ID3DXEffect* iface, D3DXHANDLE object, UINT index)
216 {
217     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
218
219     FIXME("(%p)->(%p, %u): stub\n", This, object, index);
220
221     return NULL;
222 }
223
224 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetAnnotationByName(ID3DXEffect* iface, D3DXHANDLE object, LPCSTR name)
225 {
226     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
227
228     FIXME("(%p)->(%p, %s): stub\n", This, object, name);
229
230     return NULL;
231 }
232
233 static HRESULT WINAPI ID3DXEffectImpl_SetValue(ID3DXEffect* iface, D3DXHANDLE parameter, LPCVOID data, UINT bytes)
234 {
235     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
236
237     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, data, bytes);
238
239     return E_NOTIMPL;
240 }
241
242 static HRESULT WINAPI ID3DXEffectImpl_GetValue(ID3DXEffect* iface, D3DXHANDLE parameter, LPVOID data, UINT bytes)
243 {
244     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
245
246     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, data, bytes);
247
248     return E_NOTIMPL;
249 }
250
251 static HRESULT WINAPI ID3DXEffectImpl_SetBool(ID3DXEffect* iface, D3DXHANDLE parameter, BOOL b)
252 {
253     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
254
255     FIXME("(%p)->(%p, %u): stub\n", This, parameter, b);
256
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI ID3DXEffectImpl_GetBool(ID3DXEffect* iface, D3DXHANDLE parameter, BOOL* b)
261 {
262     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
263
264     FIXME("(%p)->(%p, %p): stub\n", This, parameter, b);
265
266     return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI ID3DXEffectImpl_SetBoolArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST BOOL* b, UINT count)
270 {
271     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
272
273     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, b, count);
274
275     return E_NOTIMPL;
276 }
277
278 static HRESULT WINAPI ID3DXEffectImpl_GetBoolArray(ID3DXEffect* iface, D3DXHANDLE parameter, BOOL* b, UINT count)
279 {
280     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
281
282     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, b, count);
283
284     return E_NOTIMPL;
285 }
286
287 static HRESULT WINAPI ID3DXEffectImpl_SetInt(ID3DXEffect* iface, D3DXHANDLE parameter, INT n)
288 {
289     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
290
291     FIXME("(%p)->(%p, %d): stub\n", This, parameter, n);
292
293     return E_NOTIMPL;
294 }
295
296 static HRESULT WINAPI ID3DXEffectImpl_GetInt(ID3DXEffect* iface, D3DXHANDLE parameter, INT* n)
297 {
298     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
299
300     FIXME("(%p)->(%p, %p): stub\n", This, parameter, n);
301
302     return E_NOTIMPL;
303 }
304
305 static HRESULT WINAPI ID3DXEffectImpl_SetIntArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST INT* n, UINT count)
306 {
307     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
308
309     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, n, count);
310
311     return E_NOTIMPL;
312 }
313
314 static HRESULT WINAPI ID3DXEffectImpl_GetIntArray(ID3DXEffect* iface, D3DXHANDLE parameter, INT* n, UINT count)
315 {
316     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
317
318     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, n, count);
319
320     return E_NOTIMPL;
321 }
322
323 static HRESULT WINAPI ID3DXEffectImpl_SetFloat(ID3DXEffect* iface, D3DXHANDLE parameter, FLOAT f)
324 {
325     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
326
327     FIXME("(%p)->(%p, %f): stub\n", This, parameter, f);
328
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI ID3DXEffectImpl_GetFloat(ID3DXEffect* iface, D3DXHANDLE parameter, FLOAT* f)
333 {
334     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
335
336     FIXME("(%p)->(%p, %p): stub\n", This, parameter, f);
337
338     return E_NOTIMPL;
339 }
340
341 static HRESULT WINAPI ID3DXEffectImpl_SetFloatArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST FLOAT* f, UINT count)
342 {
343     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
344
345     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, f, count);
346
347     return E_NOTIMPL;
348 }
349
350 static HRESULT WINAPI ID3DXEffectImpl_GetFloatArray(ID3DXEffect* iface, D3DXHANDLE parameter, FLOAT* f, UINT count)
351 {
352     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
353
354     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, f, count);
355
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI ID3DXEffectImpl_SetVector(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXVECTOR4* vector)
360 {
361     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
362
363     FIXME("(%p)->(%p, %p): stub\n", This, parameter, vector);
364
365     return E_NOTIMPL;
366 }
367
368 static HRESULT WINAPI ID3DXEffectImpl_GetVector(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXVECTOR4* vector)
369 {
370     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
371
372     FIXME("(%p)->(%p, %p): stub\n", This, parameter, vector);
373
374     return E_NOTIMPL;
375 }
376
377 static HRESULT WINAPI ID3DXEffectImpl_SetVectorArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXVECTOR4* vector, UINT count)
378 {
379     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
380
381     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, vector, count);
382
383     return E_NOTIMPL;
384 }
385
386 static HRESULT WINAPI ID3DXEffectImpl_GetVectorArray(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXVECTOR4* vector, UINT count)
387 {
388     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
389
390     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, vector, count);
391
392     return E_NOTIMPL;
393 }
394
395 static HRESULT WINAPI ID3DXEffectImpl_SetMatrix(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXMATRIX* matrix)
396 {
397     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
398
399     FIXME("(%p)->(%p, %p): stub\n", This, parameter, matrix);
400
401     return E_NOTIMPL;
402 }
403
404 static HRESULT WINAPI ID3DXEffectImpl_GetMatrix(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXMATRIX* matrix)
405 {
406     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
407
408     FIXME("(%p)->(%p, %p): stub\n", This, parameter, matrix);
409
410     return E_NOTIMPL;
411 }
412
413 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXMATRIX* matrix, UINT count)
414 {
415     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
416
417     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
418
419     return E_NOTIMPL;
420 }
421
422 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixArray(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXMATRIX* matrix, UINT count)
423 {
424     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
425
426     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
427
428     return E_NOTIMPL;
429 }
430
431 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixPointerArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXMATRIX** matrix, UINT count)
432 {
433     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
434
435     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
436
437     return E_NOTIMPL;
438 }
439
440 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixPointerArray(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXMATRIX** matrix, UINT count)
441 {
442     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
443
444     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
445
446     return E_NOTIMPL;
447 }
448
449 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixTranspose(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXMATRIX* matrix)
450 {
451     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
452
453     FIXME("(%p)->(%p, %p): stub\n", This, parameter, matrix);
454
455     return E_NOTIMPL;
456 }
457
458 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixTranspose(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXMATRIX* matrix)
459 {
460     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
461
462     FIXME("(%p)->(%p, %p): stub\n", This, parameter, matrix);
463
464     return E_NOTIMPL;
465 }
466
467 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixTransposeArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXMATRIX* matrix, UINT count)
468 {
469     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
470
471     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
472
473     return E_NOTIMPL;
474 }
475
476 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixTransposeArray(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXMATRIX* matrix, UINT count)
477 {
478     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
479
480     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
481
482     return E_NOTIMPL;
483 }
484
485 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixTransposePointerArray(ID3DXEffect* iface, D3DXHANDLE parameter, CONST D3DXMATRIX** matrix, UINT count)
486 {
487     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
488
489     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
490
491     return E_NOTIMPL;
492 }
493
494 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixTransposePointerArray(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXMATRIX** matrix, UINT count)
495 {
496     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
497
498     FIXME("(%p)->(%p, %p, %u): stub\n", This, parameter, matrix, count);
499
500     return E_NOTIMPL;
501 }
502
503 static HRESULT WINAPI ID3DXEffectImpl_SetString(ID3DXEffect* iface, D3DXHANDLE parameter, LPCSTR string)
504 {
505     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
506
507     FIXME("(%p)->(%p, %p): stub\n", This, parameter, string);
508
509     return E_NOTIMPL;
510 }
511
512 static HRESULT WINAPI ID3DXEffectImpl_GetString(ID3DXEffect* iface, D3DXHANDLE parameter, LPCSTR* string)
513 {
514     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
515
516     FIXME("(%p)->(%p, %p): stub\n", This, parameter, string);
517
518     return E_NOTIMPL;
519 }
520
521 static HRESULT WINAPI ID3DXEffectImpl_SetTexture(ID3DXEffect* iface, D3DXHANDLE parameter, LPDIRECT3DBASETEXTURE9 texture)
522 {
523     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
524
525     FIXME("(%p)->(%p, %p): stub\n", This, parameter, texture);
526
527     return E_NOTIMPL;
528 }
529
530 static HRESULT WINAPI ID3DXEffectImpl_GetTexture(ID3DXEffect* iface, D3DXHANDLE parameter, LPDIRECT3DBASETEXTURE9* texture)
531 {
532     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
533
534     FIXME("(%p)->(%p, %p): stub\n", This, parameter, texture);
535
536     return E_NOTIMPL;
537 }
538
539 static HRESULT WINAPI ID3DXEffectImpl_GetPixelShader(ID3DXEffect* iface, D3DXHANDLE parameter, LPDIRECT3DPIXELSHADER9* pshader)
540 {
541     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
542
543     FIXME("(%p)->(%p, %p): stub\n", This, parameter, pshader);
544
545     return E_NOTIMPL;
546 }
547
548 static HRESULT WINAPI ID3DXEffectImpl_GetVertexShader(ID3DXEffect* iface, D3DXHANDLE parameter, LPDIRECT3DVERTEXSHADER9* vshader)
549 {
550     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
551
552     FIXME("(%p)->(%p, %p): stub\n", This, parameter, vshader);
553
554     return E_NOTIMPL;
555 }
556
557 static HRESULT WINAPI ID3DXEffectImpl_SetArrayRange(ID3DXEffect* iface, D3DXHANDLE parameter, UINT start, UINT end)
558 {
559     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
560
561     FIXME("(%p)->(%p, %u, %u): stub\n", This, parameter, start, end);
562
563     return E_NOTIMPL;
564 }
565
566 /*** ID3DXEffect methods ***/
567 static HRESULT WINAPI ID3DXEffectImpl_GetPool(ID3DXEffect* iface, LPD3DXEFFECTPOOL* pool)
568 {
569     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
570
571     FIXME("(%p)->(%p): stub\n", This, pool);
572
573     return E_NOTIMPL;
574 }
575
576 static HRESULT WINAPI ID3DXEffectImpl_SetTechnique(ID3DXEffect* iface, D3DXHANDLE technique)
577 {
578     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
579
580     FIXME("(%p)->(%p): stub\n", This, technique);
581
582     return E_NOTIMPL;
583 }
584
585 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetCurrentTechnique(ID3DXEffect* iface)
586 {
587     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
588
589     FIXME("(%p)->(): stub\n", This);
590
591     return NULL;
592 }
593
594 static HRESULT WINAPI ID3DXEffectImpl_ValidateTechnique(ID3DXEffect* iface, D3DXHANDLE technique)
595 {
596     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
597
598     FIXME("(%p)->(%p): stub\n", This, technique);
599
600     return D3D_OK;
601 }
602
603 static HRESULT WINAPI ID3DXEffectImpl_FindNextValidTechnique(ID3DXEffect* iface, D3DXHANDLE technique, D3DXHANDLE* next_technique)
604 {
605     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
606
607     FIXME("(%p)->(%p, %p): stub\n", This, technique, next_technique);
608
609     return E_NOTIMPL;
610 }
611
612 static BOOL WINAPI ID3DXEffectImpl_IsParameterUsed(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXHANDLE technique)
613 {
614     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
615
616     FIXME("(%p)->(%p, %p): stub\n", This, parameter, technique);
617
618     return FALSE;
619 }
620
621 static HRESULT WINAPI ID3DXEffectImpl_Begin(ID3DXEffect* iface, UINT *passes, DWORD flags)
622 {
623     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
624
625     FIXME("(%p)->(%p, %#x): stub\n", This, passes, flags);
626
627     return E_NOTIMPL;
628 }
629
630 static HRESULT WINAPI ID3DXEffectImpl_BeginPass(ID3DXEffect* iface, UINT pass)
631 {
632     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
633
634     FIXME("(%p)->(%u): stub\n", This, pass);
635
636     return E_NOTIMPL;
637 }
638
639 static HRESULT WINAPI ID3DXEffectImpl_CommitChanges(ID3DXEffect* iface)
640 {
641     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
642
643     FIXME("(%p)->(): stub\n", This);
644
645     return E_NOTIMPL;
646 }
647
648 static HRESULT WINAPI ID3DXEffectImpl_EndPass(ID3DXEffect* iface)
649 {
650     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
651
652     FIXME("(%p)->(): stub\n", This);
653
654     return E_NOTIMPL;
655 }
656
657 static HRESULT WINAPI ID3DXEffectImpl_End(ID3DXEffect* iface)
658 {
659     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
660
661     FIXME("(%p)->(): stub\n", This);
662
663     return E_NOTIMPL;
664 }
665
666 static HRESULT WINAPI ID3DXEffectImpl_GetDevice(ID3DXEffect* iface, LPDIRECT3DDEVICE9* device)
667 {
668     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
669
670     FIXME("(%p)->(%p): stub\n", This, device);
671
672     return E_NOTIMPL;
673 }
674
675 static HRESULT WINAPI ID3DXEffectImpl_OnLostDevice(ID3DXEffect* iface)
676 {
677     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
678
679     FIXME("(%p)->(): stub\n", This);
680
681     return E_NOTIMPL;
682 }
683
684 static HRESULT WINAPI ID3DXEffectImpl_OnResetDevice(ID3DXEffect* iface)
685 {
686     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
687
688     FIXME("(%p)->(): stub\n", This);
689
690     return E_NOTIMPL;
691 }
692
693 static HRESULT WINAPI ID3DXEffectImpl_SetStateManager(ID3DXEffect* iface, LPD3DXEFFECTSTATEMANAGER manager)
694 {
695     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
696
697     FIXME("(%p)->(%p): stub\n", This, manager);
698
699     return E_NOTIMPL;
700 }
701
702 static HRESULT WINAPI ID3DXEffectImpl_GetStateManager(ID3DXEffect* iface, LPD3DXEFFECTSTATEMANAGER* manager)
703 {
704     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
705
706     FIXME("(%p)->(%p): stub\n", This, manager);
707
708     return E_NOTIMPL;
709 }
710
711 static HRESULT WINAPI ID3DXEffectImpl_BeginParameterBlock(ID3DXEffect* iface)
712 {
713     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
714
715     FIXME("(%p)->(): stub\n", This);
716
717     return E_NOTIMPL;
718 }
719
720 static D3DXHANDLE WINAPI ID3DXEffectImpl_EndParameterBlock(ID3DXEffect* iface)
721 {
722     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
723
724     FIXME("(%p)->(): stub\n", This);
725
726     return NULL;
727 }
728
729 static HRESULT WINAPI ID3DXEffectImpl_ApplyParameterBlock(ID3DXEffect* iface, D3DXHANDLE parameter_block)
730 {
731     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
732
733     FIXME("(%p)->(%p): stub\n", This, parameter_block);
734
735     return E_NOTIMPL;
736 }
737
738 static HRESULT WINAPI ID3DXEffectImpl_DeleteParameterBlock(ID3DXEffect* iface, D3DXHANDLE parameter_block)
739 {
740     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
741
742     FIXME("(%p)->(%p): stub\n", This, parameter_block);
743
744     return E_NOTIMPL;
745 }
746
747 static HRESULT WINAPI ID3DXEffectImpl_CloneEffect(ID3DXEffect* iface, LPDIRECT3DDEVICE9 device, LPD3DXEFFECT* effect)
748 {
749     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
750
751     FIXME("(%p)->(%p, %p): stub\n", This, device, effect);
752
753     return E_NOTIMPL;
754 }
755
756 static HRESULT WINAPI ID3DXEffectImpl_SetRawValue(ID3DXEffect* iface, D3DXHANDLE parameter, LPCVOID data, UINT byte_offset, UINT bytes)
757 {
758     ID3DXEffectImpl *This = (ID3DXEffectImpl *)iface;
759
760     FIXME("(%p)->(%p, %p, %u, %u): stub\n", This, parameter, data, byte_offset, bytes);
761
762     return E_NOTIMPL;
763 }
764
765 static const struct ID3DXEffectVtbl ID3DXEffect_Vtbl =
766 {
767     /*** IUnknown methods ***/
768     ID3DXEffectImpl_QueryInterface,
769     ID3DXEffectImpl_AddRef,
770     ID3DXEffectImpl_Release,
771     /*** ID3DXBaseEffect methods ***/
772     ID3DXEffectImpl_GetDesc,
773     ID3DXEffectImpl_GetParameterDesc,
774     ID3DXEffectImpl_GetTechniqueDesc,
775     ID3DXEffectImpl_GetPassDesc,
776     ID3DXEffectImpl_GetFunctionDesc,
777     ID3DXEffectImpl_GetParameter,
778     ID3DXEffectImpl_GetParameterByName,
779     ID3DXEffectImpl_GetParameterBySemantic,
780     ID3DXEffectImpl_GetParameterElement,
781     ID3DXEffectImpl_GetTechnique,
782     ID3DXEffectImpl_GetTechniqueByName,
783     ID3DXEffectImpl_GetPass,
784     ID3DXEffectImpl_GetPassByName,
785     ID3DXEffectImpl_GetFunction,
786     ID3DXEffectImpl_GetFunctionByName,
787     ID3DXEffectImpl_GetAnnotation,
788     ID3DXEffectImpl_GetAnnotationByName,
789     ID3DXEffectImpl_SetValue,
790     ID3DXEffectImpl_GetValue,
791     ID3DXEffectImpl_SetBool,
792     ID3DXEffectImpl_GetBool,
793     ID3DXEffectImpl_SetBoolArray,
794     ID3DXEffectImpl_GetBoolArray,
795     ID3DXEffectImpl_SetInt,
796     ID3DXEffectImpl_GetInt,
797     ID3DXEffectImpl_SetIntArray,
798     ID3DXEffectImpl_GetIntArray,
799     ID3DXEffectImpl_SetFloat,
800     ID3DXEffectImpl_GetFloat,
801     ID3DXEffectImpl_SetFloatArray,
802     ID3DXEffectImpl_GetFloatArray,
803     ID3DXEffectImpl_SetVector,
804     ID3DXEffectImpl_GetVector,
805     ID3DXEffectImpl_SetVectorArray,
806     ID3DXEffectImpl_GetVectorArray,
807     ID3DXEffectImpl_SetMatrix,
808     ID3DXEffectImpl_GetMatrix,
809     ID3DXEffectImpl_SetMatrixArray,
810     ID3DXEffectImpl_GetMatrixArray,
811     ID3DXEffectImpl_SetMatrixPointerArray,
812     ID3DXEffectImpl_GetMatrixPointerArray,
813     ID3DXEffectImpl_SetMatrixTranspose,
814     ID3DXEffectImpl_GetMatrixTranspose,
815     ID3DXEffectImpl_SetMatrixTransposeArray,
816     ID3DXEffectImpl_GetMatrixTransposeArray,
817     ID3DXEffectImpl_SetMatrixTransposePointerArray,
818     ID3DXEffectImpl_GetMatrixTransposePointerArray,
819     ID3DXEffectImpl_SetString,
820     ID3DXEffectImpl_GetString,
821     ID3DXEffectImpl_SetTexture,
822     ID3DXEffectImpl_GetTexture,
823     ID3DXEffectImpl_GetPixelShader,
824     ID3DXEffectImpl_GetVertexShader,
825     ID3DXEffectImpl_SetArrayRange,
826     /*** ID3DXEffect methods ***/
827     ID3DXEffectImpl_GetPool,
828     ID3DXEffectImpl_SetTechnique,
829     ID3DXEffectImpl_GetCurrentTechnique,
830     ID3DXEffectImpl_ValidateTechnique,
831     ID3DXEffectImpl_FindNextValidTechnique,
832     ID3DXEffectImpl_IsParameterUsed,
833     ID3DXEffectImpl_Begin,
834     ID3DXEffectImpl_BeginPass,
835     ID3DXEffectImpl_CommitChanges,
836     ID3DXEffectImpl_EndPass,
837     ID3DXEffectImpl_End,
838     ID3DXEffectImpl_GetDevice,
839     ID3DXEffectImpl_OnLostDevice,
840     ID3DXEffectImpl_OnResetDevice,
841     ID3DXEffectImpl_SetStateManager,
842     ID3DXEffectImpl_GetStateManager,
843     ID3DXEffectImpl_BeginParameterBlock,
844     ID3DXEffectImpl_EndParameterBlock,
845     ID3DXEffectImpl_ApplyParameterBlock,
846     ID3DXEffectImpl_DeleteParameterBlock,
847     ID3DXEffectImpl_CloneEffect,
848     ID3DXEffectImpl_SetRawValue
849 };
850
851 HRESULT WINAPI D3DXCreateEffectEx(LPDIRECT3DDEVICE9 device,
852                                   LPCVOID srcdata,
853                                   UINT srcdatalen,
854                                   CONST D3DXMACRO* defines,
855                                   LPD3DXINCLUDE include,
856                                   LPCSTR skip_constants,
857                                   DWORD flags,
858                                   LPD3DXEFFECTPOOL pool,
859                                   LPD3DXEFFECT* effect,
860                                   LPD3DXBUFFER* compilation_errors)
861 {
862     ID3DXEffectImpl* object;
863
864     FIXME("(%p, %p, %u, %p, %p, %p, %#x, %p, %p, %p): semi-stub\n", device, srcdata, srcdatalen, defines, include,
865         skip_constants, flags, pool, effect, compilation_errors);
866
867     if (!device || !srcdata)
868         return D3DERR_INVALIDCALL;
869
870     if (!srcdatalen)
871         return E_FAIL;
872
873     /* Native dll allows effect to be null so just return D3D_OK after doing basic checks */
874     if (!effect)
875         return D3D_OK;
876
877     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXEffectImpl));
878     if (!object)
879     {
880         ERR("Out of memory\n");
881         return E_OUTOFMEMORY;
882     }
883
884     object->lpVtbl = &ID3DXEffect_Vtbl;
885     object->ref = 1;
886
887     *effect = (LPD3DXEFFECT)object;
888
889     return D3D_OK;
890 }
891
892 HRESULT WINAPI D3DXCreateEffect(LPDIRECT3DDEVICE9 device,
893                                 LPCVOID srcdata,
894                                 UINT srcdatalen,
895                                 CONST D3DXMACRO* defines,
896                                 LPD3DXINCLUDE include,
897                                 DWORD flags,
898                                 LPD3DXEFFECTPOOL pool,
899                                 LPD3DXEFFECT* effect,
900                                 LPD3DXBUFFER* compilation_errors)
901 {
902     TRACE("(%p, %p, %u, %p, %p, %#x, %p, %p, %p): Forwarded to D3DXCreateEffectEx\n", device, srcdata, srcdatalen, defines,
903         include, flags, pool, effect, compilation_errors);
904
905     return D3DXCreateEffectEx(device, srcdata, srcdatalen, defines, include, NULL, flags, pool, effect, compilation_errors);
906 }
907
908 HRESULT WINAPI D3DXCreateEffectCompiler(LPCSTR srcdata,
909                                         UINT srcdatalen,
910                                         CONST D3DXMACRO* defines,
911                                         LPD3DXINCLUDE include,
912                                         DWORD flags,
913                                         LPD3DXEFFECTCOMPILER* compiler,
914                                         LPD3DXBUFFER* parse_errors)
915 {
916     FIXME("(%p, %u, %p, %p, %#x, %p, %p): stub\n", srcdata, srcdatalen, defines, include, flags, compiler, parse_errors);
917
918     return E_NOTIMPL;
919 }
920
921 static const struct ID3DXEffectPoolVtbl ID3DXEffectPool_Vtbl;
922
923 typedef struct ID3DXEffectPoolImpl {
924     const ID3DXEffectPoolVtbl *lpVtbl;
925     LONG ref;
926 } ID3DXEffectPoolImpl;
927
928 /*** IUnknown methods ***/
929 static HRESULT WINAPI ID3DXEffectPoolImpl_QueryInterface(ID3DXEffectPool* iface, REFIID riid, void** object)
930 {
931     ID3DXEffectPoolImpl *This = (ID3DXEffectPoolImpl *)iface;
932
933     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), object);
934
935     if (IsEqualGUID(riid, &IID_IUnknown) ||
936         IsEqualGUID(riid, &IID_ID3DXEffectPool))
937     {
938         This->lpVtbl->AddRef(iface);
939         *object = This;
940         return S_OK;
941     }
942
943     WARN("Interface %s not found\n", debugstr_guid(riid));
944
945     return E_NOINTERFACE;
946 }
947
948 static ULONG WINAPI ID3DXEffectPoolImpl_AddRef(ID3DXEffectPool* iface)
949 {
950     ID3DXEffectPoolImpl *This = (ID3DXEffectPoolImpl *)iface;
951
952     TRACE("(%p)->(): AddRef from %u\n", This, This->ref);
953
954     return InterlockedIncrement(&This->ref);
955 }
956
957 static ULONG WINAPI ID3DXEffectPoolImpl_Release(ID3DXEffectPool* iface)
958 {
959     ID3DXEffectPoolImpl *This = (ID3DXEffectPoolImpl *)iface;
960     ULONG ref = InterlockedDecrement(&This->ref);
961
962     TRACE("(%p)->(): Release from %u\n", This, ref + 1);
963
964     if (!ref)
965         HeapFree(GetProcessHeap(), 0, This);
966
967     return ref;
968 }
969
970 static const struct ID3DXEffectPoolVtbl ID3DXEffectPool_Vtbl =
971 {
972     /*** IUnknown methods ***/
973     ID3DXEffectPoolImpl_QueryInterface,
974     ID3DXEffectPoolImpl_AddRef,
975     ID3DXEffectPoolImpl_Release
976 };
977
978 HRESULT WINAPI D3DXCreateEffectPool(LPD3DXEFFECTPOOL* pool)
979 {
980     ID3DXEffectPoolImpl* object;
981
982     TRACE("(%p)\n", pool);
983
984     if (!pool)
985         return D3DERR_INVALIDCALL;
986
987     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXEffectImpl));
988     if (!object)
989     {
990         ERR("Out of memory\n");
991         return E_OUTOFMEMORY;
992     }
993
994     object->lpVtbl = &ID3DXEffectPool_Vtbl;
995     object->ref = 1;
996
997     *pool = (LPD3DXEFFECTPOOL)object;
998
999     return S_OK;
1000 }