d3dx9: Get rid of some unused vtbl forward declarations.
[wine/wine-gecko.git] / dlls / d3dx9_36 / effect.c
blob757833b783fdd3e032174a0aa902e081cf3023c3
1 /*
2 * Copyright 2010 Christian Costa
3 * Copyright 2011 Rico Schüller
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "config.h"
21 #include "wine/port.h"
22 #define NONAMELESSUNION
23 #include "wine/debug.h"
24 #include "wine/unicode.h"
26 #include "windef.h"
27 #include "wingdi.h"
28 #include "d3dx9_36_private.h"
30 /* Constants for special INT/FLOAT conversation */
31 #define INT_FLOAT_MULTI 255.0f
32 #define INT_FLOAT_MULTI_INVERSE (1/INT_FLOAT_MULTI)
34 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
36 enum STATE_CLASS
38 SC_LIGHTENABLE,
39 SC_FVF,
40 SC_LIGHT,
41 SC_MATERIAL,
42 SC_NPATCHMODE,
43 SC_PIXELSHADER,
44 SC_RENDERSTATE,
45 SC_SETSAMPLER,
46 SC_SAMPLERSTATE,
47 SC_TEXTURE,
48 SC_TEXTURESTAGE,
49 SC_TRANSFORM,
50 SC_VERTEXSHADER,
51 SC_SHADERCONST,
52 SC_UNKNOWN,
55 enum MATERIAL_TYPE
57 MT_DIFFUSE,
58 MT_AMBIENT,
59 MT_SPECULAR,
60 MT_EMISSIVE,
61 MT_POWER,
64 enum LIGHT_TYPE
66 LT_TYPE,
67 LT_DIFFUSE,
68 LT_SPECULAR,
69 LT_AMBIENT,
70 LT_POSITION,
71 LT_DIRECTION,
72 LT_RANGE,
73 LT_FALLOFF,
74 LT_ATTENUATION0,
75 LT_ATTENUATION1,
76 LT_ATTENUATION2,
77 LT_THETA,
78 LT_PHI,
81 enum SHADER_CONSTANT_TYPE
83 SCT_VSFLOAT,
84 SCT_VSBOOL,
85 SCT_VSINT,
86 SCT_PSFLOAT,
87 SCT_PSBOOL,
88 SCT_PSINT,
91 enum STATE_TYPE
93 ST_CONSTANT,
94 ST_PARAMETER,
95 ST_FXLC,
98 struct d3dx_parameter
100 char *name;
101 char *semantic;
102 void *data;
103 D3DXPARAMETER_CLASS class;
104 D3DXPARAMETER_TYPE type;
105 UINT rows;
106 UINT columns;
107 UINT element_count;
108 UINT annotation_count;
109 UINT member_count;
110 DWORD flags;
111 UINT bytes;
113 struct d3dx_parameter *annotations;
114 struct d3dx_parameter *members;
117 struct d3dx_state
119 UINT operation;
120 UINT index;
121 enum STATE_TYPE type;
122 struct d3dx_parameter *parameter;
125 struct d3dx_sampler
127 UINT state_count;
128 struct d3dx_state *states;
131 struct d3dx_pass
133 char *name;
134 UINT state_count;
135 UINT annotation_count;
137 struct d3dx_state *states;
138 struct d3dx_parameter *annotations;
141 struct d3dx_technique
143 char *name;
144 UINT pass_count;
145 UINT annotation_count;
147 struct d3dx_parameter *annotations;
148 struct d3dx_pass *passes;
151 struct d3dx9_base_effect
153 struct ID3DXEffectImpl *effect;
155 UINT parameter_count;
156 UINT technique_count;
158 struct d3dx_parameter *parameters;
159 struct d3dx_technique *techniques;
162 struct ID3DXEffectImpl
164 ID3DXEffect ID3DXEffect_iface;
165 LONG ref;
167 struct d3dx9_base_effect base_effect;
169 struct ID3DXEffectStateManager *manager;
170 struct IDirect3DDevice9 *device;
171 struct ID3DXEffectPool *pool;
172 struct d3dx_technique *active_technique;
173 struct d3dx_pass *active_pass;
174 BOOL started;
175 DWORD flags;
178 struct ID3DXEffectCompilerImpl
180 ID3DXEffectCompiler ID3DXEffectCompiler_iface;
181 LONG ref;
183 struct d3dx9_base_effect base_effect;
186 static struct d3dx_parameter *get_parameter_by_name(struct d3dx9_base_effect *base,
187 struct d3dx_parameter *parameter, const char *name);
188 static struct d3dx_parameter *get_annotation_by_name(UINT count, struct d3dx_parameter *parameters,
189 const char *name);
190 static HRESULT d3dx9_parse_state(struct d3dx_state *state, const char *data, const char **ptr, D3DXHANDLE *objects);
191 static void free_parameter_state(struct d3dx_parameter *param, BOOL element, BOOL child, enum STATE_TYPE st);
193 static const struct
195 enum STATE_CLASS class;
196 UINT op;
197 const char *name;
199 state_table[] =
201 /* Render sates */
202 {SC_RENDERSTATE, D3DRS_ZENABLE, "D3DRS_ZENABLE"}, /* 0x0 */
203 {SC_RENDERSTATE, D3DRS_FILLMODE, "D3DRS_FILLMODE"},
204 {SC_RENDERSTATE, D3DRS_SHADEMODE, "D3DRS_SHADEMODE"},
205 {SC_RENDERSTATE, D3DRS_ZWRITEENABLE, "D3DRS_ZWRITEENABLE"},
206 {SC_RENDERSTATE, D3DRS_ALPHATESTENABLE, "D3DRS_ALPHATESTENABLE"},
207 {SC_RENDERSTATE, D3DRS_LASTPIXEL, "D3DRS_LASTPIXEL"},
208 {SC_RENDERSTATE, D3DRS_SRCBLEND, "D3DRS_SRCBLEND"},
209 {SC_RENDERSTATE, D3DRS_DESTBLEND, "D3DRS_DESTBLEND"},
210 {SC_RENDERSTATE, D3DRS_CULLMODE, "D3DRS_CULLMODE"},
211 {SC_RENDERSTATE, D3DRS_ZFUNC, "D3DRS_ZFUNC"},
212 {SC_RENDERSTATE, D3DRS_ALPHAREF, "D3DRS_ALPHAREF"},
213 {SC_RENDERSTATE, D3DRS_ALPHAFUNC, "D3DRS_ALPHAFUNC"},
214 {SC_RENDERSTATE, D3DRS_DITHERENABLE, "D3DRS_DITHERENABLE"},
215 {SC_RENDERSTATE, D3DRS_ALPHABLENDENABLE, "D3DRS_ALPHABLENDENABLE"},
216 {SC_RENDERSTATE, D3DRS_FOGENABLE, "D3DRS_FOGENABLE"},
217 {SC_RENDERSTATE, D3DRS_SPECULARENABLE, "D3DRS_SPECULARENABLE"},
218 {SC_RENDERSTATE, D3DRS_FOGCOLOR, "D3DRS_FOGCOLOR"}, /* 0x10 */
219 {SC_RENDERSTATE, D3DRS_FOGTABLEMODE, "D3DRS_FOGTABLEMODE"},
220 {SC_RENDERSTATE, D3DRS_FOGSTART, "D3DRS_FOGSTART"},
221 {SC_RENDERSTATE, D3DRS_FOGEND, "D3DRS_FOGEND"},
222 {SC_RENDERSTATE, D3DRS_FOGDENSITY, "D3DRS_FOGDENSITY"},
223 {SC_RENDERSTATE, D3DRS_RANGEFOGENABLE, "D3DRS_RANGEFOGENABLE"},
224 {SC_RENDERSTATE, D3DRS_STENCILENABLE, "D3DRS_STENCILENABLE"},
225 {SC_RENDERSTATE, D3DRS_STENCILFAIL, "D3DRS_STENCILFAIL"},
226 {SC_RENDERSTATE, D3DRS_STENCILZFAIL, "D3DRS_STENCILZFAIL"},
227 {SC_RENDERSTATE, D3DRS_STENCILPASS, "D3DRS_STENCILPASS"},
228 {SC_RENDERSTATE, D3DRS_STENCILFUNC, "D3DRS_STENCILFUNC"},
229 {SC_RENDERSTATE, D3DRS_STENCILREF, "D3DRS_STENCILREF"},
230 {SC_RENDERSTATE, D3DRS_STENCILMASK, "D3DRS_STENCILMASK"},
231 {SC_RENDERSTATE, D3DRS_STENCILWRITEMASK, "D3DRS_STENCILWRITEMASK"},
232 {SC_RENDERSTATE, D3DRS_TEXTUREFACTOR, "D3DRS_TEXTUREFACTOR"},
233 {SC_RENDERSTATE, D3DRS_WRAP0, "D3DRS_WRAP0"},
234 {SC_RENDERSTATE, D3DRS_WRAP1, "D3DRS_WRAP1"}, /* 0x20 */
235 {SC_RENDERSTATE, D3DRS_WRAP2, "D3DRS_WRAP2"},
236 {SC_RENDERSTATE, D3DRS_WRAP3, "D3DRS_WRAP3"},
237 {SC_RENDERSTATE, D3DRS_WRAP4, "D3DRS_WRAP4"},
238 {SC_RENDERSTATE, D3DRS_WRAP5, "D3DRS_WRAP5"},
239 {SC_RENDERSTATE, D3DRS_WRAP6, "D3DRS_WRAP6"},
240 {SC_RENDERSTATE, D3DRS_WRAP7, "D3DRS_WRAP7"},
241 {SC_RENDERSTATE, D3DRS_WRAP8, "D3DRS_WRAP8"},
242 {SC_RENDERSTATE, D3DRS_WRAP9, "D3DRS_WRAP9"},
243 {SC_RENDERSTATE, D3DRS_WRAP10, "D3DRS_WRAP10"},
244 {SC_RENDERSTATE, D3DRS_WRAP11, "D3DRS_WRAP11"},
245 {SC_RENDERSTATE, D3DRS_WRAP12, "D3DRS_WRAP12"},
246 {SC_RENDERSTATE, D3DRS_WRAP13, "D3DRS_WRAP13"},
247 {SC_RENDERSTATE, D3DRS_WRAP14, "D3DRS_WRAP14"},
248 {SC_RENDERSTATE, D3DRS_WRAP15, "D3DRS_WRAP15"},
249 {SC_RENDERSTATE, D3DRS_CLIPPING, "D3DRS_CLIPPING"},
250 {SC_RENDERSTATE, D3DRS_LIGHTING, "D3DRS_LIGHTING"}, /* 0x30 */
251 {SC_RENDERSTATE, D3DRS_AMBIENT, "D3DRS_AMBIENT"},
252 {SC_RENDERSTATE, D3DRS_FOGVERTEXMODE, "D3DRS_FOGVERTEXMODE"},
253 {SC_RENDERSTATE, D3DRS_COLORVERTEX, "D3DRS_COLORVERTEX"},
254 {SC_RENDERSTATE, D3DRS_LOCALVIEWER, "D3DRS_LOCALVIEWER"},
255 {SC_RENDERSTATE, D3DRS_NORMALIZENORMALS, "D3DRS_NORMALIZENORMALS"},
256 {SC_RENDERSTATE, D3DRS_DIFFUSEMATERIALSOURCE, "D3DRS_DIFFUSEMATERIALSOURCE"},
257 {SC_RENDERSTATE, D3DRS_SPECULARMATERIALSOURCE, "D3DRS_SPECULARMATERIALSOURCE"},
258 {SC_RENDERSTATE, D3DRS_AMBIENTMATERIALSOURCE, "D3DRS_AMBIENTMATERIALSOURCE"},
259 {SC_RENDERSTATE, D3DRS_EMISSIVEMATERIALSOURCE, "D3DRS_EMISSIVEMATERIALSOURCE"},
260 {SC_RENDERSTATE, D3DRS_VERTEXBLEND, "D3DRS_VERTEXBLEND"},
261 {SC_RENDERSTATE, D3DRS_CLIPPLANEENABLE, "D3DRS_CLIPPLANEENABLE"},
262 {SC_RENDERSTATE, D3DRS_POINTSIZE, "D3DRS_POINTSIZE"},
263 {SC_RENDERSTATE, D3DRS_POINTSIZE_MIN, "D3DRS_POINTSIZE_MIN"},
264 {SC_RENDERSTATE, D3DRS_POINTSIZE_MAX, "D3DRS_POINTSIZE_MAX"},
265 {SC_RENDERSTATE, D3DRS_POINTSPRITEENABLE, "D3DRS_POINTSPRITEENABLE"},
266 {SC_RENDERSTATE, D3DRS_POINTSCALEENABLE, "D3DRS_POINTSCALEENABLE"}, /* 0x40 */
267 {SC_RENDERSTATE, D3DRS_POINTSCALE_A, "D3DRS_POINTSCALE_A"},
268 {SC_RENDERSTATE, D3DRS_POINTSCALE_B, "D3DRS_POINTSCALE_B"},
269 {SC_RENDERSTATE, D3DRS_POINTSCALE_C, "D3DRS_POINTSCALE_C"},
270 {SC_RENDERSTATE, D3DRS_MULTISAMPLEANTIALIAS, "D3DRS_MULTISAMPLEANTIALIAS"},
271 {SC_RENDERSTATE, D3DRS_MULTISAMPLEMASK, "D3DRS_MULTISAMPLEMASK"},
272 {SC_RENDERSTATE, D3DRS_PATCHEDGESTYLE, "D3DRS_PATCHEDGESTYLE"},
273 {SC_RENDERSTATE, D3DRS_DEBUGMONITORTOKEN, "D3DRS_DEBUGMONITORTOKEN"},
274 {SC_RENDERSTATE, D3DRS_INDEXEDVERTEXBLENDENABLE, "D3DRS_INDEXEDVERTEXBLENDENABLE"},
275 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE, "D3DRS_COLORWRITEENABLE"},
276 {SC_RENDERSTATE, D3DRS_TWEENFACTOR, "D3DRS_TWEENFACTOR"},
277 {SC_RENDERSTATE, D3DRS_BLENDOP, "D3DRS_BLENDOP"},
278 {SC_RENDERSTATE, D3DRS_POSITIONDEGREE, "D3DRS_POSITIONDEGREE"},
279 {SC_RENDERSTATE, D3DRS_NORMALDEGREE, "D3DRS_NORMALDEGREE"},
280 {SC_RENDERSTATE, D3DRS_SCISSORTESTENABLE, "D3DRS_SCISSORTESTENABLE"},
281 {SC_RENDERSTATE, D3DRS_SLOPESCALEDEPTHBIAS, "D3DRS_SLOPESCALEDEPTHBIAS"},
282 {SC_RENDERSTATE, D3DRS_ANTIALIASEDLINEENABLE, "D3DRS_ANTIALIASEDLINEENABLE"}, /* 0x50 */
283 {SC_RENDERSTATE, D3DRS_MINTESSELLATIONLEVEL, "D3DRS_MINTESSELLATIONLEVEL"},
284 {SC_RENDERSTATE, D3DRS_MAXTESSELLATIONLEVEL, "D3DRS_MAXTESSELLATIONLEVEL"},
285 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_X, "D3DRS_ADAPTIVETESS_X"},
286 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_Y, "D3DRS_ADAPTIVETESS_Y"},
287 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_Z, "D3DRS_ADAPTIVETESS_Z"},
288 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_W, "D3DRS_ADAPTIVETESS_W"},
289 {SC_RENDERSTATE, D3DRS_ENABLEADAPTIVETESSELLATION, "D3DRS_ENABLEADAPTIVETESSELLATION"},
290 {SC_RENDERSTATE, D3DRS_TWOSIDEDSTENCILMODE, "D3DRS_TWOSIDEDSTENCILMODE"},
291 {SC_RENDERSTATE, D3DRS_CCW_STENCILFAIL, "D3DRS_CCW_STENCILFAIL"},
292 {SC_RENDERSTATE, D3DRS_CCW_STENCILZFAIL, "D3DRS_CCW_STENCILZFAIL"},
293 {SC_RENDERSTATE, D3DRS_CCW_STENCILPASS, "D3DRS_CCW_STENCILPASS"},
294 {SC_RENDERSTATE, D3DRS_CCW_STENCILFUNC, "D3DRS_CCW_STENCILFUNC"},
295 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE1, "D3DRS_COLORWRITEENABLE1"},
296 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE2, "D3DRS_COLORWRITEENABLE2"},
297 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE3, "D3DRS_COLORWRITEENABLE3"},
298 {SC_RENDERSTATE, D3DRS_BLENDFACTOR, "D3DRS_BLENDFACTOR"}, /* 0x60 */
299 {SC_RENDERSTATE, D3DRS_SRGBWRITEENABLE, "D3DRS_SRGBWRITEENABLE"},
300 {SC_RENDERSTATE, D3DRS_DEPTHBIAS, "D3DRS_DEPTHBIAS"},
301 {SC_RENDERSTATE, D3DRS_SEPARATEALPHABLENDENABLE, "D3DRS_SEPARATEALPHABLENDENABLE"},
302 {SC_RENDERSTATE, D3DRS_SRCBLENDALPHA, "D3DRS_SRCBLENDALPHA"},
303 {SC_RENDERSTATE, D3DRS_DESTBLENDALPHA, "D3DRS_DESTBLENDALPHA"},
304 {SC_RENDERSTATE, D3DRS_BLENDOPALPHA, "D3DRS_BLENDOPALPHA"},
305 /* Texture stages */
306 {SC_TEXTURESTAGE, D3DTSS_COLOROP, "D3DTSS_COLOROP"},
307 {SC_TEXTURESTAGE, D3DTSS_COLORARG0, "D3DTSS_COLORARG0"},
308 {SC_TEXTURESTAGE, D3DTSS_COLORARG1, "D3DTSS_COLORARG1"},
309 {SC_TEXTURESTAGE, D3DTSS_COLORARG2, "D3DTSS_COLORARG2"},
310 {SC_TEXTURESTAGE, D3DTSS_ALPHAOP, "D3DTSS_ALPHAOP"},
311 {SC_TEXTURESTAGE, D3DTSS_ALPHAARG0, "D3DTSS_ALPHAARG0"},
312 {SC_TEXTURESTAGE, D3DTSS_ALPHAARG1, "D3DTSS_ALPHAARG1"},
313 {SC_TEXTURESTAGE, D3DTSS_ALPHAARG2, "D3DTSS_ALPHAARG2"},
314 {SC_TEXTURESTAGE, D3DTSS_RESULTARG, "D3DTSS_RESULTARG"},
315 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT00, "D3DTSS_BUMPENVMAT00"}, /* 0x70 */
316 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT01, "D3DTSS_BUMPENVMAT01"},
317 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT10, "D3DTSS_BUMPENVMAT10"},
318 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT11, "D3DTSS_BUMPENVMAT11"},
319 {SC_TEXTURESTAGE, D3DTSS_TEXCOORDINDEX, "D3DTSS_TEXCOORDINDEX"},
320 {SC_TEXTURESTAGE, D3DTSS_BUMPENVLSCALE, "D3DTSS_BUMPENVLSCALE"},
321 {SC_TEXTURESTAGE, D3DTSS_BUMPENVLOFFSET, "D3DTSS_BUMPENVLOFFSET"},
322 {SC_TEXTURESTAGE, D3DTSS_TEXTURETRANSFORMFLAGS, "D3DTSS_TEXTURETRANSFORMFLAGS"},
323 {SC_TEXTURESTAGE, D3DTSS_CONSTANT, "D3DTSS_CONSTANT"},
324 /* NPatchMode */
325 {SC_NPATCHMODE, 0, "NPatchMode"},
326 /* FVF */
327 {SC_FVF, 0, "FVF"},
328 /* Transform */
329 {SC_TRANSFORM, D3DTS_PROJECTION, "D3DTS_PROJECTION"},
330 {SC_TRANSFORM, D3DTS_VIEW, "D3DTS_VIEW"},
331 {SC_TRANSFORM, D3DTS_WORLD, "D3DTS_WORLD"},
332 {SC_TRANSFORM, D3DTS_TEXTURE0, "D3DTS_TEXTURE0"},
333 /* Material */
334 {SC_MATERIAL, MT_DIFFUSE, "MaterialDiffuse"},
335 {SC_MATERIAL, MT_AMBIENT, "MaterialAmbient"}, /* 0x80 */
336 {SC_MATERIAL, MT_SPECULAR, "MaterialSpecular"},
337 {SC_MATERIAL, MT_EMISSIVE, "MaterialEmissive"},
338 {SC_MATERIAL, MT_POWER, "MaterialPower"},
339 /* Light */
340 {SC_LIGHT, LT_TYPE, "LightType"},
341 {SC_LIGHT, LT_DIFFUSE, "LightDiffuse"},
342 {SC_LIGHT, LT_SPECULAR, "LightSpecular"},
343 {SC_LIGHT, LT_AMBIENT, "LightAmbient"},
344 {SC_LIGHT, LT_POSITION, "LightPosition"},
345 {SC_LIGHT, LT_DIRECTION, "LightDirection"},
346 {SC_LIGHT, LT_RANGE, "LightRange"},
347 {SC_LIGHT, LT_FALLOFF, "LightFallOff"},
348 {SC_LIGHT, LT_ATTENUATION0, "LightAttenuation0"},
349 {SC_LIGHT, LT_ATTENUATION1, "LightAttenuation1"},
350 {SC_LIGHT, LT_ATTENUATION2, "LightAttenuation2"},
351 {SC_LIGHT, LT_THETA, "LightTheta"},
352 {SC_LIGHT, LT_PHI, "LightPhi"}, /* 0x90 */
353 /* Ligthenable */
354 {SC_LIGHTENABLE, 0, "LightEnable"},
355 /* Vertexshader */
356 {SC_VERTEXSHADER, 0, "Vertexshader"},
357 /* Pixelshader */
358 {SC_PIXELSHADER, 0, "Pixelshader"},
359 /* Shader constants */
360 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstantF"},
361 {SC_SHADERCONST, SCT_VSBOOL, "VertexShaderConstantB"},
362 {SC_SHADERCONST, SCT_VSINT, "VertexShaderConstantI"},
363 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant"},
364 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant1"},
365 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant2"},
366 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant3"},
367 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant4"},
368 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstantF"},
369 {SC_SHADERCONST, SCT_PSBOOL, "PixelShaderConstantB"},
370 {SC_SHADERCONST, SCT_PSINT, "PixelShaderConstantI"},
371 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant"},
372 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant1"}, /* 0xa0 */
373 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant2"},
374 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant3"},
375 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant4"},
376 /* Texture */
377 {SC_TEXTURE, 0, "Texture"},
378 /* Sampler states */
379 {SC_SAMPLERSTATE, D3DSAMP_ADDRESSU, "AddressU"},
380 {SC_SAMPLERSTATE, D3DSAMP_ADDRESSV, "AddressV"},
381 {SC_SAMPLERSTATE, D3DSAMP_ADDRESSW, "AddressW"},
382 {SC_SAMPLERSTATE, D3DSAMP_BORDERCOLOR, "BorderColor"},
383 {SC_SAMPLERSTATE, D3DSAMP_MAGFILTER, "MagFilter"},
384 {SC_SAMPLERSTATE, D3DSAMP_MINFILTER, "MinFilter"},
385 {SC_SAMPLERSTATE, D3DSAMP_MIPFILTER, "MipFilter"},
386 {SC_SAMPLERSTATE, D3DSAMP_MIPMAPLODBIAS, "MipMapLodBias"},
387 {SC_SAMPLERSTATE, D3DSAMP_MAXMIPLEVEL, "MaxMipLevel"},
388 {SC_SAMPLERSTATE, D3DSAMP_MAXANISOTROPY, "MaxAnisotropy"},
389 {SC_SAMPLERSTATE, D3DSAMP_SRGBTEXTURE, "SRGBTexture"},
390 {SC_SAMPLERSTATE, D3DSAMP_ELEMENTINDEX, "ElementIndex"}, /* 0xb0 */
391 {SC_SAMPLERSTATE, D3DSAMP_DMAPOFFSET, "DMAPOffset"},
392 /* Set sampler */
393 {SC_SETSAMPLER, 0, "Sampler"},
396 static inline void read_dword(const char **ptr, DWORD *d)
398 memcpy(d, *ptr, sizeof(*d));
399 *ptr += sizeof(*d);
402 static void skip_dword_unknown(const char **ptr, unsigned int count)
404 unsigned int i;
405 DWORD d;
407 FIXME("Skipping %u unknown DWORDs:\n", count);
408 for (i = 0; i < count; ++i)
410 read_dword(ptr, &d);
411 FIXME("\t0x%08x\n", d);
415 static inline struct d3dx_parameter *get_parameter_struct(D3DXHANDLE handle)
417 return (struct d3dx_parameter *) handle;
420 static inline D3DXHANDLE get_parameter_handle(struct d3dx_parameter *parameter)
422 return (D3DXHANDLE) parameter;
425 static inline D3DXHANDLE get_technique_handle(struct d3dx_technique *technique)
427 return (D3DXHANDLE) technique;
430 static inline D3DXHANDLE get_pass_handle(struct d3dx_pass *pass)
432 return (D3DXHANDLE) pass;
435 static struct d3dx_technique *get_technique_by_name(struct d3dx9_base_effect *base, const char *name)
437 UINT i;
439 if (!name) return NULL;
441 for (i = 0; i < base->technique_count; ++i)
443 if (!strcmp(base->techniques[i].name, name))
444 return &base->techniques[i];
447 return NULL;
450 static struct d3dx_technique *get_valid_technique(struct d3dx9_base_effect *base, D3DXHANDLE technique)
452 unsigned int i;
454 for (i = 0; i < base->technique_count; ++i)
456 if (get_technique_handle(&base->techniques[i]) == technique)
457 return &base->techniques[i];
460 return get_technique_by_name(base, technique);
463 static struct d3dx_pass *get_valid_pass(struct d3dx9_base_effect *base, D3DXHANDLE pass)
465 unsigned int i, k;
467 for (i = 0; i < base->technique_count; ++i)
469 struct d3dx_technique *technique = &base->techniques[i];
471 for (k = 0; k < technique->pass_count; ++k)
473 if (get_pass_handle(&technique->passes[k]) == pass)
474 return &technique->passes[k];
478 return NULL;
481 static struct d3dx_parameter *get_valid_sub_parameter(struct d3dx_parameter *param, D3DXHANDLE parameter)
483 unsigned int i, count;
484 struct d3dx_parameter *p;
486 for (i = 0; i < param->annotation_count; ++i)
488 if (get_parameter_handle(&param->annotations[i]) == parameter)
489 return &param->annotations[i];
491 p = get_valid_sub_parameter(&param->annotations[i], parameter);
492 if (p) return p;
495 count = param->element_count ? param->element_count : param->member_count;
496 for (i = 0; i < count; ++i)
498 if (get_parameter_handle(&param->members[i]) == parameter)
499 return &param->members[i];
501 p = get_valid_sub_parameter(&param->members[i], parameter);
502 if (p) return p;
505 return NULL;
508 static struct d3dx_parameter *get_valid_parameter(struct d3dx9_base_effect *base, D3DXHANDLE parameter)
510 unsigned int i, k, m;
511 struct d3dx_parameter *p;
513 for (i = 0; i < base->parameter_count; ++i)
515 if (get_parameter_handle(&base->parameters[i]) == parameter)
516 return &base->parameters[i];
518 p = get_valid_sub_parameter(&base->parameters[i], parameter);
519 if (p) return p;
522 for (i = 0; i < base->technique_count; ++i)
524 struct d3dx_technique *technique = &base->techniques[i];
526 for (k = 0; k < technique->pass_count; ++k)
528 struct d3dx_pass *pass = &technique->passes[k];
530 for (m = 0; m < pass->annotation_count; ++m)
532 if (get_parameter_handle(&pass->annotations[m]) == parameter)
533 return &pass->annotations[m];
535 p = get_valid_sub_parameter(&pass->annotations[m], parameter);
536 if (p) return p;
540 for (k = 0; k < technique->annotation_count; ++k)
542 if (get_parameter_handle(&technique->annotations[k]) == parameter)
543 return &technique->annotations[k];
545 p = get_valid_sub_parameter(&technique->annotations[k], parameter);
546 if (p) return p;
550 return get_parameter_by_name(base, NULL, parameter);
553 static void free_state(struct d3dx_state *state)
555 free_parameter_state(state->parameter, FALSE, FALSE, state->type);
558 static void free_sampler(struct d3dx_sampler *sampler)
560 UINT i;
562 for (i = 0; i < sampler->state_count; ++i)
564 free_state(&sampler->states[i]);
566 HeapFree(GetProcessHeap(), 0, sampler->states);
569 static void free_parameter(struct d3dx_parameter *param, BOOL element, BOOL child)
571 free_parameter_state(param, element, child, ST_CONSTANT);
574 static void free_parameter_state(struct d3dx_parameter *param, BOOL element, BOOL child, enum STATE_TYPE st)
576 unsigned int i;
578 TRACE("Free parameter %p, name %s, type %s, child %s, state_type %x\n", param, param->name,
579 debug_d3dxparameter_type(param->type), child ? "yes" : "no", st);
581 if (!param)
582 return;
584 if (param->annotations)
586 for (i = 0; i < param->annotation_count; ++i)
587 free_parameter(&param->annotations[i], FALSE, FALSE);
588 HeapFree(GetProcessHeap(), 0, param->annotations);
589 param->annotations = NULL;
592 if (param->members)
594 unsigned int count = param->element_count ? param->element_count : param->member_count;
596 for (i = 0; i < count; ++i)
597 free_parameter(&param->members[i], param->element_count != 0, TRUE);
598 HeapFree(GetProcessHeap(), 0, param->members);
599 param->members = NULL;
602 if (param->class == D3DXPC_OBJECT && !param->element_count)
604 switch (param->type)
606 case D3DXPT_STRING:
607 HeapFree(GetProcessHeap(), 0, *(LPSTR *)param->data);
608 if (!child) HeapFree(GetProcessHeap(), 0, param->data);
609 break;
611 case D3DXPT_TEXTURE:
612 case D3DXPT_TEXTURE1D:
613 case D3DXPT_TEXTURE2D:
614 case D3DXPT_TEXTURE3D:
615 case D3DXPT_TEXTURECUBE:
616 case D3DXPT_PIXELSHADER:
617 case D3DXPT_VERTEXSHADER:
618 if (st == ST_CONSTANT)
620 if (*(IUnknown **)param->data) IUnknown_Release(*(IUnknown **)param->data);
622 else
624 HeapFree(GetProcessHeap(), 0, *(LPSTR *)param->data);
626 if (!child) HeapFree(GetProcessHeap(), 0, param->data);
627 break;
629 case D3DXPT_SAMPLER:
630 case D3DXPT_SAMPLER1D:
631 case D3DXPT_SAMPLER2D:
632 case D3DXPT_SAMPLER3D:
633 case D3DXPT_SAMPLERCUBE:
634 if (st == ST_CONSTANT)
636 free_sampler((struct d3dx_sampler *)param->data);
638 else
640 HeapFree(GetProcessHeap(), 0, *(LPSTR *)param->data);
642 /* samplers have always own data, so free that */
643 HeapFree(GetProcessHeap(), 0, param->data);
644 break;
646 default:
647 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
648 break;
651 else
653 if (!child)
655 if (st != ST_CONSTANT)
657 HeapFree(GetProcessHeap(), 0, *(LPSTR *)param->data);
659 HeapFree(GetProcessHeap(), 0, param->data);
663 /* only the parent has to release name and semantic */
664 if (!element)
666 HeapFree(GetProcessHeap(), 0, param->name);
667 HeapFree(GetProcessHeap(), 0, param->semantic);
671 static void free_pass(struct d3dx_pass *pass)
673 unsigned int i;
675 TRACE("Free pass %p\n", pass);
677 if (!pass)
678 return;
680 if (pass->annotations)
682 for (i = 0; i < pass->annotation_count; ++i)
683 free_parameter(&pass->annotations[i], FALSE, FALSE);
684 HeapFree(GetProcessHeap(), 0, pass->annotations);
685 pass->annotations = NULL;
688 if (pass->states)
690 for (i = 0; i < pass->state_count; ++i)
691 free_state(&pass->states[i]);
692 HeapFree(GetProcessHeap(), 0, pass->states);
693 pass->states = NULL;
696 HeapFree(GetProcessHeap(), 0, pass->name);
697 pass->name = NULL;
700 static void free_technique(struct d3dx_technique *technique)
702 unsigned int i;
704 TRACE("Free technique %p\n", technique);
706 if (!technique)
707 return;
709 if (technique->annotations)
711 for (i = 0; i < technique->annotation_count; ++i)
712 free_parameter(&technique->annotations[i], FALSE, FALSE);
713 HeapFree(GetProcessHeap(), 0, technique->annotations);
714 technique->annotations = NULL;
717 if (technique->passes)
719 for (i = 0; i < technique->pass_count; ++i)
720 free_pass(&technique->passes[i]);
721 HeapFree(GetProcessHeap(), 0, technique->passes);
722 technique->passes = NULL;
725 HeapFree(GetProcessHeap(), 0, technique->name);
726 technique->name = NULL;
729 static void d3dx9_base_effect_cleanup(struct d3dx9_base_effect *base)
731 unsigned int i;
733 TRACE("base %p.\n", base);
735 if (base->parameters)
737 for (i = 0; i < base->parameter_count; ++i)
738 free_parameter(&base->parameters[i], FALSE, FALSE);
739 HeapFree(GetProcessHeap(), 0, base->parameters);
740 base->parameters = NULL;
743 if (base->techniques)
745 for (i = 0; i < base->technique_count; ++i)
746 free_technique(&base->techniques[i]);
747 HeapFree(GetProcessHeap(), 0, base->techniques);
748 base->techniques = NULL;
752 static void free_effect(struct ID3DXEffectImpl *effect)
754 TRACE("Free effect %p\n", effect);
756 d3dx9_base_effect_cleanup(&effect->base_effect);
758 if (effect->pool)
760 effect->pool->lpVtbl->Release(effect->pool);
763 if (effect->manager)
765 IUnknown_Release(effect->manager);
768 IDirect3DDevice9_Release(effect->device);
771 static void free_effect_compiler(struct ID3DXEffectCompilerImpl *compiler)
773 TRACE("Free effect compiler %p\n", compiler);
775 d3dx9_base_effect_cleanup(&compiler->base_effect);
778 static void get_vector(struct d3dx_parameter *param, D3DXVECTOR4 *vector)
780 UINT i;
782 for (i = 0; i < 4; ++i)
784 if (i < param->columns)
785 set_number((FLOAT *)vector + i, D3DXPT_FLOAT, (DWORD *)param->data + i, param->type);
786 else
787 ((FLOAT *)vector)[i] = 0.0f;
791 static void set_vector(struct d3dx_parameter *param, CONST D3DXVECTOR4 *vector)
793 UINT i;
795 for (i = 0; i < param->columns; ++i)
797 set_number((FLOAT *)param->data + i, param->type, (FLOAT *)vector + i, D3DXPT_FLOAT);
801 static void get_matrix(struct d3dx_parameter *param, D3DXMATRIX *matrix, BOOL transpose)
803 UINT i, k;
805 for (i = 0; i < 4; ++i)
807 for (k = 0; k < 4; ++k)
809 FLOAT *tmp = transpose ? (FLOAT *)&matrix->u.m[k][i] : (FLOAT *)&matrix->u.m[i][k];
811 if ((i < param->rows) && (k < param->columns))
812 set_number(tmp, D3DXPT_FLOAT, (DWORD *)param->data + i * param->columns + k, param->type);
813 else
814 *tmp = 0.0f;
819 static void set_matrix(struct d3dx_parameter *param, const D3DXMATRIX *matrix, BOOL transpose)
821 UINT i, k;
823 for (i = 0; i < param->rows; ++i)
825 for (k = 0; k < param->columns; ++k)
827 set_number((FLOAT *)param->data + i * param->columns + k, param->type,
828 transpose ? &matrix->u.m[k][i] : &matrix->u.m[i][k], D3DXPT_FLOAT);
833 static struct d3dx_parameter *get_parameter_element_by_name(struct d3dx_parameter *parameter, const char *name)
835 UINT element;
836 struct d3dx_parameter *temp_parameter;
837 const char *part;
839 TRACE("parameter %p, name %s\n", parameter, debugstr_a(name));
841 if (!name || !*name) return NULL;
843 element = atoi(name);
844 part = strchr(name, ']') + 1;
846 /* check for empty [] && element range */
847 if ((part - name) > 1 && parameter->element_count > element)
849 temp_parameter = &parameter->members[element];
851 switch (*part++)
853 case '.':
854 return get_parameter_by_name(NULL, temp_parameter, part);
856 case '@':
857 return get_annotation_by_name(temp_parameter->annotation_count, temp_parameter->annotations, part);
859 case '\0':
860 TRACE("Returning parameter %p\n", temp_parameter);
861 return temp_parameter;
863 default:
864 FIXME("Unhandled case \"%c\"\n", *--part);
865 break;
869 TRACE("Parameter not found\n");
870 return NULL;
873 static struct d3dx_parameter *get_annotation_by_name(UINT count, struct d3dx_parameter *annotations,
874 const char *name)
876 UINT i, length;
877 struct d3dx_parameter *temp_parameter;
878 const char *part;
880 TRACE("count %u, annotations %p, name %s\n", count, annotations, debugstr_a(name));
882 if (!name || !*name) return NULL;
884 length = strcspn( name, "[.@" );
885 part = name + length;
887 for (i = 0; i < count; ++i)
889 temp_parameter = &annotations[i];
891 if (!strcmp(temp_parameter->name, name))
893 TRACE("Returning annotation %p\n", temp_parameter);
894 return temp_parameter;
896 else if (strlen(temp_parameter->name) == length && !strncmp(temp_parameter->name, name, length))
898 switch (*part++)
900 case '.':
901 return get_parameter_by_name(NULL, temp_parameter, part);
903 case '[':
904 return get_parameter_element_by_name(temp_parameter, part);
906 default:
907 FIXME("Unhandled case \"%c\"\n", *--part);
908 break;
913 TRACE("Annotation not found\n");
914 return NULL;
917 static struct d3dx_parameter *get_parameter_by_name(struct d3dx9_base_effect *base,
918 struct d3dx_parameter *parameter, const char *name)
920 UINT i, count, length;
921 struct d3dx_parameter *temp_parameter;
922 struct d3dx_parameter *parameters;
923 const char *part;
925 TRACE("base %p, parameter %p, name %s\n", base, parameter, debugstr_a(name));
927 if (!name || !*name) return NULL;
929 if (!parameter)
931 count = base->parameter_count;
932 parameters = base->parameters;
934 else
936 count = parameter->member_count;
937 parameters = parameter->members;
940 length = strcspn( name, "[.@" );
941 part = name + length;
943 for (i = 0; i < count; i++)
945 temp_parameter = &parameters[i];
947 if (!strcmp(temp_parameter->name, name))
949 TRACE("Returning parameter %p\n", temp_parameter);
950 return temp_parameter;
952 else if (strlen(temp_parameter->name) == length && !strncmp(temp_parameter->name, name, length))
954 switch (*part++)
956 case '.':
957 return get_parameter_by_name(NULL, temp_parameter, part);
959 case '@':
960 return get_annotation_by_name(temp_parameter->annotation_count, temp_parameter->annotations, part);
962 case '[':
963 return get_parameter_element_by_name(temp_parameter, part);
965 default:
966 FIXME("Unhandled case \"%c\"\n", *--part);
967 break;
972 TRACE("Parameter not found\n");
973 return NULL;
976 static inline DWORD d3dx9_effect_version(DWORD major, DWORD minor)
978 return (0xfeff0000 | ((major) << 8) | (minor));
981 static HRESULT d3dx9_base_effect_get_desc(struct d3dx9_base_effect *base, D3DXEFFECT_DESC *desc)
983 if (!desc)
985 WARN("Invalid argument specified.\n");
986 return D3DERR_INVALIDCALL;
989 FIXME("partial stub!\n");
991 /* TODO: add creator and function count. */
992 desc->Creator = NULL;
993 desc->Functions = 0;
994 desc->Parameters = base->parameter_count;
995 desc->Techniques = base->technique_count;
997 return D3D_OK;
1000 static HRESULT d3dx9_base_effect_get_parameter_desc(struct d3dx9_base_effect *base,
1001 D3DXHANDLE parameter, D3DXPARAMETER_DESC *desc)
1003 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1005 if (!desc || !param)
1007 WARN("Invalid argument specified.\n");
1008 return D3DERR_INVALIDCALL;
1011 desc->Name = param->name;
1012 desc->Semantic = param->semantic;
1013 desc->Class = param->class;
1014 desc->Type = param->type;
1015 desc->Rows = param->rows;
1016 desc->Columns = param->columns;
1017 desc->Elements = param->element_count;
1018 desc->Annotations = param->annotation_count;
1019 desc->StructMembers = param->member_count;
1020 desc->Flags = param->flags;
1021 desc->Bytes = param->bytes;
1023 return D3D_OK;
1026 static HRESULT d3dx9_base_effect_get_technique_desc(struct d3dx9_base_effect *base,
1027 D3DXHANDLE technique, D3DXTECHNIQUE_DESC *desc)
1029 struct d3dx_technique *tech = technique ? get_valid_technique(base, technique) : &base->techniques[0];
1031 if (!desc || !tech)
1033 WARN("Invalid argument specified.\n");
1034 return D3DERR_INVALIDCALL;
1037 desc->Name = tech->name;
1038 desc->Passes = tech->pass_count;
1039 desc->Annotations = tech->annotation_count;
1041 return D3D_OK;
1044 static HRESULT d3dx9_base_effect_get_pass_desc(struct d3dx9_base_effect *base,
1045 D3DXHANDLE pass, D3DXPASS_DESC *desc)
1047 struct d3dx_pass *p = get_valid_pass(base, pass);
1049 if (!desc || !p)
1051 WARN("Invalid argument specified.\n");
1052 return D3DERR_INVALIDCALL;
1055 desc->Name = p->name;
1056 desc->Annotations = p->annotation_count;
1058 FIXME("Pixel shader and vertex shader are not supported, yet.\n");
1059 desc->pVertexShaderFunction = NULL;
1060 desc->pPixelShaderFunction = NULL;
1062 return D3D_OK;
1065 static HRESULT d3dx9_base_effect_get_function_desc(struct d3dx9_base_effect *base,
1066 D3DXHANDLE shader, D3DXFUNCTION_DESC *desc)
1068 FIXME("stub!\n");
1070 return E_NOTIMPL;
1073 static D3DXHANDLE d3dx9_base_effect_get_parameter(struct d3dx9_base_effect *base,
1074 D3DXHANDLE parameter, UINT index)
1076 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1078 if (!parameter)
1080 if (index < base->parameter_count)
1082 TRACE("Returning parameter %p.\n", &base->parameters[index]);
1083 return get_parameter_handle(&base->parameters[index]);
1086 else
1088 if (param && !param->element_count && index < param->member_count)
1090 TRACE("Returning parameter %p.\n", &param->members[index]);
1091 return get_parameter_handle(&param->members[index]);
1095 WARN("Invalid argument specified.\n");
1097 return NULL;
1100 static D3DXHANDLE d3dx9_base_effect_get_parameter_by_name(struct d3dx9_base_effect *base,
1101 D3DXHANDLE parameter, const char *name)
1103 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1104 D3DXHANDLE handle;
1106 if (!name)
1108 handle = get_parameter_handle(param);
1109 TRACE("Returning parameter %p.\n", handle);
1110 return handle;
1113 handle = get_parameter_handle(get_parameter_by_name(base, param, name));
1114 TRACE("Returning parameter %p.\n", handle);
1116 return handle;
1119 static D3DXHANDLE d3dx9_base_effect_get_parameter_by_semantic(struct d3dx9_base_effect *base,
1120 D3DXHANDLE parameter, const char *semantic)
1122 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1123 struct d3dx_parameter *temp_param;
1124 UINT i;
1126 if (!parameter)
1128 for (i = 0; i < base->parameter_count; ++i)
1130 temp_param = &base->parameters[i];
1132 if (!temp_param->semantic)
1134 if (!semantic)
1136 TRACE("Returning parameter %p\n", temp_param);
1137 return get_parameter_handle(temp_param);
1139 continue;
1142 if (!strcasecmp(temp_param->semantic, semantic))
1144 TRACE("Returning parameter %p\n", temp_param);
1145 return get_parameter_handle(temp_param);
1149 else if (param)
1151 for (i = 0; i < param->member_count; ++i)
1153 temp_param = &param->members[i];
1155 if (!temp_param->semantic)
1157 if (!semantic)
1159 TRACE("Returning parameter %p\n", temp_param);
1160 return get_parameter_handle(temp_param);
1162 continue;
1165 if (!strcasecmp(temp_param->semantic, semantic))
1167 TRACE("Returning parameter %p\n", temp_param);
1168 return get_parameter_handle(temp_param);
1173 WARN("Invalid argument specified\n");
1175 return NULL;
1178 static D3DXHANDLE d3dx9_base_effect_get_parameter_element(struct d3dx9_base_effect *base,
1179 D3DXHANDLE parameter, UINT index)
1181 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1183 if (!param)
1185 if (index < base->parameter_count)
1187 TRACE("Returning parameter %p.\n", &base->parameters[index]);
1188 return get_parameter_handle(&base->parameters[index]);
1191 else
1193 if (index < param->element_count)
1195 TRACE("Returning parameter %p.\n", &param->members[index]);
1196 return get_parameter_handle(&param->members[index]);
1200 WARN("Invalid argument specified\n");
1202 return NULL;
1205 static D3DXHANDLE d3dx9_base_effect_get_technique(struct d3dx9_base_effect *base, UINT index)
1207 if (index >= base->technique_count)
1209 WARN("Invalid argument specified.\n");
1210 return NULL;
1213 TRACE("Returning technique %p.\n", &base->techniques[index]);
1215 return get_technique_handle(&base->techniques[index]);
1218 static D3DXHANDLE d3dx9_base_effect_get_technique_by_name(struct d3dx9_base_effect *base, const char *name)
1220 struct d3dx_technique *tech = get_technique_by_name(base, name);
1222 if (tech)
1224 D3DXHANDLE t = get_technique_handle(tech);
1225 TRACE("Returning technique %p\n", t);
1226 return t;
1229 WARN("Invalid argument specified.\n");
1231 return NULL;
1234 static D3DXHANDLE d3dx9_base_effect_get_pass(struct d3dx9_base_effect *base,
1235 D3DXHANDLE technique, UINT index)
1237 struct d3dx_technique *tech = get_valid_technique(base, technique);
1239 if (tech && index < tech->pass_count)
1241 TRACE("Returning pass %p\n", &tech->passes[index]);
1242 return get_pass_handle(&tech->passes[index]);
1245 WARN("Invalid argument specified.\n");
1247 return NULL;
1250 static D3DXHANDLE d3dx9_base_effect_get_pass_by_name(struct d3dx9_base_effect *base,
1251 D3DXHANDLE technique, const char *name)
1253 struct d3dx_technique *tech = get_valid_technique(base, technique);
1255 if (tech && name)
1257 unsigned int i;
1259 for (i = 0; i < tech->pass_count; ++i)
1261 struct d3dx_pass *pass = &tech->passes[i];
1263 if (!strcmp(pass->name, name))
1265 TRACE("Returning pass %p\n", pass);
1266 return get_pass_handle(pass);
1271 WARN("Invalid argument specified.\n");
1273 return NULL;
1276 static D3DXHANDLE d3dx9_base_effect_get_function(struct d3dx9_base_effect *base, UINT index)
1278 FIXME("stub!\n");
1280 return NULL;
1283 static D3DXHANDLE d3dx9_base_effect_get_function_by_name(struct d3dx9_base_effect *base, const char *name)
1285 FIXME("stub!\n");
1287 return NULL;
1290 static UINT get_annotation_from_object(struct d3dx9_base_effect *base,
1291 D3DXHANDLE object, struct d3dx_parameter **annotations)
1293 struct d3dx_parameter *param = get_valid_parameter(base, object);
1294 struct d3dx_pass *pass = get_valid_pass(base, object);
1295 struct d3dx_technique *technique = get_valid_technique(base, object);
1297 if (pass)
1299 *annotations = pass->annotations;
1300 return pass->annotation_count;
1302 else if (technique)
1304 *annotations = technique->annotations;
1305 return technique->annotation_count;
1307 else if (param)
1309 *annotations = param->annotations;
1310 return param->annotation_count;
1312 else
1314 FIXME("Functions are not handled, yet!\n");
1315 return 0;
1319 static D3DXHANDLE d3dx9_base_effect_get_annotation(struct d3dx9_base_effect *base,
1320 D3DXHANDLE object, UINT index)
1322 struct d3dx_parameter *annotations = NULL;
1323 UINT annotation_count = 0;
1325 annotation_count = get_annotation_from_object(base, object, &annotations);
1327 if (index < annotation_count)
1329 TRACE("Returning parameter %p\n", &annotations[index]);
1330 return get_parameter_handle(&annotations[index]);
1333 WARN("Invalid argument specified\n");
1335 return NULL;
1338 static D3DXHANDLE d3dx9_base_effect_get_annotation_by_name(struct d3dx9_base_effect *base,
1339 D3DXHANDLE object, const char *name)
1341 struct d3dx_parameter *annotation = NULL;
1342 struct d3dx_parameter *annotations = NULL;
1343 UINT annotation_count = 0;
1345 if (!name)
1347 WARN("Invalid argument specified\n");
1348 return NULL;
1351 annotation_count = get_annotation_from_object(base, object, &annotations);
1353 annotation = get_annotation_by_name(annotation_count, annotations, name);
1354 if (annotation)
1356 TRACE("Returning parameter %p\n", annotation);
1357 return get_parameter_handle(annotation);
1360 WARN("Invalid argument specified\n");
1362 return NULL;
1365 static HRESULT d3dx9_base_effect_set_value(struct d3dx9_base_effect *base,
1366 D3DXHANDLE parameter, const void *data, UINT bytes)
1368 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1370 if (!param)
1372 WARN("Invalid parameter %p specified\n", parameter);
1373 return D3DERR_INVALIDCALL;
1376 /* samplers don't touch data */
1377 if (param->class == D3DXPC_OBJECT && (param->type == D3DXPT_SAMPLER
1378 || param->type == D3DXPT_SAMPLER1D || param->type == D3DXPT_SAMPLER2D
1379 || param->type == D3DXPT_SAMPLER3D || param->type == D3DXPT_SAMPLERCUBE))
1381 TRACE("Sampler: returning E_FAIL\n");
1382 return E_FAIL;
1385 if (data && param->bytes <= bytes)
1387 switch (param->type)
1389 case D3DXPT_VOID:
1390 case D3DXPT_BOOL:
1391 case D3DXPT_INT:
1392 case D3DXPT_FLOAT:
1393 TRACE("Copy %u bytes\n", param->bytes);
1394 memcpy(param->data, data, param->bytes);
1395 break;
1397 default:
1398 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
1399 break;
1402 return D3D_OK;
1405 WARN("Invalid argument specified\n");
1407 return D3DERR_INVALIDCALL;
1410 static HRESULT d3dx9_base_effect_get_value(struct d3dx9_base_effect *base,
1411 D3DXHANDLE parameter, void *data, UINT bytes)
1413 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1415 if (!param)
1417 WARN("Invalid parameter %p specified\n", parameter);
1418 return D3DERR_INVALIDCALL;
1421 /* samplers don't touch data */
1422 if (param->class == D3DXPC_OBJECT && (param->type == D3DXPT_SAMPLER
1423 || param->type == D3DXPT_SAMPLER1D || param->type == D3DXPT_SAMPLER2D
1424 || param->type == D3DXPT_SAMPLER3D || param->type == D3DXPT_SAMPLERCUBE))
1426 TRACE("Sampler: returning E_FAIL\n");
1427 return E_FAIL;
1430 if (data && param->bytes <= bytes)
1432 TRACE("Type %s\n", debug_d3dxparameter_type(param->type));
1434 switch (param->type)
1436 case D3DXPT_VOID:
1437 case D3DXPT_BOOL:
1438 case D3DXPT_INT:
1439 case D3DXPT_FLOAT:
1440 case D3DXPT_STRING:
1441 break;
1443 case D3DXPT_VERTEXSHADER:
1444 case D3DXPT_PIXELSHADER:
1445 case D3DXPT_TEXTURE:
1446 case D3DXPT_TEXTURE1D:
1447 case D3DXPT_TEXTURE2D:
1448 case D3DXPT_TEXTURE3D:
1449 case D3DXPT_TEXTURECUBE:
1451 UINT i;
1453 for (i = 0; i < (param->element_count ? param->element_count : 1); ++i)
1455 IUnknown *unk = ((IUnknown **)param->data)[i];
1456 if (unk) IUnknown_AddRef(unk);
1458 break;
1461 default:
1462 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
1463 break;
1466 TRACE("Copy %u bytes\n", param->bytes);
1467 memcpy(data, param->data, param->bytes);
1468 return D3D_OK;
1471 WARN("Invalid argument specified\n");
1473 return D3DERR_INVALIDCALL;
1476 static HRESULT d3dx9_base_effect_set_bool(struct d3dx9_base_effect *base, D3DXHANDLE parameter, BOOL b)
1478 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1480 if (param && !param->element_count && param->rows == 1 && param->columns == 1)
1482 set_number(param->data, param->type, &b, D3DXPT_BOOL);
1483 return D3D_OK;
1486 WARN("Invalid argument specified\n");
1488 return D3DERR_INVALIDCALL;
1491 static HRESULT d3dx9_base_effect_get_bool(struct d3dx9_base_effect *base, D3DXHANDLE parameter, BOOL *b)
1493 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1495 if (b && param && !param->element_count && param->rows == 1 && param->columns == 1)
1497 set_number(b, D3DXPT_BOOL, param->data, param->type);
1498 TRACE("Returning %s\n", *b ? "TRUE" : "FALSE");
1499 return D3D_OK;
1502 WARN("Invalid argument specified\n");
1504 return D3DERR_INVALIDCALL;
1507 static HRESULT d3dx9_base_effect_set_bool_array(struct d3dx9_base_effect *base,
1508 D3DXHANDLE parameter, const BOOL *b, UINT count)
1510 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1512 if (param)
1514 UINT i, size = min(count, param->bytes / sizeof(DWORD));
1516 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1518 switch (param->class)
1520 case D3DXPC_SCALAR:
1521 case D3DXPC_VECTOR:
1522 case D3DXPC_MATRIX_ROWS:
1523 for (i = 0; i < size; ++i)
1525 /* don't crop the input, use D3DXPT_INT instead of D3DXPT_BOOL */
1526 set_number((DWORD *)param->data + i, param->type, &b[i], D3DXPT_INT);
1528 return D3D_OK;
1530 case D3DXPC_OBJECT:
1531 case D3DXPC_STRUCT:
1532 break;
1534 default:
1535 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1536 break;
1540 WARN("Invalid argument specified\n");
1542 return D3DERR_INVALIDCALL;
1545 static HRESULT d3dx9_base_effect_get_bool_array(struct d3dx9_base_effect *base,
1546 D3DXHANDLE parameter, BOOL *b, UINT count)
1548 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1550 if (b && param && (param->class == D3DXPC_SCALAR
1551 || param->class == D3DXPC_VECTOR
1552 || param->class == D3DXPC_MATRIX_ROWS
1553 || param->class == D3DXPC_MATRIX_COLUMNS))
1555 UINT i, size = min(count, param->bytes / sizeof(DWORD));
1557 for (i = 0; i < size; ++i)
1559 set_number(&b[i], D3DXPT_BOOL, (DWORD *)param->data + i, param->type);
1561 return D3D_OK;
1564 WARN("Invalid argument specified\n");
1566 return D3DERR_INVALIDCALL;
1569 static HRESULT d3dx9_base_effect_set_int(struct d3dx9_base_effect *base, D3DXHANDLE parameter, INT n)
1571 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1573 if (param && !param->element_count)
1575 if (param->rows == 1 && param->columns == 1)
1577 set_number(param->data, param->type, &n, D3DXPT_INT);
1578 return D3D_OK;
1582 * Split the value, if parameter is a vector with dimension 3 or 4.
1584 if (param->type == D3DXPT_FLOAT &&
1585 ((param->class == D3DXPC_VECTOR && param->columns != 2) ||
1586 (param->class == D3DXPC_MATRIX_ROWS && param->rows != 2 && param->columns == 1)))
1588 TRACE("Vector fixup\n");
1590 *(FLOAT *)param->data = ((n & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
1591 ((FLOAT *)param->data)[1] = ((n & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
1592 ((FLOAT *)param->data)[2] = (n & 0xff) * INT_FLOAT_MULTI_INVERSE;
1593 if (param->rows * param->columns > 3)
1595 ((FLOAT *)param->data)[3] = ((n & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
1597 return D3D_OK;
1601 WARN("Invalid argument specified\n");
1603 return D3DERR_INVALIDCALL;
1606 static HRESULT d3dx9_base_effect_get_int(struct d3dx9_base_effect *base, D3DXHANDLE parameter, INT *n)
1608 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1610 if (n && param && !param->element_count)
1612 if (param->columns == 1 && param->rows == 1)
1614 set_number(n, D3DXPT_INT, param->data, param->type);
1615 TRACE("Returning %i\n", *n);
1616 return D3D_OK;
1619 if (param->type == D3DXPT_FLOAT &&
1620 ((param->class == D3DXPC_VECTOR && param->columns != 2)
1621 || (param->class == D3DXPC_MATRIX_ROWS && param->rows != 2 && param->columns == 1)))
1623 TRACE("Vector fixup\n");
1625 /* all components (3,4) are clamped (0,255) and put in the INT */
1626 *n = (INT)(min(max(0.0f, *((FLOAT *)param->data + 2)), 1.0f) * INT_FLOAT_MULTI);
1627 *n += ((INT)(min(max(0.0f, *((FLOAT *)param->data + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8;
1628 *n += ((INT)(min(max(0.0f, *((FLOAT *)param->data + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16;
1629 if (param->columns * param->rows > 3)
1631 *n += ((INT)(min(max(0.0f, *((FLOAT *)param->data + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24;
1634 TRACE("Returning %i\n", *n);
1635 return D3D_OK;
1639 WARN("Invalid argument specified\n");
1641 return D3DERR_INVALIDCALL;
1644 static HRESULT d3dx9_base_effect_set_int_array(struct d3dx9_base_effect *base,
1645 D3DXHANDLE parameter, const INT *n, UINT count)
1647 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1649 if (param)
1651 UINT i, size = min(count, param->bytes / sizeof(DWORD));
1653 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1655 switch (param->class)
1657 case D3DXPC_SCALAR:
1658 case D3DXPC_VECTOR:
1659 case D3DXPC_MATRIX_ROWS:
1660 for (i = 0; i < size; ++i)
1662 set_number((DWORD *)param->data + i, param->type, &n[i], D3DXPT_INT);
1664 return D3D_OK;
1666 case D3DXPC_OBJECT:
1667 case D3DXPC_STRUCT:
1668 break;
1670 default:
1671 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1672 break;
1676 WARN("Invalid argument specified\n");
1678 return D3DERR_INVALIDCALL;
1681 static HRESULT d3dx9_base_effect_get_int_array(struct d3dx9_base_effect *base,
1682 D3DXHANDLE parameter, INT *n, UINT count)
1684 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1686 if (n && param && (param->class == D3DXPC_SCALAR
1687 || param->class == D3DXPC_VECTOR
1688 || param->class == D3DXPC_MATRIX_ROWS
1689 || param->class == D3DXPC_MATRIX_COLUMNS))
1691 UINT i, size = min(count, param->bytes / sizeof(DWORD));
1693 for (i = 0; i < size; ++i)
1695 set_number(&n[i], D3DXPT_INT, (DWORD *)param->data + i, param->type);
1697 return D3D_OK;
1700 WARN("Invalid argument specified\n");
1702 return D3DERR_INVALIDCALL;
1705 static HRESULT d3dx9_base_effect_set_float(struct d3dx9_base_effect *base, D3DXHANDLE parameter, float f)
1707 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1709 if (param && !param->element_count && param->rows == 1 && param->columns == 1)
1711 set_number((DWORD *)param->data, param->type, &f, D3DXPT_FLOAT);
1712 return D3D_OK;
1715 WARN("Invalid argument specified\n");
1717 return D3DERR_INVALIDCALL;
1720 static HRESULT d3dx9_base_effect_get_float(struct d3dx9_base_effect *base, D3DXHANDLE parameter, float *f)
1722 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1724 if (f && param && !param->element_count && param->columns == 1 && param->rows == 1)
1726 set_number(f, D3DXPT_FLOAT, (DWORD *)param->data, param->type);
1727 TRACE("Returning %f\n", *f);
1728 return D3D_OK;
1731 WARN("Invalid argument specified\n");
1733 return D3DERR_INVALIDCALL;
1736 static HRESULT d3dx9_base_effect_set_float_array(struct d3dx9_base_effect *base,
1737 D3DXHANDLE parameter, const float *f, UINT count)
1739 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1741 if (param)
1743 UINT i, size = min(count, param->bytes / sizeof(DWORD));
1745 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1747 switch (param->class)
1749 case D3DXPC_SCALAR:
1750 case D3DXPC_VECTOR:
1751 case D3DXPC_MATRIX_ROWS:
1752 for (i = 0; i < size; ++i)
1754 set_number((DWORD *)param->data + i, param->type, &f[i], D3DXPT_FLOAT);
1756 return D3D_OK;
1758 case D3DXPC_OBJECT:
1759 case D3DXPC_STRUCT:
1760 break;
1762 default:
1763 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1764 break;
1768 WARN("Invalid argument specified\n");
1770 return D3DERR_INVALIDCALL;
1773 static HRESULT d3dx9_base_effect_get_float_array(struct d3dx9_base_effect *base,
1774 D3DXHANDLE parameter, float *f, UINT count)
1776 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1778 if (f && param && (param->class == D3DXPC_SCALAR
1779 || param->class == D3DXPC_VECTOR
1780 || param->class == D3DXPC_MATRIX_ROWS
1781 || param->class == D3DXPC_MATRIX_COLUMNS))
1783 UINT i, size = min(count, param->bytes / sizeof(DWORD));
1785 for (i = 0; i < size; ++i)
1787 set_number(&f[i], D3DXPT_FLOAT, (DWORD *)param->data + i, param->type);
1789 return D3D_OK;
1792 WARN("Invalid argument specified\n");
1794 return D3DERR_INVALIDCALL;
1797 static HRESULT d3dx9_base_effect_set_vector(struct d3dx9_base_effect *base,
1798 D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
1800 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1802 if (param && !param->element_count)
1804 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1806 switch (param->class)
1808 case D3DXPC_SCALAR:
1809 case D3DXPC_VECTOR:
1810 if (param->type == D3DXPT_INT && param->bytes == 4)
1812 DWORD tmp;
1814 TRACE("INT fixup\n");
1815 tmp = (DWORD)(max(min(vector->z, 1.0f), 0.0f) * INT_FLOAT_MULTI);
1816 tmp += ((DWORD)(max(min(vector->y, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 8;
1817 tmp += ((DWORD)(max(min(vector->x, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16;
1818 tmp += ((DWORD)(max(min(vector->w, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24;
1820 *(INT *)param->data = tmp;
1821 return D3D_OK;
1823 set_vector(param, vector);
1824 return D3D_OK;
1826 case D3DXPC_MATRIX_ROWS:
1827 case D3DXPC_OBJECT:
1828 case D3DXPC_STRUCT:
1829 break;
1831 default:
1832 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1833 break;
1837 WARN("Invalid argument specified\n");
1839 return D3DERR_INVALIDCALL;
1842 static HRESULT d3dx9_base_effect_get_vector(struct d3dx9_base_effect *base,
1843 D3DXHANDLE parameter, D3DXVECTOR4 *vector)
1845 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1847 if (vector && param && !param->element_count)
1849 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1851 switch (param->class)
1853 case D3DXPC_SCALAR:
1854 case D3DXPC_VECTOR:
1855 if (param->type == D3DXPT_INT && param->bytes == 4)
1857 TRACE("INT fixup\n");
1858 vector->x = (((*(INT *)param->data) & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
1859 vector->y = (((*(INT *)param->data) & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
1860 vector->z = ((*(INT *)param->data) & 0xff) * INT_FLOAT_MULTI_INVERSE;
1861 vector->w = (((*(INT *)param->data) & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
1862 return D3D_OK;
1864 get_vector(param, vector);
1865 return D3D_OK;
1867 case D3DXPC_MATRIX_ROWS:
1868 case D3DXPC_OBJECT:
1869 case D3DXPC_STRUCT:
1870 break;
1872 default:
1873 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1874 break;
1878 WARN("Invalid argument specified\n");
1880 return D3DERR_INVALIDCALL;
1883 static HRESULT d3dx9_base_effect_set_vector_array(struct d3dx9_base_effect *base,
1884 D3DXHANDLE parameter, const D3DXVECTOR4 *vector, UINT count)
1886 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1888 if (param && param->element_count && param->element_count >= count)
1890 UINT i;
1892 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1894 switch (param->class)
1896 case D3DXPC_VECTOR:
1897 for (i = 0; i < count; ++i)
1899 set_vector(&param->members[i], &vector[i]);
1901 return D3D_OK;
1903 case D3DXPC_SCALAR:
1904 case D3DXPC_MATRIX_ROWS:
1905 case D3DXPC_OBJECT:
1906 case D3DXPC_STRUCT:
1907 break;
1909 default:
1910 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1911 break;
1915 WARN("Invalid argument specified\n");
1917 return D3DERR_INVALIDCALL;
1920 static HRESULT d3dx9_base_effect_get_vector_array(struct d3dx9_base_effect *base,
1921 D3DXHANDLE parameter, D3DXVECTOR4 *vector, UINT count)
1923 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1925 if (!count) return D3D_OK;
1927 if (vector && param && count <= param->element_count)
1929 UINT i;
1931 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1933 switch (param->class)
1935 case D3DXPC_VECTOR:
1936 for (i = 0; i < count; ++i)
1938 get_vector(&param->members[i], &vector[i]);
1940 return D3D_OK;
1942 case D3DXPC_SCALAR:
1943 case D3DXPC_MATRIX_ROWS:
1944 case D3DXPC_OBJECT:
1945 case D3DXPC_STRUCT:
1946 break;
1948 default:
1949 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1950 break;
1954 WARN("Invalid argument specified\n");
1956 return D3DERR_INVALIDCALL;
1959 static HRESULT d3dx9_base_effect_set_matrix(struct d3dx9_base_effect *base,
1960 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
1962 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1964 if (param && !param->element_count)
1966 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
1968 switch (param->class)
1970 case D3DXPC_MATRIX_ROWS:
1971 set_matrix(param, matrix, FALSE);
1972 return D3D_OK;
1974 case D3DXPC_SCALAR:
1975 case D3DXPC_VECTOR:
1976 case D3DXPC_OBJECT:
1977 case D3DXPC_STRUCT:
1978 break;
1980 default:
1981 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
1982 break;
1986 WARN("Invalid argument specified\n");
1988 return D3DERR_INVALIDCALL;
1991 static HRESULT d3dx9_base_effect_get_matrix(struct d3dx9_base_effect *base,
1992 D3DXHANDLE parameter, D3DXMATRIX *matrix)
1994 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
1996 if (matrix && param && !param->element_count)
1998 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2000 switch (param->class)
2002 case D3DXPC_MATRIX_ROWS:
2003 get_matrix(param, matrix, FALSE);
2004 return D3D_OK;
2006 case D3DXPC_SCALAR:
2007 case D3DXPC_VECTOR:
2008 case D3DXPC_OBJECT:
2009 case D3DXPC_STRUCT:
2010 break;
2012 default:
2013 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2014 break;
2018 WARN("Invalid argument specified\n");
2020 return D3DERR_INVALIDCALL;
2023 static HRESULT d3dx9_base_effect_set_matrix_array(struct d3dx9_base_effect *base,
2024 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
2026 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2028 if (param && param->element_count >= count)
2030 UINT i;
2032 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2034 switch (param->class)
2036 case D3DXPC_MATRIX_ROWS:
2037 for (i = 0; i < count; ++i)
2039 set_matrix(&param->members[i], &matrix[i], FALSE);
2041 return D3D_OK;
2043 case D3DXPC_SCALAR:
2044 case D3DXPC_VECTOR:
2045 case D3DXPC_OBJECT:
2046 case D3DXPC_STRUCT:
2047 break;
2049 default:
2050 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2051 break;
2055 WARN("Invalid argument specified\n");
2057 return D3DERR_INVALIDCALL;
2060 static HRESULT d3dx9_base_effect_get_matrix_array(struct d3dx9_base_effect *base,
2061 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
2063 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2065 if (!count) return D3D_OK;
2067 if (matrix && param && count <= param->element_count)
2069 UINT i;
2071 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2073 switch (param->class)
2075 case D3DXPC_MATRIX_ROWS:
2076 for (i = 0; i < count; ++i)
2078 get_matrix(&param->members[i], &matrix[i], FALSE);
2080 return D3D_OK;
2082 case D3DXPC_SCALAR:
2083 case D3DXPC_VECTOR:
2084 case D3DXPC_OBJECT:
2085 case D3DXPC_STRUCT:
2086 break;
2088 default:
2089 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2090 break;
2094 WARN("Invalid argument specified\n");
2096 return D3DERR_INVALIDCALL;
2099 static HRESULT d3dx9_base_effect_set_matrix_pointer_array(struct d3dx9_base_effect *base,
2100 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
2102 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2104 if (param && count <= param->element_count)
2106 UINT i;
2108 switch (param->class)
2110 case D3DXPC_MATRIX_ROWS:
2111 for (i = 0; i < count; ++i)
2113 set_matrix(&param->members[i], matrix[i], FALSE);
2115 return D3D_OK;
2117 case D3DXPC_SCALAR:
2118 case D3DXPC_VECTOR:
2119 case D3DXPC_OBJECT:
2120 break;
2122 default:
2123 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2124 break;
2128 WARN("Invalid argument specified\n");
2130 return D3DERR_INVALIDCALL;
2133 static HRESULT d3dx9_base_effect_get_matrix_pointer_array(struct d3dx9_base_effect *base,
2134 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
2136 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2138 if (!count) return D3D_OK;
2140 if (param && matrix && count <= param->element_count)
2142 UINT i;
2144 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2146 switch (param->class)
2148 case D3DXPC_MATRIX_ROWS:
2149 for (i = 0; i < count; ++i)
2151 get_matrix(&param->members[i], matrix[i], FALSE);
2153 return D3D_OK;
2155 case D3DXPC_SCALAR:
2156 case D3DXPC_VECTOR:
2157 case D3DXPC_OBJECT:
2158 break;
2160 default:
2161 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2162 break;
2166 WARN("Invalid argument specified\n");
2168 return D3DERR_INVALIDCALL;
2171 static HRESULT d3dx9_base_effect_set_matrix_transpose(struct d3dx9_base_effect *base,
2172 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
2174 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2176 if (param && !param->element_count)
2178 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2180 switch (param->class)
2182 case D3DXPC_MATRIX_ROWS:
2183 set_matrix(param, matrix, TRUE);
2184 return D3D_OK;
2186 case D3DXPC_SCALAR:
2187 case D3DXPC_VECTOR:
2188 case D3DXPC_OBJECT:
2189 case D3DXPC_STRUCT:
2190 break;
2192 default:
2193 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2194 break;
2198 WARN("Invalid argument specified\n");
2200 return D3DERR_INVALIDCALL;
2203 static HRESULT d3dx9_base_effect_get_matrix_transpose(struct d3dx9_base_effect *base,
2204 D3DXHANDLE parameter, D3DXMATRIX *matrix)
2206 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2208 if (matrix && param && !param->element_count)
2210 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2212 switch (param->class)
2214 case D3DXPC_SCALAR:
2215 case D3DXPC_VECTOR:
2216 get_matrix(param, matrix, FALSE);
2217 return D3D_OK;
2219 case D3DXPC_MATRIX_ROWS:
2220 get_matrix(param, matrix, TRUE);
2221 return D3D_OK;
2223 case D3DXPC_OBJECT:
2224 case D3DXPC_STRUCT:
2225 break;
2227 default:
2228 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2229 break;
2233 WARN("Invalid argument specified\n");
2235 return D3DERR_INVALIDCALL;
2238 static HRESULT d3dx9_base_effect_set_matrix_transpose_array(struct d3dx9_base_effect *base,
2239 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
2241 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2243 if (param && param->element_count >= count)
2245 UINT i;
2247 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2249 switch (param->class)
2251 case D3DXPC_MATRIX_ROWS:
2252 for (i = 0; i < count; ++i)
2254 set_matrix(&param->members[i], &matrix[i], TRUE);
2256 return D3D_OK;
2258 case D3DXPC_SCALAR:
2259 case D3DXPC_VECTOR:
2260 case D3DXPC_OBJECT:
2261 case D3DXPC_STRUCT:
2262 break;
2264 default:
2265 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2266 break;
2270 WARN("Invalid argument specified\n");
2272 return D3DERR_INVALIDCALL;
2275 static HRESULT d3dx9_base_effect_get_matrix_transpose_array(struct d3dx9_base_effect *base,
2276 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
2278 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2280 if (!count) return D3D_OK;
2282 if (matrix && param && count <= param->element_count)
2284 UINT i;
2286 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2288 switch (param->class)
2290 case D3DXPC_MATRIX_ROWS:
2291 for (i = 0; i < count; ++i)
2293 get_matrix(&param->members[i], &matrix[i], TRUE);
2295 return D3D_OK;
2297 case D3DXPC_SCALAR:
2298 case D3DXPC_VECTOR:
2299 case D3DXPC_OBJECT:
2300 case D3DXPC_STRUCT:
2301 break;
2303 default:
2304 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2305 break;
2309 WARN("Invalid argument specified\n");
2311 return D3DERR_INVALIDCALL;
2314 static HRESULT d3dx9_base_effect_set_matrix_transpose_pointer_array(struct d3dx9_base_effect *base,
2315 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
2317 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2319 if (param && count <= param->element_count)
2321 UINT i;
2323 switch (param->class)
2325 case D3DXPC_MATRIX_ROWS:
2326 for (i = 0; i < count; ++i)
2328 set_matrix(&param->members[i], matrix[i], TRUE);
2330 return D3D_OK;
2332 case D3DXPC_SCALAR:
2333 case D3DXPC_VECTOR:
2334 case D3DXPC_OBJECT:
2335 break;
2337 default:
2338 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2339 break;
2343 WARN("Invalid argument specified\n");
2345 return D3DERR_INVALIDCALL;
2348 static HRESULT d3dx9_base_effect_get_matrix_transpose_pointer_array(struct d3dx9_base_effect *base,
2349 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
2351 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2353 if (!count) return D3D_OK;
2355 if (matrix && param && count <= param->element_count)
2357 UINT i;
2359 TRACE("Class %s\n", debug_d3dxparameter_class(param->class));
2361 switch (param->class)
2363 case D3DXPC_MATRIX_ROWS:
2364 for (i = 0; i < count; ++i)
2366 get_matrix(&param->members[i], matrix[i], TRUE);
2368 return D3D_OK;
2370 case D3DXPC_SCALAR:
2371 case D3DXPC_VECTOR:
2372 case D3DXPC_OBJECT:
2373 break;
2375 default:
2376 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
2377 break;
2381 WARN("Invalid argument specified\n");
2383 return D3DERR_INVALIDCALL;
2386 static HRESULT d3dx9_base_effect_set_string(struct d3dx9_base_effect *base,
2387 D3DXHANDLE parameter, const char *string)
2389 FIXME("stub!\n");
2391 return E_NOTIMPL;
2394 static HRESULT d3dx9_base_effect_get_string(struct d3dx9_base_effect *base,
2395 D3DXHANDLE parameter, const char **string)
2397 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2399 if (string && param && !param->element_count && param->type == D3DXPT_STRING)
2401 *string = *(LPCSTR *)param->data;
2402 TRACE("Returning %s\n", debugstr_a(*string));
2403 return D3D_OK;
2406 WARN("Invalid argument specified\n");
2408 return D3DERR_INVALIDCALL;
2411 static HRESULT d3dx9_base_effect_set_texture(struct d3dx9_base_effect *base,
2412 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 *texture)
2414 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2416 if (param && !param->element_count &&
2417 (param->type == D3DXPT_TEXTURE || param->type == D3DXPT_TEXTURE1D
2418 || param->type == D3DXPT_TEXTURE2D || param->type == D3DXPT_TEXTURE3D
2419 || param->type == D3DXPT_TEXTURECUBE))
2421 struct IDirect3DBaseTexture9 *oltexture = *(struct IDirect3DBaseTexture9 **)param->data;
2423 if (texture) IDirect3DBaseTexture9_AddRef(texture);
2424 if (oltexture) IDirect3DBaseTexture9_Release(oltexture);
2426 *(struct IDirect3DBaseTexture9 **)param->data = texture;
2428 return D3D_OK;
2431 WARN("Invalid argument specified\n");
2433 return D3DERR_INVALIDCALL;
2436 static HRESULT d3dx9_base_effect_get_texture(struct d3dx9_base_effect *base,
2437 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 **texture)
2439 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2441 if (texture && param && !param->element_count &&
2442 (param->type == D3DXPT_TEXTURE || param->type == D3DXPT_TEXTURE1D
2443 || param->type == D3DXPT_TEXTURE2D || param->type == D3DXPT_TEXTURE3D
2444 || param->type == D3DXPT_TEXTURECUBE))
2446 *texture = *(struct IDirect3DBaseTexture9 **)param->data;
2447 if (*texture) IDirect3DBaseTexture9_AddRef(*texture);
2448 TRACE("Returning %p\n", *texture);
2449 return D3D_OK;
2452 WARN("Invalid argument specified\n");
2454 return D3DERR_INVALIDCALL;
2457 static HRESULT d3dx9_base_effect_get_pixel_shader(struct d3dx9_base_effect *base,
2458 D3DXHANDLE parameter, struct IDirect3DPixelShader9 **shader)
2460 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2462 if (shader && param && !param->element_count && param->type == D3DXPT_PIXELSHADER)
2464 if ((*shader = *(struct IDirect3DPixelShader9 **)param->data))
2465 IDirect3DPixelShader9_AddRef(*shader);
2466 TRACE("Returning %p.\n", *shader);
2467 return D3D_OK;
2470 WARN("Invalid argument specified\n");
2472 return D3DERR_INVALIDCALL;
2475 static HRESULT d3dx9_base_effect_get_vertex_shader(struct d3dx9_base_effect *base,
2476 D3DXHANDLE parameter, struct IDirect3DVertexShader9 **shader)
2478 struct d3dx_parameter *param = get_valid_parameter(base, parameter);
2480 if (shader && param && !param->element_count && param->type == D3DXPT_VERTEXSHADER)
2482 if ((*shader = *(struct IDirect3DVertexShader9 **)param->data))
2483 IDirect3DVertexShader9_AddRef(*shader);
2484 TRACE("Returning %p.\n", *shader);
2485 return D3D_OK;
2488 WARN("Invalid argument specified\n");
2490 return D3DERR_INVALIDCALL;
2493 static HRESULT d3dx9_base_effect_set_array_range(struct d3dx9_base_effect *base,
2494 D3DXHANDLE parameter, UINT start, UINT end)
2496 FIXME("stub!\n");
2498 return E_NOTIMPL;
2501 static inline struct ID3DXEffectImpl *impl_from_ID3DXEffect(ID3DXEffect *iface)
2503 return CONTAINING_RECORD(iface, struct ID3DXEffectImpl, ID3DXEffect_iface);
2506 /*** IUnknown methods ***/
2507 static HRESULT WINAPI ID3DXEffectImpl_QueryInterface(ID3DXEffect *iface, REFIID riid, void **object)
2509 TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);
2511 if (IsEqualGUID(riid, &IID_IUnknown) ||
2512 IsEqualGUID(riid, &IID_ID3DXEffect))
2514 iface->lpVtbl->AddRef(iface);
2515 *object = iface;
2516 return S_OK;
2519 ERR("Interface %s not found\n", debugstr_guid(riid));
2521 return E_NOINTERFACE;
2524 static ULONG WINAPI ID3DXEffectImpl_AddRef(ID3DXEffect *iface)
2526 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
2528 TRACE("(%p)->(): AddRef from %u\n", This, This->ref);
2530 return InterlockedIncrement(&This->ref);
2533 static ULONG WINAPI ID3DXEffectImpl_Release(ID3DXEffect *iface)
2535 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
2536 ULONG ref = InterlockedDecrement(&This->ref);
2538 TRACE("(%p)->(): Release from %u\n", This, ref + 1);
2540 if (!ref)
2542 free_effect(This);
2543 HeapFree(GetProcessHeap(), 0, This);
2546 return ref;
2549 /*** ID3DXBaseEffect methods ***/
2550 static HRESULT WINAPI ID3DXEffectImpl_GetDesc(ID3DXEffect *iface, D3DXEFFECT_DESC *desc)
2552 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2554 TRACE("iface %p, desc %p.\n", iface, desc);
2556 return d3dx9_base_effect_get_desc(&effect->base_effect, desc);
2559 static HRESULT WINAPI ID3DXEffectImpl_GetParameterDesc(ID3DXEffect *iface,
2560 D3DXHANDLE parameter, D3DXPARAMETER_DESC *desc)
2562 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2564 TRACE("iface %p, parameter %p, desc %p.\n", iface, parameter, desc);
2566 return d3dx9_base_effect_get_parameter_desc(&effect->base_effect, parameter, desc);
2569 static HRESULT WINAPI ID3DXEffectImpl_GetTechniqueDesc(ID3DXEffect *iface,
2570 D3DXHANDLE technique, D3DXTECHNIQUE_DESC *desc)
2572 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2574 TRACE("iface %p, technique %p, desc %p.\n", iface, technique, desc);
2576 return d3dx9_base_effect_get_technique_desc(&effect->base_effect, technique, desc);
2579 static HRESULT WINAPI ID3DXEffectImpl_GetPassDesc(ID3DXEffect *iface, D3DXHANDLE pass, D3DXPASS_DESC *desc)
2581 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2583 TRACE("iface %p, pass %p, desc %p.\n", iface, pass, desc);
2585 return d3dx9_base_effect_get_pass_desc(&effect->base_effect, pass, desc);
2588 static HRESULT WINAPI ID3DXEffectImpl_GetFunctionDesc(ID3DXEffect *iface, D3DXHANDLE shader, D3DXFUNCTION_DESC *desc)
2590 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2592 TRACE("iface %p, shader %p, desc %p.\n", iface, shader, desc);
2594 return d3dx9_base_effect_get_function_desc(&effect->base_effect, shader, desc);
2597 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameter(ID3DXEffect *iface, D3DXHANDLE parameter, UINT index)
2599 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2601 TRACE("iface %p, parameter %p, index %u.\n", iface, parameter, index);
2603 return d3dx9_base_effect_get_parameter(&effect->base_effect, parameter, index);
2606 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameterByName(ID3DXEffect *iface,
2607 D3DXHANDLE parameter, const char *name)
2609 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2611 TRACE("iface %p, parameter %p, name %s.\n", iface, parameter, debugstr_a(name));
2613 return d3dx9_base_effect_get_parameter_by_name(&effect->base_effect, parameter, name);
2616 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameterBySemantic(ID3DXEffect *iface,
2617 D3DXHANDLE parameter, const char *semantic)
2619 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2621 TRACE("iface %p, parameter %p, semantic %s.\n", iface, parameter, debugstr_a(semantic));
2623 return d3dx9_base_effect_get_parameter_by_semantic(&effect->base_effect, parameter, semantic);
2626 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetParameterElement(ID3DXEffect *iface, D3DXHANDLE parameter, UINT index)
2628 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2630 TRACE("iface %p, parameter %p, index %u.\n", iface, parameter, index);
2632 return d3dx9_base_effect_get_parameter_element(&effect->base_effect, parameter, index);
2635 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetTechnique(ID3DXEffect *iface, UINT index)
2637 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2639 TRACE("iface %p, index %u.\n", iface, index);
2641 return d3dx9_base_effect_get_technique(&effect->base_effect, index);
2644 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetTechniqueByName(ID3DXEffect *iface, const char *name)
2646 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2648 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2650 return d3dx9_base_effect_get_technique_by_name(&effect->base_effect, name);
2653 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetPass(ID3DXEffect *iface, D3DXHANDLE technique, UINT index)
2655 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2657 TRACE("iface %p, technique %p, index %u.\n", iface, technique, index);
2659 return d3dx9_base_effect_get_pass(&effect->base_effect, technique, index);
2662 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetPassByName(ID3DXEffect *iface,
2663 D3DXHANDLE technique, const char *name)
2665 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2667 TRACE("iface %p, technique %p, name %s.\n", iface, technique, debugstr_a(name));
2669 return d3dx9_base_effect_get_pass_by_name(&effect->base_effect, technique, name);
2672 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetFunction(ID3DXEffect *iface, UINT index)
2674 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2676 TRACE("iface %p, index %u.\n", iface, index);
2678 return d3dx9_base_effect_get_function(&effect->base_effect, index);
2681 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetFunctionByName(ID3DXEffect *iface, const char *name)
2683 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2685 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2687 return d3dx9_base_effect_get_function_by_name(&effect->base_effect, name);
2690 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetAnnotation(ID3DXEffect *iface, D3DXHANDLE object, UINT index)
2692 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2694 TRACE("iface %p, object %p, index %u.\n", iface, object, index);
2696 return d3dx9_base_effect_get_annotation(&effect->base_effect, object, index);
2699 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetAnnotationByName(ID3DXEffect *iface,
2700 D3DXHANDLE object, const char *name)
2702 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2704 TRACE("iface %p, object %p, name %s.\n", iface, object, debugstr_a(name));
2706 return d3dx9_base_effect_get_annotation_by_name(&effect->base_effect, object, name);
2709 static HRESULT WINAPI ID3DXEffectImpl_SetValue(ID3DXEffect *iface,
2710 D3DXHANDLE parameter, const void *data, UINT bytes)
2712 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2714 TRACE("iface %p, parameter %p, data %p, bytes %u.\n", iface, parameter, data, bytes);
2716 return d3dx9_base_effect_set_value(&effect->base_effect, parameter, data, bytes);
2719 static HRESULT WINAPI ID3DXEffectImpl_GetValue(ID3DXEffect *iface,
2720 D3DXHANDLE parameter, void *data, UINT bytes)
2722 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2724 TRACE("iface %p, parameter %p, data %p, bytes %u.\n", iface, parameter, data, bytes);
2726 return d3dx9_base_effect_get_value(&effect->base_effect, parameter, data, bytes);
2729 static HRESULT WINAPI ID3DXEffectImpl_SetBool(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL b)
2731 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2733 TRACE("iface %p, parameter %p, b %#x.\n", iface, parameter, b);
2735 return d3dx9_base_effect_set_bool(&effect->base_effect, parameter, b);
2738 static HRESULT WINAPI ID3DXEffectImpl_GetBool(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL *b)
2740 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2742 TRACE("iface %p, parameter %p, b %p.\n", iface, parameter, b);
2744 return d3dx9_base_effect_get_bool(&effect->base_effect, parameter, b);
2747 static HRESULT WINAPI ID3DXEffectImpl_SetBoolArray(ID3DXEffect *iface,
2748 D3DXHANDLE parameter, const BOOL *b, UINT count)
2750 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2752 TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
2754 return d3dx9_base_effect_set_bool_array(&effect->base_effect, parameter, b, count);
2757 static HRESULT WINAPI ID3DXEffectImpl_GetBoolArray(ID3DXEffect *iface,
2758 D3DXHANDLE parameter, BOOL *b, UINT count)
2760 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2762 TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
2764 return d3dx9_base_effect_get_bool_array(&effect->base_effect, parameter, b, count);
2767 static HRESULT WINAPI ID3DXEffectImpl_SetInt(ID3DXEffect *iface, D3DXHANDLE parameter, INT n)
2769 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2771 TRACE("iface %p, parameter %p, n %d.\n", iface, parameter, n);
2773 return d3dx9_base_effect_set_int(&effect->base_effect, parameter, n);
2776 static HRESULT WINAPI ID3DXEffectImpl_GetInt(ID3DXEffect *iface, D3DXHANDLE parameter, INT *n)
2778 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2780 TRACE("iface %p, parameter %p, n %p.\n", iface, parameter, n);
2782 return d3dx9_base_effect_get_int(&effect->base_effect, parameter, n);
2785 static HRESULT WINAPI ID3DXEffectImpl_SetIntArray(ID3DXEffect *iface,
2786 D3DXHANDLE parameter, const INT *n, UINT count)
2788 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2790 TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
2792 return d3dx9_base_effect_set_int_array(&effect->base_effect, parameter, n, count);
2795 static HRESULT WINAPI ID3DXEffectImpl_GetIntArray(ID3DXEffect *iface,
2796 D3DXHANDLE parameter, INT *n, UINT count)
2798 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2800 TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
2802 return d3dx9_base_effect_get_int_array(&effect->base_effect, parameter, n, count);
2805 static HRESULT WINAPI ID3DXEffectImpl_SetFloat(ID3DXEffect *iface, D3DXHANDLE parameter, float f)
2807 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2809 TRACE("iface %p, parameter %p, f %.8e.\n", iface, parameter, f);
2811 return d3dx9_base_effect_set_float(&effect->base_effect, parameter, f);
2814 static HRESULT WINAPI ID3DXEffectImpl_GetFloat(ID3DXEffect *iface, D3DXHANDLE parameter, float *f)
2816 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2818 TRACE("iface %p, parameter %p, f %p.\n", iface, parameter, f);
2820 return d3dx9_base_effect_get_float(&effect->base_effect, parameter, f);
2823 static HRESULT WINAPI ID3DXEffectImpl_SetFloatArray(ID3DXEffect *iface,
2824 D3DXHANDLE parameter, const float *f, UINT count)
2826 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2828 TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
2830 return d3dx9_base_effect_set_float_array(&effect->base_effect, parameter, f, count);
2833 static HRESULT WINAPI ID3DXEffectImpl_GetFloatArray(ID3DXEffect *iface,
2834 D3DXHANDLE parameter, float *f, UINT count)
2836 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2838 TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
2840 return d3dx9_base_effect_get_float_array(&effect->base_effect, parameter, f, count);
2843 static HRESULT WINAPI ID3DXEffectImpl_SetVector(ID3DXEffect *iface,
2844 D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
2846 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2848 TRACE("iface %p, parameter %p, vector %p.\n", iface, parameter, vector);
2850 return d3dx9_base_effect_set_vector(&effect->base_effect, parameter, vector);
2853 static HRESULT WINAPI ID3DXEffectImpl_GetVector(ID3DXEffect *iface,
2854 D3DXHANDLE parameter, D3DXVECTOR4 *vector)
2856 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2858 TRACE("iface %p, parameter %p, vector %p.\n", iface, parameter, vector);
2860 return d3dx9_base_effect_get_vector(&effect->base_effect, parameter, vector);
2863 static HRESULT WINAPI ID3DXEffectImpl_SetVectorArray(ID3DXEffect *iface,
2864 D3DXHANDLE parameter, const D3DXVECTOR4 *vector, UINT count)
2866 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2868 TRACE("iface %p, parameter %p, vector %p, count %u.\n", iface, parameter, vector, count);
2870 return d3dx9_base_effect_set_vector_array(&effect->base_effect, parameter, vector, count);
2873 static HRESULT WINAPI ID3DXEffectImpl_GetVectorArray(ID3DXEffect *iface,
2874 D3DXHANDLE parameter, D3DXVECTOR4 *vector, UINT count)
2876 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2878 TRACE("iface %p, parameter %p, vector %p, count %u.\n", iface, parameter, vector, count);
2880 return d3dx9_base_effect_get_vector_array(&effect->base_effect, parameter, vector, count);
2883 static HRESULT WINAPI ID3DXEffectImpl_SetMatrix(ID3DXEffect *iface,
2884 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
2886 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2888 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
2890 return d3dx9_base_effect_set_matrix(&effect->base_effect, parameter, matrix);
2893 static HRESULT WINAPI ID3DXEffectImpl_GetMatrix(ID3DXEffect *iface,
2894 D3DXHANDLE parameter, D3DXMATRIX *matrix)
2896 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2898 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
2900 return d3dx9_base_effect_get_matrix(&effect->base_effect, parameter, matrix);
2903 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixArray(ID3DXEffect *iface,
2904 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
2906 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2908 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2910 return d3dx9_base_effect_set_matrix_array(&effect->base_effect, parameter, matrix, count);
2913 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixArray(ID3DXEffect *iface,
2914 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
2916 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2918 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2920 return d3dx9_base_effect_get_matrix_array(&effect->base_effect, parameter, matrix, count);
2923 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixPointerArray(ID3DXEffect *iface,
2924 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
2926 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2928 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2930 return d3dx9_base_effect_set_matrix_pointer_array(&effect->base_effect, parameter, matrix, count);
2933 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixPointerArray(ID3DXEffect *iface,
2934 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
2936 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2938 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2940 return d3dx9_base_effect_get_matrix_pointer_array(&effect->base_effect, parameter, matrix, count);
2943 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixTranspose(ID3DXEffect *iface,
2944 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
2946 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2948 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
2950 return d3dx9_base_effect_set_matrix_transpose(&effect->base_effect, parameter, matrix);
2953 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixTranspose(ID3DXEffect *iface,
2954 D3DXHANDLE parameter, D3DXMATRIX *matrix)
2956 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2958 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
2960 return d3dx9_base_effect_get_matrix_transpose(&effect->base_effect, parameter, matrix);
2963 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixTransposeArray(ID3DXEffect *iface,
2964 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
2966 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2968 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2970 return d3dx9_base_effect_set_matrix_transpose_array(&effect->base_effect, parameter, matrix, count);
2973 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixTransposeArray(ID3DXEffect *iface,
2974 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
2976 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2978 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2980 return d3dx9_base_effect_get_matrix_transpose_array(&effect->base_effect, parameter, matrix, count);
2983 static HRESULT WINAPI ID3DXEffectImpl_SetMatrixTransposePointerArray(ID3DXEffect *iface,
2984 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
2986 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2988 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
2990 return d3dx9_base_effect_set_matrix_transpose_pointer_array(&effect->base_effect, parameter, matrix, count);
2993 static HRESULT WINAPI ID3DXEffectImpl_GetMatrixTransposePointerArray(ID3DXEffect *iface,
2994 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
2996 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
2998 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3000 return d3dx9_base_effect_get_matrix_transpose_pointer_array(&effect->base_effect, parameter, matrix, count);
3003 static HRESULT WINAPI ID3DXEffectImpl_SetString(ID3DXEffect *iface, D3DXHANDLE parameter, const char *string)
3005 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3007 TRACE("iface %p, parameter %p, string %s.\n", iface, parameter, debugstr_a(string));
3009 return d3dx9_base_effect_set_string(&effect->base_effect, parameter, string);
3012 static HRESULT WINAPI ID3DXEffectImpl_GetString(ID3DXEffect *iface, D3DXHANDLE parameter, const char **string)
3014 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3016 TRACE("iface %p, parameter %p, string %p.\n", iface, parameter, string);
3018 return d3dx9_base_effect_get_string(&effect->base_effect, parameter, string);
3021 static HRESULT WINAPI ID3DXEffectImpl_SetTexture(struct ID3DXEffect *iface,
3022 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 *texture)
3024 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3026 TRACE("iface %p, parameter %p, texture %p.\n", iface, parameter, texture);
3028 return d3dx9_base_effect_set_texture(&effect->base_effect, parameter, texture);
3031 static HRESULT WINAPI ID3DXEffectImpl_GetTexture(struct ID3DXEffect *iface,
3032 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 **texture)
3034 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3036 TRACE("iface %p, parameter %p, texture %p.\n", iface, parameter, texture);
3038 return d3dx9_base_effect_get_texture(&effect->base_effect, parameter, texture);
3041 static HRESULT WINAPI ID3DXEffectImpl_GetPixelShader(ID3DXEffect *iface,
3042 D3DXHANDLE parameter, struct IDirect3DPixelShader9 **shader)
3044 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3046 TRACE("iface %p, parameter %p, shader %p.\n", iface, parameter, shader);
3048 return d3dx9_base_effect_get_pixel_shader(&effect->base_effect, parameter, shader);
3051 static HRESULT WINAPI ID3DXEffectImpl_GetVertexShader(struct ID3DXEffect *iface,
3052 D3DXHANDLE parameter, struct IDirect3DVertexShader9 **shader)
3054 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3056 TRACE("iface %p, parameter %p, shader %p.\n", iface, parameter, shader);
3058 return d3dx9_base_effect_get_vertex_shader(&effect->base_effect, parameter, shader);
3061 static HRESULT WINAPI ID3DXEffectImpl_SetArrayRange(ID3DXEffect *iface, D3DXHANDLE parameter, UINT start, UINT end)
3063 struct ID3DXEffectImpl *effect = impl_from_ID3DXEffect(iface);
3065 TRACE("iface %p, parameter %p, start %u, end %u.\n", iface, parameter, start, end);
3067 return d3dx9_base_effect_set_array_range(&effect->base_effect, parameter, start, end);
3070 /*** ID3DXEffect methods ***/
3071 static HRESULT WINAPI ID3DXEffectImpl_GetPool(ID3DXEffect *iface, ID3DXEffectPool **pool)
3073 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3075 TRACE("iface %p, pool %p\n", This, pool);
3077 if (!pool)
3079 WARN("Invalid argument supplied.\n");
3080 return D3DERR_INVALIDCALL;
3083 if (This->pool)
3085 This->pool->lpVtbl->AddRef(This->pool);
3088 *pool = This->pool;
3090 TRACE("Returning pool %p\n", *pool);
3092 return S_OK;
3095 static HRESULT WINAPI ID3DXEffectImpl_SetTechnique(ID3DXEffect *iface, D3DXHANDLE technique)
3097 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3098 struct d3dx9_base_effect *base = &This->base_effect;
3099 struct d3dx_technique *tech = get_valid_technique(base, technique);
3101 TRACE("iface %p, technique %p\n", This, technique);
3103 if (tech)
3105 This->active_technique = tech;
3106 TRACE("Technique %p\n", tech);
3107 return D3D_OK;
3110 WARN("Invalid argument supplied.\n");
3112 return D3DERR_INVALIDCALL;
3115 static D3DXHANDLE WINAPI ID3DXEffectImpl_GetCurrentTechnique(ID3DXEffect *iface)
3117 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3119 TRACE("iface %p\n", This);
3121 return get_technique_handle(This->active_technique);
3124 static HRESULT WINAPI ID3DXEffectImpl_ValidateTechnique(ID3DXEffect* iface, D3DXHANDLE technique)
3126 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3128 FIXME("(%p)->(%p): stub\n", This, technique);
3130 return D3D_OK;
3133 static HRESULT WINAPI ID3DXEffectImpl_FindNextValidTechnique(ID3DXEffect* iface, D3DXHANDLE technique, D3DXHANDLE* next_technique)
3135 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3137 FIXME("(%p)->(%p, %p): stub\n", This, technique, next_technique);
3139 return E_NOTIMPL;
3142 static BOOL WINAPI ID3DXEffectImpl_IsParameterUsed(ID3DXEffect* iface, D3DXHANDLE parameter, D3DXHANDLE technique)
3144 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3146 FIXME("(%p)->(%p, %p): stub\n", This, parameter, technique);
3148 return FALSE;
3151 static HRESULT WINAPI ID3DXEffectImpl_Begin(ID3DXEffect *iface, UINT *passes, DWORD flags)
3153 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3154 struct d3dx_technique *technique = This->active_technique;
3156 FIXME("iface %p, passes %p, flags %#x partial stub\n", iface, passes, flags);
3158 if (passes && technique)
3160 if (flags & ~(D3DXFX_DONOTSAVESTATE | D3DXFX_DONOTSAVESAMPLERSTATE | D3DXFX_DONOTSAVESHADERSTATE))
3161 WARN("Invalid flags (%#x) specified.\n", flags);
3163 if (This->manager || flags & D3DXFX_DONOTSAVESTATE)
3165 TRACE("State capturing disabled.\n");
3167 else
3169 FIXME("State capturing not supported, yet!\n");
3172 *passes = technique->pass_count;
3173 This->started = TRUE;
3174 This->flags = flags;
3176 return D3D_OK;
3179 WARN("Invalid argument supplied.\n");
3181 return D3DERR_INVALIDCALL;
3184 static HRESULT WINAPI ID3DXEffectImpl_BeginPass(ID3DXEffect *iface, UINT pass)
3186 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3187 struct d3dx_technique *technique = This->active_technique;
3189 TRACE("iface %p, pass %u\n", This, pass);
3191 if (technique && pass < technique->pass_count && !This->active_pass)
3193 This->active_pass = &technique->passes[pass];
3195 FIXME("No states applied, yet!\n");
3197 return D3D_OK;
3200 WARN("Invalid argument supplied.\n");
3202 return D3DERR_INVALIDCALL;
3205 static HRESULT WINAPI ID3DXEffectImpl_CommitChanges(ID3DXEffect* iface)
3207 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3209 FIXME("(%p)->(): stub\n", This);
3211 return E_NOTIMPL;
3214 static HRESULT WINAPI ID3DXEffectImpl_EndPass(ID3DXEffect *iface)
3216 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3218 TRACE("iface %p\n", This);
3220 if (This->active_pass)
3222 This->active_pass = NULL;
3223 return D3D_OK;
3226 WARN("Invalid call.\n");
3228 return D3DERR_INVALIDCALL;
3231 static HRESULT WINAPI ID3DXEffectImpl_End(ID3DXEffect *iface)
3233 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3235 FIXME("iface %p partial stub\n", iface);
3237 if (!This->started)
3238 return D3D_OK;
3240 if (This->manager || This->flags & D3DXFX_DONOTSAVESTATE)
3242 TRACE("State restoring disabled.\n");
3244 else
3246 FIXME("State restoring not supported, yet!\n");
3249 This->started = FALSE;
3251 return D3D_OK;
3254 static HRESULT WINAPI ID3DXEffectImpl_GetDevice(ID3DXEffect *iface, struct IDirect3DDevice9 **device)
3256 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3258 TRACE("iface %p, device %p\n", This, device);
3260 if (!device)
3262 WARN("Invalid argument supplied.\n");
3263 return D3DERR_INVALIDCALL;
3266 IDirect3DDevice9_AddRef(This->device);
3268 *device = This->device;
3270 TRACE("Returning device %p\n", *device);
3272 return S_OK;
3275 static HRESULT WINAPI ID3DXEffectImpl_OnLostDevice(ID3DXEffect* iface)
3277 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3279 FIXME("(%p)->(): stub\n", This);
3281 return E_NOTIMPL;
3284 static HRESULT WINAPI ID3DXEffectImpl_OnResetDevice(ID3DXEffect* iface)
3286 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3288 FIXME("(%p)->(): stub\n", This);
3290 return E_NOTIMPL;
3293 static HRESULT WINAPI ID3DXEffectImpl_SetStateManager(ID3DXEffect *iface, ID3DXEffectStateManager *manager)
3295 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3297 TRACE("iface %p, manager %p\n", This, manager);
3299 if (manager) IUnknown_AddRef(manager);
3300 if (This->manager) IUnknown_Release(This->manager);
3302 This->manager = manager;
3304 return D3D_OK;
3307 static HRESULT WINAPI ID3DXEffectImpl_GetStateManager(ID3DXEffect *iface, ID3DXEffectStateManager **manager)
3309 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3311 TRACE("iface %p, manager %p\n", This, manager);
3313 if (!manager)
3315 WARN("Invalid argument supplied.\n");
3316 return D3DERR_INVALIDCALL;
3319 if (This->manager) IUnknown_AddRef(This->manager);
3320 *manager = This->manager;
3322 return D3D_OK;
3325 static HRESULT WINAPI ID3DXEffectImpl_BeginParameterBlock(ID3DXEffect* iface)
3327 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3329 FIXME("(%p)->(): stub\n", This);
3331 return E_NOTIMPL;
3334 static D3DXHANDLE WINAPI ID3DXEffectImpl_EndParameterBlock(ID3DXEffect* iface)
3336 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3338 FIXME("(%p)->(): stub\n", This);
3340 return NULL;
3343 static HRESULT WINAPI ID3DXEffectImpl_ApplyParameterBlock(ID3DXEffect* iface, D3DXHANDLE parameter_block)
3345 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3347 FIXME("(%p)->(%p): stub\n", This, parameter_block);
3349 return E_NOTIMPL;
3352 static HRESULT WINAPI ID3DXEffectImpl_DeleteParameterBlock(ID3DXEffect* iface, D3DXHANDLE parameter_block)
3354 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3356 FIXME("(%p)->(%p): stub\n", This, parameter_block);
3358 return E_NOTIMPL;
3361 static HRESULT WINAPI ID3DXEffectImpl_CloneEffect(ID3DXEffect *iface,
3362 struct IDirect3DDevice9 *device, struct ID3DXEffect **effect)
3364 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3366 FIXME("(%p)->(%p, %p): stub\n", This, device, effect);
3368 return E_NOTIMPL;
3371 static HRESULT WINAPI ID3DXEffectImpl_SetRawValue(ID3DXEffect* iface, D3DXHANDLE parameter, LPCVOID data, UINT byte_offset, UINT bytes)
3373 struct ID3DXEffectImpl *This = impl_from_ID3DXEffect(iface);
3375 FIXME("(%p)->(%p, %p, %u, %u): stub\n", This, parameter, data, byte_offset, bytes);
3377 return E_NOTIMPL;
3380 static const struct ID3DXEffectVtbl ID3DXEffect_Vtbl =
3382 /*** IUnknown methods ***/
3383 ID3DXEffectImpl_QueryInterface,
3384 ID3DXEffectImpl_AddRef,
3385 ID3DXEffectImpl_Release,
3386 /*** ID3DXBaseEffect methods ***/
3387 ID3DXEffectImpl_GetDesc,
3388 ID3DXEffectImpl_GetParameterDesc,
3389 ID3DXEffectImpl_GetTechniqueDesc,
3390 ID3DXEffectImpl_GetPassDesc,
3391 ID3DXEffectImpl_GetFunctionDesc,
3392 ID3DXEffectImpl_GetParameter,
3393 ID3DXEffectImpl_GetParameterByName,
3394 ID3DXEffectImpl_GetParameterBySemantic,
3395 ID3DXEffectImpl_GetParameterElement,
3396 ID3DXEffectImpl_GetTechnique,
3397 ID3DXEffectImpl_GetTechniqueByName,
3398 ID3DXEffectImpl_GetPass,
3399 ID3DXEffectImpl_GetPassByName,
3400 ID3DXEffectImpl_GetFunction,
3401 ID3DXEffectImpl_GetFunctionByName,
3402 ID3DXEffectImpl_GetAnnotation,
3403 ID3DXEffectImpl_GetAnnotationByName,
3404 ID3DXEffectImpl_SetValue,
3405 ID3DXEffectImpl_GetValue,
3406 ID3DXEffectImpl_SetBool,
3407 ID3DXEffectImpl_GetBool,
3408 ID3DXEffectImpl_SetBoolArray,
3409 ID3DXEffectImpl_GetBoolArray,
3410 ID3DXEffectImpl_SetInt,
3411 ID3DXEffectImpl_GetInt,
3412 ID3DXEffectImpl_SetIntArray,
3413 ID3DXEffectImpl_GetIntArray,
3414 ID3DXEffectImpl_SetFloat,
3415 ID3DXEffectImpl_GetFloat,
3416 ID3DXEffectImpl_SetFloatArray,
3417 ID3DXEffectImpl_GetFloatArray,
3418 ID3DXEffectImpl_SetVector,
3419 ID3DXEffectImpl_GetVector,
3420 ID3DXEffectImpl_SetVectorArray,
3421 ID3DXEffectImpl_GetVectorArray,
3422 ID3DXEffectImpl_SetMatrix,
3423 ID3DXEffectImpl_GetMatrix,
3424 ID3DXEffectImpl_SetMatrixArray,
3425 ID3DXEffectImpl_GetMatrixArray,
3426 ID3DXEffectImpl_SetMatrixPointerArray,
3427 ID3DXEffectImpl_GetMatrixPointerArray,
3428 ID3DXEffectImpl_SetMatrixTranspose,
3429 ID3DXEffectImpl_GetMatrixTranspose,
3430 ID3DXEffectImpl_SetMatrixTransposeArray,
3431 ID3DXEffectImpl_GetMatrixTransposeArray,
3432 ID3DXEffectImpl_SetMatrixTransposePointerArray,
3433 ID3DXEffectImpl_GetMatrixTransposePointerArray,
3434 ID3DXEffectImpl_SetString,
3435 ID3DXEffectImpl_GetString,
3436 ID3DXEffectImpl_SetTexture,
3437 ID3DXEffectImpl_GetTexture,
3438 ID3DXEffectImpl_GetPixelShader,
3439 ID3DXEffectImpl_GetVertexShader,
3440 ID3DXEffectImpl_SetArrayRange,
3441 /*** ID3DXEffect methods ***/
3442 ID3DXEffectImpl_GetPool,
3443 ID3DXEffectImpl_SetTechnique,
3444 ID3DXEffectImpl_GetCurrentTechnique,
3445 ID3DXEffectImpl_ValidateTechnique,
3446 ID3DXEffectImpl_FindNextValidTechnique,
3447 ID3DXEffectImpl_IsParameterUsed,
3448 ID3DXEffectImpl_Begin,
3449 ID3DXEffectImpl_BeginPass,
3450 ID3DXEffectImpl_CommitChanges,
3451 ID3DXEffectImpl_EndPass,
3452 ID3DXEffectImpl_End,
3453 ID3DXEffectImpl_GetDevice,
3454 ID3DXEffectImpl_OnLostDevice,
3455 ID3DXEffectImpl_OnResetDevice,
3456 ID3DXEffectImpl_SetStateManager,
3457 ID3DXEffectImpl_GetStateManager,
3458 ID3DXEffectImpl_BeginParameterBlock,
3459 ID3DXEffectImpl_EndParameterBlock,
3460 ID3DXEffectImpl_ApplyParameterBlock,
3461 ID3DXEffectImpl_DeleteParameterBlock,
3462 ID3DXEffectImpl_CloneEffect,
3463 ID3DXEffectImpl_SetRawValue
3466 static inline struct ID3DXEffectCompilerImpl *impl_from_ID3DXEffectCompiler(ID3DXEffectCompiler *iface)
3468 return CONTAINING_RECORD(iface, struct ID3DXEffectCompilerImpl, ID3DXEffectCompiler_iface);
3471 /*** IUnknown methods ***/
3472 static HRESULT WINAPI ID3DXEffectCompilerImpl_QueryInterface(ID3DXEffectCompiler *iface, REFIID riid, void **object)
3474 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
3476 if (IsEqualGUID(riid, &IID_IUnknown) ||
3477 IsEqualGUID(riid, &IID_ID3DXEffectCompiler))
3479 iface->lpVtbl->AddRef(iface);
3480 *object = iface;
3481 return S_OK;
3484 ERR("Interface %s not found\n", debugstr_guid(riid));
3486 return E_NOINTERFACE;
3489 static ULONG WINAPI ID3DXEffectCompilerImpl_AddRef(ID3DXEffectCompiler *iface)
3491 struct ID3DXEffectCompilerImpl *This = impl_from_ID3DXEffectCompiler(iface);
3493 TRACE("iface %p: AddRef from %u\n", iface, This->ref);
3495 return InterlockedIncrement(&This->ref);
3498 static ULONG WINAPI ID3DXEffectCompilerImpl_Release(ID3DXEffectCompiler *iface)
3500 struct ID3DXEffectCompilerImpl *This = impl_from_ID3DXEffectCompiler(iface);
3501 ULONG ref = InterlockedDecrement(&This->ref);
3503 TRACE("iface %p: Release from %u\n", iface, ref + 1);
3505 if (!ref)
3507 free_effect_compiler(This);
3508 HeapFree(GetProcessHeap(), 0, This);
3511 return ref;
3514 /*** ID3DXBaseEffect methods ***/
3515 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetDesc(ID3DXEffectCompiler *iface, D3DXEFFECT_DESC *desc)
3517 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3519 TRACE("iface %p, desc %p.\n", iface, desc);
3521 return d3dx9_base_effect_get_desc(&compiler->base_effect, desc);
3524 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetParameterDesc(ID3DXEffectCompiler *iface,
3525 D3DXHANDLE parameter, D3DXPARAMETER_DESC *desc)
3527 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3529 TRACE("iface %p, parameter %p, desc %p.\n", iface, parameter, desc);
3531 return d3dx9_base_effect_get_parameter_desc(&compiler->base_effect, parameter, desc);
3534 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetTechniqueDesc(ID3DXEffectCompiler *iface,
3535 D3DXHANDLE technique, D3DXTECHNIQUE_DESC *desc)
3537 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3539 TRACE("iface %p, technique %p, desc %p.\n", iface, technique, desc);
3541 return d3dx9_base_effect_get_technique_desc(&compiler->base_effect, technique, desc);
3544 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetPassDesc(ID3DXEffectCompiler *iface,
3545 D3DXHANDLE pass, D3DXPASS_DESC *desc)
3547 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3549 TRACE("iface %p, pass %p, desc %p.\n", iface, pass, desc);
3551 return d3dx9_base_effect_get_pass_desc(&compiler->base_effect, pass, desc);
3554 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFunctionDesc(ID3DXEffectCompiler *iface,
3555 D3DXHANDLE shader, D3DXFUNCTION_DESC *desc)
3557 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3559 TRACE("iface %p, shader %p, desc %p.\n", iface, shader, desc);
3561 return d3dx9_base_effect_get_function_desc(&compiler->base_effect, shader, desc);
3564 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameter(ID3DXEffectCompiler *iface,
3565 D3DXHANDLE parameter, UINT index)
3567 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3569 TRACE("iface %p, parameter %p, index %u.\n", iface, parameter, index);
3571 return d3dx9_base_effect_get_parameter(&compiler->base_effect, parameter, index);
3574 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameterByName(ID3DXEffectCompiler *iface,
3575 D3DXHANDLE parameter, const char *name)
3577 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3579 TRACE("iface %p, parameter %p, name %s.\n", iface, parameter, debugstr_a(name));
3581 return d3dx9_base_effect_get_parameter_by_name(&compiler->base_effect, parameter, name);
3584 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameterBySemantic(ID3DXEffectCompiler *iface,
3585 D3DXHANDLE parameter, const char *semantic)
3587 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3589 TRACE("iface %p, parameter %p, semantic %s.\n", iface, parameter, debugstr_a(semantic));
3591 return d3dx9_base_effect_get_parameter_by_semantic(&compiler->base_effect, parameter, semantic);
3594 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameterElement(ID3DXEffectCompiler *iface,
3595 D3DXHANDLE parameter, UINT index)
3597 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3599 TRACE("iface %p, parameter %p, index %u.\n", iface, parameter, index);
3601 return d3dx9_base_effect_get_parameter_element(&compiler->base_effect, parameter, index);
3604 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetTechnique(ID3DXEffectCompiler *iface, UINT index)
3606 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3608 TRACE("iface %p, index %u.\n", iface, index);
3610 return d3dx9_base_effect_get_technique(&compiler->base_effect, index);
3613 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetTechniqueByName(ID3DXEffectCompiler *iface, const char *name)
3615 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3617 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
3619 return d3dx9_base_effect_get_technique_by_name(&compiler->base_effect, name);
3622 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetPass(ID3DXEffectCompiler *iface, D3DXHANDLE technique, UINT index)
3624 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3626 TRACE("iface %p, technique %p, index %u.\n", iface, technique, index);
3628 return d3dx9_base_effect_get_pass(&compiler->base_effect, technique, index);
3631 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetPassByName(ID3DXEffectCompiler *iface,
3632 D3DXHANDLE technique, const char *name)
3634 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3636 TRACE("iface %p, technique %p, name %s.\n", iface, technique, debugstr_a(name));
3638 return d3dx9_base_effect_get_pass_by_name(&compiler->base_effect, technique, name);
3641 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetFunction(ID3DXEffectCompiler *iface, UINT index)
3643 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3645 TRACE("iface %p, index %u.\n", iface, index);
3647 return d3dx9_base_effect_get_function(&compiler->base_effect, index);
3650 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetFunctionByName(ID3DXEffectCompiler *iface, const char *name)
3652 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3654 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
3656 return d3dx9_base_effect_get_function_by_name(&compiler->base_effect, name);
3659 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetAnnotation(ID3DXEffectCompiler *iface,
3660 D3DXHANDLE object, UINT index)
3662 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3664 TRACE("iface %p, object %p, index %u.\n", iface, object, index);
3666 return d3dx9_base_effect_get_annotation(&compiler->base_effect, object, index);
3669 static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetAnnotationByName(ID3DXEffectCompiler *iface,
3670 D3DXHANDLE object, const char *name)
3672 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3674 TRACE("iface %p, object %p, name %s.\n", iface, object, debugstr_a(name));
3676 return d3dx9_base_effect_get_annotation_by_name(&compiler->base_effect, object, name);
3679 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetValue(ID3DXEffectCompiler *iface,
3680 D3DXHANDLE parameter, const void *data, UINT bytes)
3682 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3684 TRACE("iface %p, parameter %p, data %p, bytes %u.\n", iface, parameter, data, bytes);
3686 return d3dx9_base_effect_set_value(&compiler->base_effect, parameter, data, bytes);
3689 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetValue(ID3DXEffectCompiler *iface,
3690 D3DXHANDLE parameter, void *data, UINT bytes)
3692 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3694 TRACE("iface %p, parameter %p, data %p, bytes %u.\n", iface, parameter, data, bytes);
3696 return d3dx9_base_effect_get_value(&compiler->base_effect, parameter, data, bytes);
3699 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetBool(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL b)
3701 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3703 TRACE("iface %p, parameter %p, b %#x.\n", iface, parameter, b);
3705 return d3dx9_base_effect_set_bool(&compiler->base_effect, parameter, b);
3708 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetBool(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *b)
3710 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3712 TRACE("iface %p, parameter %p, b %p.\n", iface, parameter, b);
3714 return d3dx9_base_effect_get_bool(&compiler->base_effect, parameter, b);
3717 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetBoolArray(ID3DXEffectCompiler *iface,
3718 D3DXHANDLE parameter, const BOOL *b, UINT count)
3720 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3722 TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
3724 return d3dx9_base_effect_set_bool_array(&compiler->base_effect, parameter, b, count);
3727 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetBoolArray(ID3DXEffectCompiler *iface,
3728 D3DXHANDLE parameter, BOOL *b, UINT count)
3730 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3732 TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
3734 return d3dx9_base_effect_get_bool_array(&compiler->base_effect, parameter, b, count);
3737 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetInt(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT n)
3739 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3741 TRACE("iface %p, parameter %p, n %d.\n", iface, parameter, n);
3743 return d3dx9_base_effect_set_int(&compiler->base_effect, parameter, n);
3746 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetInt(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT *n)
3748 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3750 TRACE("iface %p, parameter %p, n %p.\n", iface, parameter, n);
3752 return d3dx9_base_effect_get_int(&compiler->base_effect, parameter, n);
3755 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetIntArray(ID3DXEffectCompiler *iface,
3756 D3DXHANDLE parameter, const INT *n, UINT count)
3758 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3760 TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
3762 return d3dx9_base_effect_set_int_array(&compiler->base_effect, parameter, n, count);
3765 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetIntArray(ID3DXEffectCompiler *iface,
3766 D3DXHANDLE parameter, INT *n, UINT count)
3768 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3770 TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
3772 return d3dx9_base_effect_get_int_array(&compiler->base_effect, parameter, n, count);
3775 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetFloat(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float f)
3777 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3779 TRACE("iface %p, parameter %p, f %.8e.\n", iface, parameter, f);
3781 return d3dx9_base_effect_set_float(&compiler->base_effect, parameter, f);
3784 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFloat(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float *f)
3786 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3788 TRACE("iface %p, parameter %p, f %p.\n", iface, parameter, f);
3790 return d3dx9_base_effect_get_float(&compiler->base_effect, parameter, f);
3793 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetFloatArray(ID3DXEffectCompiler *iface,
3794 D3DXHANDLE parameter, const float *f, UINT count)
3796 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3798 TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
3800 return d3dx9_base_effect_set_float_array(&compiler->base_effect, parameter, f, count);
3803 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFloatArray(ID3DXEffectCompiler *iface,
3804 D3DXHANDLE parameter, float *f, UINT count)
3806 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3808 TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
3810 return d3dx9_base_effect_get_float_array(&compiler->base_effect, parameter, f, count);
3813 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetVector(ID3DXEffectCompiler *iface,
3814 D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
3816 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3818 TRACE("iface %p, parameter %p, vector %p.\n", iface, parameter, vector);
3820 return d3dx9_base_effect_set_vector(&compiler->base_effect, parameter, vector);
3823 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVector(ID3DXEffectCompiler *iface,
3824 D3DXHANDLE parameter, D3DXVECTOR4 *vector)
3826 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3828 TRACE("iface %p, parameter %p, vector %p.\n", iface, parameter, vector);
3830 return d3dx9_base_effect_get_vector(&compiler->base_effect, parameter, vector);
3833 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetVectorArray(ID3DXEffectCompiler *iface,
3834 D3DXHANDLE parameter, const D3DXVECTOR4 *vector, UINT count)
3836 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3838 TRACE("iface %p, parameter %p, vector %p, count %u.\n", iface, parameter, vector, count);
3840 return d3dx9_base_effect_set_vector_array(&compiler->base_effect, parameter, vector, count);
3843 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVectorArray(ID3DXEffectCompiler *iface,
3844 D3DXHANDLE parameter, D3DXVECTOR4 *vector, UINT count)
3846 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3848 TRACE("iface %p, parameter %p, vector %p, count %u.\n", iface, parameter, vector, count);
3850 return d3dx9_base_effect_get_vector_array(&compiler->base_effect, parameter, vector, count);
3853 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrix(ID3DXEffectCompiler *iface,
3854 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
3856 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3858 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3860 return d3dx9_base_effect_set_matrix(&compiler->base_effect, parameter, matrix);
3863 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrix(ID3DXEffectCompiler *iface,
3864 D3DXHANDLE parameter, D3DXMATRIX *matrix)
3866 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3868 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3870 return d3dx9_base_effect_get_matrix(&compiler->base_effect, parameter, matrix);
3873 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixArray(ID3DXEffectCompiler *iface,
3874 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
3876 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3878 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3880 return d3dx9_base_effect_set_matrix_array(&compiler->base_effect, parameter, matrix, count);
3883 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixArray(ID3DXEffectCompiler *iface,
3884 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
3886 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3888 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3890 return d3dx9_base_effect_get_matrix_array(&compiler->base_effect, parameter, matrix, count);
3893 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixPointerArray(ID3DXEffectCompiler *iface,
3894 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
3896 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3898 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3900 return d3dx9_base_effect_set_matrix_pointer_array(&compiler->base_effect, parameter, matrix, count);
3903 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixPointerArray(ID3DXEffectCompiler *iface,
3904 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
3906 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3908 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3910 return d3dx9_base_effect_get_matrix_pointer_array(&compiler->base_effect, parameter, matrix, count);
3913 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixTranspose(ID3DXEffectCompiler *iface,
3914 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
3916 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3918 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3920 return d3dx9_base_effect_set_matrix_transpose(&compiler->base_effect, parameter, matrix);
3923 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixTranspose(ID3DXEffectCompiler *iface,
3924 D3DXHANDLE parameter, D3DXMATRIX *matrix)
3926 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3928 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3930 return d3dx9_base_effect_get_matrix_transpose(&compiler->base_effect, parameter, matrix);
3933 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixTransposeArray(ID3DXEffectCompiler *iface,
3934 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
3936 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3938 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3940 return d3dx9_base_effect_set_matrix_transpose_array(&compiler->base_effect, parameter, matrix, count);
3943 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixTransposeArray(ID3DXEffectCompiler *iface,
3944 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
3946 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3948 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3950 return d3dx9_base_effect_get_matrix_transpose_array(&compiler->base_effect, parameter, matrix, count);
3953 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixTransposePointerArray(ID3DXEffectCompiler *iface,
3954 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
3956 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3958 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3960 return d3dx9_base_effect_set_matrix_transpose_pointer_array(&compiler->base_effect, parameter, matrix, count);
3963 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixTransposePointerArray(ID3DXEffectCompiler *iface,
3964 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
3966 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3968 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3970 return d3dx9_base_effect_get_matrix_transpose_pointer_array(&compiler->base_effect, parameter, matrix, count);
3973 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetString(ID3DXEffectCompiler *iface,
3974 D3DXHANDLE parameter, const char *string)
3976 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3978 TRACE("iface %p, parameter %p, string %s.\n", iface, parameter, debugstr_a(string));
3980 return d3dx9_base_effect_set_string(&compiler->base_effect, parameter, string);
3983 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetString(ID3DXEffectCompiler *iface,
3984 D3DXHANDLE parameter, const char **string)
3986 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3988 TRACE("iface %p, parameter %p, string %p.\n", iface, parameter, string);
3990 return d3dx9_base_effect_get_string(&compiler->base_effect, parameter, string);
3993 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetTexture(struct ID3DXEffectCompiler *iface,
3994 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 *texture)
3996 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
3998 TRACE("iface %p, parameter %p, texture %p.\n", iface, parameter, texture);
4000 return d3dx9_base_effect_set_texture(&compiler->base_effect, parameter, texture);
4003 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetTexture(struct ID3DXEffectCompiler *iface,
4004 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 **texture)
4006 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
4008 TRACE("iface %p, parameter %p, texture %p.\n", iface, parameter, texture);
4010 return d3dx9_base_effect_get_texture(&compiler->base_effect, parameter, texture);
4013 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetPixelShader(ID3DXEffectCompiler *iface,
4014 D3DXHANDLE parameter, struct IDirect3DPixelShader9 **shader)
4016 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
4018 TRACE("iface %p, parameter %p, shader %p.\n", iface, parameter, shader);
4020 return d3dx9_base_effect_get_pixel_shader(&compiler->base_effect, parameter, shader);
4023 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVertexShader(struct ID3DXEffectCompiler *iface,
4024 D3DXHANDLE parameter, struct IDirect3DVertexShader9 **shader)
4026 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
4028 TRACE("iface %p, parameter %p, shader %p.\n", iface, parameter, shader);
4030 return d3dx9_base_effect_get_vertex_shader(&compiler->base_effect, parameter, shader);
4033 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetArrayRange(ID3DXEffectCompiler *iface,
4034 D3DXHANDLE parameter, UINT start, UINT end)
4036 struct ID3DXEffectCompilerImpl *compiler = impl_from_ID3DXEffectCompiler(iface);
4038 TRACE("iface %p, parameter %p, start %u, end %u.\n", iface, parameter, start, end);
4040 return d3dx9_base_effect_set_array_range(&compiler->base_effect, parameter, start, end);
4043 /*** ID3DXEffectCompiler methods ***/
4044 static HRESULT WINAPI ID3DXEffectCompilerImpl_SetLiteral(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL literal)
4046 struct ID3DXEffectCompilerImpl *This = impl_from_ID3DXEffectCompiler(iface);
4048 FIXME("iface %p, parameter %p, literal %u\n", This, parameter, literal);
4050 return E_NOTIMPL;
4053 static HRESULT WINAPI ID3DXEffectCompilerImpl_GetLiteral(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *literal)
4055 struct ID3DXEffectCompilerImpl *This = impl_from_ID3DXEffectCompiler(iface);
4057 FIXME("iface %p, parameter %p, literal %p\n", This, parameter, literal);
4059 return E_NOTIMPL;
4062 static HRESULT WINAPI ID3DXEffectCompilerImpl_CompileEffect(ID3DXEffectCompiler *iface, DWORD flags,
4063 ID3DXBuffer **effect, ID3DXBuffer **error_msgs)
4065 struct ID3DXEffectCompilerImpl *This = impl_from_ID3DXEffectCompiler(iface);
4067 FIXME("iface %p, flags %#x, effect %p, error_msgs %p stub\n", This, flags, effect, error_msgs);
4069 return E_NOTIMPL;
4072 static HRESULT WINAPI ID3DXEffectCompilerImpl_CompileShader(ID3DXEffectCompiler *iface, D3DXHANDLE function,
4073 const char *target, DWORD flags, ID3DXBuffer **shader, ID3DXBuffer **error_msgs,
4074 ID3DXConstantTable **constant_table)
4076 struct ID3DXEffectCompilerImpl *This = impl_from_ID3DXEffectCompiler(iface);
4078 FIXME("iface %p, function %p, target %p, flags %#x, shader %p, error_msgs %p, constant_table %p stub\n",
4079 This, function, target, flags, shader, error_msgs, constant_table);
4081 return E_NOTIMPL;
4084 static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl =
4086 /*** IUnknown methods ***/
4087 ID3DXEffectCompilerImpl_QueryInterface,
4088 ID3DXEffectCompilerImpl_AddRef,
4089 ID3DXEffectCompilerImpl_Release,
4090 /*** ID3DXBaseEffect methods ***/
4091 ID3DXEffectCompilerImpl_GetDesc,
4092 ID3DXEffectCompilerImpl_GetParameterDesc,
4093 ID3DXEffectCompilerImpl_GetTechniqueDesc,
4094 ID3DXEffectCompilerImpl_GetPassDesc,
4095 ID3DXEffectCompilerImpl_GetFunctionDesc,
4096 ID3DXEffectCompilerImpl_GetParameter,
4097 ID3DXEffectCompilerImpl_GetParameterByName,
4098 ID3DXEffectCompilerImpl_GetParameterBySemantic,
4099 ID3DXEffectCompilerImpl_GetParameterElement,
4100 ID3DXEffectCompilerImpl_GetTechnique,
4101 ID3DXEffectCompilerImpl_GetTechniqueByName,
4102 ID3DXEffectCompilerImpl_GetPass,
4103 ID3DXEffectCompilerImpl_GetPassByName,
4104 ID3DXEffectCompilerImpl_GetFunction,
4105 ID3DXEffectCompilerImpl_GetFunctionByName,
4106 ID3DXEffectCompilerImpl_GetAnnotation,
4107 ID3DXEffectCompilerImpl_GetAnnotationByName,
4108 ID3DXEffectCompilerImpl_SetValue,
4109 ID3DXEffectCompilerImpl_GetValue,
4110 ID3DXEffectCompilerImpl_SetBool,
4111 ID3DXEffectCompilerImpl_GetBool,
4112 ID3DXEffectCompilerImpl_SetBoolArray,
4113 ID3DXEffectCompilerImpl_GetBoolArray,
4114 ID3DXEffectCompilerImpl_SetInt,
4115 ID3DXEffectCompilerImpl_GetInt,
4116 ID3DXEffectCompilerImpl_SetIntArray,
4117 ID3DXEffectCompilerImpl_GetIntArray,
4118 ID3DXEffectCompilerImpl_SetFloat,
4119 ID3DXEffectCompilerImpl_GetFloat,
4120 ID3DXEffectCompilerImpl_SetFloatArray,
4121 ID3DXEffectCompilerImpl_GetFloatArray,
4122 ID3DXEffectCompilerImpl_SetVector,
4123 ID3DXEffectCompilerImpl_GetVector,
4124 ID3DXEffectCompilerImpl_SetVectorArray,
4125 ID3DXEffectCompilerImpl_GetVectorArray,
4126 ID3DXEffectCompilerImpl_SetMatrix,
4127 ID3DXEffectCompilerImpl_GetMatrix,
4128 ID3DXEffectCompilerImpl_SetMatrixArray,
4129 ID3DXEffectCompilerImpl_GetMatrixArray,
4130 ID3DXEffectCompilerImpl_SetMatrixPointerArray,
4131 ID3DXEffectCompilerImpl_GetMatrixPointerArray,
4132 ID3DXEffectCompilerImpl_SetMatrixTranspose,
4133 ID3DXEffectCompilerImpl_GetMatrixTranspose,
4134 ID3DXEffectCompilerImpl_SetMatrixTransposeArray,
4135 ID3DXEffectCompilerImpl_GetMatrixTransposeArray,
4136 ID3DXEffectCompilerImpl_SetMatrixTransposePointerArray,
4137 ID3DXEffectCompilerImpl_GetMatrixTransposePointerArray,
4138 ID3DXEffectCompilerImpl_SetString,
4139 ID3DXEffectCompilerImpl_GetString,
4140 ID3DXEffectCompilerImpl_SetTexture,
4141 ID3DXEffectCompilerImpl_GetTexture,
4142 ID3DXEffectCompilerImpl_GetPixelShader,
4143 ID3DXEffectCompilerImpl_GetVertexShader,
4144 ID3DXEffectCompilerImpl_SetArrayRange,
4145 /*** ID3DXEffectCompiler methods ***/
4146 ID3DXEffectCompilerImpl_SetLiteral,
4147 ID3DXEffectCompilerImpl_GetLiteral,
4148 ID3DXEffectCompilerImpl_CompileEffect,
4149 ID3DXEffectCompilerImpl_CompileShader,
4152 static HRESULT d3dx9_parse_sampler(struct d3dx_sampler *sampler, const char *data, const char **ptr, D3DXHANDLE *objects)
4154 HRESULT hr;
4155 UINT i;
4156 struct d3dx_state *states;
4158 read_dword(ptr, &sampler->state_count);
4159 TRACE("Count: %u\n", sampler->state_count);
4161 states = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*states) * sampler->state_count);
4162 if (!states)
4164 ERR("Out of memory\n");
4165 return E_OUTOFMEMORY;
4168 for (i = 0; i < sampler->state_count; ++i)
4170 hr = d3dx9_parse_state(&states[i], data, ptr, objects);
4171 if (hr != D3D_OK)
4173 WARN("Failed to parse state %u\n", i);
4174 goto err_out;
4178 sampler->states = states;
4180 return D3D_OK;
4182 err_out:
4184 for (i = 0; i < sampler->state_count; ++i)
4186 free_state(&states[i]);
4189 HeapFree(GetProcessHeap(), 0, states);
4191 return hr;
4194 static HRESULT d3dx9_parse_value(struct d3dx_parameter *param, void *value, const char *data, const char **ptr, D3DXHANDLE *objects)
4196 unsigned int i;
4197 HRESULT hr;
4198 UINT old_size = 0;
4199 DWORD id;
4201 if (param->element_count)
4203 param->data = value;
4205 for (i = 0; i < param->element_count; ++i)
4207 struct d3dx_parameter *member = &param->members[i];
4209 hr = d3dx9_parse_value(member, value ? (char *)value + old_size : NULL, data, ptr, objects);
4210 if (hr != D3D_OK)
4212 WARN("Failed to parse value %u\n", i);
4213 return hr;
4216 old_size += member->bytes;
4219 return D3D_OK;
4222 switch(param->class)
4224 case D3DXPC_SCALAR:
4225 case D3DXPC_VECTOR:
4226 case D3DXPC_MATRIX_ROWS:
4227 case D3DXPC_MATRIX_COLUMNS:
4228 param->data = value;
4229 break;
4231 case D3DXPC_STRUCT:
4232 param->data = value;
4234 for (i = 0; i < param->member_count; ++i)
4236 struct d3dx_parameter *member = &param->members[i];
4238 hr = d3dx9_parse_value(member, (char *)value + old_size, data, ptr, objects);
4239 if (hr != D3D_OK)
4241 WARN("Failed to parse value %u\n", i);
4242 return hr;
4245 old_size += member->bytes;
4247 break;
4249 case D3DXPC_OBJECT:
4250 switch (param->type)
4252 case D3DXPT_STRING:
4253 case D3DXPT_TEXTURE:
4254 case D3DXPT_TEXTURE1D:
4255 case D3DXPT_TEXTURE2D:
4256 case D3DXPT_TEXTURE3D:
4257 case D3DXPT_TEXTURECUBE:
4258 case D3DXPT_PIXELSHADER:
4259 case D3DXPT_VERTEXSHADER:
4260 read_dword(ptr, &id);
4261 TRACE("Id: %u\n", id);
4262 objects[id] = get_parameter_handle(param);
4263 param->data = value;
4264 break;
4266 case D3DXPT_SAMPLER:
4267 case D3DXPT_SAMPLER1D:
4268 case D3DXPT_SAMPLER2D:
4269 case D3DXPT_SAMPLER3D:
4270 case D3DXPT_SAMPLERCUBE:
4272 struct d3dx_sampler *sampler;
4274 sampler = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*sampler));
4275 if (!sampler)
4276 return E_OUTOFMEMORY;
4278 hr = d3dx9_parse_sampler(sampler, data, ptr, objects);
4279 if (hr != D3D_OK)
4281 HeapFree(GetProcessHeap(), 0, sampler);
4282 WARN("Failed to parse sampler\n");
4283 return hr;
4286 param->data = sampler;
4287 break;
4290 default:
4291 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
4292 break;
4294 break;
4296 default:
4297 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
4298 break;
4301 return D3D_OK;
4304 static HRESULT d3dx9_parse_init_value(struct d3dx_parameter *param, const char *data, const char *ptr, D3DXHANDLE *objects)
4306 UINT size = param->bytes;
4307 HRESULT hr;
4308 void *value = NULL;
4310 TRACE("param size: %u\n", size);
4312 if (size)
4314 value = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
4315 if (!value)
4317 ERR("Failed to allocate data memory.\n");
4318 return E_OUTOFMEMORY;
4321 switch(param->class)
4323 case D3DXPC_OBJECT:
4324 break;
4326 case D3DXPC_SCALAR:
4327 case D3DXPC_VECTOR:
4328 case D3DXPC_MATRIX_ROWS:
4329 case D3DXPC_MATRIX_COLUMNS:
4330 case D3DXPC_STRUCT:
4331 TRACE("Data: %s.\n", debugstr_an(ptr, size));
4332 memcpy(value, ptr, size);
4333 break;
4335 default:
4336 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
4337 break;
4341 hr = d3dx9_parse_value(param, value, data, &ptr, objects);
4342 if (hr != D3D_OK)
4344 WARN("Failed to parse value\n");
4345 HeapFree(GetProcessHeap(), 0, value);
4346 return hr;
4349 return D3D_OK;
4352 static HRESULT d3dx9_parse_name(char **name, const char *ptr)
4354 DWORD size;
4356 read_dword(&ptr, &size);
4357 TRACE("Name size: %#x\n", size);
4359 if (!size)
4361 return D3D_OK;
4364 *name = HeapAlloc(GetProcessHeap(), 0, size);
4365 if (!*name)
4367 ERR("Failed to allocate name memory.\n");
4368 return E_OUTOFMEMORY;
4371 TRACE("Name: %s.\n", debugstr_an(ptr, size));
4372 memcpy(*name, ptr, size);
4374 return D3D_OK;
4377 static HRESULT d3dx9_copy_data(char **str, const char **ptr)
4379 DWORD size;
4381 read_dword(ptr, &size);
4382 TRACE("Data size: %#x\n", size);
4384 *str = HeapAlloc(GetProcessHeap(), 0, size);
4385 if (!*str)
4387 ERR("Failed to allocate name memory.\n");
4388 return E_OUTOFMEMORY;
4391 TRACE("Data: %s.\n", debugstr_an(*ptr, size));
4392 memcpy(*str, *ptr, size);
4394 *ptr += ((size + 3) & ~3);
4396 return D3D_OK;
4399 static HRESULT d3dx9_parse_data(struct d3dx_parameter *param, const char **ptr, struct IDirect3DDevice9 *device)
4401 DWORD size;
4402 HRESULT hr;
4404 TRACE("Parse data for parameter %s, type %s\n", debugstr_a(param->name), debug_d3dxparameter_type(param->type));
4406 read_dword(ptr, &size);
4407 TRACE("Data size: %#x\n", size);
4409 if (!size)
4411 TRACE("Size is 0\n");
4412 *(void **)param->data = NULL;
4413 return D3D_OK;
4416 switch (param->type)
4418 case D3DXPT_STRING:
4419 /* re-read with size (sizeof(DWORD) = 4) */
4420 hr = d3dx9_parse_name((LPSTR *)param->data, *ptr - 4);
4421 if (hr != D3D_OK)
4423 WARN("Failed to parse string data\n");
4424 return hr;
4426 break;
4428 case D3DXPT_VERTEXSHADER:
4429 if (FAILED(hr = IDirect3DDevice9_CreateVertexShader(device, (DWORD *)*ptr, param->data)))
4431 WARN("Failed to create vertex shader\n");
4432 return hr;
4434 break;
4436 case D3DXPT_PIXELSHADER:
4437 if (FAILED(hr = IDirect3DDevice9_CreatePixelShader(device, (DWORD *)*ptr, param->data)))
4439 WARN("Failed to create pixel shader\n");
4440 return hr;
4442 break;
4444 default:
4445 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
4446 break;
4450 *ptr += ((size + 3) & ~3);
4452 return D3D_OK;
4455 static HRESULT d3dx9_parse_effect_typedef(struct d3dx_parameter *param, const char *data, const char **ptr,
4456 struct d3dx_parameter *parent, UINT flags)
4458 DWORD offset;
4459 HRESULT hr;
4460 UINT i;
4462 param->flags = flags;
4464 if (!parent)
4466 read_dword(ptr, &param->type);
4467 TRACE("Type: %s\n", debug_d3dxparameter_type(param->type));
4469 read_dword(ptr, &param->class);
4470 TRACE("Class: %s\n", debug_d3dxparameter_class(param->class));
4472 read_dword(ptr, &offset);
4473 TRACE("Type name offset: %#x\n", offset);
4474 hr = d3dx9_parse_name(&param->name, data + offset);
4475 if (hr != D3D_OK)
4477 WARN("Failed to parse name\n");
4478 goto err_out;
4481 read_dword(ptr, &offset);
4482 TRACE("Type semantic offset: %#x\n", offset);
4483 hr = d3dx9_parse_name(&param->semantic, data + offset);
4484 if (hr != D3D_OK)
4486 WARN("Failed to parse semantic\n");
4487 goto err_out;
4490 read_dword(ptr, &param->element_count);
4491 TRACE("Elements: %u\n", param->element_count);
4493 switch (param->class)
4495 case D3DXPC_VECTOR:
4496 read_dword(ptr, &param->columns);
4497 TRACE("Columns: %u\n", param->columns);
4499 read_dword(ptr, &param->rows);
4500 TRACE("Rows: %u\n", param->rows);
4502 /* sizeof(DWORD) * rows * columns */
4503 param->bytes = 4 * param->rows * param->columns;
4504 break;
4506 case D3DXPC_SCALAR:
4507 case D3DXPC_MATRIX_ROWS:
4508 case D3DXPC_MATRIX_COLUMNS:
4509 read_dword(ptr, &param->rows);
4510 TRACE("Rows: %u\n", param->rows);
4512 read_dword(ptr, &param->columns);
4513 TRACE("Columns: %u\n", param->columns);
4515 /* sizeof(DWORD) * rows * columns */
4516 param->bytes = 4 * param->rows * param->columns;
4517 break;
4519 case D3DXPC_STRUCT:
4520 read_dword(ptr, &param->member_count);
4521 TRACE("Members: %u\n", param->member_count);
4522 break;
4524 case D3DXPC_OBJECT:
4525 switch (param->type)
4527 case D3DXPT_STRING:
4528 case D3DXPT_PIXELSHADER:
4529 case D3DXPT_VERTEXSHADER:
4530 case D3DXPT_TEXTURE:
4531 case D3DXPT_TEXTURE1D:
4532 case D3DXPT_TEXTURE2D:
4533 case D3DXPT_TEXTURE3D:
4534 case D3DXPT_TEXTURECUBE:
4535 param->bytes = sizeof(void *);
4536 break;
4538 case D3DXPT_SAMPLER:
4539 case D3DXPT_SAMPLER1D:
4540 case D3DXPT_SAMPLER2D:
4541 case D3DXPT_SAMPLER3D:
4542 case D3DXPT_SAMPLERCUBE:
4543 param->bytes = 0;
4544 break;
4546 default:
4547 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
4548 break;
4550 break;
4552 default:
4553 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
4554 break;
4557 else
4559 /* elements */
4560 param->type = parent->type;
4561 param->class = parent->class;
4562 param->name = parent->name;
4563 param->semantic = parent->semantic;
4564 param->element_count = 0;
4565 param->annotation_count = 0;
4566 param->member_count = parent->member_count;
4567 param->bytes = parent->bytes;
4568 param->rows = parent->rows;
4569 param->columns = parent->columns;
4572 if (param->element_count)
4574 unsigned int param_bytes = 0;
4575 const char *save_ptr = *ptr;
4577 param->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*param->members) * param->element_count);
4578 if (!param->members)
4580 ERR("Out of memory\n");
4581 hr = E_OUTOFMEMORY;
4582 goto err_out;
4585 for (i = 0; i < param->element_count; ++i)
4587 *ptr = save_ptr;
4589 hr = d3dx9_parse_effect_typedef(&param->members[i], data, ptr, param, flags);
4590 if (hr != D3D_OK)
4592 WARN("Failed to parse member %u\n", i);
4593 goto err_out;
4596 param_bytes += param->members[i].bytes;
4599 param->bytes = param_bytes;
4601 else if (param->member_count)
4603 param->members = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*param->members) * param->member_count);
4604 if (!param->members)
4606 ERR("Out of memory\n");
4607 hr = E_OUTOFMEMORY;
4608 goto err_out;
4611 for (i = 0; i < param->member_count; ++i)
4613 hr = d3dx9_parse_effect_typedef(&param->members[i], data, ptr, NULL, flags);
4614 if (hr != D3D_OK)
4616 WARN("Failed to parse member %u\n", i);
4617 goto err_out;
4620 param->bytes += param->members[i].bytes;
4623 return D3D_OK;
4625 err_out:
4627 if (param->members)
4629 unsigned int count = param->element_count ? param->element_count : param->member_count;
4631 for (i = 0; i < count; ++i)
4632 free_parameter(&param->members[i], param->element_count != 0, TRUE);
4633 HeapFree(GetProcessHeap(), 0, param->members);
4634 param->members = NULL;
4637 if (!parent)
4639 HeapFree(GetProcessHeap(), 0, param->name);
4640 HeapFree(GetProcessHeap(), 0, param->semantic);
4642 param->name = NULL;
4643 param->semantic = NULL;
4645 return hr;
4648 static HRESULT d3dx9_parse_effect_annotation(struct d3dx_parameter *anno, const char *data, const char **ptr, D3DXHANDLE *objects)
4650 DWORD offset;
4651 const char *ptr2;
4652 HRESULT hr;
4654 anno->flags = D3DX_PARAMETER_ANNOTATION;
4656 read_dword(ptr, &offset);
4657 TRACE("Typedef offset: %#x\n", offset);
4658 ptr2 = data + offset;
4659 hr = d3dx9_parse_effect_typedef(anno, data, &ptr2, NULL, D3DX_PARAMETER_ANNOTATION);
4660 if (hr != D3D_OK)
4662 WARN("Failed to parse type definition\n");
4663 return hr;
4666 read_dword(ptr, &offset);
4667 TRACE("Value offset: %#x\n", offset);
4668 hr = d3dx9_parse_init_value(anno, data, data + offset, objects);
4669 if (hr != D3D_OK)
4671 WARN("Failed to parse value\n");
4672 return hr;
4675 return D3D_OK;
4678 static HRESULT d3dx9_parse_state(struct d3dx_state *state, const char *data, const char **ptr, D3DXHANDLE *objects)
4680 DWORD offset;
4681 const char *ptr2;
4682 HRESULT hr;
4683 struct d3dx_parameter *parameter;
4685 parameter = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*parameter));
4686 if (!parameter)
4687 return E_OUTOFMEMORY;
4689 state->type = ST_CONSTANT;
4691 read_dword(ptr, &state->operation);
4692 TRACE("Operation: %#x (%s)\n", state->operation, state_table[state->operation].name);
4694 read_dword(ptr, &state->index);
4695 TRACE("Index: %#x\n", state->index);
4697 read_dword(ptr, &offset);
4698 TRACE("Typedef offset: %#x\n", offset);
4699 ptr2 = data + offset;
4700 hr = d3dx9_parse_effect_typedef(parameter, data, &ptr2, NULL, 0);
4701 if (hr != D3D_OK)
4703 WARN("Failed to parse type definition\n");
4704 goto err_out;
4707 read_dword(ptr, &offset);
4708 TRACE("Value offset: %#x\n", offset);
4709 hr = d3dx9_parse_init_value(parameter, data, data + offset, objects);
4710 if (hr != D3D_OK)
4712 WARN("Failed to parse value\n");
4713 goto err_out;
4716 state->parameter = parameter;
4718 return D3D_OK;
4720 err_out:
4722 free_parameter(parameter, FALSE, FALSE);
4724 return hr;
4727 static HRESULT d3dx9_parse_effect_parameter(struct d3dx_parameter *param, const char *data, const char **ptr, D3DXHANDLE *objects)
4729 DWORD offset;
4730 HRESULT hr;
4731 unsigned int i;
4732 const char *ptr2;
4734 read_dword(ptr, &offset);
4735 TRACE("Typedef offset: %#x\n", offset);
4736 ptr2 = data + offset;
4738 read_dword(ptr, &offset);
4739 TRACE("Value offset: %#x\n", offset);
4741 read_dword(ptr, &param->flags);
4742 TRACE("Flags: %#x\n", param->flags);
4744 read_dword(ptr, &param->annotation_count);
4745 TRACE("Annotation count: %u\n", param->annotation_count);
4747 hr = d3dx9_parse_effect_typedef(param, data, &ptr2, NULL, param->flags);
4748 if (hr != D3D_OK)
4750 WARN("Failed to parse type definition\n");
4751 return hr;
4754 hr = d3dx9_parse_init_value(param, data, data + offset, objects);
4755 if (hr != D3D_OK)
4757 WARN("Failed to parse value\n");
4758 return hr;
4761 if (param->annotation_count)
4763 param->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
4764 sizeof(*param->annotations) * param->annotation_count);
4765 if (!param->annotations)
4767 ERR("Out of memory\n");
4768 hr = E_OUTOFMEMORY;
4769 goto err_out;
4772 for (i = 0; i < param->annotation_count; ++i)
4774 hr = d3dx9_parse_effect_annotation(&param->annotations[i], data, ptr, objects);
4775 if (hr != D3D_OK)
4777 WARN("Failed to parse annotation\n");
4778 goto err_out;
4783 return D3D_OK;
4785 err_out:
4787 if (param->annotations)
4789 for (i = 0; i < param->annotation_count; ++i)
4790 free_parameter(&param->annotations[i], FALSE, FALSE);
4791 HeapFree(GetProcessHeap(), 0, param->annotations);
4792 param->annotations = NULL;
4795 return hr;
4798 static HRESULT d3dx9_parse_effect_pass(struct d3dx_pass *pass, const char *data, const char **ptr, D3DXHANDLE *objects)
4800 DWORD offset;
4801 HRESULT hr;
4802 unsigned int i;
4803 struct d3dx_state *states = NULL;
4804 char *name = NULL;
4806 read_dword(ptr, &offset);
4807 TRACE("Pass name offset: %#x\n", offset);
4808 hr = d3dx9_parse_name(&name, data + offset);
4809 if (hr != D3D_OK)
4811 WARN("Failed to parse name\n");
4812 goto err_out;
4815 read_dword(ptr, &pass->annotation_count);
4816 TRACE("Annotation count: %u\n", pass->annotation_count);
4818 read_dword(ptr, &pass->state_count);
4819 TRACE("State count: %u\n", pass->state_count);
4821 if (pass->annotation_count)
4823 pass->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
4824 sizeof(*pass->annotations) * pass->annotation_count);
4825 if (!pass->annotations)
4827 ERR("Out of memory\n");
4828 hr = E_OUTOFMEMORY;
4829 goto err_out;
4832 for (i = 0; i < pass->annotation_count; ++i)
4834 hr = d3dx9_parse_effect_annotation(&pass->annotations[i], data, ptr, objects);
4835 if (hr != D3D_OK)
4837 WARN("Failed to parse annotation %u\n", i);
4838 goto err_out;
4843 if (pass->state_count)
4845 states = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*states) * pass->state_count);
4846 if (!states)
4848 ERR("Out of memory\n");
4849 hr = E_OUTOFMEMORY;
4850 goto err_out;
4853 for (i = 0; i < pass->state_count; ++i)
4855 hr = d3dx9_parse_state(&states[i], data, ptr, objects);
4856 if (hr != D3D_OK)
4858 WARN("Failed to parse annotation %u\n", i);
4859 goto err_out;
4864 pass->name = name;
4865 pass->states = states;
4867 return D3D_OK;
4869 err_out:
4871 if (pass->annotations)
4873 for (i = 0; i < pass->annotation_count; ++i)
4874 free_parameter(&pass->annotations[i], FALSE, FALSE);
4875 HeapFree(GetProcessHeap(), 0, pass->annotations);
4876 pass->annotations = NULL;
4879 if (states)
4881 for (i = 0; i < pass->state_count; ++i)
4883 free_state(&states[i]);
4885 HeapFree(GetProcessHeap(), 0, states);
4888 HeapFree(GetProcessHeap(), 0, name);
4890 return hr;
4893 static HRESULT d3dx9_parse_effect_technique(struct d3dx_technique *technique, const char *data, const char **ptr, D3DXHANDLE *objects)
4895 DWORD offset;
4896 HRESULT hr;
4897 unsigned int i;
4898 char *name = NULL;
4900 read_dword(ptr, &offset);
4901 TRACE("Technique name offset: %#x\n", offset);
4902 hr = d3dx9_parse_name(&name, data + offset);
4903 if (hr != D3D_OK)
4905 WARN("Failed to parse name\n");
4906 goto err_out;
4909 read_dword(ptr, &technique->annotation_count);
4910 TRACE("Annotation count: %u\n", technique->annotation_count);
4912 read_dword(ptr, &technique->pass_count);
4913 TRACE("Pass count: %u\n", technique->pass_count);
4915 if (technique->annotation_count)
4917 technique->annotations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
4918 sizeof(*technique->annotations) * technique->annotation_count);
4919 if (!technique->annotations)
4921 ERR("Out of memory\n");
4922 hr = E_OUTOFMEMORY;
4923 goto err_out;
4926 for (i = 0; i < technique->annotation_count; ++i)
4928 hr = d3dx9_parse_effect_annotation(&technique->annotations[i], data, ptr, objects);
4929 if (hr != D3D_OK)
4931 WARN("Failed to parse annotation %u\n", i);
4932 goto err_out;
4937 if (technique->pass_count)
4939 technique->passes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
4940 sizeof(*technique->passes) * technique->pass_count);
4941 if (!technique->passes)
4943 ERR("Out of memory\n");
4944 hr = E_OUTOFMEMORY;
4945 goto err_out;
4948 for (i = 0; i < technique->pass_count; ++i)
4950 hr = d3dx9_parse_effect_pass(&technique->passes[i], data, ptr, objects);
4951 if (hr != D3D_OK)
4953 WARN("Failed to parse pass %u\n", i);
4954 goto err_out;
4959 technique->name = name;
4961 return D3D_OK;
4963 err_out:
4965 if (technique->passes)
4967 for (i = 0; i < technique->pass_count; ++i)
4968 free_pass(&technique->passes[i]);
4969 HeapFree(GetProcessHeap(), 0, technique->passes);
4970 technique->passes = NULL;
4973 if (technique->annotations)
4975 for (i = 0; i < technique->annotation_count; ++i)
4976 free_parameter(&technique->annotations[i], FALSE, FALSE);
4977 HeapFree(GetProcessHeap(), 0, technique->annotations);
4978 technique->annotations = NULL;
4981 HeapFree(GetProcessHeap(), 0, name);
4983 return hr;
4986 static HRESULT d3dx9_parse_resource(struct d3dx9_base_effect *base, const char *data, const char **ptr)
4988 DWORD technique_index;
4989 DWORD index, state_index, usage, element_index;
4990 struct d3dx_state *state;
4991 struct d3dx_parameter *param;
4992 HRESULT hr = E_FAIL;
4994 read_dword(ptr, &technique_index);
4995 TRACE("techn: %u\n", technique_index);
4997 read_dword(ptr, &index);
4998 TRACE("index: %u\n", index);
5000 read_dword(ptr, &element_index);
5001 TRACE("element_index: %u\n", element_index);
5003 read_dword(ptr, &state_index);
5004 TRACE("state_index: %u\n", state_index);
5006 read_dword(ptr, &usage);
5007 TRACE("usage: %u\n", usage);
5009 if (technique_index == 0xffffffff)
5011 struct d3dx_parameter *parameter;
5012 struct d3dx_sampler *sampler;
5014 if (index >= base->parameter_count)
5016 FIXME("Index out of bounds: index %u >= parameter_count %u\n", index, base->parameter_count);
5017 return E_FAIL;
5020 parameter = &base->parameters[index];
5021 if (element_index != 0xffffffff)
5023 if (element_index >= parameter->element_count && parameter->element_count != 0)
5025 FIXME("Index out of bounds: element_index %u >= element_count %u\n", element_index, parameter->element_count);
5026 return E_FAIL;
5029 if (parameter->element_count != 0) parameter = &parameter->members[element_index];
5032 sampler = parameter->data;
5033 if (state_index >= sampler->state_count)
5035 FIXME("Index out of bounds: state_index %u >= state_count %u\n", state_index, sampler->state_count);
5036 return E_FAIL;
5039 state = &sampler->states[state_index];
5041 else
5043 struct d3dx_technique *technique;
5044 struct d3dx_pass *pass;
5046 if (technique_index >= base->technique_count)
5048 FIXME("Index out of bounds: technique_index %u >= technique_count %u\n", technique_index, base->technique_count);
5049 return E_FAIL;
5052 technique = &base->techniques[technique_index];
5053 if (index >= technique->pass_count)
5055 FIXME("Index out of bounds: index %u >= pass_count %u\n", index, technique->pass_count);
5056 return E_FAIL;
5059 pass = &technique->passes[index];
5060 if (state_index >= pass->state_count)
5062 FIXME("Index out of bounds: state_index %u >= state_count %u\n", state_index, pass->state_count);
5063 return E_FAIL;
5066 state = &pass->states[state_index];
5069 param = state->parameter;
5071 switch (usage)
5073 case 0:
5074 TRACE("usage 0: type %s\n", debug_d3dxparameter_type(param->type));
5075 switch (param->type)
5077 case D3DXPT_VERTEXSHADER:
5078 case D3DXPT_PIXELSHADER:
5079 state->type = ST_CONSTANT;
5080 hr = d3dx9_parse_data(param, ptr, base->effect->device);
5081 break;
5083 case D3DXPT_BOOL:
5084 case D3DXPT_INT:
5085 case D3DXPT_FLOAT:
5086 case D3DXPT_STRING:
5087 state->type = ST_FXLC;
5088 hr = d3dx9_copy_data(param->data, ptr);
5089 break;
5091 default:
5092 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
5093 break;
5095 break;
5097 case 1:
5098 state->type = ST_PARAMETER;
5099 hr = d3dx9_copy_data(param->data, ptr);
5100 if (hr == D3D_OK)
5102 TRACE("Mapping to parameter %s\n", *(char **)param->data);
5104 break;
5106 default:
5107 FIXME("Unknown usage %x\n", usage);
5108 break;
5111 return hr;
5114 static HRESULT d3dx9_parse_effect(struct d3dx9_base_effect *base, const char *data, UINT data_size, DWORD start)
5116 const char *ptr = data + start;
5117 D3DXHANDLE *objects = NULL;
5118 UINT stringcount, objectcount, resourcecount;
5119 HRESULT hr;
5120 UINT i;
5122 read_dword(&ptr, &base->parameter_count);
5123 TRACE("Parameter count: %u\n", base->parameter_count);
5125 read_dword(&ptr, &base->technique_count);
5126 TRACE("Technique count: %u\n", base->technique_count);
5128 skip_dword_unknown(&ptr, 1);
5130 read_dword(&ptr, &objectcount);
5131 TRACE("Object count: %u\n", objectcount);
5133 objects = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*objects) * objectcount);
5134 if (!objects)
5136 ERR("Out of memory\n");
5137 hr = E_OUTOFMEMORY;
5138 goto err_out;
5141 if (base->parameter_count)
5143 base->parameters = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
5144 sizeof(*base->parameters) * base->parameter_count);
5145 if (!base->parameters)
5147 ERR("Out of memory\n");
5148 hr = E_OUTOFMEMORY;
5149 goto err_out;
5152 for (i = 0; i < base->parameter_count; ++i)
5154 hr = d3dx9_parse_effect_parameter(&base->parameters[i], data, &ptr, objects);
5155 if (hr != D3D_OK)
5157 WARN("Failed to parse parameter %u\n", i);
5158 goto err_out;
5163 if (base->technique_count)
5165 base->techniques = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
5166 sizeof(*base->techniques) * base->technique_count);
5167 if (!base->techniques)
5169 ERR("Out of memory\n");
5170 hr = E_OUTOFMEMORY;
5171 goto err_out;
5174 for (i = 0; i < base->technique_count; ++i)
5176 hr = d3dx9_parse_effect_technique(&base->techniques[i], data, &ptr, objects);
5177 if (hr != D3D_OK)
5179 WARN("Failed to parse technique %u\n", i);
5180 goto err_out;
5185 read_dword(&ptr, &stringcount);
5186 TRACE("String count: %u\n", stringcount);
5188 read_dword(&ptr, &resourcecount);
5189 TRACE("Resource count: %u\n", resourcecount);
5191 for (i = 0; i < stringcount; ++i)
5193 DWORD id;
5194 struct d3dx_parameter *param;
5196 read_dword(&ptr, &id);
5197 TRACE("Id: %u\n", id);
5199 param = get_parameter_struct(objects[id]);
5201 hr = d3dx9_parse_data(param, &ptr, base->effect->device);
5202 if (hr != D3D_OK)
5204 WARN("Failed to parse data %u\n", i);
5205 goto err_out;
5209 for (i = 0; i < resourcecount; ++i)
5211 TRACE("parse resource %u\n", i);
5213 hr = d3dx9_parse_resource(base, data, &ptr);
5214 if (hr != D3D_OK)
5216 WARN("Failed to parse resource %u\n", i);
5217 goto err_out;
5221 HeapFree(GetProcessHeap(), 0, objects);
5223 return D3D_OK;
5225 err_out:
5227 if (base->techniques)
5229 for (i = 0; i < base->technique_count; ++i)
5230 free_technique(&base->techniques[i]);
5231 HeapFree(GetProcessHeap(), 0, base->techniques);
5232 base->techniques = NULL;
5235 if (base->parameters)
5237 for (i = 0; i < base->parameter_count; ++i)
5239 free_parameter(&base->parameters[i], FALSE, FALSE);
5241 HeapFree(GetProcessHeap(), 0, base->parameters);
5242 base->parameters = NULL;
5245 HeapFree(GetProcessHeap(), 0, objects);
5247 return hr;
5250 static HRESULT d3dx9_base_effect_init(struct d3dx9_base_effect *base,
5251 const char *data, SIZE_T data_size, struct ID3DXEffectImpl *effect)
5253 DWORD tag, offset;
5254 const char *ptr = data;
5255 HRESULT hr;
5257 TRACE("base %p, data %p, data_size %lu, effect %p\n", base, data, data_size, effect);
5259 base->effect = effect;
5261 read_dword(&ptr, &tag);
5262 TRACE("Tag: %x\n", tag);
5264 if (tag != d3dx9_effect_version(9, 1))
5266 /* todo: compile hlsl ascii code */
5267 FIXME("HLSL ascii effects not supported, yet\n");
5269 /* Show the start of the shader for debugging info. */
5270 TRACE("effect:\n%s\n", debugstr_an(data, data_size > 40 ? 40 : data_size));
5272 else
5274 read_dword(&ptr, &offset);
5275 TRACE("Offset: %x\n", offset);
5277 hr = d3dx9_parse_effect(base, ptr, data_size, offset);
5278 if (hr != D3D_OK)
5280 FIXME("Failed to parse effect.\n");
5281 return hr;
5285 return D3D_OK;
5288 static HRESULT d3dx9_effect_init(struct ID3DXEffectImpl *effect, struct IDirect3DDevice9 *device,
5289 const char *data, SIZE_T data_size, struct ID3DXEffectPool *pool)
5291 HRESULT hr;
5293 TRACE("effect %p, device %p, data %p, data_size %lu, pool %p\n", effect, device, data, data_size, pool);
5295 effect->ID3DXEffect_iface.lpVtbl = &ID3DXEffect_Vtbl;
5296 effect->ref = 1;
5298 if (pool) pool->lpVtbl->AddRef(pool);
5299 effect->pool = pool;
5301 IDirect3DDevice9_AddRef(device);
5302 effect->device = device;
5304 if (FAILED(hr = d3dx9_base_effect_init(&effect->base_effect, data, data_size, effect)))
5306 FIXME("Failed to parse effect, hr %#x.\n", hr);
5307 free_effect(effect);
5308 return hr;
5311 /* initialize defaults - check because of unsupported ascii effects */
5312 if (effect->base_effect.techniques)
5314 effect->active_technique = &effect->base_effect.techniques[0];
5315 effect->active_pass = NULL;
5318 return D3D_OK;
5321 HRESULT WINAPI D3DXCreateEffectEx(struct IDirect3DDevice9 *device, const void *srcdata, UINT srcdatalen,
5322 const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skip_constants, DWORD flags,
5323 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilation_errors)
5325 struct ID3DXEffectImpl *object;
5326 HRESULT hr;
5328 FIXME("(%p, %p, %u, %p, %p, %p, %#x, %p, %p, %p): semi-stub\n", device, srcdata, srcdatalen, defines, include,
5329 skip_constants, flags, pool, effect, compilation_errors);
5331 if (compilation_errors)
5332 *compilation_errors = NULL;
5334 if (!device || !srcdata)
5335 return D3DERR_INVALIDCALL;
5337 if (!srcdatalen)
5338 return E_FAIL;
5340 /* Native dll allows effect to be null so just return D3D_OK after doing basic checks */
5341 if (!effect)
5342 return D3D_OK;
5344 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
5345 if (!object)
5346 return E_OUTOFMEMORY;
5348 hr = d3dx9_effect_init(object, device, srcdata, srcdatalen, pool);
5349 if (FAILED(hr))
5351 WARN("Failed to initialize shader reflection\n");
5352 HeapFree(GetProcessHeap(), 0, object);
5353 return hr;
5356 *effect = &object->ID3DXEffect_iface;
5358 TRACE("Created ID3DXEffect %p\n", object);
5360 return D3D_OK;
5363 HRESULT WINAPI D3DXCreateEffect(struct IDirect3DDevice9 *device, const void *srcdata, UINT srcdatalen,
5364 const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags,
5365 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilation_errors)
5367 TRACE("(%p, %p, %u, %p, %p, %#x, %p, %p, %p): Forwarded to D3DXCreateEffectEx\n", device, srcdata, srcdatalen, defines,
5368 include, flags, pool, effect, compilation_errors);
5370 return D3DXCreateEffectEx(device, srcdata, srcdatalen, defines, include, NULL, flags, pool, effect, compilation_errors);
5373 static HRESULT d3dx9_effect_compiler_init(struct ID3DXEffectCompilerImpl *compiler, const char *data, SIZE_T data_size)
5375 HRESULT hr;
5377 TRACE("effect %p, data %p, data_size %lu\n", compiler, data, data_size);
5379 compiler->ID3DXEffectCompiler_iface.lpVtbl = &ID3DXEffectCompiler_Vtbl;
5380 compiler->ref = 1;
5382 if (FAILED(hr = d3dx9_base_effect_init(&compiler->base_effect, data, data_size, NULL)))
5384 FIXME("Failed to parse effect, hr %#x.\n", hr);
5385 free_effect_compiler(compiler);
5386 return hr;
5389 return D3D_OK;
5392 HRESULT WINAPI D3DXCreateEffectCompiler(const char *srcdata, UINT srcdatalen, const D3DXMACRO *defines,
5393 ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **parse_errors)
5395 struct ID3DXEffectCompilerImpl *object;
5396 HRESULT hr;
5398 TRACE("srcdata %p, srcdatalen %u, defines %p, include %p, flags %#x, compiler %p, parse_errors %p\n",
5399 srcdata, srcdatalen, defines, include, flags, compiler, parse_errors);
5401 if (!srcdata || !compiler)
5403 WARN("Invalid arguments supplied\n");
5404 return D3DERR_INVALIDCALL;
5407 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
5408 if (!object)
5409 return E_OUTOFMEMORY;
5411 hr = d3dx9_effect_compiler_init(object, srcdata, srcdatalen);
5412 if (FAILED(hr))
5414 WARN("Failed to initialize effect compiler\n");
5415 HeapFree(GetProcessHeap(), 0, object);
5416 return hr;
5419 *compiler = &object->ID3DXEffectCompiler_iface;
5421 TRACE("Created ID3DXEffectCompiler %p\n", object);
5423 return D3D_OK;
5426 struct ID3DXEffectPoolImpl
5428 ID3DXEffectPool ID3DXEffectPool_iface;
5429 LONG ref;
5432 static inline struct ID3DXEffectPoolImpl *impl_from_ID3DXEffectPool(ID3DXEffectPool *iface)
5434 return CONTAINING_RECORD(iface, struct ID3DXEffectPoolImpl, ID3DXEffectPool_iface);
5437 /*** IUnknown methods ***/
5438 static HRESULT WINAPI ID3DXEffectPoolImpl_QueryInterface(ID3DXEffectPool *iface, REFIID riid, void **object)
5440 TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);
5442 if (IsEqualGUID(riid, &IID_IUnknown) ||
5443 IsEqualGUID(riid, &IID_ID3DXEffectPool))
5445 iface->lpVtbl->AddRef(iface);
5446 *object = iface;
5447 return S_OK;
5450 WARN("Interface %s not found\n", debugstr_guid(riid));
5452 return E_NOINTERFACE;
5455 static ULONG WINAPI ID3DXEffectPoolImpl_AddRef(ID3DXEffectPool *iface)
5457 struct ID3DXEffectPoolImpl *This = impl_from_ID3DXEffectPool(iface);
5459 TRACE("(%p)->(): AddRef from %u\n", This, This->ref);
5461 return InterlockedIncrement(&This->ref);
5464 static ULONG WINAPI ID3DXEffectPoolImpl_Release(ID3DXEffectPool *iface)
5466 struct ID3DXEffectPoolImpl *This = impl_from_ID3DXEffectPool(iface);
5467 ULONG ref = InterlockedDecrement(&This->ref);
5469 TRACE("(%p)->(): Release from %u\n", This, ref + 1);
5471 if (!ref)
5472 HeapFree(GetProcessHeap(), 0, This);
5474 return ref;
5477 static const struct ID3DXEffectPoolVtbl ID3DXEffectPool_Vtbl =
5479 /*** IUnknown methods ***/
5480 ID3DXEffectPoolImpl_QueryInterface,
5481 ID3DXEffectPoolImpl_AddRef,
5482 ID3DXEffectPoolImpl_Release
5485 HRESULT WINAPI D3DXCreateEffectPool(ID3DXEffectPool **pool)
5487 struct ID3DXEffectPoolImpl *object;
5489 TRACE("(%p)\n", pool);
5491 if (!pool)
5492 return D3DERR_INVALIDCALL;
5494 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
5495 if (!object)
5496 return E_OUTOFMEMORY;
5498 object->ID3DXEffectPool_iface.lpVtbl = &ID3DXEffectPool_Vtbl;
5499 object->ref = 1;
5501 *pool = &object->ID3DXEffectPool_iface;
5503 return S_OK;
5506 HRESULT WINAPI D3DXCreateEffectFromFileExW(struct IDirect3DDevice9 *device, const WCHAR *srcfile,
5507 const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags,
5508 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5510 LPVOID buffer;
5511 HRESULT ret;
5512 DWORD size;
5514 TRACE("(%s): relay\n", debugstr_w(srcfile));
5516 if (!device || !srcfile)
5517 return D3DERR_INVALIDCALL;
5519 ret = map_view_of_file(srcfile, &buffer, &size);
5521 if (FAILED(ret))
5522 return D3DXERR_INVALIDDATA;
5524 ret = D3DXCreateEffectEx(device, buffer, size, defines, include, skipconstants, flags, pool, effect, compilationerrors);
5525 UnmapViewOfFile(buffer);
5527 return ret;
5530 HRESULT WINAPI D3DXCreateEffectFromFileExA(struct IDirect3DDevice9 *device, const char *srcfile,
5531 const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags,
5532 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5534 LPWSTR srcfileW;
5535 HRESULT ret;
5536 DWORD len;
5538 TRACE("(void): relay\n");
5540 if (!srcfile)
5541 return D3DERR_INVALIDCALL;
5543 len = MultiByteToWideChar(CP_ACP, 0, srcfile, -1, NULL, 0);
5544 srcfileW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(*srcfileW));
5545 MultiByteToWideChar(CP_ACP, 0, srcfile, -1, srcfileW, len);
5547 ret = D3DXCreateEffectFromFileExW(device, srcfileW, defines, include, skipconstants, flags, pool, effect, compilationerrors);
5548 HeapFree(GetProcessHeap(), 0, srcfileW);
5550 return ret;
5553 HRESULT WINAPI D3DXCreateEffectFromFileW(struct IDirect3DDevice9 *device, const WCHAR *srcfile,
5554 const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool,
5555 struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5557 TRACE("(void): relay\n");
5558 return D3DXCreateEffectFromFileExW(device, srcfile, defines, include, NULL, flags, pool, effect, compilationerrors);
5561 HRESULT WINAPI D3DXCreateEffectFromFileA(struct IDirect3DDevice9 *device, const char *srcfile,
5562 const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool,
5563 struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5565 TRACE("(void): relay\n");
5566 return D3DXCreateEffectFromFileExA(device, srcfile, defines, include, NULL, flags, pool, effect, compilationerrors);
5569 HRESULT WINAPI D3DXCreateEffectFromResourceExW(struct IDirect3DDevice9 *device, HMODULE srcmodule,
5570 const WCHAR *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants,
5571 DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5573 HRSRC resinfo;
5575 TRACE("(%p, %s): relay\n", srcmodule, debugstr_w(srcresource));
5577 if (!device)
5578 return D3DERR_INVALIDCALL;
5580 resinfo = FindResourceW(srcmodule, srcresource, (LPCWSTR) RT_RCDATA);
5582 if (resinfo)
5584 LPVOID buffer;
5585 HRESULT ret;
5586 DWORD size;
5588 ret = load_resource_into_memory(srcmodule, resinfo, &buffer, &size);
5590 if (FAILED(ret))
5591 return D3DXERR_INVALIDDATA;
5593 return D3DXCreateEffectEx(device, buffer, size, defines, include, skipconstants, flags, pool, effect, compilationerrors);
5596 return D3DXERR_INVALIDDATA;
5599 HRESULT WINAPI D3DXCreateEffectFromResourceExA(struct IDirect3DDevice9 *device, HMODULE srcmodule,
5600 const char *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants,
5601 DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5603 HRSRC resinfo;
5605 TRACE("(%p, %s): relay\n", srcmodule, debugstr_a(srcresource));
5607 if (!device)
5608 return D3DERR_INVALIDCALL;
5610 resinfo = FindResourceA(srcmodule, srcresource, (LPCSTR) RT_RCDATA);
5612 if (resinfo)
5614 LPVOID buffer;
5615 HRESULT ret;
5616 DWORD size;
5618 ret = load_resource_into_memory(srcmodule, resinfo, &buffer, &size);
5620 if (FAILED(ret))
5621 return D3DXERR_INVALIDDATA;
5623 return D3DXCreateEffectEx(device, buffer, size, defines, include, skipconstants, flags, pool, effect, compilationerrors);
5626 return D3DXERR_INVALIDDATA;
5629 HRESULT WINAPI D3DXCreateEffectFromResourceW(struct IDirect3DDevice9 *device, HMODULE srcmodule,
5630 const WCHAR *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags,
5631 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5633 TRACE("(void): relay\n");
5634 return D3DXCreateEffectFromResourceExW(device, srcmodule, srcresource, defines, include, NULL, flags, pool, effect, compilationerrors);
5637 HRESULT WINAPI D3DXCreateEffectFromResourceA(struct IDirect3DDevice9 *device, HMODULE srcmodule,
5638 const char *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags,
5639 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilationerrors)
5641 TRACE("(void): relay\n");
5642 return D3DXCreateEffectFromResourceExA(device, srcmodule, srcresource, defines, include, NULL, flags, pool, effect, compilationerrors);
5645 HRESULT WINAPI D3DXCreateEffectCompilerFromFileW(const WCHAR *srcfile, const D3DXMACRO *defines,
5646 ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **effectcompiler, ID3DXBuffer **parseerrors)
5648 LPVOID buffer;
5649 HRESULT ret;
5650 DWORD size;
5652 TRACE("(%s): relay\n", debugstr_w(srcfile));
5654 if (!srcfile)
5655 return D3DERR_INVALIDCALL;
5657 ret = map_view_of_file(srcfile, &buffer, &size);
5659 if (FAILED(ret))
5660 return D3DXERR_INVALIDDATA;
5662 ret = D3DXCreateEffectCompiler(buffer, size, defines, include, flags, effectcompiler, parseerrors);
5663 UnmapViewOfFile(buffer);
5665 return ret;
5668 HRESULT WINAPI D3DXCreateEffectCompilerFromFileA(const char *srcfile, const D3DXMACRO *defines,
5669 ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **effectcompiler, ID3DXBuffer **parseerrors)
5671 LPWSTR srcfileW;
5672 HRESULT ret;
5673 DWORD len;
5675 TRACE("(void): relay\n");
5677 if (!srcfile)
5678 return D3DERR_INVALIDCALL;
5680 len = MultiByteToWideChar(CP_ACP, 0, srcfile, -1, NULL, 0);
5681 srcfileW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(*srcfileW));
5682 MultiByteToWideChar(CP_ACP, 0, srcfile, -1, srcfileW, len);
5684 ret = D3DXCreateEffectCompilerFromFileW(srcfileW, defines, include, flags, effectcompiler, parseerrors);
5685 HeapFree(GetProcessHeap(), 0, srcfileW);
5687 return ret;
5690 HRESULT WINAPI D3DXCreateEffectCompilerFromResourceA(HMODULE srcmodule, const char *srcresource,
5691 const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags,
5692 ID3DXEffectCompiler **effectcompiler, ID3DXBuffer **parseerrors)
5694 HRSRC resinfo;
5696 TRACE("(%p, %s): relay\n", srcmodule, debugstr_a(srcresource));
5698 resinfo = FindResourceA(srcmodule, srcresource, (LPCSTR) RT_RCDATA);
5700 if (resinfo)
5702 LPVOID buffer;
5703 HRESULT ret;
5704 DWORD size;
5706 ret = load_resource_into_memory(srcmodule, resinfo, &buffer, &size);
5708 if (FAILED(ret))
5709 return D3DXERR_INVALIDDATA;
5711 return D3DXCreateEffectCompiler(buffer, size, defines, include, flags, effectcompiler, parseerrors);
5714 return D3DXERR_INVALIDDATA;
5717 HRESULT WINAPI D3DXCreateEffectCompilerFromResourceW(HMODULE srcmodule, const WCHAR *srcresource,
5718 const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags,
5719 ID3DXEffectCompiler **effectcompiler, ID3DXBuffer **parseerrors)
5721 HRSRC resinfo;
5723 TRACE("(%p, %s): relay\n", srcmodule, debugstr_w(srcresource));
5725 resinfo = FindResourceW(srcmodule, srcresource, (LPCWSTR) RT_RCDATA);
5727 if (resinfo)
5729 LPVOID buffer;
5730 HRESULT ret;
5731 DWORD size;
5733 ret = load_resource_into_memory(srcmodule, resinfo, &buffer, &size);
5735 if (FAILED(ret))
5736 return D3DXERR_INVALIDDATA;
5738 return D3DXCreateEffectCompiler(buffer, size, defines, include, flags, effectcompiler, parseerrors);
5741 return D3DXERR_INVALIDDATA;
5744 HRESULT WINAPI D3DXDisassembleEffect(ID3DXEffect *effect, BOOL enable_color_code, ID3DXBuffer **disassembly)
5746 FIXME("(%p, %u, %p): stub\n", effect, enable_color_code, disassembly);
5748 return D3DXERR_INVALIDDATA;