ReactOS 0.4.17-dev-970-gcf0f1a6
effect.c
Go to the documentation of this file.
1/*
2 * Copyright 2010 Christian Costa
3 * Copyright 2011 Rico Schüller
4 *
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.
9 *
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.
14 *
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
18 */
19
20#include <stdbool.h>
21#include <stdio.h>
22#include <assert.h>
23
24#include "d3dx9_private.h"
25#include "d3dcompiler.h"
26#include "winternl.h"
27#include "wine/list.h"
28
29/* Constants for special INT/FLOAT conversation */
30#define INT_FLOAT_MULTI 255.0f
31#define INT_FLOAT_MULTI_INVERSE (1/INT_FLOAT_MULTI)
32
33static const char parameter_magic_string[4] = {'@', '!', '#', '\xFF'};
34static const char parameter_block_magic_string[4] = {'@', '!', '#', '\xFE'};
35
36#define PARAMETER_FLAG_SHARED 1
37
38#define INITIAL_POOL_SIZE 16
39#define INITIAL_PARAM_BLOCK_SIZE 1024
40
42
44{
60};
61
63{
69};
70
72{
86};
87
89{
96};
97
99{
104};
105
107{
108 unsigned int size;
109 void *data;
112};
113
115{
116 unsigned int operation;
117 unsigned int index;
121};
122
124{
127};
128
130{
131 char *name;
132 unsigned int state_count;
133 unsigned int annotation_count;
134
137
139};
140
142{
143 char *name;
144 unsigned int pass_count;
145 unsigned int annotation_count;
146
149
150 struct IDirect3DStateBlock9 *saved_state;
151};
152
154{
157 struct list entry;
158 size_t size;
159 size_t offset;
161};
162
164{
166 unsigned int bytes;
167};
168
170{
171 ID3DXEffect ID3DXEffect_iface;
173
174 unsigned int technique_count;
175 unsigned int object_count;
179
181
182 struct ID3DXEffectStateManager *manager;
190
192 unsigned int light_updated;
195
198
199 char *source;
202};
203
204#define INITIAL_SHARED_DATA_SIZE 4
205
207{
208 ID3DXEffectPool ID3DXEffectPool_iface;
210
212 unsigned int size;
213
215};
216
218{
219 ID3DXEffectCompiler ID3DXEffectCompiler_iface;
221};
222
224 struct IDirect3DDevice9 *device, const char *data, SIZE_T data_size,
225 unsigned int flags, struct ID3DXEffectPool *pool, const char *skip_constants_string);
226static HRESULT d3dx_parse_state(struct d3dx_effect *effect, struct d3dx_state *state,
227 const char *data, const char **ptr, struct d3dx_object *objects);
229
231
232static const struct
233{
234 enum STATE_CLASS class;
236 const char *name;
237}
238state_table[] =
239{
240 /* Render states */
241 {SC_RENDERSTATE, D3DRS_ZENABLE, "D3DRS_ZENABLE"}, /* 0x0 */
242 {SC_RENDERSTATE, D3DRS_FILLMODE, "D3DRS_FILLMODE"},
243 {SC_RENDERSTATE, D3DRS_SHADEMODE, "D3DRS_SHADEMODE"},
244 {SC_RENDERSTATE, D3DRS_ZWRITEENABLE, "D3DRS_ZWRITEENABLE"},
245 {SC_RENDERSTATE, D3DRS_ALPHATESTENABLE, "D3DRS_ALPHATESTENABLE"},
246 {SC_RENDERSTATE, D3DRS_LASTPIXEL, "D3DRS_LASTPIXEL"},
247 {SC_RENDERSTATE, D3DRS_SRCBLEND, "D3DRS_SRCBLEND"},
248 {SC_RENDERSTATE, D3DRS_DESTBLEND, "D3DRS_DESTBLEND"},
249 {SC_RENDERSTATE, D3DRS_CULLMODE, "D3DRS_CULLMODE"},
250 {SC_RENDERSTATE, D3DRS_ZFUNC, "D3DRS_ZFUNC"},
251 {SC_RENDERSTATE, D3DRS_ALPHAREF, "D3DRS_ALPHAREF"},
252 {SC_RENDERSTATE, D3DRS_ALPHAFUNC, "D3DRS_ALPHAFUNC"},
253 {SC_RENDERSTATE, D3DRS_DITHERENABLE, "D3DRS_DITHERENABLE"},
254 {SC_RENDERSTATE, D3DRS_ALPHABLENDENABLE, "D3DRS_ALPHABLENDENABLE"},
255 {SC_RENDERSTATE, D3DRS_FOGENABLE, "D3DRS_FOGENABLE"},
256 {SC_RENDERSTATE, D3DRS_SPECULARENABLE, "D3DRS_SPECULARENABLE"},
257 {SC_RENDERSTATE, D3DRS_FOGCOLOR, "D3DRS_FOGCOLOR"}, /* 0x10 */
258 {SC_RENDERSTATE, D3DRS_FOGTABLEMODE, "D3DRS_FOGTABLEMODE"},
259 {SC_RENDERSTATE, D3DRS_FOGSTART, "D3DRS_FOGSTART"},
260 {SC_RENDERSTATE, D3DRS_FOGEND, "D3DRS_FOGEND"},
261 {SC_RENDERSTATE, D3DRS_FOGDENSITY, "D3DRS_FOGDENSITY"},
262 {SC_RENDERSTATE, D3DRS_RANGEFOGENABLE, "D3DRS_RANGEFOGENABLE"},
263 {SC_RENDERSTATE, D3DRS_STENCILENABLE, "D3DRS_STENCILENABLE"},
264 {SC_RENDERSTATE, D3DRS_STENCILFAIL, "D3DRS_STENCILFAIL"},
265 {SC_RENDERSTATE, D3DRS_STENCILZFAIL, "D3DRS_STENCILZFAIL"},
266 {SC_RENDERSTATE, D3DRS_STENCILPASS, "D3DRS_STENCILPASS"},
267 {SC_RENDERSTATE, D3DRS_STENCILFUNC, "D3DRS_STENCILFUNC"},
268 {SC_RENDERSTATE, D3DRS_STENCILREF, "D3DRS_STENCILREF"},
269 {SC_RENDERSTATE, D3DRS_STENCILMASK, "D3DRS_STENCILMASK"},
270 {SC_RENDERSTATE, D3DRS_STENCILWRITEMASK, "D3DRS_STENCILWRITEMASK"},
271 {SC_RENDERSTATE, D3DRS_TEXTUREFACTOR, "D3DRS_TEXTUREFACTOR"},
272 {SC_RENDERSTATE, D3DRS_WRAP0, "D3DRS_WRAP0"},
273 {SC_RENDERSTATE, D3DRS_WRAP1, "D3DRS_WRAP1"}, /* 0x20 */
274 {SC_RENDERSTATE, D3DRS_WRAP2, "D3DRS_WRAP2"},
275 {SC_RENDERSTATE, D3DRS_WRAP3, "D3DRS_WRAP3"},
276 {SC_RENDERSTATE, D3DRS_WRAP4, "D3DRS_WRAP4"},
277 {SC_RENDERSTATE, D3DRS_WRAP5, "D3DRS_WRAP5"},
278 {SC_RENDERSTATE, D3DRS_WRAP6, "D3DRS_WRAP6"},
279 {SC_RENDERSTATE, D3DRS_WRAP7, "D3DRS_WRAP7"},
280 {SC_RENDERSTATE, D3DRS_WRAP8, "D3DRS_WRAP8"},
281 {SC_RENDERSTATE, D3DRS_WRAP9, "D3DRS_WRAP9"},
282 {SC_RENDERSTATE, D3DRS_WRAP10, "D3DRS_WRAP10"},
283 {SC_RENDERSTATE, D3DRS_WRAP11, "D3DRS_WRAP11"},
284 {SC_RENDERSTATE, D3DRS_WRAP12, "D3DRS_WRAP12"},
285 {SC_RENDERSTATE, D3DRS_WRAP13, "D3DRS_WRAP13"},
286 {SC_RENDERSTATE, D3DRS_WRAP14, "D3DRS_WRAP14"},
287 {SC_RENDERSTATE, D3DRS_WRAP15, "D3DRS_WRAP15"},
288 {SC_RENDERSTATE, D3DRS_CLIPPING, "D3DRS_CLIPPING"},
289 {SC_RENDERSTATE, D3DRS_LIGHTING, "D3DRS_LIGHTING"}, /* 0x30 */
290 {SC_RENDERSTATE, D3DRS_AMBIENT, "D3DRS_AMBIENT"},
291 {SC_RENDERSTATE, D3DRS_FOGVERTEXMODE, "D3DRS_FOGVERTEXMODE"},
292 {SC_RENDERSTATE, D3DRS_COLORVERTEX, "D3DRS_COLORVERTEX"},
293 {SC_RENDERSTATE, D3DRS_LOCALVIEWER, "D3DRS_LOCALVIEWER"},
294 {SC_RENDERSTATE, D3DRS_NORMALIZENORMALS, "D3DRS_NORMALIZENORMALS"},
295 {SC_RENDERSTATE, D3DRS_DIFFUSEMATERIALSOURCE, "D3DRS_DIFFUSEMATERIALSOURCE"},
296 {SC_RENDERSTATE, D3DRS_SPECULARMATERIALSOURCE, "D3DRS_SPECULARMATERIALSOURCE"},
297 {SC_RENDERSTATE, D3DRS_AMBIENTMATERIALSOURCE, "D3DRS_AMBIENTMATERIALSOURCE"},
298 {SC_RENDERSTATE, D3DRS_EMISSIVEMATERIALSOURCE, "D3DRS_EMISSIVEMATERIALSOURCE"},
299 {SC_RENDERSTATE, D3DRS_VERTEXBLEND, "D3DRS_VERTEXBLEND"},
300 {SC_RENDERSTATE, D3DRS_CLIPPLANEENABLE, "D3DRS_CLIPPLANEENABLE"},
301 {SC_RENDERSTATE, D3DRS_POINTSIZE, "D3DRS_POINTSIZE"},
302 {SC_RENDERSTATE, D3DRS_POINTSIZE_MIN, "D3DRS_POINTSIZE_MIN"},
303 {SC_RENDERSTATE, D3DRS_POINTSIZE_MAX, "D3DRS_POINTSIZE_MAX"},
304 {SC_RENDERSTATE, D3DRS_POINTSPRITEENABLE, "D3DRS_POINTSPRITEENABLE"},
305 {SC_RENDERSTATE, D3DRS_POINTSCALEENABLE, "D3DRS_POINTSCALEENABLE"}, /* 0x40 */
306 {SC_RENDERSTATE, D3DRS_POINTSCALE_A, "D3DRS_POINTSCALE_A"},
307 {SC_RENDERSTATE, D3DRS_POINTSCALE_B, "D3DRS_POINTSCALE_B"},
308 {SC_RENDERSTATE, D3DRS_POINTSCALE_C, "D3DRS_POINTSCALE_C"},
309 {SC_RENDERSTATE, D3DRS_MULTISAMPLEANTIALIAS, "D3DRS_MULTISAMPLEANTIALIAS"},
310 {SC_RENDERSTATE, D3DRS_MULTISAMPLEMASK, "D3DRS_MULTISAMPLEMASK"},
311 {SC_RENDERSTATE, D3DRS_PATCHEDGESTYLE, "D3DRS_PATCHEDGESTYLE"},
312 {SC_RENDERSTATE, D3DRS_DEBUGMONITORTOKEN, "D3DRS_DEBUGMONITORTOKEN"},
313 {SC_RENDERSTATE, D3DRS_INDEXEDVERTEXBLENDENABLE, "D3DRS_INDEXEDVERTEXBLENDENABLE"},
314 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE, "D3DRS_COLORWRITEENABLE"},
315 {SC_RENDERSTATE, D3DRS_TWEENFACTOR, "D3DRS_TWEENFACTOR"},
316 {SC_RENDERSTATE, D3DRS_BLENDOP, "D3DRS_BLENDOP"},
317 {SC_RENDERSTATE, D3DRS_POSITIONDEGREE, "D3DRS_POSITIONDEGREE"},
318 {SC_RENDERSTATE, D3DRS_NORMALDEGREE, "D3DRS_NORMALDEGREE"},
319 {SC_RENDERSTATE, D3DRS_SCISSORTESTENABLE, "D3DRS_SCISSORTESTENABLE"},
320 {SC_RENDERSTATE, D3DRS_SLOPESCALEDEPTHBIAS, "D3DRS_SLOPESCALEDEPTHBIAS"},
321 {SC_RENDERSTATE, D3DRS_ANTIALIASEDLINEENABLE, "D3DRS_ANTIALIASEDLINEENABLE"}, /* 0x50 */
322 {SC_RENDERSTATE, D3DRS_MINTESSELLATIONLEVEL, "D3DRS_MINTESSELLATIONLEVEL"},
323 {SC_RENDERSTATE, D3DRS_MAXTESSELLATIONLEVEL, "D3DRS_MAXTESSELLATIONLEVEL"},
324 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_X, "D3DRS_ADAPTIVETESS_X"},
325 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_Y, "D3DRS_ADAPTIVETESS_Y"},
326 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_Z, "D3DRS_ADAPTIVETESS_Z"},
327 {SC_RENDERSTATE, D3DRS_ADAPTIVETESS_W, "D3DRS_ADAPTIVETESS_W"},
328 {SC_RENDERSTATE, D3DRS_ENABLEADAPTIVETESSELLATION, "D3DRS_ENABLEADAPTIVETESSELLATION"},
329 {SC_RENDERSTATE, D3DRS_TWOSIDEDSTENCILMODE, "D3DRS_TWOSIDEDSTENCILMODE"},
330 {SC_RENDERSTATE, D3DRS_CCW_STENCILFAIL, "D3DRS_CCW_STENCILFAIL"},
331 {SC_RENDERSTATE, D3DRS_CCW_STENCILZFAIL, "D3DRS_CCW_STENCILZFAIL"},
332 {SC_RENDERSTATE, D3DRS_CCW_STENCILPASS, "D3DRS_CCW_STENCILPASS"},
333 {SC_RENDERSTATE, D3DRS_CCW_STENCILFUNC, "D3DRS_CCW_STENCILFUNC"},
334 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE1, "D3DRS_COLORWRITEENABLE1"},
335 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE2, "D3DRS_COLORWRITEENABLE2"},
336 {SC_RENDERSTATE, D3DRS_COLORWRITEENABLE3, "D3DRS_COLORWRITEENABLE3"},
337 {SC_RENDERSTATE, D3DRS_BLENDFACTOR, "D3DRS_BLENDFACTOR"}, /* 0x60 */
338 {SC_RENDERSTATE, D3DRS_SRGBWRITEENABLE, "D3DRS_SRGBWRITEENABLE"},
339 {SC_RENDERSTATE, D3DRS_DEPTHBIAS, "D3DRS_DEPTHBIAS"},
340 {SC_RENDERSTATE, D3DRS_SEPARATEALPHABLENDENABLE, "D3DRS_SEPARATEALPHABLENDENABLE"},
341 {SC_RENDERSTATE, D3DRS_SRCBLENDALPHA, "D3DRS_SRCBLENDALPHA"},
342 {SC_RENDERSTATE, D3DRS_DESTBLENDALPHA, "D3DRS_DESTBLENDALPHA"},
343 {SC_RENDERSTATE, D3DRS_BLENDOPALPHA, "D3DRS_BLENDOPALPHA"},
344 /* Texture stages */
345 {SC_TEXTURESTAGE, D3DTSS_COLOROP, "D3DTSS_COLOROP"},
346 {SC_TEXTURESTAGE, D3DTSS_COLORARG0, "D3DTSS_COLORARG0"},
347 {SC_TEXTURESTAGE, D3DTSS_COLORARG1, "D3DTSS_COLORARG1"},
348 {SC_TEXTURESTAGE, D3DTSS_COLORARG2, "D3DTSS_COLORARG2"},
349 {SC_TEXTURESTAGE, D3DTSS_ALPHAOP, "D3DTSS_ALPHAOP"},
350 {SC_TEXTURESTAGE, D3DTSS_ALPHAARG0, "D3DTSS_ALPHAARG0"},
351 {SC_TEXTURESTAGE, D3DTSS_ALPHAARG1, "D3DTSS_ALPHAARG1"},
352 {SC_TEXTURESTAGE, D3DTSS_ALPHAARG2, "D3DTSS_ALPHAARG2"},
353 {SC_TEXTURESTAGE, D3DTSS_RESULTARG, "D3DTSS_RESULTARG"},
354 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT00, "D3DTSS_BUMPENVMAT00"}, /* 0x70 */
355 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT01, "D3DTSS_BUMPENVMAT01"},
356 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT10, "D3DTSS_BUMPENVMAT10"},
357 {SC_TEXTURESTAGE, D3DTSS_BUMPENVMAT11, "D3DTSS_BUMPENVMAT11"},
358 {SC_TEXTURESTAGE, D3DTSS_TEXCOORDINDEX, "D3DTSS_TEXCOORDINDEX"},
359 {SC_TEXTURESTAGE, D3DTSS_BUMPENVLSCALE, "D3DTSS_BUMPENVLSCALE"},
360 {SC_TEXTURESTAGE, D3DTSS_BUMPENVLOFFSET, "D3DTSS_BUMPENVLOFFSET"},
361 {SC_TEXTURESTAGE, D3DTSS_TEXTURETRANSFORMFLAGS, "D3DTSS_TEXTURETRANSFORMFLAGS"},
362 {SC_TEXTURESTAGE, D3DTSS_CONSTANT, "D3DTSS_CONSTANT"},
363 /* NPatchMode */
364 {SC_NPATCHMODE, 0, "NPatchMode"},
365 /* FVF */
366 {SC_FVF, 0, "FVF"},
367 /* Transform */
368 {SC_TRANSFORM, D3DTS_PROJECTION, "D3DTS_PROJECTION"},
369 {SC_TRANSFORM, D3DTS_VIEW, "D3DTS_VIEW"},
370 {SC_TRANSFORM, D3DTS_WORLD, "D3DTS_WORLD"},
371 {SC_TRANSFORM, D3DTS_TEXTURE0, "D3DTS_TEXTURE0"},
372 /* Material */
373 {SC_MATERIAL, MT_DIFFUSE, "MaterialDiffuse"},
374 {SC_MATERIAL, MT_AMBIENT, "MaterialAmbient"}, /* 0x80 */
375 {SC_MATERIAL, MT_SPECULAR, "MaterialSpecular"},
376 {SC_MATERIAL, MT_EMISSIVE, "MaterialEmissive"},
377 {SC_MATERIAL, MT_POWER, "MaterialPower"},
378 /* Light */
379 {SC_LIGHT, LT_TYPE, "LightType"},
380 {SC_LIGHT, LT_DIFFUSE, "LightDiffuse"},
381 {SC_LIGHT, LT_SPECULAR, "LightSpecular"},
382 {SC_LIGHT, LT_AMBIENT, "LightAmbient"},
383 {SC_LIGHT, LT_POSITION, "LightPosition"},
384 {SC_LIGHT, LT_DIRECTION, "LightDirection"},
385 {SC_LIGHT, LT_RANGE, "LightRange"},
386 {SC_LIGHT, LT_FALLOFF, "LightFallOff"},
387 {SC_LIGHT, LT_ATTENUATION0, "LightAttenuation0"},
388 {SC_LIGHT, LT_ATTENUATION1, "LightAttenuation1"},
389 {SC_LIGHT, LT_ATTENUATION2, "LightAttenuation2"},
390 {SC_LIGHT, LT_THETA, "LightTheta"},
391 {SC_LIGHT, LT_PHI, "LightPhi"}, /* 0x90 */
392 /* Lightenable */
393 {SC_LIGHTENABLE, 0, "LightEnable"},
394 /* Vertexshader */
395 {SC_VERTEXSHADER, 0, "Vertexshader"},
396 /* Pixelshader */
397 {SC_PIXELSHADER, 0, "Pixelshader"},
398 /* Shader constants */
399 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstantF"},
400 {SC_SHADERCONST, SCT_VSBOOL, "VertexShaderConstantB"},
401 {SC_SHADERCONST, SCT_VSINT, "VertexShaderConstantI"},
402 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant"},
403 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant1"},
404 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant2"},
405 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant3"},
406 {SC_SHADERCONST, SCT_VSFLOAT, "VertexShaderConstant4"},
407 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstantF"},
408 {SC_SHADERCONST, SCT_PSBOOL, "PixelShaderConstantB"},
409 {SC_SHADERCONST, SCT_PSINT, "PixelShaderConstantI"},
410 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant"},
411 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant1"}, /* 0xa0 */
412 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant2"},
413 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant3"},
414 {SC_SHADERCONST, SCT_PSFLOAT, "PixelShaderConstant4"},
415 /* Texture */
416 {SC_TEXTURE, 0, "Texture"},
417 /* Sampler states */
418 {SC_SAMPLERSTATE, D3DSAMP_ADDRESSU, "AddressU"},
419 {SC_SAMPLERSTATE, D3DSAMP_ADDRESSV, "AddressV"},
420 {SC_SAMPLERSTATE, D3DSAMP_ADDRESSW, "AddressW"},
421 {SC_SAMPLERSTATE, D3DSAMP_BORDERCOLOR, "BorderColor"},
422 {SC_SAMPLERSTATE, D3DSAMP_MAGFILTER, "MagFilter"},
423 {SC_SAMPLERSTATE, D3DSAMP_MINFILTER, "MinFilter"},
424 {SC_SAMPLERSTATE, D3DSAMP_MIPFILTER, "MipFilter"},
425 {SC_SAMPLERSTATE, D3DSAMP_MIPMAPLODBIAS, "MipMapLodBias"},
426 {SC_SAMPLERSTATE, D3DSAMP_MAXMIPLEVEL, "MaxMipLevel"},
427 {SC_SAMPLERSTATE, D3DSAMP_MAXANISOTROPY, "MaxAnisotropy"},
428 {SC_SAMPLERSTATE, D3DSAMP_SRGBTEXTURE, "SRGBTexture"},
429 {SC_SAMPLERSTATE, D3DSAMP_ELEMENTINDEX, "ElementIndex"}, /* 0xb0 */
430 {SC_SAMPLERSTATE, D3DSAMP_DMAPOFFSET, "DMAPOffset"},
431 /* Set sampler */
432 {SC_SETSAMPLER, 0, "Sampler"},
434
435static inline uint32_t read_u32(const char **ptr)
436{
437 uint32_t u;
438
439 memcpy(&u, *ptr, sizeof(u));
440 *ptr += sizeof(u);
441 return u;
442}
443
444static inline D3DXHANDLE get_parameter_handle(struct d3dx_parameter *parameter)
445{
446 return (D3DXHANDLE)parameter;
447}
448
449static inline D3DXHANDLE get_technique_handle(struct d3dx_technique *technique)
450{
451 return (D3DXHANDLE)technique;
452}
453
455{
456 return (D3DXHANDLE)pass;
457}
458
459static struct d3dx_technique *get_technique_by_name(struct d3dx_effect *effect, const char *name)
460{
461 unsigned int i;
462
463 if (!name) return NULL;
464
465 for (i = 0; i < effect->technique_count; ++i)
466 {
467 if (!strcmp(effect->techniques[i].name, name))
468 return &effect->techniques[i];
469 }
470
471 return NULL;
472}
473
474static struct d3dx_technique *get_valid_technique(struct d3dx_effect *effect, D3DXHANDLE technique)
475{
476 unsigned int i;
477
478 for (i = 0; i < effect->technique_count; ++i)
479 {
480 if (get_technique_handle(&effect->techniques[i]) == technique)
481 return &effect->techniques[i];
482 }
483
484 return get_technique_by_name(effect, technique);
485}
486
487static struct d3dx_pass *get_valid_pass(struct d3dx_effect *effect, D3DXHANDLE pass)
488{
489 unsigned int i, k;
490
491 for (i = 0; i < effect->technique_count; ++i)
492 {
493 struct d3dx_technique *technique = &effect->techniques[i];
494
495 for (k = 0; k < technique->pass_count; ++k)
496 {
497 if (get_pass_handle(&technique->passes[k]) == pass)
498 return &technique->passes[k];
499 }
500 }
501
502 return NULL;
503}
504
505static struct d3dx_parameter *get_valid_parameter(struct d3dx_effect *effect, D3DXHANDLE parameter)
506{
507 struct d3dx_parameter *handle_param = (struct d3dx_parameter *)parameter;
508
509 if (handle_param && !strncmp(handle_param->magic_string, parameter_magic_string,
510 sizeof(parameter_magic_string)))
511 return handle_param;
512
513 return effect->flags & D3DXFX_LARGEADDRESSAWARE ? NULL : get_parameter_by_name(&effect->params, NULL, parameter);
514}
515
517{
519
520 return block && !strncmp(block->magic_string, parameter_block_magic_string,
522}
523
524static void free_state(struct d3dx_state *state)
525{
526 free_parameter(&state->parameter, FALSE, FALSE);
527}
528
529static void free_object(struct d3dx_object *object)
530{
531 free(object->data);
532}
533
535{
536 UINT i;
537
538 for (i = 0; i < sampler->state_count; ++i)
539 {
540 free_state(&sampler->states[i]);
541 }
542 free(sampler->states);
543}
544
546
547static void free_parameter_object_data(struct d3dx_parameter *param, const void *data, unsigned int bytes)
548{
549 unsigned int i, count;
550
551 if (param->class != D3DXPC_OBJECT)
552 return;
553
554 count = min(param->element_count ? param->element_count : 1, bytes / sizeof(void *));
555
556 for (i = 0; i < count; ++i)
557 {
558 switch (param->type)
559 {
560 case D3DXPT_STRING:
561 free(((char **)data)[i]);
562 break;
563
564 case D3DXPT_TEXTURE:
565 case D3DXPT_TEXTURE1D:
566 case D3DXPT_TEXTURE2D:
567 case D3DXPT_TEXTURE3D:
571 if (*(IUnknown **)data)
572 IUnknown_Release(((IUnknown **)data)[i]);
573 break;
574
575 case D3DXPT_SAMPLER:
576 case D3DXPT_SAMPLER1D:
577 case D3DXPT_SAMPLER2D:
578 case D3DXPT_SAMPLER3D:
580 assert(count == 1);
581 free_sampler((struct d3dx_sampler *)data);
582 return;
583
584 default:
585 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
586 break;
587 }
588 }
589}
590
592{
593 if (!param->data)
594 return;
595
596 if (!param->element_count)
598
599 if (!child || is_param_type_sampler(param->type))
600 free(param->data);
601}
602
604{
605 unsigned int i;
606
607 TRACE("Free parameter %p, name %s, type %s, element %#x, child %#x.\n", param, param->name,
609
610 if (param->param_eval)
611 d3dx_free_param_eval(param->param_eval);
612
613 if (param->members)
614 {
615 unsigned int count = param->element_count ? param->element_count : param->member_count;
616
617 for (i = 0; i < count; ++i)
618 free_parameter(&param->members[i], param->element_count != 0, TRUE);
619 free(param->members);
620 }
621
622 free(param->full_name);
624
625 /* only the parent has to release name and semantic */
626 if (!element)
627 {
628 free(param->name);
629 free(param->semantic);
630 }
631}
632
634{
635 if (param->annotations)
636 {
637 unsigned int i;
638
639 for (i = 0; i < param->annotation_count; ++i)
640 free_parameter(&param->annotations[i], FALSE, FALSE);
641 free(param->annotations);
642 }
644 free_parameter(&param->param, FALSE, FALSE);
645}
646
647static void free_pass(struct d3dx_pass *pass)
648{
649 unsigned int i;
650
651 TRACE("Free pass %p\n", pass);
652
653 if (!pass)
654 return;
655
656 if (pass->annotations)
657 {
658 for (i = 0; i < pass->annotation_count; ++i)
659 free_parameter(&pass->annotations[i], FALSE, FALSE);
660 free(pass->annotations);
661 pass->annotations = NULL;
662 }
663
664 if (pass->states)
665 {
666 for (i = 0; i < pass->state_count; ++i)
667 free_state(&pass->states[i]);
668 free(pass->states);
669 pass->states = NULL;
670 }
671
672 free(pass->name);
673 pass->name = NULL;
674}
675
676static void free_technique(struct d3dx_technique *technique)
677{
678 unsigned int i;
679
680 TRACE("Free technique %p\n", technique);
681
682 if (!technique)
683 return;
684
685 if (technique->saved_state)
686 {
688 technique->saved_state = NULL;
689 }
690
691 if (technique->annotations)
692 {
693 for (i = 0; i < technique->annotation_count; ++i)
694 free_parameter(&technique->annotations[i], FALSE, FALSE);
695 free(technique->annotations);
696 technique->annotations = NULL;
697 }
698
699 if (technique->passes)
700 {
701 for (i = 0; i < technique->pass_count; ++i)
702 free_pass(&technique->passes[i]);
703 free(technique->passes);
704 technique->passes = NULL;
705 }
706
707 free(technique->name);
708 technique->name = NULL;
709}
710
712{
713 return sizeof(*record) + record->bytes;
714}
715
717{
719
720 if (!block)
721 return;
722
723 record = (struct d3dx_recorded_parameter *)block->buffer;
724 while ((BYTE *)record < block->buffer + block->offset)
725 {
726 free_parameter_object_data(record->param, record + 1, record->bytes);
728 }
729 assert((BYTE *)record == block->buffer + block->offset);
730
731 free(block->buffer);
732 free(block);
733}
734
735static int param_rb_compare(const void *key, const struct wine_rb_entry *entry)
736{
737 const char *name = key;
739
740 return strcmp(name, param->full_name);
741}
742
744{
745 store->count = count;
747
748 if (store->count && !(store->parameters = calloc(store->count, sizeof(*store->parameters))))
749 return E_OUTOFMEMORY;
750
751 return S_OK;
752}
753
755{
756 unsigned int i;
757
758 free(store->full_name_tmp);
759
760 if (store->parameters)
761 {
762 for (i = 0; i < store->count; ++i)
764 free(store->parameters);
765 store->parameters = NULL;
766 }
767}
768
769static void d3dx_effect_cleanup(struct d3dx_effect *effect)
770{
772 ID3DXEffectPool *pool;
773 unsigned int i;
774
775 TRACE("effect %p.\n", effect);
776
777 free_parameter_block(effect->current_parameter_block);
778 LIST_FOR_EACH_ENTRY_SAFE(block, cursor, &effect->parameter_block_list, struct d3dx_parameter_block, entry)
779 {
780 list_remove(&block->entry);
782 }
783
785
786 if (effect->techniques)
787 {
788 for (i = 0; i < effect->technique_count; ++i)
789 free_technique(&effect->techniques[i]);
790 free(effect->techniques);
791 }
792
793 if (effect->objects)
794 {
795 for (i = 0; i < effect->object_count; ++i)
796 free_object(&effect->objects[i]);
797 free(effect->objects);
798 }
799
800 if (effect->pool)
801 {
802 pool = &effect->pool->ID3DXEffectPool_iface;
803 pool->lpVtbl->Release(pool);
804 }
805
806 if (effect->manager)
807 IUnknown_Release(effect->manager);
808
810 free(effect);
811}
812
814{
815 UINT i;
816
817 for (i = 0; i < 4; ++i)
818 {
819 if (i < param->columns)
820 set_number((FLOAT *)vector + i, D3DXPT_FLOAT, (DWORD *)param->data + i, param->type);
821 else
822 ((FLOAT *)vector)[i] = 0.0f;
823 }
824}
825
826static void set_vector(struct d3dx_parameter *param, const D3DXVECTOR4 *vector, void *dst_data)
827{
828 UINT i;
829
830 for (i = 0; i < param->columns; ++i)
831 set_number((FLOAT *)dst_data + i, param->type, (FLOAT *)vector + i, D3DXPT_FLOAT);
832}
833
835{
836 UINT i, k;
837
838 for (i = 0; i < 4; ++i)
839 {
840 for (k = 0; k < 4; ++k)
841 {
842 FLOAT *tmp = transpose ? (FLOAT *)&matrix->m[k][i] : (FLOAT *)&matrix->m[i][k];
843
844 if ((i < param->rows) && (k < param->columns))
845 set_number(tmp, D3DXPT_FLOAT, (DWORD *)param->data + i * param->columns + k, param->type);
846 else
847 *tmp = 0.0f;
848 }
849 }
850}
851
852static void set_matrix(struct d3dx_parameter *param, const D3DXMATRIX *matrix, void *dst_data)
853{
854 UINT i, k;
855
856 if (param->type == D3DXPT_FLOAT)
857 {
858 if (param->columns == 4)
859 {
860 memcpy(dst_data, matrix->m, param->rows * 4 * sizeof(float));
861 }
862 else
863 {
864 for (i = 0; i < param->rows; ++i)
865 memcpy((float *)dst_data + i * param->columns, matrix->m + i, param->columns * sizeof(float));
866 }
867 return;
868 }
869
870 for (i = 0; i < param->rows; ++i)
871 {
872 for (k = 0; k < param->columns; ++k)
873 set_number((FLOAT *)dst_data + i * param->columns + k, param->type,
874 &matrix->m[i][k], D3DXPT_FLOAT);
875 }
876}
877
878static void set_matrix_transpose(struct d3dx_parameter *param, const D3DXMATRIX *matrix, void *dst_data)
879{
880 UINT i, k;
881
882 for (i = 0; i < param->rows; ++i)
883 {
884 for (k = 0; k < param->columns; ++k)
885 {
886 set_number((FLOAT *)dst_data + i * param->columns + k, param->type,
887 &matrix->m[k][i], D3DXPT_FLOAT);
888 }
889 }
890}
891
892static HRESULT set_string(char **param_data, const char *string)
893{
894 free(*param_data);
895 *param_data = strdup(string);
896 if (!*param_data)
897 {
898 ERR("Out of memory.\n");
899 return E_OUTOFMEMORY;
900 }
901 return D3D_OK;
902}
903
904static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigned int bytes,
905 void *dst_data)
906{
907 unsigned int i, count;
908
909 bytes = min(bytes, param->bytes);
910 count = min(param->element_count ? param->element_count : 1, bytes / sizeof(void *));
911
912 switch (param->type)
913 {
914 case D3DXPT_TEXTURE:
915 case D3DXPT_TEXTURE1D:
916 case D3DXPT_TEXTURE2D:
917 case D3DXPT_TEXTURE3D:
919 for (i = 0; i < count; ++i)
920 {
921 IUnknown *old_texture = ((IUnknown **)dst_data)[i];
922 IUnknown *new_texture = ((IUnknown **)data)[i];
923
924 if (new_texture == old_texture)
925 continue;
926
927 if (new_texture)
928 IUnknown_AddRef(new_texture);
929 if (old_texture)
930 IUnknown_Release(old_texture);
931 }
932 /* fallthrough */
933 case D3DXPT_VOID:
934 case D3DXPT_BOOL:
935 case D3DXPT_INT:
936 case D3DXPT_FLOAT:
937 TRACE("Copy %u bytes.\n", bytes);
938 memcpy(dst_data, data, bytes);
939 break;
940
941 case D3DXPT_STRING:
942 {
943 HRESULT hr;
944
945 for (i = 0; i < count; ++i)
946 if (FAILED(hr = set_string(&((char **)dst_data)[i], ((const char **)data)[i])))
947 return hr;
948 break;
949 }
950
951 default:
952 FIXME("Unhandled type %s.\n", debug_d3dxparameter_type(param->type));
953 break;
954 }
955
956 return D3D_OK;
957}
958
960 struct d3dx_parameter *parameter, const char *name)
961{
963 struct d3dx_parameter *temp_parameter;
964 const char *part;
965
966 TRACE("parameter %p, name %s\n", parameter, debugstr_a(name));
967
968 if (!name || !*name) return NULL;
969
970 element = atoi(name);
971 part = strchr(name, ']') + 1;
972
973 /* check for empty [] && element range */
974 if ((part - name) > 1 && parameter->element_count > element)
975 {
976 temp_parameter = &parameter->members[element];
977
978 switch (*part++)
979 {
980 case '.':
981 return get_parameter_by_name(store, temp_parameter, part);
982
983 case '\0':
984 TRACE("Returning parameter %p\n", temp_parameter);
985 return temp_parameter;
986
987 default:
988 FIXME("Unhandled case \"%c\"\n", *--part);
989 break;
990 }
991 }
992
993 TRACE("Parameter not found\n");
994 return NULL;
995}
996
997static struct d3dx_parameter *get_annotation_by_name(struct d3dx_effect *effect, unsigned int count,
998 struct d3dx_parameter *annotations, const char *name)
999{
1000 UINT i, length;
1001 struct d3dx_parameter *temp_parameter;
1002 const char *part;
1003
1004 TRACE("count %u, annotations %p, name %s\n", count, annotations, debugstr_a(name));
1005
1006 if (!name || !*name) return NULL;
1007
1008 length = strcspn( name, "[.@" );
1009 part = name + length;
1010
1011 for (i = 0; i < count; ++i)
1012 {
1013 temp_parameter = &annotations[i];
1014
1015 if (!strcmp(temp_parameter->name, name))
1016 {
1017 TRACE("Returning annotation %p\n", temp_parameter);
1018 return temp_parameter;
1019 }
1020 else if (strlen(temp_parameter->name) == length && !strncmp(temp_parameter->name, name, length))
1021 {
1022 switch (*part++)
1023 {
1024 case '.':
1025 return get_parameter_by_name(&effect->params, temp_parameter, part);
1026
1027 case '[':
1028 return get_parameter_element_by_name(&effect->params, temp_parameter, part);
1029
1030 default:
1031 FIXME("Unhandled case \"%c\"\n", *--part);
1032 break;
1033 }
1034 }
1035 }
1036
1037 TRACE("Annotation not found\n");
1038 return NULL;
1039}
1040
1042 struct d3dx_parameter *parameter, const char *name)
1043{
1044 struct d3dx_parameter *temp_parameter;
1045 unsigned int name_len, param_name_len;
1046 unsigned int i, count, length;
1047 struct wine_rb_entry *entry;
1048 unsigned int full_name_size;
1049 const char *part;
1050 char *full_name;
1051
1052 TRACE("store %p, parameter %p, name %s.\n", store, parameter, debugstr_a(name));
1053
1054 if (!name || !*name) return NULL;
1055
1056 if (!parameter)
1057 {
1058 if ((entry = wine_rb_get(&store->tree, name)))
1060 return NULL;
1061 }
1062
1063 if (parameter->full_name)
1064 {
1065 name_len = strlen(name);
1066 param_name_len = strlen(parameter->full_name);
1067 full_name_size = name_len + param_name_len + 2;
1068 if (store->full_name_tmp_size < full_name_size)
1069 {
1070 if (!(full_name = realloc(store->full_name_tmp, full_name_size)))
1071 {
1072 ERR("Out of memory.\n");
1073 return NULL;
1074 }
1075 store->full_name_tmp = full_name;
1076 store->full_name_tmp_size = full_name_size;
1077 }
1078 else
1079 {
1080 full_name = store->full_name_tmp;
1081 }
1082 memcpy(full_name, parameter->full_name, param_name_len);
1083 full_name[param_name_len] = '.';
1084 memcpy(full_name + param_name_len + 1, name, name_len);
1085 full_name[param_name_len + 1 + name_len] = 0;
1086
1087 if ((entry = wine_rb_get(&store->tree, full_name)))
1089 return NULL;
1090 }
1091
1092 /* Pass / technique annotations are not stored in the parameters tree,
1093 * do a linear search. */
1094 count = parameter->member_count;
1095
1096 length = strcspn( name, "[." );
1097 part = name + length;
1098
1099 for (i = 0; i < count; i++)
1100 {
1101 temp_parameter = &parameter->members[i];
1102
1103 if (!strcmp(temp_parameter->name, name))
1104 {
1105 TRACE("Returning parameter %p\n", temp_parameter);
1106 return temp_parameter;
1107 }
1108 else if (strlen(temp_parameter->name) == length && !strncmp(temp_parameter->name, name, length))
1109 {
1110 switch (*part++)
1111 {
1112 case '.':
1113 return get_parameter_by_name(store, temp_parameter, part);
1114
1115 case '[':
1116 return get_parameter_element_by_name(store, temp_parameter, part);
1117
1118 default:
1119 FIXME("Unhandled case \"%c\"\n", *--part);
1120 break;
1121 }
1122 }
1123 }
1124
1125 TRACE("Parameter not found\n");
1126 return NULL;
1127}
1128
1130{
1131 return (0xfeff0000 | ((major) << 8) | (minor));
1132}
1133
1135 void **param_value, struct d3dx_parameter **out_param,
1136 BOOL update_all, BOOL *param_dirty)
1137{
1138 struct d3dx_parameter *param = &state->parameter;
1139
1140 *param_value = NULL;
1141 *out_param = NULL;
1142 *param_dirty = FALSE;
1143
1144 switch (state->type)
1145 {
1146 case ST_PARAMETER:
1147 param = state->referenced_param;
1148 *param_dirty = is_param_dirty(param, pass->update_version);
1149 /* fallthrough */
1150 case ST_CONSTANT:
1151 *out_param = param;
1152 *param_value = param->data;
1153 return D3D_OK;
1154 case ST_ARRAY_SELECTOR:
1155 {
1156 unsigned int array_idx;
1157 static const struct d3dx_parameter array_idx_param =
1158 {"", NULL, NULL, NULL, NULL, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 0, 0, 0, sizeof(array_idx)};
1159 HRESULT hr;
1160 struct d3dx_parameter *ref_param, *selected_param;
1161
1162 if (!param->param_eval)
1163 {
1164 FIXME("Preshader structure is null.\n");
1165 return D3DERR_INVALIDCALL;
1166 }
1167 /* We override with the update_version of the pass because we want
1168 * to force index recomputation and check for out of bounds. */
1169 if (is_param_eval_input_dirty(param->param_eval, pass->update_version))
1170 {
1171 if (FAILED(hr = d3dx_evaluate_parameter(param->param_eval, &array_idx_param, &array_idx)))
1172 return hr;
1173 }
1174 else
1175 {
1176 array_idx = state->index;
1177 }
1178 ref_param = state->referenced_param;
1179 TRACE("Array index %u, stored array index %u, element_count %u.\n", array_idx, state->index,
1180 ref_param->element_count);
1181 /* According to the tests, native d3dx handles the case of array index evaluated to -1
1182 * in a specific way, always selecting first array element and not returning error. */
1183 if (array_idx == ~0u)
1184 {
1185 WARN("Array index is -1, setting to 0.\n");
1186 array_idx = 0;
1187 }
1188
1189 if (array_idx >= ref_param->element_count)
1190 {
1191 WARN("Computed array index %u is larger than array size %u.\n",
1192 array_idx, ref_param->element_count);
1193 return E_FAIL;
1194 }
1195 selected_param = &ref_param->members[array_idx];
1196 *param_dirty = state->index != array_idx || is_param_dirty(selected_param, pass->update_version);
1197 state->index = array_idx;
1198
1199 *param_value = selected_param->data;
1200 *out_param = selected_param;
1201 return D3D_OK;
1202 }
1203 case ST_FXLC:
1204 if (param->param_eval)
1205 {
1206 *out_param = param;
1207 *param_value = param->data;
1208 /* We check with the update_version of the pass because the
1209 * same preshader might be used by both the vertex and the
1210 * pixel shader (that can happen e.g. for sampler states). */
1211 if (update_all || is_param_eval_input_dirty(param->param_eval, pass->update_version))
1212 {
1213 *param_dirty = TRUE;
1214 return d3dx_evaluate_parameter(param->param_eval, param, *param_value);
1215 }
1216 else
1217 return D3D_OK;
1218 }
1219 else
1220 {
1221 FIXME("No preshader for FXLC parameter.\n");
1222 return D3DERR_INVALIDCALL;
1223 }
1224 }
1225 return E_NOTIMPL;
1226}
1227
1228static unsigned int get_annotation_from_object(struct d3dx_effect *effect, D3DXHANDLE object,
1229 struct d3dx_parameter **annotations)
1230{
1231 struct d3dx_parameter *param = get_valid_parameter(effect, object);
1232 struct d3dx_pass *pass = get_valid_pass(effect, object);
1233 struct d3dx_technique *technique = get_valid_technique(effect, object);
1234
1235 if (pass)
1236 {
1237 *annotations = pass->annotations;
1238 return pass->annotation_count;
1239 }
1240 else if (technique)
1241 {
1242 *annotations = technique->annotations;
1243 return technique->annotation_count;
1244 }
1245 else if (param)
1246 {
1248 {
1249 struct d3dx_top_level_parameter *top_param
1251
1252 *annotations = top_param->annotations;
1253 return top_param->annotation_count;
1254 }
1255 else
1256 {
1257 *annotations = NULL;
1258 return 0;
1259 }
1260 }
1261 else
1262 {
1263 FIXME("Functions are not handled, yet!\n");
1264 return 0;
1265 }
1266}
1267
1269 void *data)
1270{
1271 unsigned int i;
1272 unsigned int member_count;
1273
1274 if (param_func(data, param))
1275 return TRUE;
1276
1277 member_count = param->element_count ? param->element_count : param->member_count;
1278 for (i = 0; i < member_count; ++i)
1279 {
1280 if (walk_parameter_tree(&param->members[i], param_func, data))
1281 return TRUE;
1282 }
1283 return FALSE;
1284}
1285
1287{
1288 return effect->pool ? &effect->pool->version_counter : &effect->version_counter;
1289}
1290
1292{
1294}
1295
1296static void *record_parameter(struct d3dx_effect *effect, struct d3dx_parameter *param, unsigned int bytes)
1297{
1298 struct d3dx_parameter_block *block = effect->current_parameter_block;
1299 struct d3dx_recorded_parameter new_record, *record;
1300 unsigned int new_size, alloc_size;
1301
1302 new_record.param = param;
1303 new_record.bytes = bytes;
1304 new_size = block->offset + get_recorded_parameter_size(&new_record);
1305
1306 if (new_size > block->size)
1307 {
1308 BYTE *new_alloc;
1309
1310 alloc_size = max(block->size * 2, max(new_size, INITIAL_PARAM_BLOCK_SIZE));
1311 new_alloc = realloc(block->buffer, alloc_size);
1312 if (!new_alloc)
1313 {
1314 ERR("Out of memory.\n");
1315 return param->data;
1316 }
1317 /* Data update functions may want to free some references upon setting value. */
1318 memset(new_alloc + block->size, 0, alloc_size - block->size);
1319
1320 block->size = alloc_size;
1321 block->buffer = new_alloc;
1322 }
1323 record = (struct d3dx_recorded_parameter *)(block->buffer + block->offset);
1324 *record = new_record;
1325 block->offset = new_size;
1326 return record + 1;
1327}
1328
1329static void set_dirty(struct d3dx_parameter *param)
1330{
1331 struct d3dx_top_level_parameter *top_param = param->top_level_param;
1332 struct d3dx_shared_data *shared_data;
1333 ULONG64 new_update_version;
1334
1335 /* This is true for annotations. */
1336 if (!top_param)
1337 return;
1338
1339 new_update_version = next_update_version(top_param->version_counter);
1340 if ((shared_data = top_param->shared_data))
1341 shared_data->update_version = new_update_version;
1342 else
1343 top_param->update_version = new_update_version;
1344}
1345
1346static void *param_get_data_and_dirtify(struct d3dx_effect *effect, struct d3dx_parameter *param,
1347 unsigned int bytes, BOOL value_changed)
1348{
1349 assert(bytes <= param->bytes);
1350
1351 if (value_changed && !effect->current_parameter_block)
1353
1354 return effect->current_parameter_block ? record_parameter(effect, param, bytes) : param->data;
1355}
1356
1358{
1359 static const struct
1360 {
1361 unsigned int offset;
1362 const char *name;
1363 }
1364 light_tbl[] =
1365 {
1366 {FIELD_OFFSET(D3DLIGHT9, Type), "LC_TYPE"},
1367 {FIELD_OFFSET(D3DLIGHT9, Diffuse), "LT_DIFFUSE"},
1368 {FIELD_OFFSET(D3DLIGHT9, Specular), "LT_SPECULAR"},
1369 {FIELD_OFFSET(D3DLIGHT9, Ambient), "LT_AMBIENT"},
1370 {FIELD_OFFSET(D3DLIGHT9, Position), "LT_POSITION"},
1371 {FIELD_OFFSET(D3DLIGHT9, Direction), "LT_DIRECTION"},
1372 {FIELD_OFFSET(D3DLIGHT9, Range), "LT_RANGE"},
1373 {FIELD_OFFSET(D3DLIGHT9, Falloff), "LT_FALLOFF"},
1374 {FIELD_OFFSET(D3DLIGHT9, Attenuation0), "LT_ATTENUATION0"},
1375 {FIELD_OFFSET(D3DLIGHT9, Attenuation1), "LT_ATTENUATION1"},
1376 {FIELD_OFFSET(D3DLIGHT9, Attenuation2), "LT_ATTENUATION2"},
1377 {FIELD_OFFSET(D3DLIGHT9, Theta), "LT_THETA"},
1378 {FIELD_OFFSET(D3DLIGHT9, Phi), "LT_PHI"}
1379 };
1380 switch (op)
1381 {
1382 case LT_TYPE:
1383 TRACE("LT_TYPE %u.\n", *(D3DLIGHTTYPE *)value);
1384 light->Type = *(D3DLIGHTTYPE *)value;
1385 break;
1386 case LT_DIFFUSE:
1387 case LT_SPECULAR:
1388 case LT_AMBIENT:
1389 {
1391
1392 TRACE("%s (%.8e %.8e %.8e %.8e).\n", light_tbl[op].name, c.r, c.g, c.b, c.a);
1393 *(D3DCOLORVALUE *)((BYTE *)light + light_tbl[op].offset) = c;
1394 break;
1395 }
1396 case LT_POSITION:
1397 case LT_DIRECTION:
1398 {
1399 D3DVECTOR v = *(D3DVECTOR *)value;
1400
1401 TRACE("%s (%.8e %.8e %.8e).\n", light_tbl[op].name, v.x, v.y, v.z);
1402 *(D3DVECTOR *)((BYTE *)light + light_tbl[op].offset) = v;
1403 break;
1404 }
1405 case LT_RANGE:
1406 case LT_FALLOFF:
1407 case LT_ATTENUATION0:
1408 case LT_ATTENUATION1:
1409 case LT_ATTENUATION2:
1410 case LT_THETA:
1411 case LT_PHI:
1412 {
1413 float v = *(float *)value;
1414 TRACE("%s %.8e.\n", light_tbl[op].name, v);
1415 *(float *)((BYTE *)light + light_tbl[op].offset) = v;
1416 break;
1417 }
1418 default:
1419 WARN("Unknown light parameter %u.\n", op);
1420 break;
1421 }
1422}
1423
1425{
1426 static const struct
1427 {
1428 unsigned int offset;
1429 const char *name;
1430 }
1431 material_tbl[] =
1432 {
1433 {FIELD_OFFSET(D3DMATERIAL9, Diffuse), "MT_DIFFUSE"},
1434 {FIELD_OFFSET(D3DMATERIAL9, Ambient), "MT_AMBIENT"},
1435 {FIELD_OFFSET(D3DMATERIAL9, Specular), "MT_SPECULAR"},
1436 {FIELD_OFFSET(D3DMATERIAL9, Emissive), "MT_EMISSIVE"},
1437 {FIELD_OFFSET(D3DMATERIAL9, Power), "MT_POWER"}
1438 };
1439
1440 switch (op)
1441 {
1442 case MT_POWER:
1443 {
1444 float v = *(float *)value;
1445
1446 TRACE("%s %.8e.\n", material_tbl[op].name, v);
1447 material->Power = v;
1448 break;
1449 }
1450 case MT_DIFFUSE:
1451 case MT_AMBIENT:
1452 case MT_SPECULAR:
1453 case MT_EMISSIVE:
1454 {
1456
1457 TRACE("%s, value (%.8e %.8e %.8e %.8e).\n", material_tbl[op].name, c.r, c.g, c.b, c.a);
1458 *(D3DCOLORVALUE *)((BYTE *)material + material_tbl[op].offset) = c;
1459 break;
1460 }
1461 default:
1462 WARN("Unknown material parameter %u.\n", op);
1463 break;
1464 }
1465}
1466
1468 struct d3dx_parameter *param, void *value_ptr)
1469{
1470 static const struct
1471 {
1473 UINT elem_size;
1474 const char *name;
1475 }
1476 const_tbl[] =
1477 {
1478 {D3DXPT_FLOAT, sizeof(float) * 4, "SCT_VSFLOAT"},
1479 {D3DXPT_BOOL, sizeof(BOOL), "SCT_VSBOOL"},
1480 {D3DXPT_INT, sizeof(int) * 4, "SCT_VSINT"},
1481 {D3DXPT_FLOAT, sizeof(float) * 4, "SCT_PSFLOAT"},
1482 {D3DXPT_BOOL, sizeof(BOOL), "SCT_PSBOOL"},
1483 {D3DXPT_INT, sizeof(int) * 4, "SCT_PSINT"},
1484 };
1485
1486 BOOL is_heap_buffer = FALSE;
1487 unsigned int element_count;
1488 void *buffer = value_ptr;
1490 HRESULT ret;
1491
1492 assert(op < ARRAY_SIZE(const_tbl));
1493 element_count = param->bytes / const_tbl[op].elem_size;
1494 TRACE("%s, index %u, element_count %u.\n", const_tbl[op].name, index, element_count);
1495 if (param->type != const_tbl[op].type)
1496 {
1497 FIXME("Unexpected param type %u.\n", param->type);
1498 return D3DERR_INVALIDCALL;
1499 }
1500
1501 if (param->bytes % const_tbl[op].elem_size || element_count > 1)
1502 {
1503 unsigned int param_data_size;
1504
1505 TRACE("Parameter size %u, rows %u, cols %u.\n", param->bytes, param->rows, param->columns);
1506
1507 if (param->bytes % const_tbl[op].elem_size)
1508 ++element_count;
1509 if (element_count > 1)
1510 {
1511 WARN("Setting %u elements.\n", element_count);
1512 buffer = calloc(element_count, const_tbl[op].elem_size);
1513 if (!buffer)
1514 {
1515 ERR("Out of memory.\n");
1516 return E_OUTOFMEMORY;
1517 }
1518 is_heap_buffer = TRUE;
1519 }
1520 else
1521 {
1522 assert(const_tbl[op].elem_size <= sizeof(value));
1523 buffer = &value;
1524 }
1525 param_data_size = min(param->bytes, const_tbl[op].elem_size);
1526 memcpy(buffer, value_ptr, param_data_size);
1527 }
1528
1529 switch (op)
1530 {
1531 case SCT_VSFLOAT:
1532 ret = SET_D3D_STATE(effect, SetVertexShaderConstantF, index, (const float *)buffer, element_count);
1533 break;
1534 case SCT_VSBOOL:
1535 ret = SET_D3D_STATE(effect, SetVertexShaderConstantB, index, (const BOOL *)buffer, element_count);
1536 break;
1537 case SCT_VSINT:
1538 ret = SET_D3D_STATE(effect, SetVertexShaderConstantI, index, (const int *)buffer, element_count);
1539 break;
1540 case SCT_PSFLOAT:
1541 ret = SET_D3D_STATE(effect, SetPixelShaderConstantF, index, (const float *)buffer, element_count);
1542 break;
1543 case SCT_PSBOOL:
1544 ret = SET_D3D_STATE(effect, SetPixelShaderConstantB, index, (const BOOL *)buffer, element_count);
1545 break;
1546 case SCT_PSINT:
1547 ret = SET_D3D_STATE(effect, SetPixelShaderConstantI, index, (const int *)buffer, element_count);
1548 break;
1549 default:
1551 break;
1552 }
1553
1554 if (is_heap_buffer)
1555 free(buffer);
1556
1557 return ret;
1558}
1559
1560static HRESULT d3dx9_apply_state(struct d3dx_effect *effect, struct d3dx_pass *pass,
1561 struct d3dx_state *state, unsigned int parent_index, BOOL update_all);
1562
1564 struct d3dx_parameter *param, BOOL vs, BOOL update_all)
1565{
1566 HRESULT hr, ret;
1567 struct d3dx_parameter **params;
1568 D3DXCONSTANT_DESC *cdesc;
1569 unsigned int parameters_count;
1570 unsigned int i, j;
1571
1572 if (!param->param_eval)
1573 {
1574 FIXME("param_eval structure is null.\n");
1575 return D3DERR_INVALIDCALL;
1576 }
1578 param->param_eval, update_all)))
1579 return hr;
1580 params = param->param_eval->shader_inputs.inputs_param;
1581 cdesc = param->param_eval->shader_inputs.inputs;
1582 parameters_count = param->param_eval->shader_inputs.input_count;
1583 ret = D3D_OK;
1584 for (i = 0; i < parameters_count; ++i)
1585 {
1586 if (params[i] && params[i]->class == D3DXPC_OBJECT && is_param_type_sampler(params[i]->type))
1587 {
1588 struct d3dx_sampler *sampler;
1589 unsigned int sampler_idx;
1590
1591 for (sampler_idx = 0; sampler_idx < cdesc[i].RegisterCount; ++sampler_idx)
1592 {
1593 sampler = params[i]->element_count ? params[i]->members[sampler_idx].data : params[i]->data;
1594 TRACE("sampler %s, register index %u, state count %u.\n", debugstr_a(params[i]->name),
1595 cdesc[i].RegisterIndex, sampler->state_count);
1596 for (j = 0; j < sampler->state_count; ++j)
1597 {
1598 if (FAILED(hr = d3dx9_apply_state(effect, pass, &sampler->states[j],
1599 cdesc[i].RegisterIndex + sampler_idx + (vs ? D3DVERTEXTEXTURESAMPLER0 : 0),
1600 update_all)))
1601 ret = hr;
1602 }
1603 }
1604 }
1605 }
1606 return ret;
1607}
1608
1609static HRESULT d3dx9_apply_state(struct d3dx_effect *effect, struct d3dx_pass *pass,
1610 struct d3dx_state *state, unsigned int parent_index, BOOL update_all)
1611{
1612 struct d3dx_parameter *param;
1613 void *param_value;
1614 BOOL param_dirty;
1615 HRESULT hr;
1616
1617 TRACE("operation %u, index %u, type %u.\n", state->operation, state->index, state->type);
1618
1619 if (FAILED(hr = d3dx9_get_param_value_ptr(pass, state, &param_value, &param,
1620 update_all, &param_dirty)))
1621 {
1622 if (!update_all && hr == E_FAIL)
1623 {
1624 /* Native d3dx9 returns D3D_OK from CommitChanges() involving
1625 * out of bounds array access and does not touch the affected
1626 * states. */
1627 WARN("Returning D3D_OK on out of bounds array access.\n");
1628 return D3D_OK;
1629 }
1630 return hr;
1631 }
1632
1633 if (!(update_all || param_dirty
1634 || state_table[state->operation].class == SC_VERTEXSHADER
1635 || state_table[state->operation].class == SC_PIXELSHADER
1636 || state_table[state->operation].class == SC_SETSAMPLER))
1637 return D3D_OK;
1638
1639 switch (state_table[state->operation].class)
1640 {
1641 case SC_RENDERSTATE:
1642 TRACE("%s, operation %u, value %lu.\n", state_table[state->operation].name,
1643 state_table[state->operation].op, *(DWORD *)param_value);
1644 return SET_D3D_STATE(effect, SetRenderState, state_table[state->operation].op, *(DWORD *)param_value);
1645 case SC_FVF:
1646 TRACE("%s, value %#lx.\n", state_table[state->operation].name, *(DWORD *)param_value);
1647 return SET_D3D_STATE(effect, SetFVF, *(DWORD *)param_value);
1648 case SC_TEXTURE:
1649 {
1650 UINT unit;
1651
1652 unit = parent_index == ~0u ? state->index : parent_index;
1653 TRACE("%s, unit %u, value %p.\n", state_table[state->operation].name, unit,
1654 *(IDirect3DBaseTexture9 **)param_value);
1655 return SET_D3D_STATE(effect, SetTexture, unit, *(IDirect3DBaseTexture9 **)param_value);
1656 }
1657 case SC_TEXTURESTAGE:
1658 TRACE("%s, stage %u, value %lu.\n", state_table[state->operation].name, state->index, *(DWORD *)param_value);
1659 return SET_D3D_STATE(effect, SetTextureStageState, state->index,
1660 state_table[state->operation].op, *(DWORD *)param_value);
1661 case SC_SETSAMPLER:
1662 {
1663 struct d3dx_sampler *sampler;
1664 HRESULT ret, hr;
1665 unsigned int i;
1666
1667 sampler = (struct d3dx_sampler *)param_value;
1668 TRACE("%s, sampler %u, applying %u states.\n", state_table[state->operation].name, state->index,
1669 sampler->state_count);
1670 ret = D3D_OK;
1671 for (i = 0; i < sampler->state_count; i++)
1672 {
1673 if (FAILED(hr = d3dx9_apply_state(effect, pass, &sampler->states[i], state->index, update_all)))
1674 ret = hr;
1675 }
1676 return ret;
1677 }
1678 case SC_SAMPLERSTATE:
1679 {
1680 UINT sampler;
1681
1682 sampler = parent_index == ~0u ? state->index : parent_index;
1683 TRACE("%s, sampler %u, value %lu.\n", state_table[state->operation].name, sampler, *(DWORD *)param_value);
1684 return SET_D3D_STATE(effect, SetSamplerState, sampler, state_table[state->operation].op,
1685 *(DWORD *)param_value);
1686 }
1687 case SC_VERTEXSHADER:
1688 TRACE("%s, shader %p.\n", state_table[state->operation].name, *(IDirect3DVertexShader9 **)param_value);
1689 if ((update_all || param_dirty)
1690 && FAILED(hr = SET_D3D_STATE(effect, SetVertexShader,
1691 *(IDirect3DVertexShader9 **)param_value)))
1692 ERR("Could not set vertex shader, hr %#lx.\n", hr);
1693 else if (*(IDirect3DVertexShader9 **)param_value)
1694 hr = d3dx_set_shader_constants(effect, pass, param, TRUE, update_all || param_dirty);
1695 return hr;
1696 case SC_PIXELSHADER:
1697 TRACE("%s, shader %p.\n", state_table[state->operation].name, *(IDirect3DPixelShader9 **)param_value);
1698 if ((update_all || param_dirty)
1699 && FAILED(hr = SET_D3D_STATE(effect, SetPixelShader,
1700 *(IDirect3DPixelShader9 **)param_value)))
1701 ERR("Could not set pixel shader, hr %#lx.\n", hr);
1702 else if (*(IDirect3DPixelShader9 **)param_value)
1703 hr = d3dx_set_shader_constants(effect, pass, param, FALSE, update_all || param_dirty);
1704 return hr;
1705 case SC_TRANSFORM:
1706 TRACE("%s, state %u.\n", state_table[state->operation].name, state->index);
1707 return SET_D3D_STATE(effect, SetTransform, state_table[state->operation].op + state->index,
1708 (D3DMATRIX *)param_value);
1709 case SC_LIGHTENABLE:
1710 TRACE("%s, index %u, value %u.\n", state_table[state->operation].name, state->index, *(BOOL *)param_value);
1711 return SET_D3D_STATE(effect, LightEnable, state->index, *(BOOL *)param_value);
1712 case SC_LIGHT:
1713 {
1714 TRACE("%s, index %u, op %u.\n", state_table[state->operation].name, state->index,
1715 state_table[state->operation].op);
1717 &effect->current_light[state->index], param_value);
1718 effect->light_updated |= 1u << state->index;
1719 return D3D_OK;
1720 }
1721 case SC_MATERIAL:
1722 {
1723 TRACE("%s, index %u, op %u.\n", state_table[state->operation].name, state->index,
1724 state_table[state->operation].op);
1726 &effect->current_material, param_value);
1727 effect->material_updated = TRUE;
1728 return D3D_OK;
1729 }
1730 case SC_NPATCHMODE:
1731 TRACE("%s, nsegments %f.\n", state_table[state->operation].name, *(float *)param_value);
1732 return SET_D3D_STATE(effect, SetNPatchMode, *(float *)param_value);
1733 case SC_SHADERCONST:
1734 TRACE("%s, index %u, op %u.\n", state_table[state->operation].name, state->index,
1735 state_table[state->operation].op);
1736 return d3dx_set_shader_const_state(effect, state_table[state->operation].op, state->index,
1737 param, param_value);
1738 default:
1739 FIXME("%s not handled.\n", state_table[state->operation].name);
1740 break;
1741 }
1742 return D3D_OK;
1743}
1744
1745static HRESULT d3dx9_apply_pass_states(struct d3dx_effect *effect, struct d3dx_pass *pass, BOOL update_all)
1746{
1747 unsigned int i;
1748 HRESULT ret;
1749 HRESULT hr;
1750 ULONG64 new_update_version = next_effect_update_version(effect);
1751
1752 TRACE("effect %p, pass %p, state_count %u.\n", effect, pass, pass->state_count);
1753
1754 ret = D3D_OK;
1755 for (i = 0; i < pass->state_count; ++i)
1756 {
1757 if (FAILED(hr = d3dx9_apply_state(effect, pass, &pass->states[i], ~0u, update_all)))
1758 {
1759 WARN("Error applying state, hr %#lx.\n", hr);
1760 ret = hr;
1761 }
1762 }
1763
1764 if (effect->light_updated)
1765 {
1766 for (i = 0; i < ARRAY_SIZE(effect->current_light); ++i)
1767 {
1768 if ((effect->light_updated & (1u << i))
1769 && FAILED(hr = SET_D3D_STATE(effect, SetLight, i, &effect->current_light[i])))
1770 {
1771 WARN("Error setting light, hr %#lx.\n", hr);
1772 ret = hr;
1773 }
1774 }
1775 effect->light_updated = 0;
1776 }
1777
1778 if (effect->material_updated
1779 && FAILED(hr = SET_D3D_STATE(effect, SetMaterial, &effect->current_material)))
1780 {
1781 WARN("Error setting material, hr %#lx.\n", hr);
1782 ret = hr;
1783 }
1784 effect->material_updated = FALSE;
1785
1786 pass->update_version = new_update_version;
1787 return ret;
1788}
1789
1790static void param_set_data_pointer(struct d3dx_parameter *param, unsigned char *data, BOOL child, BOOL free_data)
1791{
1792 unsigned char *member_data = data;
1793 unsigned int i, count;
1794
1795 count = param->element_count ? param->element_count : param->member_count;
1796 for (i = 0; i < count; ++i)
1797 {
1798 param_set_data_pointer(&param->members[i], member_data, TRUE, free_data);
1799 if (data)
1800 member_data += param->members[i].bytes;
1801 }
1802 if (free_data)
1804 param->data = data;
1805}
1806
1807static BOOL is_same_parameter(void *param1_, struct d3dx_parameter *param2)
1808{
1809 struct d3dx_parameter *param1 = (struct d3dx_parameter *)param1_;
1810 BOOL matches;
1811 unsigned int i, member_count;
1812
1813 matches = !strcmp(param1->name, param2->name) && param1->class == param2->class
1814 && param1->type == param2->type && param1->rows == param2->rows
1815 && param1->columns == param2->columns && param1->element_count == param2->element_count
1816 && param1->member_count == param2->member_count;
1817
1818 member_count = param1->element_count ? param1->element_count : param1->member_count;
1819
1820 if (!matches || !member_count)
1821 return matches;
1822
1823 for (i = 0; i < member_count; ++i)
1824 {
1825 if (!is_same_parameter(&param1->members[i], &param2->members[i]))
1826 return FALSE;
1827 }
1828 return TRUE;
1829}
1830
1832{
1833 unsigned int i, free_entry_index;
1834 unsigned int new_size, new_count;
1835
1836 if (!(param->param.flags & PARAMETER_FLAG_SHARED) || !pool || is_param_type_sampler(param->param.type))
1837 return D3D_OK;
1838
1839 free_entry_index = pool->size;
1840 for (i = 0; i < pool->size; ++i)
1841 {
1842 if (!pool->shared_data[i].count)
1843 free_entry_index = i;
1844 else if (is_same_parameter(&param->param, &pool->shared_data[i].parameters[0]->param))
1845 break;
1846 }
1847 if (i == pool->size)
1848 {
1849 i = free_entry_index;
1850 if (i == pool->size)
1851 {
1852 struct d3dx_shared_data *new_alloc;
1853
1854 if (!pool->size)
1855 {
1857 new_alloc = calloc(new_size, sizeof(*pool->shared_data));
1858 if (!new_alloc)
1859 goto oom;
1860 }
1861 else
1862 {
1863 new_size = pool->size * 2;
1864 new_alloc = _recalloc(pool->shared_data, new_size, sizeof(*pool->shared_data));
1865 if (!new_alloc)
1866 goto oom;
1867 if (new_alloc != pool->shared_data)
1868 {
1869 unsigned int j, k;
1870
1871 for (j = 0; j < pool->size; ++j)
1872 for (k = 0; k < new_alloc[j].count; ++k)
1873 new_alloc[j].parameters[k]->shared_data = &new_alloc[j];
1874 }
1875 }
1876 pool->shared_data = new_alloc;
1877 pool->size = new_size;
1878 }
1879 pool->shared_data[i].data = param->param.data;
1880 }
1881 else
1882 {
1883 param_set_data_pointer(&param->param, pool->shared_data[i].data, FALSE, TRUE);
1884 }
1885 new_count = ++pool->shared_data[i].count;
1886 if (new_count >= pool->shared_data[i].size)
1887 {
1888 struct d3dx_top_level_parameter **new_alloc;
1889
1890 new_size = pool->shared_data[i].size ? pool->shared_data[i].size * 2 : INITIAL_SHARED_DATA_SIZE;
1891 new_alloc = _recalloc(pool->shared_data[i].parameters, new_size, sizeof(*pool->shared_data[i].parameters));
1892 if (!new_alloc)
1893 goto oom;
1894 pool->shared_data[i].parameters = new_alloc;
1895 pool->shared_data[i].size = new_size;
1896 }
1897
1898 param->shared_data = &pool->shared_data[i];
1899 pool->shared_data[i].parameters[new_count - 1] = param;
1900
1901 TRACE("name %s, parameter idx %u, new refcount %u.\n", debugstr_a(param->param.name), i,
1902 new_count);
1903
1904 return D3D_OK;
1905
1906oom:
1907 ERR("Out of memory.\n");
1908 return E_OUTOFMEMORY;
1909}
1910
1912{
1913 param->data = NULL;
1914 return FALSE;
1915}
1916
1918{
1919 unsigned int new_count;
1920
1921 if (!(param->param.flags & PARAMETER_FLAG_SHARED) || !param->shared_data)
1922 return;
1923 new_count = --param->shared_data->count;
1924
1925 TRACE("param %p, param->shared_data %p, new_count %d.\n", param, param->shared_data, new_count);
1926
1927 if (new_count)
1928 {
1929 unsigned int i;
1930
1931 for (i = 0; i < new_count; ++i)
1932 {
1933 if (param->shared_data->parameters[i] == param)
1934 {
1935 memmove(&param->shared_data->parameters[i],
1936 &param->shared_data->parameters[i + 1],
1937 sizeof(param->shared_data->parameters[i]) * (new_count - i));
1938 break;
1939 }
1940 }
1942 }
1943 else
1944 {
1945 free(param->shared_data->parameters);
1946 /* Zeroing table size is required as the entry in pool parameters table can be reused. */
1947 param->shared_data->size = 0;
1948 param->shared_data = NULL;
1949 }
1950}
1951
1952static inline struct d3dx_effect_pool *impl_from_ID3DXEffectPool(ID3DXEffectPool *iface)
1953{
1955}
1956
1957static inline struct d3dx_effect_pool *unsafe_impl_from_ID3DXEffectPool(ID3DXEffectPool *iface);
1958
1959static inline struct d3dx_effect *impl_from_ID3DXEffect(ID3DXEffect *iface)
1960{
1961 return CONTAINING_RECORD(iface, struct d3dx_effect, ID3DXEffect_iface);
1962}
1963
1964/*** IUnknown methods ***/
1965static HRESULT WINAPI d3dx_effect_QueryInterface(ID3DXEffect *iface, REFIID riid, void **object)
1966{
1967 TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);
1968
1969 if (IsEqualGUID(riid, &IID_IUnknown) ||
1970 IsEqualGUID(riid, &IID_ID3DXEffect))
1971 {
1972 iface->lpVtbl->AddRef(iface);
1973 *object = iface;
1974 return S_OK;
1975 }
1976
1977 ERR("Interface %s not found\n", debugstr_guid(riid));
1978
1979 return E_NOINTERFACE;
1980}
1981
1982static ULONG WINAPI d3dx_effect_AddRef(ID3DXEffect *iface)
1983{
1984 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
1985 ULONG refcount = InterlockedIncrement(&effect->ref);
1986
1987 TRACE("%p increasing refcount to %lu.\n", effect, refcount);
1988
1989 return refcount;
1990}
1991
1992static ULONG WINAPI d3dx_effect_Release(ID3DXEffect *iface)
1993{
1994 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
1995 ULONG refcount = InterlockedDecrement(&effect->ref);
1996
1997 TRACE("%p decreasing refcount to %lu.\n", effect, refcount);
1998
1999 if (!refcount)
2000 d3dx_effect_cleanup(effect);
2001
2002 return refcount;
2003}
2004
2005/*** ID3DXBaseEffect methods ***/
2007{
2008 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2009
2010 TRACE("iface %p, desc %p.\n", iface, desc);
2011
2012 if (!desc)
2013 {
2014 WARN("Invalid argument specified.\n");
2015 return D3DERR_INVALIDCALL;
2016 }
2017
2018 desc->Creator = "D3DX Effect Compiler";
2019 desc->Functions = 0;
2020 desc->Parameters = effect->params.count;
2021 desc->Techniques = effect->technique_count;
2022
2023 return D3D_OK;
2024}
2025
2026static HRESULT WINAPI d3dx_effect_GetParameterDesc(ID3DXEffect *iface, D3DXHANDLE parameter,
2028{
2029 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2030 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2031
2032 TRACE("iface %p, parameter %p, desc %p.\n", iface, parameter, desc);
2033
2034 if (!desc || !param)
2035 {
2036 WARN("Invalid argument specified.\n");
2037 return D3DERR_INVALIDCALL;
2038 }
2039
2040 desc->Name = param->name;
2041 desc->Semantic = param->semantic;
2042 desc->Class = param->class;
2043 desc->Type = param->type;
2044 desc->Rows = param->rows;
2045 desc->Columns = param->columns;
2046 desc->Elements = param->element_count;
2047 desc->Annotations = is_top_level_parameter(param)
2048 ? top_level_parameter_from_parameter(param)->annotation_count : 0;
2049 desc->StructMembers = param->member_count;
2050 desc->Flags = param->flags;
2051 desc->Bytes = param->bytes;
2052
2053 return D3D_OK;
2054}
2055
2056static HRESULT WINAPI d3dx_effect_GetTechniqueDesc(ID3DXEffect *iface, D3DXHANDLE technique,
2058{
2059 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2060 struct d3dx_technique *tech = technique ? get_valid_technique(effect, technique) : &effect->techniques[0];
2061
2062 TRACE("iface %p, technique %p, desc %p.\n", iface, technique, desc);
2063
2064 if (!desc || !tech)
2065 {
2066 WARN("Invalid argument specified.\n");
2067 return D3DERR_INVALIDCALL;
2068 }
2069
2070 desc->Name = tech->name;
2071 desc->Passes = tech->pass_count;
2072 desc->Annotations = tech->annotation_count;
2073
2074 return D3D_OK;
2075}
2076
2077static HRESULT WINAPI d3dx_effect_GetPassDesc(ID3DXEffect *iface, D3DXHANDLE pass_handle, D3DXPASS_DESC *desc)
2078{
2079 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2080 struct d3dx_pass *pass = get_valid_pass(effect, pass_handle);
2081 unsigned int i;
2082
2083 TRACE("iface %p, pass %p, desc %p.\n", iface, pass, desc);
2084
2085 if (!desc || !pass)
2086 {
2087 WARN("Invalid argument specified.\n");
2088 return D3DERR_INVALIDCALL;
2089 }
2090
2091 desc->Name = pass->name;
2092 desc->Annotations = pass->annotation_count;
2093
2094 desc->pVertexShaderFunction = NULL;
2095 desc->pPixelShaderFunction = NULL;
2096
2097 if (effect->flags & D3DXFX_NOT_CLONEABLE)
2098 return D3D_OK;
2099
2100 for (i = 0; i < pass->state_count; ++i)
2101 {
2102 struct d3dx_state *state = &pass->states[i];
2103
2104 if (state_table[state->operation].class == SC_VERTEXSHADER
2105 || state_table[state->operation].class == SC_PIXELSHADER)
2106 {
2107 struct d3dx_parameter *param;
2108 void *param_value;
2109 BOOL param_dirty;
2110 HRESULT hr;
2111 void *data;
2112
2113 if (FAILED(hr = d3dx9_get_param_value_ptr(pass, &pass->states[i], &param_value, &param,
2114 FALSE, &param_dirty)))
2115 return hr;
2116
2117 data = param->object_id ? effect->objects[param->object_id].data : NULL;
2118 if (state_table[state->operation].class == SC_VERTEXSHADER)
2119 desc->pVertexShaderFunction = data;
2120 else
2121 desc->pPixelShaderFunction = data;
2122 }
2123 }
2124
2125 return D3D_OK;
2126}
2127
2130{
2131 FIXME("iface %p, shader %p, desc %p stub.\n", iface, shader, desc);
2132
2133 return E_NOTIMPL;
2134}
2135
2136static D3DXHANDLE WINAPI d3dx_effect_GetParameter(ID3DXEffect *iface, D3DXHANDLE parameter, UINT index)
2137{
2138 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2139 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2140
2141 TRACE("iface %p, parameter %p, index %u.\n", iface, parameter, index);
2142
2143 if (!parameter)
2144 {
2145 if (index < effect->params.count)
2146 {
2147 TRACE("Returning parameter %p.\n", &effect->params.parameters[index]);
2148 return get_parameter_handle(&effect->params.parameters[index].param);
2149 }
2150 }
2151 else
2152 {
2153 if (param && !param->element_count && index < param->member_count)
2154 {
2155 TRACE("Returning parameter %p.\n", &param->members[index]);
2156 return get_parameter_handle(&param->members[index]);
2157 }
2158 }
2159
2160 WARN("Parameter not found.\n");
2161
2162 return NULL;
2163}
2164
2165static D3DXHANDLE WINAPI d3dx_effect_GetParameterByName(ID3DXEffect *iface, D3DXHANDLE parameter,
2166 const char *name)
2167{
2168 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2169 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2171
2172 TRACE("iface %p, parameter %p, name %s.\n", iface, parameter, debugstr_a(name));
2173
2174 if (!name)
2175 {
2177 TRACE("Returning parameter %p.\n", handle);
2178 return handle;
2179 }
2180
2182 TRACE("Returning parameter %p.\n", handle);
2183
2184 return handle;
2185}
2186
2188 const char *semantic)
2189{
2190 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2191 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2192 struct d3dx_parameter *temp_param;
2193 unsigned int i;
2194
2195 TRACE("iface %p, parameter %p, semantic %s.\n", iface, parameter, debugstr_a(semantic));
2196
2197 if (!parameter)
2198 {
2199 for (i = 0; i < effect->params.count; ++i)
2200 {
2201 temp_param = &effect->params.parameters[i].param;
2202
2203 if (!temp_param->semantic)
2204 {
2205 if (!semantic)
2206 {
2207 TRACE("Returning parameter %p\n", temp_param);
2208 return get_parameter_handle(temp_param);
2209 }
2210 continue;
2211 }
2212
2213 if (!stricmp(temp_param->semantic, semantic))
2214 {
2215 TRACE("Returning parameter %p\n", temp_param);
2216 return get_parameter_handle(temp_param);
2217 }
2218 }
2219 }
2220 else if (param)
2221 {
2222 for (i = 0; i < param->member_count; ++i)
2223 {
2224 temp_param = &param->members[i];
2225
2226 if (!temp_param->semantic)
2227 {
2228 if (!semantic)
2229 {
2230 TRACE("Returning parameter %p\n", temp_param);
2231 return get_parameter_handle(temp_param);
2232 }
2233 continue;
2234 }
2235
2236 if (!stricmp(temp_param->semantic, semantic))
2237 {
2238 TRACE("Returning parameter %p\n", temp_param);
2239 return get_parameter_handle(temp_param);
2240 }
2241 }
2242 }
2243
2244 WARN("Parameter not found.\n");
2245
2246 return NULL;
2247}
2248
2250{
2251 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2252 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2253
2254 TRACE("iface %p, parameter %p, index %u.\n", iface, parameter, index);
2255
2256 if (!param)
2257 {
2258 if (index < effect->params.count)
2259 {
2260 TRACE("Returning parameter %p.\n", &effect->params.parameters[index]);
2261 return get_parameter_handle(&effect->params.parameters[index].param);
2262 }
2263 }
2264 else
2265 {
2266 if (index < param->element_count)
2267 {
2268 TRACE("Returning parameter %p.\n", &param->members[index]);
2269 return get_parameter_handle(&param->members[index]);
2270 }
2271 }
2272
2273 WARN("Parameter not found.\n");
2274
2275 return NULL;
2276}
2277
2279{
2280 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2281
2282 TRACE("iface %p, index %u.\n", iface, index);
2283
2284 if (index >= effect->technique_count)
2285 {
2286 WARN("Invalid argument specified.\n");
2287 return NULL;
2288 }
2289
2290 TRACE("Returning technique %p.\n", &effect->techniques[index]);
2291
2292 return get_technique_handle(&effect->techniques[index]);
2293}
2294
2295static D3DXHANDLE WINAPI d3dx_effect_GetTechniqueByName(ID3DXEffect *iface, const char *name)
2296{
2297 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2298 struct d3dx_technique *tech = get_technique_by_name(effect, name);
2299
2300 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2301
2302 if (tech)
2303 {
2305 TRACE("Returning technique %p\n", t);
2306 return t;
2307 }
2308
2309 WARN("Technique not found.\n");
2310
2311 return NULL;
2312}
2313
2314static D3DXHANDLE WINAPI d3dx_effect_GetPass(ID3DXEffect *iface, D3DXHANDLE technique, UINT index)
2315{
2316 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2317 struct d3dx_technique *tech = get_valid_technique(effect, technique);
2318
2319 TRACE("iface %p, technique %p, index %u.\n", iface, technique, index);
2320
2321 if (tech && index < tech->pass_count)
2322 {
2323 TRACE("Returning pass %p\n", &tech->passes[index]);
2324 return get_pass_handle(&tech->passes[index]);
2325 }
2326
2327 WARN("Pass not found.\n");
2328
2329 return NULL;
2330}
2331
2332static D3DXHANDLE WINAPI d3dx_effect_GetPassByName(ID3DXEffect *iface, D3DXHANDLE technique, const char *name)
2333{
2334 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2335 struct d3dx_technique *tech = get_valid_technique(effect, technique);
2336
2337 TRACE("iface %p, technique %p, name %s.\n", iface, technique, debugstr_a(name));
2338
2339 if (tech && name)
2340 {
2341 unsigned int i;
2342
2343 for (i = 0; i < tech->pass_count; ++i)
2344 {
2345 struct d3dx_pass *pass = &tech->passes[i];
2346
2347 if (!strcmp(pass->name, name))
2348 {
2349 TRACE("Returning pass %p\n", pass);
2350 return get_pass_handle(pass);
2351 }
2352 }
2353 }
2354
2355 WARN("Pass not found.\n");
2356
2357 return NULL;
2358}
2359
2361{
2362 FIXME("iface %p, index %u stub.\n", iface, index);
2363
2364 return NULL;
2365}
2366
2367static D3DXHANDLE WINAPI d3dx_effect_GetFunctionByName(ID3DXEffect *iface, const char *name)
2368{
2369 FIXME("iface %p, name %s stub.\n", iface, debugstr_a(name));
2370
2371 return NULL;
2372}
2373
2375{
2376 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2377 struct d3dx_parameter *annotations = NULL;
2378 unsigned int annotation_count;
2379
2380 TRACE("iface %p, object %p, index %u.\n", iface, object, index);
2381
2382 annotation_count = get_annotation_from_object(effect, object, &annotations);
2383
2384 if (index < annotation_count)
2385 {
2386 TRACE("Returning parameter %p\n", &annotations[index]);
2387 return get_parameter_handle(&annotations[index]);
2388 }
2389
2390 WARN("Annotation not found.\n");
2391
2392 return NULL;
2393}
2394
2396 const char *name)
2397{
2398 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2399 struct d3dx_parameter *annotation = NULL;
2400 struct d3dx_parameter *annotations = NULL;
2401 unsigned int annotation_count;
2402
2403 TRACE("iface %p, object %p, name %s.\n", iface, object, debugstr_a(name));
2404
2405 if (!name)
2406 {
2407 WARN("Invalid argument specified\n");
2408 return NULL;
2409 }
2410
2411 annotation_count = get_annotation_from_object(effect, object, &annotations);
2412
2413 annotation = get_annotation_by_name(effect, annotation_count, annotations, name);
2414 if (annotation)
2415 {
2416 TRACE("Returning parameter %p\n", annotation);
2418 }
2419
2420 WARN("Annotation not found.\n");
2421
2422 return NULL;
2423}
2424
2425static HRESULT WINAPI d3dx_effect_SetValue(ID3DXEffect *iface, D3DXHANDLE parameter,
2426 const void *data, UINT bytes)
2427{
2428 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2429 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2430
2431 TRACE("iface %p, parameter %p, data %p, bytes %u.\n", iface, parameter, data, bytes);
2432
2433 if (!param)
2434 {
2435 WARN("Invalid parameter %p specified.\n", parameter);
2436 return D3DERR_INVALIDCALL;
2437 }
2438 if (param->class == D3DXPC_OBJECT && is_param_type_sampler(param->type))
2439 {
2440 WARN("Parameter is a sampler, returning E_FAIL.\n");
2441 return E_FAIL;
2442 }
2443
2444 if (data && param->bytes <= bytes)
2445 return set_value(param, data, bytes, param_get_data_and_dirtify(effect, param, param->bytes, TRUE));
2446
2447 WARN("Invalid argument specified.\n");
2448
2449 return D3DERR_INVALIDCALL;
2450}
2451
2452static HRESULT WINAPI d3dx_effect_GetValue(ID3DXEffect *iface, D3DXHANDLE parameter, void *data, UINT bytes)
2453{
2454 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2455 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2456
2457 TRACE("iface %p, parameter %p, data %p, bytes %u.\n", iface, parameter, data, bytes);
2458
2459 if (!param)
2460 {
2461 WARN("Invalid parameter %p specified.\n", parameter);
2462 return D3DERR_INVALIDCALL;
2463 }
2464 if (param->class == D3DXPC_OBJECT && is_param_type_sampler(param->type))
2465 {
2466 WARN("Parameter is a sampler, returning E_FAIL.\n");
2467 return E_FAIL;
2468 }
2469
2470 if (data && param->bytes <= bytes)
2471 {
2472 TRACE("Type %s.\n", debug_d3dxparameter_type(param->type));
2473
2474 switch (param->type)
2475 {
2476 case D3DXPT_VOID:
2477 case D3DXPT_BOOL:
2478 case D3DXPT_INT:
2479 case D3DXPT_FLOAT:
2480 case D3DXPT_STRING:
2481 break;
2482
2484 case D3DXPT_PIXELSHADER:
2485 case D3DXPT_TEXTURE:
2486 case D3DXPT_TEXTURE1D:
2487 case D3DXPT_TEXTURE2D:
2488 case D3DXPT_TEXTURE3D:
2489 case D3DXPT_TEXTURECUBE:
2490 {
2491 unsigned int i;
2492
2493 for (i = 0; i < (param->element_count ? param->element_count : 1); ++i)
2494 {
2495 IUnknown *unk = ((IUnknown **)param->data)[i];
2496 if (unk)
2497 IUnknown_AddRef(unk);
2498 }
2499 break;
2500 }
2501
2502 default:
2503 FIXME("Unhandled type %s.\n", debug_d3dxparameter_type(param->type));
2504 break;
2505 }
2506
2507 TRACE("Copy %u bytes.\n", param->bytes);
2508 memcpy(data, param->data, param->bytes);
2509 return D3D_OK;
2510 }
2511
2512 WARN("Parameter not found.\n");
2513
2514 return D3DERR_INVALIDCALL;
2515}
2516
2517static HRESULT WINAPI d3dx_effect_SetBool(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL b)
2518{
2519 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2520 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2521
2522 TRACE("iface %p, parameter %p, b %#x.\n", iface, parameter, b);
2523
2524 if (param && !param->element_count && param->rows == 1 && param->columns == 1)
2525 {
2526 set_number(param_get_data_and_dirtify(effect, param, sizeof(int), TRUE),
2527 param->type, &b, D3DXPT_BOOL);
2528 return D3D_OK;
2529 }
2530
2531 WARN("Parameter not found.\n");
2532
2533 return D3DERR_INVALIDCALL;
2534}
2535
2536static HRESULT WINAPI d3dx_effect_GetBool(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL *b)
2537{
2538 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2539 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2540
2541 TRACE("iface %p, parameter %p, b %p.\n", iface, parameter, b);
2542
2543 if (b && param && !param->element_count && param->rows == 1 && param->columns == 1)
2544 {
2545 set_number(b, D3DXPT_BOOL, param->data, param->type);
2546 TRACE("Returning %s\n", *b ? "TRUE" : "FALSE");
2547 return D3D_OK;
2548 }
2549
2550 WARN("Parameter not found.\n");
2551
2552 return D3DERR_INVALIDCALL;
2553}
2554
2555static HRESULT WINAPI d3dx_effect_SetBoolArray(ID3DXEffect *iface, D3DXHANDLE parameter, const BOOL *b, UINT count)
2556{
2557 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2558 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2559 DWORD *data;
2560
2561 TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
2562
2563 if (param)
2564 {
2565 unsigned int i, size = min(count, param->bytes / sizeof(DWORD));
2566
2567 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
2568
2569 switch (param->class)
2570 {
2571 case D3DXPC_SCALAR:
2572 case D3DXPC_VECTOR:
2573 case D3DXPC_MATRIX_ROWS:
2574 data = param_get_data_and_dirtify(effect, param, size * sizeof(int), TRUE);
2575 for (i = 0; i < size; ++i)
2576 {
2577 /* don't crop the input, use D3DXPT_INT instead of D3DXPT_BOOL */
2578 set_number(data + i, param->type, &b[i], D3DXPT_INT);
2579 }
2580 return D3D_OK;
2581
2582 case D3DXPC_OBJECT:
2583 case D3DXPC_STRUCT:
2584 break;
2585
2586 default:
2587 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
2588 break;
2589 }
2590 }
2591
2592 WARN("Parameter not found.\n");
2593
2594 return D3DERR_INVALIDCALL;
2595}
2596
2597static HRESULT WINAPI d3dx_effect_GetBoolArray(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL *b, UINT count)
2598{
2599 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2600 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2601
2602 TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
2603
2604 if (b && param && (param->class == D3DXPC_SCALAR
2605 || param->class == D3DXPC_VECTOR
2606 || param->class == D3DXPC_MATRIX_ROWS
2607 || param->class == D3DXPC_MATRIX_COLUMNS))
2608 {
2609 unsigned int i, size = min(count, param->bytes / sizeof(DWORD));
2610
2611 for (i = 0; i < size; ++i)
2612 {
2613 set_number(&b[i], D3DXPT_BOOL, (DWORD *)param->data + i, param->type);
2614 }
2615 return D3D_OK;
2616 }
2617
2618 WARN("Parameter not found.\n");
2619
2620 return D3DERR_INVALIDCALL;
2621}
2622
2623static HRESULT WINAPI d3dx_effect_SetInt(ID3DXEffect *iface, D3DXHANDLE parameter, INT n)
2624{
2625 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2626 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2627
2628 TRACE("iface %p, parameter %p, n %d.\n", iface, parameter, n);
2629
2630 if (param && !param->element_count)
2631 {
2632 if (param->rows == 1 && param->columns == 1)
2633 {
2634 DWORD value;
2635
2636 set_number(&value, param->type, &n, D3DXPT_INT);
2637 *(DWORD *)param_get_data_and_dirtify(effect, param, sizeof(int),
2638 value != *(DWORD *)param->data) = value;
2639 return D3D_OK;
2640 }
2641
2642 /* Split the value if parameter is a vector with dimension 3 or 4. */
2643 if (param->type == D3DXPT_FLOAT
2644 && ((param->class == D3DXPC_VECTOR && param->columns != 2)
2645 || (param->class == D3DXPC_MATRIX_ROWS && param->rows != 2 && param->columns == 1)))
2646 {
2647 float *data;
2648
2649 TRACE("Vector fixup.\n");
2650
2652 min(4, param->rows * param->columns) * sizeof(float), TRUE);
2653
2654 data[0] = ((n & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
2655 data[1] = ((n & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
2656 data[2] = (n & 0xff) * INT_FLOAT_MULTI_INVERSE;
2657 if (param->rows * param->columns > 3)
2658 data[3] = ((n & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
2659
2660 return D3D_OK;
2661 }
2662 }
2663
2664 WARN("Parameter not found.\n");
2665
2666 return D3DERR_INVALIDCALL;
2667}
2668
2669static HRESULT WINAPI d3dx_effect_GetInt(ID3DXEffect *iface, D3DXHANDLE parameter, INT *n)
2670{
2671 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2672 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2673
2674 TRACE("iface %p, parameter %p, n %p.\n", iface, parameter, n);
2675
2676 if (n && param && !param->element_count)
2677 {
2678 if (param->columns == 1 && param->rows == 1)
2679 {
2680 set_number(n, D3DXPT_INT, param->data, param->type);
2681 TRACE("Returning %d.\n", *n);
2682 return D3D_OK;
2683 }
2684
2685 if (param->type == D3DXPT_FLOAT &&
2686 ((param->class == D3DXPC_VECTOR && param->columns != 2)
2687 || (param->class == D3DXPC_MATRIX_ROWS && param->rows != 2 && param->columns == 1)))
2688 {
2689 TRACE("Vector fixup.\n");
2690
2691 *n = min(max(0.0f, *((float *)param->data + 2)), 1.0f) * INT_FLOAT_MULTI;
2692 *n += ((int)(min(max(0.0f, *((float *)param->data + 1)), 1.0f) * INT_FLOAT_MULTI)) << 8;
2693 *n += ((int)(min(max(0.0f, *((float *)param->data + 0)), 1.0f) * INT_FLOAT_MULTI)) << 16;
2694 if (param->columns * param->rows > 3)
2695 *n += ((int)(min(max(0.0f, *((float *)param->data + 3)), 1.0f) * INT_FLOAT_MULTI)) << 24;
2696
2697 TRACE("Returning %d.\n", *n);
2698 return D3D_OK;
2699 }
2700 }
2701
2702 WARN("Parameter not found.\n");
2703
2704 return D3DERR_INVALIDCALL;
2705}
2706
2707static HRESULT WINAPI d3dx_effect_SetIntArray(ID3DXEffect *iface, D3DXHANDLE parameter, const INT *n, UINT count)
2708{
2709 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2710 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2711 DWORD *data;
2712
2713 TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
2714
2715 if (param)
2716 {
2717 unsigned int i, size = min(count, param->bytes / sizeof(DWORD));
2718
2719 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
2720
2721 switch (param->class)
2722 {
2723 case D3DXPC_SCALAR:
2724 case D3DXPC_VECTOR:
2725 case D3DXPC_MATRIX_ROWS:
2726 data = param_get_data_and_dirtify(effect, param, size * sizeof(int), TRUE);
2727 for (i = 0; i < size; ++i)
2728 set_number(data + i, param->type, &n[i], D3DXPT_INT);
2729 return D3D_OK;
2730
2731 case D3DXPC_OBJECT:
2732 case D3DXPC_STRUCT:
2733 break;
2734
2735 default:
2736 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
2737 break;
2738 }
2739 }
2740
2741 WARN("Parameter not found.\n");
2742
2743 return D3DERR_INVALIDCALL;
2744}
2745
2746static HRESULT WINAPI d3dx_effect_GetIntArray(ID3DXEffect *iface, D3DXHANDLE parameter, INT *n, UINT count)
2747{
2748 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2749 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2750
2751 TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
2752
2753 if (n && param && (param->class == D3DXPC_SCALAR
2754 || param->class == D3DXPC_VECTOR
2755 || param->class == D3DXPC_MATRIX_ROWS
2756 || param->class == D3DXPC_MATRIX_COLUMNS))
2757 {
2758 unsigned int i, size = min(count, param->bytes / sizeof(DWORD));
2759
2760 for (i = 0; i < size; ++i)
2761 set_number(&n[i], D3DXPT_INT, (DWORD *)param->data + i, param->type);
2762 return D3D_OK;
2763 }
2764
2765 WARN("Parameter not found.\n");
2766
2767 return D3DERR_INVALIDCALL;
2768}
2769
2770static HRESULT WINAPI d3dx_effect_SetFloat(ID3DXEffect *iface, D3DXHANDLE parameter, float f)
2771{
2772 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2773 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2774
2775 TRACE("iface %p, parameter %p, f %.8e.\n", iface, parameter, f);
2776
2777 if (param && !param->element_count && param->rows == 1 && param->columns == 1)
2778 {
2779 DWORD value;
2780
2781 set_number(&value, param->type, &f, D3DXPT_FLOAT);
2782 *(DWORD *)param_get_data_and_dirtify(effect, param, sizeof(float),
2783 value != *(DWORD *)param->data) = value;
2784 return D3D_OK;
2785 }
2786
2787 WARN("Parameter not found.\n");
2788
2789 return D3DERR_INVALIDCALL;
2790}
2791
2792static HRESULT WINAPI d3dx_effect_GetFloat(ID3DXEffect *iface, D3DXHANDLE parameter, float *f)
2793{
2794 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2795 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2796
2797 TRACE("iface %p, parameter %p, f %p.\n", iface, parameter, f);
2798
2799 if (f && param && !param->element_count && param->columns == 1 && param->rows == 1)
2800 {
2801 set_number(f, D3DXPT_FLOAT, (DWORD *)param->data, param->type);
2802 TRACE("Returning %f.\n", *f);
2803 return D3D_OK;
2804 }
2805
2806 WARN("Parameter not found.\n");
2807
2808 return D3DERR_INVALIDCALL;
2809}
2810
2811static HRESULT WINAPI d3dx_effect_SetFloatArray(ID3DXEffect *iface, D3DXHANDLE parameter,
2812 const float *f, UINT count)
2813{
2814 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2815 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2816 DWORD *data;
2817
2818 TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
2819
2820 if (param)
2821 {
2822 unsigned int i, size = min(count, param->bytes / sizeof(DWORD));
2823
2824 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
2825
2826 switch (param->class)
2827 {
2828 case D3DXPC_SCALAR:
2829 case D3DXPC_VECTOR:
2830 case D3DXPC_MATRIX_ROWS:
2831 data = param_get_data_and_dirtify(effect, param, size * sizeof(float), TRUE);
2832 for (i = 0; i < size; ++i)
2833 set_number(data + i, param->type, &f[i], D3DXPT_FLOAT);
2834 return D3D_OK;
2835
2836 case D3DXPC_OBJECT:
2837 case D3DXPC_STRUCT:
2838 break;
2839
2840 default:
2841 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
2842 break;
2843 }
2844 }
2845
2846 WARN("Parameter not found.\n");
2847
2848 return D3DERR_INVALIDCALL;
2849}
2850
2851static HRESULT WINAPI d3dx_effect_GetFloatArray(ID3DXEffect *iface, D3DXHANDLE parameter, float *f, UINT count)
2852{
2853 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2854 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2855
2856 TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
2857
2858 if (f && param && (param->class == D3DXPC_SCALAR
2859 || param->class == D3DXPC_VECTOR
2860 || param->class == D3DXPC_MATRIX_ROWS
2861 || param->class == D3DXPC_MATRIX_COLUMNS))
2862 {
2863 unsigned int i, size = min(count, param->bytes / sizeof(DWORD));
2864
2865 for (i = 0; i < size; ++i)
2866 set_number(&f[i], D3DXPT_FLOAT, (DWORD *)param->data + i, param->type);
2867 return D3D_OK;
2868 }
2869
2870 WARN("Parameter not found.\n");
2871
2872 return D3DERR_INVALIDCALL;
2873}
2874
2875static HRESULT WINAPI d3dx_effect_SetVector(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
2876{
2877 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2878 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2879
2880 TRACE("iface %p, parameter %p, vector %p.\n", iface, parameter, vector);
2881
2882 if (param && !param->element_count)
2883 {
2884 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
2885
2886 switch (param->class)
2887 {
2888 case D3DXPC_SCALAR:
2889 case D3DXPC_VECTOR:
2890 if (param->type == D3DXPT_INT && param->bytes == 4)
2891 {
2892 DWORD tmp;
2893
2894 TRACE("INT fixup.\n");
2895 tmp = max(min(vector->z, 1.0f), 0.0f) * INT_FLOAT_MULTI;
2896 tmp += ((DWORD)(max(min(vector->y, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 8;
2897 tmp += ((DWORD)(max(min(vector->x, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16;
2898 tmp += ((DWORD)(max(min(vector->w, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24;
2899
2900 *(int *)param_get_data_and_dirtify(effect, param, sizeof(int), TRUE) = tmp;
2901 return D3D_OK;
2902 }
2903 if (param->type == D3DXPT_FLOAT)
2904 {
2905 memcpy(param_get_data_and_dirtify(effect, param, param->columns * sizeof(float), TRUE),
2906 vector, param->columns * sizeof(float));
2907 return D3D_OK;
2908 }
2909
2910 set_vector(param, vector, param_get_data_and_dirtify(effect, param, param->columns * sizeof(float), TRUE));
2911 return D3D_OK;
2912
2913 case D3DXPC_MATRIX_ROWS:
2914 case D3DXPC_OBJECT:
2915 case D3DXPC_STRUCT:
2916 break;
2917
2918 default:
2919 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
2920 break;
2921 }
2922 }
2923
2924 WARN("Parameter not found.\n");
2925
2926 return D3DERR_INVALIDCALL;
2927}
2928
2929static HRESULT WINAPI d3dx_effect_GetVector(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXVECTOR4 *vector)
2930{
2931 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2932 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2933
2934 TRACE("iface %p, parameter %p, vector %p.\n", iface, parameter, vector);
2935
2936 if (vector && param && !param->element_count)
2937 {
2938 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
2939
2940 switch (param->class)
2941 {
2942 case D3DXPC_SCALAR:
2943 case D3DXPC_VECTOR:
2944 if (param->type == D3DXPT_INT && param->bytes == 4)
2945 {
2946 TRACE("INT fixup.\n");
2947 vector->x = (((*(int *)param->data) & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
2948 vector->y = (((*(int *)param->data) & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
2949 vector->z = ((*(int *)param->data) & 0xff) * INT_FLOAT_MULTI_INVERSE;
2950 vector->w = (((*(int *)param->data) & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
2951 return D3D_OK;
2952 }
2954 return D3D_OK;
2955
2956 case D3DXPC_MATRIX_ROWS:
2957 case D3DXPC_OBJECT:
2958 case D3DXPC_STRUCT:
2959 break;
2960
2961 default:
2962 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
2963 break;
2964 }
2965 }
2966
2967 WARN("Parameter not found.\n");
2968
2969 return D3DERR_INVALIDCALL;
2970}
2971
2972static HRESULT WINAPI d3dx_effect_SetVectorArray(ID3DXEffect *iface, D3DXHANDLE parameter,
2973 const D3DXVECTOR4 *vector, UINT count)
2974{
2975 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
2976 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
2977
2978 TRACE("iface %p, parameter %p, vector %p, count %u.\n", iface, parameter, vector, count);
2979
2980 if (param && param->element_count && param->element_count >= count)
2981 {
2982 unsigned int i;
2983 BYTE *data;
2984
2985 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
2986
2987 switch (param->class)
2988 {
2989 case D3DXPC_VECTOR:
2990 data = param_get_data_and_dirtify(effect, param, count * param->columns * sizeof(float), TRUE);
2991
2992 if (param->type == D3DXPT_FLOAT)
2993 {
2994 if (param->columns == 4)
2995 {
2996 memcpy(data, vector, count * 4 * sizeof(float));
2997 }
2998 else
2999 {
3000 for (i = 0; i < count; ++i)
3001 memcpy((float *)data + param->columns * i, vector + i,
3002 param->columns * sizeof(float));
3003 }
3004 return D3D_OK;
3005 }
3006
3007 for (i = 0; i < count; ++i)
3008 set_vector(&param->members[i], &vector[i], data + i * param->columns * sizeof(float));
3009
3010 return D3D_OK;
3011
3012 case D3DXPC_SCALAR:
3013 case D3DXPC_MATRIX_ROWS:
3014 case D3DXPC_OBJECT:
3015 case D3DXPC_STRUCT:
3016 break;
3017
3018 default:
3019 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3020 break;
3021 }
3022 }
3023
3024 WARN("Parameter not found.\n");
3025
3026 return D3DERR_INVALIDCALL;
3027}
3028
3029static HRESULT WINAPI d3dx_effect_GetVectorArray(ID3DXEffect *iface, D3DXHANDLE parameter,
3031{
3032 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3033 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3034
3035 TRACE("iface %p, parameter %p, vector %p, count %u.\n", iface, parameter, vector, count);
3036
3037 if (!count)
3038 return D3D_OK;
3039
3040 if (vector && param && count <= param->element_count)
3041 {
3042 unsigned int i;
3043
3044 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3045
3046 switch (param->class)
3047 {
3048 case D3DXPC_VECTOR:
3049 for (i = 0; i < count; ++i)
3050 get_vector(&param->members[i], &vector[i]);
3051 return D3D_OK;
3052
3053 case D3DXPC_SCALAR:
3054 case D3DXPC_MATRIX_ROWS:
3055 case D3DXPC_OBJECT:
3056 case D3DXPC_STRUCT:
3057 break;
3058
3059 default:
3060 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3061 break;
3062 }
3063 }
3064
3065 WARN("Parameter not found.\n");
3066
3067 return D3DERR_INVALIDCALL;
3068}
3069
3070static HRESULT WINAPI d3dx_effect_SetMatrix(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix)
3071{
3072 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3073 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3074
3075 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3076
3077 if (param && !param->element_count)
3078 {
3079 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3080
3081 switch (param->class)
3082 {
3083 case D3DXPC_MATRIX_ROWS:
3085 param->rows * param->columns * sizeof(float), TRUE));
3086 return D3D_OK;
3087
3088 case D3DXPC_SCALAR:
3089 case D3DXPC_VECTOR:
3090 case D3DXPC_OBJECT:
3091 case D3DXPC_STRUCT:
3092 break;
3093
3094 default:
3095 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3096 break;
3097 }
3098 }
3099
3100 WARN("Parameter not found.\n");
3101
3102 return D3DERR_INVALIDCALL;
3103}
3104
3105static HRESULT WINAPI d3dx_effect_GetMatrix(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix)
3106{
3107 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3108 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3109
3110 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3111
3112 if (matrix && param && !param->element_count)
3113 {
3114 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3115
3116 switch (param->class)
3117 {
3118 case D3DXPC_MATRIX_ROWS:
3120 return D3D_OK;
3121
3122 case D3DXPC_SCALAR:
3123 case D3DXPC_VECTOR:
3124 case D3DXPC_OBJECT:
3125 case D3DXPC_STRUCT:
3126 break;
3127
3128 default:
3129 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3130 break;
3131 }
3132 }
3133
3134 WARN("Parameter not found.\n");
3135
3136 return D3DERR_INVALIDCALL;
3137}
3138
3139static HRESULT WINAPI d3dx_effect_SetMatrixArray(ID3DXEffect *iface, D3DXHANDLE parameter,
3140 const D3DXMATRIX *matrix, UINT count)
3141{
3142 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3143 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3144
3145 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3146
3147 if (param && param->element_count >= count)
3148 {
3149 unsigned int i;
3150 BYTE *data;
3151
3152 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3153
3154 switch (param->class)
3155 {
3156 case D3DXPC_MATRIX_ROWS:
3158 * param->columns * sizeof(float), TRUE);
3159
3160 for (i = 0; i < count; ++i)
3161 set_matrix(&param->members[i], &matrix[i],
3162 data + i * param->rows * param->columns * sizeof(float));
3163
3164 return D3D_OK;
3165
3166 case D3DXPC_SCALAR:
3167 case D3DXPC_VECTOR:
3168 case D3DXPC_OBJECT:
3169 case D3DXPC_STRUCT:
3170 break;
3171
3172 default:
3173 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3174 break;
3175 }
3176 }
3177
3178 WARN("Parameter not found.\n");
3179
3180 return D3DERR_INVALIDCALL;
3181}
3182
3183static HRESULT WINAPI d3dx_effect_GetMatrixArray(ID3DXEffect *iface, D3DXHANDLE parameter,
3185{
3186 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3187 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3188
3189 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3190
3191 if (!count)
3192 return D3D_OK;
3193
3194 if (matrix && param && count <= param->element_count)
3195 {
3196 unsigned int i;
3197
3198 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3199
3200 switch (param->class)
3201 {
3202 case D3DXPC_MATRIX_ROWS:
3203 for (i = 0; i < count; ++i)
3204 get_matrix(&param->members[i], &matrix[i], FALSE);
3205 return D3D_OK;
3206
3207 case D3DXPC_SCALAR:
3208 case D3DXPC_VECTOR:
3209 case D3DXPC_OBJECT:
3210 case D3DXPC_STRUCT:
3211 break;
3212
3213 default:
3214 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3215 break;
3216 }
3217 }
3218
3219 WARN("Parameter not found.\n");
3220
3221 return D3DERR_INVALIDCALL;
3222}
3223
3224static HRESULT WINAPI d3dx_effect_SetMatrixPointerArray(ID3DXEffect *iface, D3DXHANDLE parameter,
3225 const D3DXMATRIX **matrix, UINT count)
3226{
3227 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3228 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3229
3230 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3231
3232 if (param && count <= param->element_count)
3233 {
3234 unsigned int i;
3235 BYTE *data;
3236
3237 switch (param->class)
3238 {
3239 case D3DXPC_MATRIX_ROWS:
3241 * param->columns * sizeof(float), TRUE);
3242
3243 for (i = 0; i < count; ++i)
3244 set_matrix(&param->members[i], matrix[i], data + i * param->rows
3245 * param->columns * sizeof(float));
3246
3247 return D3D_OK;
3248
3249 case D3DXPC_SCALAR:
3250 case D3DXPC_VECTOR:
3251 case D3DXPC_OBJECT:
3252 break;
3253
3254 default:
3255 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3256 break;
3257 }
3258 }
3259
3260 WARN("Parameter not found.\n");
3261
3262 return D3DERR_INVALIDCALL;
3263}
3264
3265static HRESULT WINAPI d3dx_effect_GetMatrixPointerArray(ID3DXEffect *iface, D3DXHANDLE parameter,
3267{
3268 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3269 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3270
3271 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3272
3273 if (!count)
3274 return D3D_OK;
3275
3276 if (param && matrix && count <= param->element_count)
3277 {
3278 unsigned int i;
3279
3280 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3281
3282 switch (param->class)
3283 {
3284 case D3DXPC_MATRIX_ROWS:
3285 for (i = 0; i < count; ++i)
3286 get_matrix(&param->members[i], matrix[i], FALSE);
3287 return D3D_OK;
3288
3289 case D3DXPC_SCALAR:
3290 case D3DXPC_VECTOR:
3291 case D3DXPC_OBJECT:
3292 break;
3293
3294 default:
3295 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3296 break;
3297 }
3298 }
3299
3300 WARN("Parameter not found.\n");
3301
3302 return D3DERR_INVALIDCALL;
3303}
3304
3305static HRESULT WINAPI d3dx_effect_SetMatrixTranspose(ID3DXEffect *iface, D3DXHANDLE parameter,
3306 const D3DXMATRIX *matrix)
3307{
3308 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3309 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3310
3311 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3312
3313 if (param && !param->element_count)
3314 {
3315 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3316
3317 switch (param->class)
3318 {
3319 case D3DXPC_MATRIX_ROWS:
3321 param->rows * param->columns * sizeof(float), TRUE));
3322 return D3D_OK;
3323
3324 case D3DXPC_SCALAR:
3325 case D3DXPC_VECTOR:
3326 case D3DXPC_OBJECT:
3327 case D3DXPC_STRUCT:
3328 break;
3329
3330 default:
3331 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3332 break;
3333 }
3334 }
3335
3336 WARN("Parameter not found.\n");
3337
3338 return D3DERR_INVALIDCALL;
3339}
3340
3341static HRESULT WINAPI d3dx_effect_GetMatrixTranspose(ID3DXEffect *iface, D3DXHANDLE parameter,
3343{
3344 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3345 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3346
3347 TRACE("iface %p, parameter %p, matrix %p.\n", iface, parameter, matrix);
3348
3349 if (matrix && param && !param->element_count)
3350 {
3351 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3352
3353 switch (param->class)
3354 {
3355 case D3DXPC_SCALAR:
3356 case D3DXPC_VECTOR:
3358 return D3D_OK;
3359
3360 case D3DXPC_MATRIX_ROWS:
3362 return D3D_OK;
3363
3364 case D3DXPC_OBJECT:
3365 case D3DXPC_STRUCT:
3366 break;
3367
3368 default:
3369 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3370 break;
3371 }
3372 }
3373
3374 WARN("Parameter not found.\n");
3375
3376 return D3DERR_INVALIDCALL;
3377}
3378
3380 const D3DXMATRIX *matrix, UINT count)
3381{
3382 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3383 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3384
3385 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3386
3387 if (param && param->element_count >= count)
3388 {
3389 unsigned int i;
3390 BYTE *data;
3391
3392 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3393
3394 switch (param->class)
3395 {
3396 case D3DXPC_MATRIX_ROWS:
3398 * param->columns * sizeof(float), TRUE);
3399
3400 for (i = 0; i < count; ++i)
3401 set_matrix_transpose(&param->members[i], &matrix[i], data
3402 + i * param->rows * param->columns * sizeof(float));
3403
3404 return D3D_OK;
3405
3406 case D3DXPC_SCALAR:
3407 case D3DXPC_VECTOR:
3408 case D3DXPC_OBJECT:
3409 case D3DXPC_STRUCT:
3410 break;
3411
3412 default:
3413 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3414 break;
3415 }
3416 }
3417
3418 WARN("Parameter not found.\n");
3419
3420 return D3DERR_INVALIDCALL;
3421}
3422
3425{
3426 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3427 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3428
3429 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3430
3431 if (!count)
3432 return D3D_OK;
3433
3434 if (matrix && param && count <= param->element_count)
3435 {
3436 unsigned int i;
3437
3438 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3439
3440 switch (param->class)
3441 {
3442 case D3DXPC_MATRIX_ROWS:
3443 for (i = 0; i < count; ++i)
3444 get_matrix(&param->members[i], &matrix[i], TRUE);
3445 return D3D_OK;
3446
3447 case D3DXPC_SCALAR:
3448 case D3DXPC_VECTOR:
3449 case D3DXPC_OBJECT:
3450 case D3DXPC_STRUCT:
3451 break;
3452
3453 default:
3454 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3455 break;
3456 }
3457 }
3458
3459 WARN("Parameter not found.\n");
3460
3461 return D3DERR_INVALIDCALL;
3462}
3463
3465 const D3DXMATRIX **matrix, UINT count)
3466{
3467 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3468 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3469
3470 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3471
3472 if (param && count <= param->element_count)
3473 {
3474 unsigned int i;
3475 BYTE *data;
3476
3477 switch (param->class)
3478 {
3479 case D3DXPC_MATRIX_ROWS:
3481 * param->columns * sizeof(float), TRUE);
3482
3483 for (i = 0; i < count; ++i)
3484 set_matrix_transpose(&param->members[i], matrix[i], data
3485 + i * param->rows * param->columns * sizeof(float));
3486
3487 return D3D_OK;
3488
3489 case D3DXPC_SCALAR:
3490 case D3DXPC_VECTOR:
3491 case D3DXPC_OBJECT:
3492 break;
3493
3494 default:
3495 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3496 break;
3497 }
3498 }
3499
3500 WARN("Parameter not found.\n");
3501
3502 return D3DERR_INVALIDCALL;
3503}
3504
3507{
3508 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3509 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3510
3511 TRACE("iface %p, parameter %p, matrix %p, count %u.\n", iface, parameter, matrix, count);
3512
3513 if (!count)
3514 return D3D_OK;
3515
3516 if (matrix && param && count <= param->element_count)
3517 {
3518 unsigned int i;
3519
3520 TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
3521
3522 switch (param->class)
3523 {
3524 case D3DXPC_MATRIX_ROWS:
3525 for (i = 0; i < count; ++i)
3526 get_matrix(&param->members[i], matrix[i], TRUE);
3527 return D3D_OK;
3528
3529 case D3DXPC_SCALAR:
3530 case D3DXPC_VECTOR:
3531 case D3DXPC_OBJECT:
3532 break;
3533
3534 default:
3535 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
3536 break;
3537 }
3538 }
3539
3540 WARN("Parameter not found.\n");
3541
3542 return D3DERR_INVALIDCALL;
3543}
3544
3545static HRESULT WINAPI d3dx_effect_SetString(ID3DXEffect *iface, D3DXHANDLE parameter, const char *string)
3546{
3547 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3548 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3549
3550 TRACE("iface %p, parameter %p, string %s.\n", iface, parameter, debugstr_a(string));
3551
3552 if (param && param->type == D3DXPT_STRING)
3553 return set_string(param_get_data_and_dirtify(effect, param, sizeof(void *), TRUE), string);
3554
3555 WARN("Parameter not found.\n");
3556
3557 return D3DERR_INVALIDCALL;
3558}
3559
3560static HRESULT WINAPI d3dx_effect_GetString(ID3DXEffect *iface, D3DXHANDLE parameter, const char **string)
3561{
3562 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3563 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3564
3565 TRACE("iface %p, parameter %p, string %p.\n", iface, parameter, string);
3566
3567 if (string && param && !param->element_count && param->type == D3DXPT_STRING)
3568 {
3569 *string = *(const char **)param->data;
3570 TRACE("Returning %s.\n", debugstr_a(*string));
3571 return D3D_OK;
3572 }
3573
3574 WARN("Parameter not found.\n");
3575
3576 return D3DERR_INVALIDCALL;
3577}
3578
3579static HRESULT WINAPI d3dx_effect_SetTexture(ID3DXEffect *iface, D3DXHANDLE parameter,
3580 IDirect3DBaseTexture9 *texture)
3581{
3582 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3583 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3584
3585 TRACE("iface %p, parameter %p, texture %p.\n", iface, parameter, texture);
3586
3587 if (param && !param->element_count
3588 && (param->type == D3DXPT_TEXTURE || param->type == D3DXPT_TEXTURE1D
3589 || param->type == D3DXPT_TEXTURE2D || param->type == D3DXPT_TEXTURE3D
3590 || param->type == D3DXPT_TEXTURECUBE))
3591 {
3592 IDirect3DBaseTexture9 **data = param_get_data_and_dirtify(effect, param,
3593 sizeof(void *), texture != *(IDirect3DBaseTexture9 **)param->data);
3594 IDirect3DBaseTexture9 *old_texture = *data;
3595
3596 *data = texture;
3597
3598 if (texture == old_texture)
3599 return D3D_OK;
3600
3601 if (texture)
3603 if (old_texture)
3604 IDirect3DBaseTexture9_Release(old_texture);
3605
3606 return D3D_OK;
3607 }
3608
3609 WARN("Parameter not found.\n");
3610
3611 return D3DERR_INVALIDCALL;
3612}
3613
3614static HRESULT WINAPI d3dx_effect_GetTexture(ID3DXEffect *iface, D3DXHANDLE parameter,
3615 IDirect3DBaseTexture9 **texture)
3616{
3617 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3618 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3619
3620 TRACE("iface %p, parameter %p, texture %p.\n", iface, parameter, texture);
3621
3622 if (texture && param && !param->element_count
3623 && (param->type == D3DXPT_TEXTURE || param->type == D3DXPT_TEXTURE1D
3624 || param->type == D3DXPT_TEXTURE2D || param->type == D3DXPT_TEXTURE3D
3625 || param->type == D3DXPT_TEXTURECUBE))
3626 {
3627 *texture = *(IDirect3DBaseTexture9 **)param->data;
3628 if (*texture)
3630 TRACE("Returning %p.\n", *texture);
3631 return D3D_OK;
3632 }
3633
3634 WARN("Parameter not found.\n");
3635
3636 return D3DERR_INVALIDCALL;
3637}
3638
3639static HRESULT WINAPI d3dx_effect_GetPixelShader(ID3DXEffect *iface, D3DXHANDLE parameter,
3640 IDirect3DPixelShader9 **shader)
3641{
3642 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3643 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3644
3645 TRACE("iface %p, parameter %p, shader %p.\n", iface, parameter, shader);
3646
3647 if (shader && param && !param->element_count && param->type == D3DXPT_PIXELSHADER)
3648 {
3649 if ((*shader = *(IDirect3DPixelShader9 **)param->data))
3651 TRACE("Returning %p.\n", *shader);
3652 return D3D_OK;
3653 }
3654
3655 WARN("Parameter not found.\n");
3656
3657 return D3DERR_INVALIDCALL;
3658}
3659
3660static HRESULT WINAPI d3dx_effect_GetVertexShader(ID3DXEffect *iface, D3DXHANDLE parameter,
3661 IDirect3DVertexShader9 **shader)
3662{
3663 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3664 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3665
3666 TRACE("iface %p, parameter %p, shader %p.\n", iface, parameter, shader);
3667
3668 if (shader && param && !param->element_count && param->type == D3DXPT_VERTEXSHADER)
3669 {
3670 if ((*shader = *(IDirect3DVertexShader9 **)param->data))
3672 TRACE("Returning %p.\n", *shader);
3673 return D3D_OK;
3674 }
3675
3676 WARN("Parameter not found.\n");
3677
3678 return D3DERR_INVALIDCALL;
3679}
3680
3681static HRESULT WINAPI d3dx_effect_SetArrayRange(ID3DXEffect *iface, D3DXHANDLE parameter, UINT start, UINT end)
3682{
3683 FIXME("iface %p, parameter %p, start %u, end %u stub.\n", iface, parameter, start, end);
3684
3685 return E_NOTIMPL;
3686}
3687
3688/*** ID3DXEffect methods ***/
3689static HRESULT WINAPI d3dx_effect_GetPool(ID3DXEffect *iface, ID3DXEffectPool **pool)
3690{
3691 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3692
3693 TRACE("iface %p, pool %p.\n", effect, pool);
3694
3695 if (!pool)
3696 {
3697 WARN("Invalid argument supplied.\n");
3698 return D3DERR_INVALIDCALL;
3699 }
3700
3701 *pool = NULL;
3702 if (effect->pool)
3703 {
3704 *pool = &effect->pool->ID3DXEffectPool_iface;
3705 (*pool)->lpVtbl->AddRef(*pool);
3706 }
3707
3708 TRACE("Returning pool %p.\n", *pool);
3709
3710 return S_OK;
3711}
3712
3713static HRESULT WINAPI d3dx_effect_SetTechnique(ID3DXEffect *iface, D3DXHANDLE technique)
3714{
3715 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3716 struct d3dx_technique *tech = get_valid_technique(effect, technique);
3717
3718 TRACE("iface %p, technique %p\n", iface, technique);
3719
3720 if (tech)
3721 {
3722 effect->active_technique = tech;
3723 TRACE("Technique %p\n", tech);
3724 return D3D_OK;
3725 }
3726
3727 WARN("Technique not found.\n");
3728
3729 return D3DERR_INVALIDCALL;
3730}
3731
3733{
3734 struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
3735
3736 TRACE("iface %p\n", This);
3737
3738 return get_technique_handle(This->active_technique);
3739}
3740
3741static HRESULT WINAPI d3dx_effect_ValidateTechnique(ID3DXEffect *iface, D3DXHANDLE technique)
3742{
3743 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3744 struct d3dx_technique *tech = get_valid_technique(effect, technique);
3745 HRESULT ret = D3D_OK;
3746 unsigned int i, j;
3747
3748 FIXME("iface %p, technique %p semi-stub.\n", iface, technique);
3749
3750 if (!tech)
3751 {
3753 goto done;
3754 }
3755 for (i = 0; i < tech->pass_count; ++i)
3756 {
3757 struct d3dx_pass *pass = &tech->passes[i];
3758
3759 for (j = 0; j < pass->state_count; ++j)
3760 {
3761 struct d3dx_state *state = &pass->states[j];
3762
3763 if (state_table[state->operation].class == SC_VERTEXSHADER
3764 || state_table[state->operation].class == SC_PIXELSHADER)
3765 {
3766 struct d3dx_parameter *param;
3767 void *param_value;
3768 BOOL param_dirty;
3769 HRESULT hr;
3770
3771 if (FAILED(hr = d3dx9_get_param_value_ptr(pass, &pass->states[j], &param_value, &param,
3772 FALSE, &param_dirty)))
3773 return hr;
3774
3775 if (param->object_id && effect->objects[param->object_id].creation_failed)
3776 {
3777 ret = E_FAIL;
3778 goto done;
3779 }
3780 }
3781 }
3782 }
3783done:
3784 TRACE("Returning %#lx.\n", ret);
3785 return ret;
3786}
3787
3789 D3DXHANDLE *next_technique)
3790{
3791 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3792 struct d3dx_technique *prev_tech, *tech;
3793 unsigned int i;
3794
3795 TRACE("iface %p, technique %p, next_technique %p.\n", iface, technique, next_technique);
3796
3797 if (technique)
3798 {
3799 if (!(prev_tech = get_valid_technique(effect, technique)))
3800 return D3DERR_INVALIDCALL;
3801
3802 for (i = 0; i < effect->technique_count; ++i)
3803 {
3804 tech = &effect->techniques[i];
3805 if (tech == prev_tech)
3806 {
3807 ++i;
3808 break;
3809 }
3810 }
3811 }
3812 else
3813 {
3814 i = 0;
3815 }
3816
3817 for (; i < effect->technique_count; ++i)
3818 {
3819 tech = &effect->techniques[i];
3821 {
3822 *next_technique = get_technique_handle(tech);
3823 return D3D_OK;
3824 }
3825 }
3826
3827 *next_technique = NULL;
3828 return S_FALSE;
3829}
3830
3832 void *data);
3833
3835 void *data)
3836{
3837 struct d3dx_parameter **params;
3838 unsigned int i, param_count;
3839
3840 if (!param_eval)
3841 return FALSE;
3842
3843 params = param_eval->shader_inputs.inputs_param;
3844 param_count = param_eval->shader_inputs.input_count;
3845 for (i = 0; i < param_count; ++i)
3846 {
3847 if (walk_parameter_dep(params[i], param_func, data))
3848 return TRUE;
3849 }
3850
3851 params = param_eval->pres.inputs.inputs_param;
3852 param_count = param_eval->pres.inputs.input_count;
3853 for (i = 0; i < param_count; ++i)
3854 {
3855 if (walk_parameter_dep(params[i], param_func, data))
3856 return TRUE;
3857 }
3858 return FALSE;
3859}
3860
3862 void *data)
3863{
3864 if (state->type == ST_CONSTANT && is_param_type_sampler(state->parameter.type))
3865 {
3866 if (walk_parameter_dep(&state->parameter, param_func, data))
3867 return TRUE;
3868 }
3869 else if (state->type == ST_ARRAY_SELECTOR || state->type == ST_PARAMETER)
3870 {
3871 if (walk_parameter_dep(state->referenced_param, param_func, data))
3872 return TRUE;
3873 }
3874 return walk_param_eval_dep(state->parameter.param_eval, param_func, data);
3875}
3876
3878 void *data)
3879{
3880 unsigned int i;
3881 unsigned int member_count;
3882
3883 param = &param->top_level_param->param;
3884 if (param_func(data, param))
3885 return TRUE;
3886
3887 if (walk_param_eval_dep(param->param_eval, param_func, data))
3888 return TRUE;
3889
3890 if (param->class == D3DXPC_OBJECT && is_param_type_sampler(param->type))
3891 {
3892 struct d3dx_sampler *sampler;
3893 unsigned int sampler_idx;
3894 unsigned int samplers_count = max(param->element_count, 1);
3895
3896 for (sampler_idx = 0; sampler_idx < samplers_count; ++sampler_idx)
3897 {
3898 sampler = param->element_count ? param->members[sampler_idx].data : param->data;
3899 for (i = 0; i < sampler->state_count; ++i)
3900 {
3901 if (walk_state_dep(&sampler->states[i], param_func, data))
3902 return TRUE;
3903 }
3904 }
3905 return FALSE;
3906 }
3907
3908 member_count = param->element_count ? param->element_count : param->member_count;
3909 for (i = 0; i < member_count; ++i)
3910 {
3911 if (walk_param_eval_dep(param->members[i].param_eval, param_func, data))
3912 return TRUE;
3913 }
3914
3915 return FALSE;
3916}
3917
3919{
3920 unsigned int i, j;
3921 struct d3dx_pass *pass;
3922
3923 if (!tech || !param)
3924 return FALSE;
3925
3926 for (i = 0; i < tech->pass_count; ++i)
3927 {
3928 pass = &tech->passes[i];
3929 for (j = 0; j < pass->state_count; ++j)
3930 {
3931 if (walk_state_dep(&pass->states[j], is_same_parameter, param))
3932 return TRUE;
3933 }
3934 }
3935 return FALSE;
3936}
3937
3938static BOOL WINAPI d3dx_effect_IsParameterUsed(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXHANDLE technique)
3939{
3940 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3941 struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
3942 struct d3dx_technique *tech = get_valid_technique(effect, technique);
3943 BOOL ret;
3944
3945 TRACE("iface %p, parameter %p, technique %p.\n", iface, parameter, technique);
3946 TRACE("param %p, name %s, tech %p.\n", param, param ? debugstr_a(param->name) : "", tech);
3947
3948 ret = is_parameter_used(param, tech);
3949 TRACE("Returning %#x.\n", ret);
3950 return ret;
3951}
3952
3954{
3955 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
3956 struct d3dx_technique *technique = effect->active_technique;
3957
3958 TRACE("iface %p, passes %p, flags %#lx.\n", iface, passes, flags);
3959
3960 if (technique)
3961 {
3963 WARN("Invalid flags %#lx specified.\n", flags);
3964
3966 {
3967 TRACE("State capturing disabled.\n");
3968 }
3969 else
3970 {
3971 HRESULT hr;
3972 unsigned int i;
3973
3974 if (!technique->saved_state)
3975 {
3976 ID3DXEffectStateManager *manager;
3977
3978 manager = effect->manager;
3979 effect->manager = NULL;
3981 ERR("BeginStateBlock failed, hr %#lx.\n", hr);
3982 for (i = 0; i < technique->pass_count; i++)
3983 d3dx9_apply_pass_states(effect, &technique->passes[i], TRUE);
3984 if (FAILED(hr = IDirect3DDevice9_EndStateBlock(effect->device, &technique->saved_state)))
3985 ERR("EndStateBlock failed, hr %#lx.\n", hr);
3986 effect->manager = manager;
3987 }
3989 ERR("StateBlock Capture failed, hr %#lx.\n", hr);
3990 }
3991
3992 if (passes)
3993 *passes = technique->pass_count;
3994 effect->started = TRUE;
3995 effect->begin_flags = flags;
3996
3997 return D3D_OK;
3998 }
3999
4000 WARN("Invalid argument supplied.\n");
4001
4002 return D3DERR_INVALIDCALL;
4003}
4004
4005static HRESULT WINAPI d3dx_effect_BeginPass(ID3DXEffect *iface, UINT pass)
4006{
4007 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4008 struct d3dx_technique *technique = effect->active_technique;
4009
4010 TRACE("iface %p, pass %u\n", effect, pass);
4011
4012 if (!effect->started)
4013 {
4014 WARN("Effect is not started, returning D3DERR_INVALIDCALL.\n");
4015 return D3DERR_INVALIDCALL;
4016 }
4017
4018 if (technique && pass < technique->pass_count && !effect->active_pass)
4019 {
4020 HRESULT hr;
4021
4022 memset(effect->current_light, 0, sizeof(effect->current_light));
4023 memset(&effect->current_material, 0, sizeof(effect->current_material));
4024
4025 if (SUCCEEDED(hr = d3dx9_apply_pass_states(effect, &technique->passes[pass], TRUE)))
4026 effect->active_pass = &technique->passes[pass];
4027 return hr;
4028 }
4029
4030 WARN("Invalid argument supplied.\n");
4031
4032 return D3DERR_INVALIDCALL;
4033}
4034
4035static HRESULT WINAPI d3dx_effect_CommitChanges(ID3DXEffect *iface)
4036{
4037 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4038
4039 TRACE("iface %p.\n", iface);
4040
4041 if (!effect->active_pass)
4042 {
4043 WARN("Called without an active pass.\n");
4044 return D3D_OK;
4045 }
4046 return d3dx9_apply_pass_states(effect, effect->active_pass, FALSE);
4047}
4048
4049static HRESULT WINAPI d3dx_effect_EndPass(ID3DXEffect *iface)
4050{
4051 struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
4052
4053 TRACE("iface %p\n", This);
4054
4055 if (This->active_pass)
4056 {
4057 This->active_pass = NULL;
4058 return D3D_OK;
4059 }
4060
4061 WARN("Invalid call.\n");
4062
4063 return D3DERR_INVALIDCALL;
4064}
4065
4066static HRESULT WINAPI d3dx_effect_End(ID3DXEffect *iface)
4067{
4068 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4069 struct d3dx_technique *technique = effect->active_technique;
4070
4071 TRACE("iface %p.\n", iface);
4072
4073 if (!effect->started)
4074 return D3D_OK;
4075
4076 if (effect->begin_flags & D3DXFX_DONOTSAVESTATE)
4077 {
4078 TRACE("State restoring disabled.\n");
4079 }
4080 else
4081 {
4082 HRESULT hr;
4083
4084 if (technique && technique->saved_state)
4085 {
4087 ERR("State block apply failed, hr %#lx.\n", hr);
4088 }
4089 else
4090 ERR("No saved state.\n");
4091 }
4092
4093 effect->started = FALSE;
4094
4095 return D3D_OK;
4096}
4097
4098static HRESULT WINAPI d3dx_effect_GetDevice(ID3DXEffect *iface, struct IDirect3DDevice9 **device)
4099{
4100 struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
4101
4102 TRACE("iface %p, device %p\n", This, device);
4103
4104 if (!device)
4105 {
4106 WARN("Invalid argument supplied.\n");
4107 return D3DERR_INVALIDCALL;
4108 }
4109
4111
4112 *device = This->device;
4113
4114 TRACE("Returning device %p\n", *device);
4115
4116 return S_OK;
4117}
4118
4120{
4121 struct IDirect3DVolumeTexture9 *volume_texture;
4122 struct IDirect3DCubeTexture9 *cube_texture;
4123 struct IDirect3DTexture9 *texture;
4124 D3DSURFACE_DESC surface_desc;
4125 D3DVOLUME_DESC volume_desc;
4126
4127 if (param->class == D3DXPC_OBJECT && !param->element_count)
4128 {
4129 switch (param->type)
4130 {
4131 case D3DXPT_TEXTURE:
4132 case D3DXPT_TEXTURE1D:
4133 case D3DXPT_TEXTURE2D:
4134 texture = *(IDirect3DTexture9 **)param->data;
4135 if (!texture)
4136 return FALSE;
4137 IDirect3DTexture9_GetLevelDesc(texture, 0, &surface_desc);
4138 if (surface_desc.Pool != D3DPOOL_DEFAULT)
4139 return FALSE;
4140 break;
4141 case D3DXPT_TEXTURE3D:
4142 volume_texture = *(IDirect3DVolumeTexture9 **)param->data;
4143 if (!volume_texture)
4144 return FALSE;
4145 IDirect3DVolumeTexture9_GetLevelDesc(volume_texture, 0, &volume_desc);
4146 if (volume_desc.Pool != D3DPOOL_DEFAULT)
4147 return FALSE;
4148 break;
4149 case D3DXPT_TEXTURECUBE:
4150 cube_texture = *(IDirect3DCubeTexture9 **)param->data;
4151 if (!cube_texture)
4152 return FALSE;
4153 IDirect3DCubeTexture9_GetLevelDesc(cube_texture, 0, &surface_desc);
4154 if (surface_desc.Pool != D3DPOOL_DEFAULT)
4155 return FALSE;
4156 break;
4157 default:
4158 return FALSE;
4159 }
4160 IUnknown_Release(*(IUnknown **)param->data);
4161 *(IUnknown **)param->data = NULL;
4162 }
4163 return FALSE;
4164}
4165
4166static HRESULT WINAPI d3dx_effect_OnLostDevice(ID3DXEffect *iface)
4167{
4168 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4169 unsigned int i;
4170
4171 TRACE("iface %p.\n", iface);
4172
4173 for (i = 0; i < effect->params.count; ++i)
4174 walk_parameter_tree(&effect->params.parameters[i].param, param_on_lost_device, NULL);
4175
4176 return D3D_OK;
4177}
4178
4179static HRESULT WINAPI d3dx_effect_OnResetDevice(ID3DXEffect *iface)
4180{
4181 struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
4182
4183 FIXME("(%p)->(): stub\n", This);
4184
4185 return E_NOTIMPL;
4186}
4187
4188static HRESULT WINAPI d3dx_effect_SetStateManager(ID3DXEffect *iface, ID3DXEffectStateManager *manager)
4189{
4190 struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
4191
4192 TRACE("iface %p, manager %p\n", This, manager);
4193
4194 if (manager) IUnknown_AddRef(manager);
4195 if (This->manager) IUnknown_Release(This->manager);
4196
4197 This->manager = manager;
4198
4199 return D3D_OK;
4200}
4201
4202static HRESULT WINAPI d3dx_effect_GetStateManager(ID3DXEffect *iface, ID3DXEffectStateManager **manager)
4203{
4204 struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
4205
4206 TRACE("iface %p, manager %p\n", This, manager);
4207
4208 if (!manager)
4209 {
4210 WARN("Invalid argument supplied.\n");
4211 return D3DERR_INVALIDCALL;
4212 }
4213
4214 if (This->manager) IUnknown_AddRef(This->manager);
4215 *manager = This->manager;
4216
4217 return D3D_OK;
4218}
4219
4221{
4222 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4223
4224 TRACE("iface %p.\n", iface);
4225
4226 if (effect->current_parameter_block)
4227 {
4228 WARN("Parameter block is already started.\n");
4229 return D3DERR_INVALIDCALL;
4230 }
4231
4232 effect->current_parameter_block = calloc(1, sizeof(*effect->current_parameter_block));
4235 effect->current_parameter_block->effect = effect;
4236
4237 return D3D_OK;
4238}
4239
4241{
4242 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4243 struct d3dx_parameter_block *ret;
4244 BYTE *new_buffer;
4245
4246 TRACE("iface %p.\n", iface);
4247
4248 if (!effect->current_parameter_block)
4249 {
4250 WARN("No active parameter block.\n");
4251 return NULL;
4252 }
4253 ret = effect->current_parameter_block;
4254
4255 new_buffer = realloc(ret->buffer, ret->offset);
4256 if (new_buffer)
4257 ret->buffer = new_buffer;
4258 ret->size = ret->offset;
4259
4260 effect->current_parameter_block = NULL;
4261 list_add_tail(&effect->parameter_block_list, &ret->entry);
4262 return (D3DXHANDLE)ret;
4263}
4264
4265static HRESULT WINAPI d3dx_effect_ApplyParameterBlock(ID3DXEffect *iface, D3DXHANDLE parameter_block)
4266{
4267 struct d3dx_parameter_block *block = get_valid_parameter_block(parameter_block);
4269
4270 TRACE("iface %p, parameter_block %p.\n", iface, parameter_block);
4271
4272 if (!block || !block->offset)
4273 return D3DERR_INVALIDCALL;
4274
4275 record = (struct d3dx_recorded_parameter *)block->buffer;
4276 while ((BYTE *)record < block->buffer + block->offset)
4277 {
4278 set_value(record->param, record + 1, record->bytes,
4279 param_get_data_and_dirtify(block->effect, record->param, record->bytes, TRUE));
4281 }
4282 assert((BYTE *)record == block->buffer + block->offset);
4283 return D3D_OK;
4284}
4285
4286#if D3DX_SDK_VERSION >= 26
4287static HRESULT WINAPI d3dx_effect_DeleteParameterBlock(ID3DXEffect *iface, D3DXHANDLE parameter_block)
4288{
4289 struct d3dx_parameter_block *block = get_valid_parameter_block(parameter_block);
4290 struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
4291 struct d3dx_parameter_block *b;
4292
4293 TRACE("iface %p, parameter_block %p.\n", iface, parameter_block);
4294
4295 if (!block)
4296 return D3DERR_INVALIDCALL;
4297
4298 LIST_FOR_EACH_ENTRY(b, &effect->parameter_block_list, struct d3dx_parameter_block, entry)
4299 {
4300 if (b == block)
4301 {
4302 list_remove(&b->entry);
4304 return D3D_OK;
4305 }
4306 }
4307
4308 WARN("Block is not found in issued block list, not freeing memory.\n");
4309 return D3DERR_INVALIDCALL;
4310}
4311#endif
4312
4313static bool copy_parameter(struct d3dx_effect *dst_effect, const struct d3dx_effect *src_effect,
4314 struct d3dx_parameter *dst, const struct d3dx_parameter *src)
4315{
4316 IUnknown *iface;
4317
4318 if ((src->flags & PARAMETER_FLAG_SHARED) && dst_effect->pool)
4319 return true;
4320
4321 switch (src->type)
4322 {
4323 case D3DXPT_VOID:
4324 case D3DXPT_BOOL:
4325 case D3DXPT_INT:
4326 case D3DXPT_FLOAT:
4327 memcpy(dst->data, src->data, src->bytes);
4328 break;
4329
4330 case D3DXPT_STRING:
4331 free(*(char **)dst->data);
4332 if (!(*(char **)dst->data = strdup(*(char **)src->data)))
4333 return false;
4334 break;
4335
4336 case D3DXPT_TEXTURE:
4337 case D3DXPT_TEXTURE1D:
4338 case D3DXPT_TEXTURE2D:
4339 case D3DXPT_TEXTURE3D:
4340 case D3DXPT_TEXTURECUBE:
4341 case D3DXPT_PIXELSHADER:
4343 iface = *(IUnknown **)src->data;
4344 if (src_effect->device == dst_effect->device && iface)
4345 {
4346 if (*(IUnknown **)dst->data)
4347 IUnknown_Release(*(IUnknown **)dst->data);
4348 IUnknown_AddRef(iface);
4349 *(IUnknown **)dst->data = iface;
4350 }
4351 break;
4352
4353 case D3DXPT_SAMPLER:
4354 case D3DXPT_SAMPLER1D:
4355 case D3DXPT_SAMPLER2D:
4356 case D3DXPT_SAMPLER3D:
4357 case D3DXPT_SAMPLERCUBE:
4358 /* Nothing to do; these parameters are not mutable and cannot be
4359 * retrieved using API calls. */
4360 break;
4361
4362 default:
4363 FIXME("Unhandled parameter type %#x.\n", src->type);
4364 }
4365
4366 return true;
4367}
4368
4369static HRESULT WINAPI d3dx_effect_CloneEffect(ID3DXEffect *iface, IDirect3DDevice9 *device, ID3DXEffect **out)
4370{
4371 struct d3dx_effect *src = impl_from_ID3DXEffect(iface);
4372 struct d3dx_effect *dst;
4373 unsigned int i, j, k;
4374 HRESULT hr;
4375
4376 TRACE("iface %p, device %p, out %p.\n", iface, device, out);
4377
4378 if (!out)
4379 return D3DERR_INVALIDCALL;
4380
4381 if (src->flags & D3DXFX_NOT_CLONEABLE)
4382 return E_FAIL;
4383
4384 if (!device)
4385 return D3DERR_INVALIDCALL;
4386
4387 if (!(dst = calloc(1, sizeof(*dst))))
4388 return E_OUTOFMEMORY;
4389
4390 if (FAILED(hr = d3dx9_effect_init_from_binary(dst, device, src->source, src->source_size,
4391 src->flags, &src->pool->ID3DXEffectPool_iface, src->skip_constants_string)))
4392 {
4393 free(dst);
4394 return hr;
4395 }
4396
4397 for (i = 0; i < src->params.count; ++i)
4398 {
4399 const struct d3dx_top_level_parameter *src_param = &src->params.parameters[i];
4400 struct d3dx_top_level_parameter *dst_param = &dst->params.parameters[i];
4401
4402 copy_parameter(dst, src, &dst_param->param, &src_param->param);
4403 for (j = 0; j < src_param->annotation_count; ++j)
4404 copy_parameter(dst, src, &dst_param->annotations[j], &src_param->annotations[j]);
4405 }
4406
4407 for (i = 0; i < src->technique_count; ++i)
4408 {
4409 const struct d3dx_technique *src_technique = &src->techniques[i];
4410 struct d3dx_technique *dst_technique = &dst->techniques[i];
4411
4412 for (j = 0; j < src_technique->annotation_count; ++j)
4413 copy_parameter(dst, src, &dst_technique->annotations[j], &src_technique->annotations[j]);
4414
4415 for (j = 0; j < src_technique->pass_count; ++j)
4416 {
4417 const struct d3dx_pass *src_pass = &src_technique->passes[j];
4418 struct d3dx_pass *dst_pass = &dst_technique->passes[j];
4419
4420 for (k = 0; k < src_pass->annotation_count; ++k)
4421 copy_parameter(dst, src, &dst_pass->annotations[k], &src_pass->annotations[k]);
4422 }
4423 }
4424
4425 *out = &dst->ID3DXEffect_iface;
4426 TRACE("Created effect %p.\n", dst);
4427 return D3D_OK;
4428}
4429
4430#if D3DX_SDK_VERSION >= 27
4431static HRESULT WINAPI d3dx_effect_SetRawValue(ID3DXEffect *iface, D3DXHANDLE parameter, const void *data,
4432 UINT byte_offset, UINT bytes)
4433{
4434 FIXME("iface %p, parameter %p, data %p, byte_offset %u, bytes %u stub!\n",
4435 iface, parameter, data, byte_offset, bytes);
4436
4437 return E_NOTIMPL;
4438}
4439#endif
4440
4441static const struct ID3DXEffectVtbl ID3DXEffect_Vtbl =
4442{
4443 /*** IUnknown methods ***/
4447 /*** ID3DXBaseEffect methods ***/
4502 /*** ID3DXEffect methods ***/
4522#if D3DX_SDK_VERSION >= 26
4523 d3dx_effect_DeleteParameterBlock,
4524#endif
4526#if D3DX_SDK_VERSION >= 27
4527 d3dx_effect_SetRawValue
4528#endif
4529};
4530
4531static inline struct ID3DXEffectCompilerImpl *impl_from_ID3DXEffectCompiler(ID3DXEffectCompiler *iface)
4532{
4534}
4535
4536/*** IUnknown methods ***/
4537static HRESULT WINAPI ID3DXEffectCompilerImpl_QueryInterface(ID3DXEffectCompiler *iface, REFIID riid, void **object)
4538{
4539 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
4540
4542 || IsEqualGUID(riid, &IID_ID3DXEffectCompiler))
4543 {
4544 iface->lpVtbl->AddRef(iface);
4545 *object = iface;
4546 return S_OK;
4547 }
4548
4549 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
4550
4551 *object = NULL;
4552 return E_NOINTERFACE;
4553}
4554
4555static ULONG WINAPI ID3DXEffectCompilerImpl_AddRef(ID3DXEffectCompiler *iface)
4556{
4558 ULONG refcount = InterlockedIncrement(&compiler->ref);
4559
4560 TRACE("%p increasing refcount to %lu.\n", iface, refcount);
4561
4562 return refcount;
4563}
4564
4565static ULONG WINAPI ID3DXEffectCompilerImpl_Release(ID3DXEffectCompiler *iface)
4566{
4568 ULONG refcount = InterlockedDecrement(&compiler->ref);
4569
4570 TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
4571
4572 if (!refcount)
4573 {
4574 free(compiler);
4575 }
4576
4577 return refcount;
4578}
4579
4580/*** ID3DXBaseEffect methods ***/
4582{
4583 FIXME("iface %p, desc %p stub!\n", iface, desc);
4584
4585 return E_NOTIMPL;
4586}
4587
4590{
4591 FIXME("iface %p, parameter %p, desc %p stub!\n", iface, parameter, desc);
4592
4593 return E_NOTIMPL;
4594}
4595
4598{
4599 FIXME("iface %p, technique %p, desc %p stub!\n", iface, technique, desc);
4600
4601 return E_NOTIMPL;
4602}
4603
4604static HRESULT WINAPI ID3DXEffectCompilerImpl_GetPassDesc(ID3DXEffectCompiler *iface,
4606{
4607 FIXME("iface %p, pass %p, desc %p stub!\n", iface, pass, desc);
4608
4609 return E_NOTIMPL;
4610}
4611
4614{
4615 FIXME("iface %p, shader %p, desc %p stub!\n", iface, shader, desc);
4616
4617 return E_NOTIMPL;
4618}
4619
4621 D3DXHANDLE parameter, UINT index)
4622{
4623 FIXME("iface %p, parameter %p, index %u stub!\n", iface, parameter, index);
4624
4625 return NULL;
4626}
4627
4629 D3DXHANDLE parameter, const char *name)
4630{
4631 FIXME("iface %p, parameter %p, name %s stub!\n", iface, parameter, debugstr_a(name));
4632
4633 return NULL;
4634}
4635
4637 D3DXHANDLE parameter, const char *semantic)
4638{
4639 FIXME("iface %p, parameter %p, semantic %s stub!\n", iface, parameter, debugstr_a(semantic));
4640
4641 return NULL;
4642}
4643
4645 D3DXHANDLE parameter, UINT index)
4646{
4647 FIXME("iface %p, parameter %p, index %u stub!\n", iface, parameter, index);
4648
4649 return NULL;
4650}
4651
4653{
4654 FIXME("iface %p, index %u stub!\n", iface, index);
4655
4656 return NULL;
4657}
4658
4659static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetTechniqueByName(ID3DXEffectCompiler *iface, const char *name)
4660{
4661 FIXME("iface %p, name %s stub!\n", iface, debugstr_a(name));
4662
4663 return NULL;
4664}
4665
4666static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetPass(ID3DXEffectCompiler *iface, D3DXHANDLE technique, UINT index)
4667{
4668 FIXME("iface %p, technique %p, index %u stub!\n", iface, technique, index);
4669
4670 return NULL;
4671}
4672
4674 D3DXHANDLE technique, const char *name)
4675{
4676 FIXME("iface %p, technique %p, name %s stub!\n", iface, technique, debugstr_a(name));
4677
4678 return NULL;
4679}
4680
4682{
4683 FIXME("iface %p, index %u stub!\n", iface, index);
4684
4685 return NULL;
4686}
4687
4688static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetFunctionByName(ID3DXEffectCompiler *iface, const char *name)
4689{
4690 FIXME("iface %p, name %s stub!\n", iface, debugstr_a(name));
4691
4692 return NULL;
4693}
4694
4696 D3DXHANDLE object, UINT index)
4697{
4698 FIXME("iface %p, object %p, index %u stub!\n", iface, object, index);
4699
4700 return NULL;
4701}
4702
4704 D3DXHANDLE object, const char *name)
4705{
4706 FIXME("iface %p, object %p, name %s stub!\n", iface, object, debugstr_a(name));
4707
4708 return NULL;
4709}
4710
4711static HRESULT WINAPI ID3DXEffectCompilerImpl_SetValue(ID3DXEffectCompiler *iface,
4712 D3DXHANDLE parameter, const void *data, UINT bytes)
4713{
4714 FIXME("iface %p, parameter %p, data %p, bytes %u stub!\n", iface, parameter, data, bytes);
4715
4716 return E_NOTIMPL;
4717}
4718
4719static HRESULT WINAPI ID3DXEffectCompilerImpl_GetValue(ID3DXEffectCompiler *iface,
4720 D3DXHANDLE parameter, void *data, UINT bytes)
4721{
4722 FIXME("iface %p, parameter %p, data %p, bytes %u stub!\n", iface, parameter, data, bytes);
4723
4724 return E_NOTIMPL;
4725}
4726
4727static HRESULT WINAPI ID3DXEffectCompilerImpl_SetBool(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL b)
4728{
4729 FIXME("iface %p, parameter %p, b %#x stub!\n", iface, parameter, b);
4730
4731 return E_NOTIMPL;
4732}
4733
4734static HRESULT WINAPI ID3DXEffectCompilerImpl_GetBool(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *b)
4735{
4736 FIXME("iface %p, parameter %p, b %p stub!\n", iface, parameter, b);
4737
4738 return E_NOTIMPL;
4739}
4740
4741static HRESULT WINAPI ID3DXEffectCompilerImpl_SetBoolArray(ID3DXEffectCompiler *iface,
4742 D3DXHANDLE parameter, const BOOL *b, UINT count)
4743{
4744 FIXME("iface %p, parameter %p, b %p, count %u stub!\n", iface, parameter, b, count);
4745
4746 return E_NOTIMPL;
4747}
4748
4749static HRESULT WINAPI ID3DXEffectCompilerImpl_GetBoolArray(ID3DXEffectCompiler *iface,
4750 D3DXHANDLE parameter, BOOL *b, UINT count)
4751{
4752 FIXME("iface %p, parameter %p, b %p, count %u stub!\n", iface, parameter, b, count);
4753
4754 return E_NOTIMPL;
4755}
4756
4757static HRESULT WINAPI ID3DXEffectCompilerImpl_SetInt(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT n)
4758{
4759 FIXME("iface %p, parameter %p, n %d stub!\n", iface, parameter, n);
4760
4761 return E_NOTIMPL;
4762}
4763
4764static HRESULT WINAPI ID3DXEffectCompilerImpl_GetInt(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT *n)
4765{
4766 FIXME("iface %p, parameter %p, n %p stub!\n", iface, parameter, n);
4767
4768 return E_NOTIMPL;
4769}
4770
4771static HRESULT WINAPI ID3DXEffectCompilerImpl_SetIntArray(ID3DXEffectCompiler *iface,
4772 D3DXHANDLE parameter, const INT *n, UINT count)
4773{
4774 FIXME("iface %p, parameter %p, n %p, count %u stub!\n", iface, parameter, n, count);
4775
4776 return E_NOTIMPL;
4777}
4778
4779static HRESULT WINAPI ID3DXEffectCompilerImpl_GetIntArray(ID3DXEffectCompiler *iface,
4780 D3DXHANDLE parameter, INT *n, UINT count)
4781{
4782 FIXME("iface %p, parameter %p, n %p, count %u stub!\n", iface, parameter, n, count);
4783
4784 return E_NOTIMPL;
4785}
4786
4787static HRESULT WINAPI ID3DXEffectCompilerImpl_SetFloat(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float f)
4788{
4789 FIXME("iface %p, parameter %p, f %.8e stub!\n", iface, parameter, f);
4790
4791 return E_NOTIMPL;
4792}
4793
4794static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFloat(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float *f)
4795{
4796 FIXME("iface %p, parameter %p, f %p stub!\n", iface, parameter, f);
4797
4798 return E_NOTIMPL;
4799}
4800
4801static HRESULT WINAPI ID3DXEffectCompilerImpl_SetFloatArray(ID3DXEffectCompiler *iface,
4802 D3DXHANDLE parameter, const float *f, UINT count)
4803{
4804 FIXME("iface %p, parameter %p, f %p, count %u stub!\n", iface, parameter, f, count);
4805
4806 return E_NOTIMPL;
4807}
4808
4809static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFloatArray(ID3DXEffectCompiler *iface,
4810 D3DXHANDLE parameter, float *f, UINT count)
4811{
4812 FIXME("iface %p, parameter %p, f %p, count %u stub!\n", iface, parameter, f, count);
4813
4814 return E_NOTIMPL;
4815}
4816
4817static HRESULT WINAPI ID3DXEffectCompilerImpl_SetVector(ID3DXEffectCompiler *iface,
4818 D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
4819{
4820 FIXME("iface %p, parameter %p, vector %p stub!\n", iface, parameter, vector);
4821
4822 return E_NOTIMPL;
4823}
4824
4825static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVector(ID3DXEffectCompiler *iface,
4826 D3DXHANDLE parameter, D3DXVECTOR4 *vector)
4827{
4828 FIXME("iface %p, parameter %p, vector %p stub!\n", iface, parameter, vector);
4829
4830 return E_NOTIMPL;
4831}
4832
4834 D3DXHANDLE parameter, const D3DXVECTOR4 *vector, UINT count)
4835{
4836 FIXME("iface %p, parameter %p, vector %p, count %u stub!\n", iface, parameter, vector, count);
4837
4838 return E_NOTIMPL;
4839}
4840
4842 D3DXHANDLE parameter, D3DXVECTOR4 *vector, UINT count)
4843{
4844 FIXME("iface %p, parameter %p, vector %p, count %u stub!\n", iface, parameter, vector, count);
4845
4846 return E_NOTIMPL;
4847}
4848
4849static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrix(ID3DXEffectCompiler *iface,
4850 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
4851{
4852 FIXME("iface %p, parameter %p, matrix %p stub!\n", iface, parameter, matrix);
4853
4854 return E_NOTIMPL;
4855}
4856
4857static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrix(ID3DXEffectCompiler *iface,
4858 D3DXHANDLE parameter, D3DXMATRIX *matrix)
4859{
4860 FIXME("iface %p, parameter %p, matrix %p stub!\n", iface, parameter, matrix);
4861
4862 return E_NOTIMPL;
4863}
4864
4866 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
4867{
4868 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4869
4870 return E_NOTIMPL;
4871}
4872
4874 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
4875{
4876 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4877
4878 return E_NOTIMPL;
4879}
4880
4882 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
4883{
4884 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4885
4886 return E_NOTIMPL;
4887}
4888
4890 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
4891{
4892 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4893
4894 return E_NOTIMPL;
4895}
4896
4898 D3DXHANDLE parameter, const D3DXMATRIX *matrix)
4899{
4900 FIXME("iface %p, parameter %p, matrix %p stub!\n", iface, parameter, matrix);
4901
4902 return E_NOTIMPL;
4903}
4904
4906 D3DXHANDLE parameter, D3DXMATRIX *matrix)
4907{
4908 FIXME("iface %p, parameter %p, matrix %p stub!\n", iface, parameter, matrix);
4909
4910 return E_NOTIMPL;
4911}
4912
4914 D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
4915{
4916 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4917
4918 return E_NOTIMPL;
4919}
4920
4922 D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
4923{
4924 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4925
4926 return E_NOTIMPL;
4927}
4928
4930 D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
4931{
4932 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4933
4934 return E_NOTIMPL;
4935}
4936
4938 D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
4939{
4940 FIXME("iface %p, parameter %p, matrix %p, count %u stub!\n", iface, parameter, matrix, count);
4941
4942 return E_NOTIMPL;
4943}
4944
4945static HRESULT WINAPI ID3DXEffectCompilerImpl_SetString(ID3DXEffectCompiler *iface,
4946 D3DXHANDLE parameter, const char *string)
4947{
4948 FIXME("iface %p, parameter %p, string %s stub!\n", iface, parameter, debugstr_a(string));
4949
4950 return E_NOTIMPL;
4951}
4952
4953static HRESULT WINAPI ID3DXEffectCompilerImpl_GetString(ID3DXEffectCompiler *iface,
4954 D3DXHANDLE parameter, const char **string)
4955{
4956 FIXME("iface %p, parameter %p, string %p stub!\n", iface, parameter, string);
4957
4958 return E_NOTIMPL;
4959}
4960
4961static HRESULT WINAPI ID3DXEffectCompilerImpl_SetTexture(struct ID3DXEffectCompiler *iface,
4962 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 *texture)
4963{
4964 FIXME("iface %p, parameter %p, texture %p stub!\n", iface, parameter, texture);
4965
4966 return E_NOTIMPL;
4967}
4968
4969static HRESULT WINAPI ID3DXEffectCompilerImpl_GetTexture(struct ID3DXEffectCompiler *iface,
4970 D3DXHANDLE parameter, struct IDirect3DBaseTexture9 **texture)
4971{
4972 FIXME("iface %p, parameter %p, texture %p stub!\n", iface, parameter, texture);
4973
4974 return E_NOTIMPL;
4975}
4976
4978 D3DXHANDLE parameter, struct IDirect3DPixelShader9 **shader)
4979{
4980 FIXME("iface %p, parameter %p, shader %p stub!\n", iface, parameter, shader);
4981
4982 return E_NOTIMPL;
4983}
4984
4985static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVertexShader(struct ID3DXEffectCompiler *iface,
4986 D3DXHANDLE parameter, struct IDirect3DVertexShader9 **shader)
4987{
4988 FIXME("iface %p, parameter %p, shader %p stub!\n", iface, parameter, shader);
4989
4990 return E_NOTIMPL;
4991}
4992
4993static HRESULT WINAPI ID3DXEffectCompilerImpl_SetArrayRange(ID3DXEffectCompiler *iface,
4994 D3DXHANDLE parameter, UINT start, UINT end)
4995{
4996 FIXME("iface %p, parameter %p, start %u, end %u stub!\n", iface, parameter, start, end);
4997
4998 return E_NOTIMPL;
4999}
5000
5001/*** ID3DXEffectCompiler methods ***/
5002static HRESULT WINAPI ID3DXEffectCompilerImpl_SetLiteral(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL literal)
5003{
5004 FIXME("iface %p, parameter %p, literal %#x stub!\n", iface, parameter, literal);
5005
5006 return E_NOTIMPL;
5007}
5008
5009static HRESULT WINAPI ID3DXEffectCompilerImpl_GetLiteral(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *literal)
5010{
5011 FIXME("iface %p, parameter %p, literal %p stub!\n", iface, parameter, literal);
5012
5013 return E_NOTIMPL;
5014}
5015
5017 ID3DXBuffer **effect, ID3DXBuffer **error_msgs)
5018{
5019 FIXME("iface %p, flags %#lx, effect %p, error_msgs %p stub!\n", iface, flags, effect, error_msgs);
5020
5021 return E_NOTIMPL;
5022}
5023
5024static HRESULT WINAPI ID3DXEffectCompilerImpl_CompileShader(ID3DXEffectCompiler *iface, D3DXHANDLE function,
5025 const char *target, DWORD flags, ID3DXBuffer **shader, ID3DXBuffer **error_msgs,
5026 ID3DXConstantTable **constant_table)
5027{
5028 FIXME("iface %p, function %p, target %s, flags %#lx, shader %p, error_msgs %p, constant_table %p stub!\n",
5029 iface, function, debugstr_a(target), flags, shader, error_msgs, constant_table);
5030
5031 return E_NOTIMPL;
5032}
5033
5034static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl =
5035{
5036 /*** IUnknown methods ***/
5040 /*** ID3DXBaseEffect methods ***/
5095 /*** ID3DXEffectCompiler methods ***/
5100};
5101
5103 const char *data, const char **ptr, struct d3dx_object *objects)
5104{
5105 HRESULT hr;
5106 UINT i;
5107
5108 sampler->state_count = read_u32(ptr);
5109 TRACE("Count: %u\n", sampler->state_count);
5110
5111 sampler->states = calloc(sampler->state_count, sizeof(*sampler->states));
5112 if (!sampler->states)
5113 {
5114 ERR("Out of memory\n");
5115 return E_OUTOFMEMORY;
5116 }
5117
5118 for (i = 0; i < sampler->state_count; ++i)
5119 {
5120 hr = d3dx_parse_state(effect, &sampler->states[i], data, ptr, objects);
5121 if (hr != D3D_OK)
5122 {
5123 WARN("Failed to parse state %u\n", i);
5124 goto err_out;
5125 }
5126 }
5127
5128 return D3D_OK;
5129
5130err_out:
5131
5132 for (i = 0; i < sampler->state_count; ++i)
5133 {
5134 free_state(&sampler->states[i]);
5135 }
5136 free(sampler->states);
5137 sampler->states = NULL;
5138
5139 return hr;
5140}
5141
5143 void *value, const char *data, const char **ptr, struct d3dx_object *objects)
5144{
5145 unsigned int i;
5146 HRESULT hr;
5147 UINT old_size = 0;
5148
5149 if (param->element_count)
5150 {
5151 param->data = value;
5152
5153 for (i = 0; i < param->element_count; ++i)
5154 {
5155 struct d3dx_parameter *member = &param->members[i];
5156
5157 hr = d3dx_parse_value(effect, member, value ? (char *)value + old_size : NULL, data, ptr, objects);
5158 if (hr != D3D_OK)
5159 {
5160 WARN("Failed to parse value %u\n", i);
5161 return hr;
5162 }
5163
5164 old_size += member->bytes;
5165 }
5166
5167 return D3D_OK;
5168 }
5169
5170 switch(param->class)
5171 {
5172 case D3DXPC_SCALAR:
5173 case D3DXPC_VECTOR:
5174 case D3DXPC_MATRIX_ROWS:
5176 param->data = value;
5177 break;
5178
5179 case D3DXPC_STRUCT:
5180 param->data = value;
5181
5182 for (i = 0; i < param->member_count; ++i)
5183 {
5184 struct d3dx_parameter *member = &param->members[i];
5185
5186 hr = d3dx_parse_value(effect, member, (char *)value + old_size, data, ptr, objects);
5187 if (hr != D3D_OK)
5188 {
5189 WARN("Failed to parse value %u\n", i);
5190 return hr;
5191 }
5192
5193 old_size += member->bytes;
5194 }
5195 break;
5196
5197 case D3DXPC_OBJECT:
5198 switch (param->type)
5199 {
5200 case D3DXPT_STRING:
5201 case D3DXPT_TEXTURE:
5202 case D3DXPT_TEXTURE1D:
5203 case D3DXPT_TEXTURE2D:
5204 case D3DXPT_TEXTURE3D:
5205 case D3DXPT_TEXTURECUBE:
5206 case D3DXPT_PIXELSHADER:
5208 param->object_id = read_u32(ptr);
5209 TRACE("Id: %u\n", param->object_id);
5210 objects[param->object_id].param = param;
5211 param->data = value;
5212 break;
5213
5214 case D3DXPT_SAMPLER:
5215 case D3DXPT_SAMPLER1D:
5216 case D3DXPT_SAMPLER2D:
5217 case D3DXPT_SAMPLER3D:
5218 case D3DXPT_SAMPLERCUBE:
5219 {
5220 struct d3dx_sampler *sampler;
5221
5222 sampler = calloc(1, sizeof(*sampler));
5223 if (!sampler)
5224 return E_OUTOFMEMORY;
5225
5227 if (hr != D3D_OK)
5228 {
5229 free(sampler);
5230 WARN("Failed to parse sampler\n");
5231 return hr;
5232 }
5233
5234 param->data = sampler;
5235 break;
5236 }
5237
5238 default:
5239 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
5240 break;
5241 }
5242 break;
5243
5244 default:
5245 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
5246 break;
5247 }
5248
5249 return D3D_OK;
5250}
5251
5253 const char *data, const char *ptr, struct d3dx_object *objects)
5254{
5255 UINT size = param->bytes;
5256 HRESULT hr;
5257 void *value = NULL;
5258
5259 TRACE("param size: %u\n", size);
5260
5261 if (size)
5262 {
5263 value = calloc(1, size);
5264 if (!value)
5265 {
5266 ERR("Failed to allocate data memory.\n");
5267 return E_OUTOFMEMORY;
5268 }
5269
5270 switch(param->class)
5271 {
5272 case D3DXPC_OBJECT:
5273 break;
5274
5275 case D3DXPC_SCALAR:
5276 case D3DXPC_VECTOR:
5277 case D3DXPC_MATRIX_ROWS:
5279 case D3DXPC_STRUCT:
5280 TRACE("Data: %s.\n", debugstr_an(ptr, size));
5281 memcpy(value, ptr, size);
5282 break;
5283
5284 default:
5285 FIXME("Unhandled class %s\n", debug_d3dxparameter_class(param->class));
5286 break;
5287 }
5288 }
5289
5290 hr = d3dx_parse_value(effect, param, value, data, &ptr, objects);
5291 if (hr != D3D_OK)
5292 {
5293 WARN("Failed to parse value\n");
5294 free(value);
5295 return hr;
5296 }
5297
5298 return D3D_OK;
5299}
5300
5301static HRESULT d3dx9_parse_name(char **name, const char *ptr)
5302{
5303 unsigned int size;
5304
5305 size = read_u32(&ptr);
5306 TRACE("Name size: %#x.\n", size);
5307
5308 if (!size)
5309 {
5310 return D3D_OK;
5311 }
5312
5313 *name = malloc(size);
5314 if (!*name)
5315 {
5316 ERR("Failed to allocate name memory.\n");
5317 return E_OUTOFMEMORY;
5318 }
5319
5320 TRACE("Name: %s.\n", debugstr_an(ptr, size));
5321 memcpy(*name, ptr, size);
5322
5323 return D3D_OK;
5324}
5325
5326static HRESULT d3dx9_copy_data(struct d3dx_effect *effect, unsigned int object_id, const char **ptr)
5327{
5328 struct d3dx_object *object = &effect->objects[object_id];
5329
5330 if (object->size || object->data)
5331 {
5332 if (object_id)
5333 FIXME("Overwriting object id %u!\n", object_id);
5334 else
5335 TRACE("Overwriting object id 0.\n");
5336
5337 free(object->data);
5338 object->data = NULL;
5339 }
5340
5341 object->size = read_u32(ptr);
5342 TRACE("Data size: %#x.\n", object->size);
5343
5344 if (!object->size)
5345 return D3D_OK;
5346
5347 object->data = malloc(object->size);
5348 if (!object->data)
5349 {
5350 ERR("Failed to allocate object memory.\n");
5351 return E_OUTOFMEMORY;
5352 }
5353
5354 TRACE("Data: %s.\n", debugstr_an(*ptr, object->size));
5355 memcpy(object->data, *ptr, object->size);
5356
5357 *ptr += ((object->size + 3) & ~3);
5358
5359 return D3D_OK;
5360}
5361
5363{
5365}
5366
5367static void add_param_to_tree(struct d3dx_effect *effect, struct d3dx_parameter *param,
5368 struct d3dx_parameter *parent, char separator, unsigned int element)
5369{
5370 const char *parent_name = parent ? parent->full_name : NULL;
5371 unsigned int i;
5372
5373 TRACE("Adding parameter %p (%s - parent %p, element %u) to the rbtree.\n",
5374 param, debugstr_a(param->name), parent, element);
5375
5376 if (parent_name)
5377 {
5378 unsigned int parent_name_len = strlen(parent_name);
5379 unsigned int name_len = strlen(param->name);
5380 unsigned int part_str_len;
5381 unsigned int len;
5382 char part_str[16];
5383
5384 if (separator == '[')
5385 {
5386 sprintf(part_str, "[%u]", element);
5387 part_str_len = strlen(part_str);
5388 name_len = 0;
5389 }
5390 else
5391 {
5392 part_str[0] = separator;
5393 part_str[1] = 0;
5394 part_str_len = 1;
5395 }
5396 len = parent_name_len + part_str_len + name_len + 1;
5397
5398 if (!(param->full_name = malloc(len)))
5399 {
5400 ERR("Out of memory.\n");
5401 return;
5402 }
5403
5404 memcpy(param->full_name, parent_name, parent_name_len);
5405 memcpy(param->full_name + parent_name_len, part_str, part_str_len);
5406 memcpy(param->full_name + parent_name_len + part_str_len, param->name, name_len);
5407 param->full_name[len - 1] = 0;
5408 }
5409 else
5410 {
5411 if (!(param->full_name = strdup(param->name)))
5412 {
5413 ERR("Out of memory.\n");
5414 return;
5415 }
5416 }
5417 TRACE("Full name is %s.\n", param->full_name);
5418 wine_rb_put(&effect->params.tree, param->full_name, &param->rb_entry);
5419
5421 for (i = 0; i < param->top_level_param->annotation_count; ++i)
5422 add_param_to_tree(effect, &param->top_level_param->annotations[i], param, '@', 0);
5423
5424 if (param->element_count)
5425 for (i = 0; i < param->element_count; ++i)
5426 add_param_to_tree(effect, &param->members[i], param, '[', i);
5427 else
5428 for (i = 0; i < param->member_count; ++i)
5429 add_param_to_tree(effect, &param->members[i], param, '.', 0);
5430}
5431
5433 const char *data, const char **ptr, struct d3dx_parameter *parent, UINT flags)
5434{
5436 HRESULT hr;
5437 UINT i;
5438
5439 param->flags = flags;
5440
5441 if (!parent)
5442 {
5443 param->type = read_u32(ptr);
5444 TRACE("Type: %s.\n", debug_d3dxparameter_type(param->type));
5445
5446 param->class = read_u32(ptr);
5447 TRACE("Class: %s.\n", debug_d3dxparameter_class(param->class));
5448
5449 offset = read_u32(ptr);
5450 TRACE("Type name offset: %#x.\n", offset);
5451 hr = d3dx9_parse_name(&param->name, data + offset);
5452 if (hr != D3D_OK)
5453 {
5454 WARN("Failed to parse name\n");
5455 goto err_out;
5456 }
5457
5458 offset = read_u32(ptr);
5459 TRACE("Type semantic offset: %#x.\n", offset);
5460 hr = d3dx9_parse_name(&param->semantic, data + offset);
5461 if (hr != D3D_OK)
5462 {
5463 WARN("Failed to parse semantic\n");
5464 goto err_out;
5465 }
5466
5467 param->element_count = read_u32(ptr);
5468 TRACE("Elements: %u.\n", param->element_count);
5469
5470 switch (param->class)
5471 {
5472 case D3DXPC_VECTOR:
5473 param->columns = read_u32(ptr);
5474 TRACE("Columns: %u.\n", param->columns);
5475
5476 param->rows = read_u32(ptr);
5477 TRACE("Rows: %u.\n", param->rows);
5478
5479 /* sizeof(DWORD) * rows * columns */
5480 param->bytes = 4 * param->rows * param->columns;
5481 break;
5482
5483 case D3DXPC_SCALAR:
5484 case D3DXPC_MATRIX_ROWS:
5486 param->rows = read_u32(ptr);
5487 TRACE("Rows: %u.\n", param->rows);
5488
5489 param->columns = read_u32(ptr);
5490 TRACE("Columns: %u.\n", param->columns);
5491
5492 /* sizeof(DWORD) * rows * columns */
5493 param->bytes = 4 * param->rows * param->columns;
5494 break;
5495
5496 case D3DXPC_STRUCT:
5497 param->member_count = read_u32(ptr);
5498 TRACE("Members: %u.\n", param->member_count);
5499 break;
5500
5501 case D3DXPC_OBJECT:
5502 switch (param->type)
5503 {
5504 case D3DXPT_STRING:
5505 case D3DXPT_PIXELSHADER:
5507 case D3DXPT_TEXTURE:
5508 case D3DXPT_TEXTURE1D:
5509 case D3DXPT_TEXTURE2D:
5510 case D3DXPT_TEXTURE3D:
5511 case D3DXPT_TEXTURECUBE:
5512 param->bytes = sizeof(void *);
5513 break;
5514
5515 case D3DXPT_SAMPLER:
5516 case D3DXPT_SAMPLER1D:
5517 case D3DXPT_SAMPLER2D:
5518 case D3DXPT_SAMPLER3D:
5519 case D3DXPT_SAMPLERCUBE:
5520 param->bytes = 0;
5521 break;
5522
5523 default:
5524 FIXME("Unhandled type %s.\n", debug_d3dxparameter_type(param->type));
5525 break;
5526 }
5527 break;
5528
5529 default:
5530 FIXME("Unhandled class %s.\n", debug_d3dxparameter_class(param->class));
5531 break;
5532 }
5533 }
5534 else
5535 {
5536 /* elements */
5537 param->type = parent->type;
5538 param->class = parent->class;
5539 param->name = parent->name;
5540 param->semantic = parent->semantic;
5541 param->element_count = 0;
5542 param->member_count = parent->member_count;
5543 param->bytes = parent->bytes;
5544 param->rows = parent->rows;
5545 param->columns = parent->columns;
5546 }
5547
5548 if (param->element_count)
5549 {
5550 unsigned int param_bytes = 0;
5551 const char *save_ptr = *ptr;
5552
5553 param->members = calloc(param->element_count, sizeof(*param->members));
5554 if (!param->members)
5555 {
5556 ERR("Out of memory\n");
5557 hr = E_OUTOFMEMORY;
5558 goto err_out;
5559 }
5560
5561 for (i = 0; i < param->element_count; ++i)
5562 {
5563 *ptr = save_ptr;
5564
5565 param_set_magic_number(&param->members[i]);
5566 hr = d3dx_parse_effect_typedef(effect, &param->members[i], data, ptr, param, flags);
5567 if (hr != D3D_OK)
5568 {
5569 WARN("Failed to parse member %u\n", i);
5570 goto err_out;
5571 }
5572
5573 param_bytes += param->members[i].bytes;
5574 }
5575
5576 param->bytes = param_bytes;
5577 }
5578 else if (param->member_count)
5579 {
5580 param->members = calloc(param->member_count, sizeof(*param->members));
5581 if (!param->members)
5582 {
5583 ERR("Out of memory\n");
5584 hr = E_OUTOFMEMORY;
5585 goto err_out;
5586 }
5587
5588 for (i = 0; i < param->member_count; ++i)
5589 {
5590 param_set_magic_number(&param->members[i]);
5591 hr = d3dx_parse_effect_typedef(effect, &param->members[i], data, ptr, NULL, flags);
5592 if (hr != D3D_OK)
5593 {
5594 WARN("Failed to parse member %u\n", i);
5595 goto err_out;
5596 }
5597
5598 param->bytes += param->members[i].bytes;
5599 }
5600 }
5601 return D3D_OK;
5602
5603err_out:
5604
5605 if (param->members)
5606 {
5607 unsigned int count = param->element_count ? param->element_count : param->member_count;
5608
5609 for (i = 0; i < count; ++i)
5610 free_parameter(&param->members[i], param->element_count != 0, TRUE);
5611 free(param->members);
5612 param->members = NULL;
5613 }
5614
5615 if (!parent)
5616 {
5617 free(param->name);
5618 free(param->semantic);
5619 }
5620 param->name = NULL;
5621 param->semantic = NULL;
5622
5623 return hr;
5624}
5625
5627 const char *data, const char **ptr, struct d3dx_object *objects)
5628{
5629 const char *ptr2;
5631 HRESULT hr;
5632
5634
5635 offset = read_u32(ptr);
5636 TRACE("Typedef offset: %#x.\n", offset);
5637 ptr2 = data + offset;
5639 if (hr != D3D_OK)
5640 {
5641 WARN("Failed to parse type definition.\n");
5642 return hr;
5643 }
5644
5645 offset = read_u32(ptr);
5646 TRACE("Value offset: %#x.\n", offset);
5647 hr = d3dx_parse_init_value(effect, anno, data, data + offset, objects);
5648 if (hr != D3D_OK)
5649 {
5650 WARN("Failed to parse value.\n");
5651 return hr;
5652 }
5653
5654 return D3D_OK;
5655}
5656
5657static HRESULT d3dx_parse_state(struct d3dx_effect *effect, struct d3dx_state *state,
5658 const char *data, const char **ptr, struct d3dx_object *objects)
5659{
5660 struct d3dx_parameter *param = &state->parameter;
5661 enum STATE_CLASS state_class;
5662 const char *ptr2;
5664 void *new_data;
5665 HRESULT hr;
5666
5667 state->type = ST_CONSTANT;
5668
5669 state->operation = read_u32(ptr);
5670 if (state->operation >= ARRAY_SIZE(state_table))
5671 {
5672 WARN("Unknown state operation %u.\n", state->operation);
5673 return D3DERR_INVALIDCALL;
5674 }
5675 TRACE("Operation: %#x (%s).\n", state->operation, state_table[state->operation].name);
5676
5677 state->index = read_u32(ptr);
5678 TRACE("Index: %#x.\n", state->index);
5679
5680 offset = read_u32(ptr);
5681 TRACE("Typedef offset: %#x.\n", offset);
5682 ptr2 = data + offset;
5683 hr = d3dx_parse_effect_typedef(effect, param, data, &ptr2, NULL, 0);
5684 if (hr != D3D_OK)
5685 {
5686 WARN("Failed to parse type definition\n");
5687 goto err_out;
5688 }
5689
5690 offset = read_u32(ptr);
5691 TRACE("Value offset: %#x.\n", offset);
5693 if (hr != D3D_OK)
5694 {
5695 WARN("Failed to parse value\n");
5696 goto err_out;
5697 }
5698
5699 if (((state_class = state_table[state->operation].class) == SC_VERTEXSHADER
5700 || state_class == SC_PIXELSHADER || state_class == SC_TEXTURE)
5701 && param->bytes < sizeof(void *))
5702 {
5703 if (param->type != D3DXPT_INT || *(unsigned int *)param->data)
5704 {
5705 FIXME("Unexpected parameter for object, param->type %#x, param->class %#x, *param->data %#x.\n",
5706 param->type, param->class, *(unsigned int *)param->data);
5708 goto err_out;
5709 }
5710
5711 new_data = realloc(param->data, sizeof(void *));
5712 if (!new_data)
5713 {
5714 ERR("Out of memory.\n");
5715 hr = E_OUTOFMEMORY;
5716 goto err_out;
5717 }
5718 memset(new_data, 0, sizeof(void *));
5719 param->data = new_data;
5720 param->bytes = sizeof(void *);
5721 }
5722
5723 return D3D_OK;
5724
5725err_out:
5726
5728
5729 return hr;
5730}
5731
5733 const char *data, const char **ptr, struct d3dx_object *objects)
5734{
5735 const char *ptr2;
5737 unsigned int i;
5738 HRESULT hr;
5739
5740 offset = read_u32(ptr);
5741 TRACE("Typedef offset: %#x.\n", offset);
5742 ptr2 = data + offset;
5743
5744 offset = read_u32(ptr);
5745 TRACE("Value offset: %#x.\n", offset);
5746
5747 param->param.flags = read_u32(ptr);
5748 TRACE("Flags: %#x.\n", param->param.flags);
5749
5750 param->annotation_count = read_u32(ptr);
5751 TRACE("Annotation count: %u.\n", param->annotation_count);
5752
5753 hr = d3dx_parse_effect_typedef(effect, &param->param, data, &ptr2, NULL, param->param.flags);
5754 if (hr != D3D_OK)
5755 {
5756 WARN("Failed to parse type definition.\n");
5757 return hr;
5758 }
5759
5760 hr = d3dx_parse_init_value(effect, &param->param, data, data + offset, objects);
5761 if (hr != D3D_OK)
5762 {
5763 WARN("Failed to parse value.\n");
5764 return hr;
5765 }
5766
5767 if (param->annotation_count)
5768 {
5769 param->annotations = calloc(param->annotation_count, sizeof(*param->annotations));
5770 if (!param->annotations)
5771 {
5772 ERR("Out of memory.\n");
5773 hr = E_OUTOFMEMORY;
5774 goto err_out;
5775 }
5776
5777 for (i = 0; i < param->annotation_count; ++i)
5778 {
5779 param_set_magic_number(&param->annotations[i]);
5780 hr = d3dx_parse_effect_annotation(effect, &param->annotations[i], data, ptr, objects);
5781 if (hr != D3D_OK)
5782 {
5783 WARN("Failed to parse annotation.\n");
5784 goto err_out;
5785 }
5786 }
5787 }
5788
5789 return D3D_OK;
5790
5791err_out:
5792
5793 if (param->annotations)
5794 {
5795 for (i = 0; i < param->annotation_count; ++i)
5796 free_parameter(&param->annotations[i], FALSE, FALSE);
5797 free(param->annotations);
5798 param->annotations = NULL;
5799 }
5800
5801 return hr;
5802}
5803
5805 const char *data, const char **ptr, struct d3dx_object *objects)
5806{
5807 struct d3dx_state *states = NULL;
5808 char *name = NULL;
5810 unsigned int i;
5811 HRESULT hr;
5812
5813 offset = read_u32(ptr);
5814 TRACE("Pass name offset: %#x.\n", offset);
5816 if (hr != D3D_OK)
5817 {
5818 WARN("Failed to parse name.\n");
5819 goto err_out;
5820 }
5821
5822 pass->annotation_count = read_u32(ptr);
5823 TRACE("Annotation count: %u.\n", pass->annotation_count);
5824
5825 pass->state_count = read_u32(ptr);
5826 TRACE("State count: %u.\n", pass->state_count);
5827
5828 if (pass->annotation_count)
5829 {
5830 pass->annotations = calloc(pass->annotation_count, sizeof(*pass->annotations));
5831 if (!pass->annotations)
5832 {
5833 ERR("Out of memory\n");
5834 hr = E_OUTOFMEMORY;
5835 goto err_out;
5836 }
5837
5838 for (i = 0; i < pass->annotation_count; ++i)
5839 {
5840 param_set_magic_number(&pass->annotations[i]);
5841 hr = d3dx_parse_effect_annotation(effect, &pass->annotations[i], data, ptr, objects);
5842 if (hr != D3D_OK)
5843 {
5844 WARN("Failed to parse annotation %u\n", i);
5845 goto err_out;
5846 }
5847 }
5848 }
5849
5850 if (pass->state_count)
5851 {
5852 states = calloc(pass->state_count, sizeof(*states));
5853 if (!states)
5854 {
5855 ERR("Out of memory\n");
5856 hr = E_OUTOFMEMORY;
5857 goto err_out;
5858 }
5859
5860 for (i = 0; i < pass->state_count; ++i)
5861 {
5862 hr = d3dx_parse_state(effect, &states[i], data, ptr, objects);
5863 if (hr != D3D_OK)
5864 {
5865 WARN("Failed to parse annotation %u\n", i);
5866 goto err_out;
5867 }
5868 }
5869 }
5870
5871 pass->name = name;
5872 pass->states = states;
5873
5874 return D3D_OK;
5875
5876err_out:
5877
5878 if (pass->annotations)
5879 {
5880 for (i = 0; i < pass->annotation_count; ++i)
5881 free_parameter(&pass->annotations[i], FALSE, FALSE);
5882 free(pass->annotations);
5883 pass->annotations = NULL;
5884 }
5885
5886 if (states)
5887 {
5888 for (i = 0; i < pass->state_count; ++i)
5889 {
5890 free_state(&states[i]);
5891 }
5892 free(states);
5893 }
5894
5895 free(name);
5896
5897 return hr;
5898}
5899
5900static HRESULT d3dx_parse_effect_technique(struct d3dx_effect *effect, struct d3dx_technique *technique,
5901 const char *data, const char **ptr, struct d3dx_object *objects)
5902{
5903 char *name = NULL;
5905 unsigned int i;
5906 HRESULT hr;
5907
5908 offset = read_u32(ptr);
5909 TRACE("Technique name offset: %#x.\n", offset);
5911 if (hr != D3D_OK)
5912 {
5913 WARN("Failed to parse name\n");
5914 goto err_out;
5915 }
5916
5917 technique->annotation_count = read_u32(ptr);
5918 TRACE("Annotation count: %u.\n", technique->annotation_count);
5919
5920 technique->pass_count = read_u32(ptr);
5921 TRACE("Pass count: %u.\n", technique->pass_count);
5922
5923 if (technique->annotation_count)
5924 {
5925 technique->annotations = calloc(technique->annotation_count, sizeof(*technique->annotations));
5926 if (!technique->annotations)
5927 {
5928 ERR("Out of memory\n");
5929 hr = E_OUTOFMEMORY;
5930 goto err_out;
5931 }
5932
5933 for (i = 0; i < technique->annotation_count; ++i)
5934 {
5935 param_set_magic_number(&technique->annotations[i]);
5936 hr = d3dx_parse_effect_annotation(effect, &technique->annotations[i], data, ptr, objects);
5937 if (hr != D3D_OK)
5938 {
5939 WARN("Failed to parse annotation %u\n", i);
5940 goto err_out;
5941 }
5942 }
5943 }
5944
5945 if (technique->pass_count)
5946 {
5947 technique->passes = calloc(technique->pass_count, sizeof(*technique->passes));
5948 if (!technique->passes)
5949 {
5950 ERR("Out of memory\n");
5951 hr = E_OUTOFMEMORY;
5952 goto err_out;
5953 }
5954
5955 for (i = 0; i < technique->pass_count; ++i)
5956 {
5957 hr = d3dx_parse_effect_pass(effect, &technique->passes[i], data, ptr, objects);
5958 if (hr != D3D_OK)
5959 {
5960 WARN("Failed to parse pass %u\n", i);
5961 goto err_out;
5962 }
5963 }
5964 }
5965
5966 technique->name = name;
5967
5968 return D3D_OK;
5969
5970err_out:
5971
5972 if (technique->passes)
5973 {
5974 for (i = 0; i < technique->pass_count; ++i)
5975 free_pass(&technique->passes[i]);
5976 free(technique->passes);
5977 technique->passes = NULL;
5978 }
5979
5980 if (technique->annotations)
5981 {
5982 for (i = 0; i < technique->annotation_count; ++i)
5983 free_parameter(&technique->annotations[i], FALSE, FALSE);
5984 free(technique->annotations);
5985 technique->annotations = NULL;
5986 }
5987
5988 free(name);
5989
5990 return hr;
5991}
5992
5993static HRESULT d3dx9_create_object(struct d3dx_effect *effect, struct d3dx_object *object)
5994{
5995 struct d3dx_parameter *param = object->param;
5996 IDirect3DDevice9 *device = effect->device;
5997 HRESULT hr;
5998
5999 if (*(char **)param->data)
6000 ERR("Parameter data already allocated.\n");
6001
6002 switch (param->type)
6003 {
6004 case D3DXPT_STRING:
6005 *(char **)param->data = malloc(object->size);
6006 if (!*(char **)param->data)
6007 {
6008 ERR("Out of memory.\n");
6009 return E_OUTOFMEMORY;
6010 }
6011 memcpy(*(char **)param->data, object->data, object->size);
6012 break;
6015 (IDirect3DVertexShader9 **)param->data)))
6016 {
6017 WARN("Failed to create vertex shader.\n");
6018 object->creation_failed = TRUE;
6019 }
6020 break;
6021 case D3DXPT_PIXELSHADER:
6023 (IDirect3DPixelShader9 **)param->data)))
6024 {
6025 WARN("Failed to create pixel shader.\n");
6026 object->creation_failed = TRUE;
6027 }
6028 break;
6029 default:
6030 break;
6031 }
6032 return D3D_OK;
6033}
6034
6036 const char **skip_constants, unsigned int skip_constants_count)
6037{
6038 struct d3dx_parameter *param = &state->parameter;
6039 struct d3dx_object *object = &effect->objects[param->object_id];
6040 char *ptr = object->data;
6041 uint32_t string_size;
6042 HRESULT ret;
6043
6044 TRACE("Parsing array entry selection state for parameter %p.\n", param);
6045
6046 string_size = *(uint32_t *)ptr;
6047 state->referenced_param = get_parameter_by_name(&effect->params, NULL, ptr + 4);
6048 if (state->referenced_param)
6049 {
6050 TRACE("Mapping to parameter %s.\n", debugstr_a(state->referenced_param->name));
6051 }
6052 else
6053 {
6054 FIXME("Referenced parameter %s not found.\n", ptr + 4);
6055 return D3DXERR_INVALIDDATA;
6056 }
6057 TRACE("Unknown u32: 0x%.8x.\n", *(uint32_t *)(ptr + string_size));
6058
6059 if (string_size % sizeof(uint32_t))
6060 FIXME("Unaligned string_size %u.\n", string_size);
6061 if (FAILED(ret = d3dx_create_param_eval(&effect->params, (uint32_t *)(ptr + string_size) + 1,
6062 object->size - (string_size + sizeof(uint32_t)), D3DXPT_INT, &param->param_eval,
6063 get_version_counter_ptr(effect), NULL, 0)))
6064 return ret;
6065 ret = D3D_OK;
6066 param = state->referenced_param;
6067 if (param->type == D3DXPT_VERTEXSHADER || param->type == D3DXPT_PIXELSHADER)
6068 {
6069 unsigned int i;
6070
6071 for (i = 0; i < param->element_count; i++)
6072 {
6073 if (param->members[i].type != param->type)
6074 {
6075 FIXME("Unexpected member parameter type %u, expected %u.\n", param->members[i].type, param->type);
6076 return D3DXERR_INVALIDDATA;
6077 }
6078 if (!param->members[i].param_eval)
6079 {
6080 TRACE("Creating preshader for object %u.\n", param->members[i].object_id);
6081 object = &effect->objects[param->members[i].object_id];
6082 if (FAILED(ret = d3dx_create_param_eval(&effect->params, object->data, object->size, param->type,
6083 &param->members[i].param_eval, get_version_counter_ptr(effect),
6084 skip_constants, skip_constants_count)))
6085 break;
6086 }
6087 }
6088 }
6089 return ret;
6090}
6091
6092static HRESULT d3dx_parse_resource(struct d3dx_effect *effect, const char *data, const char **ptr,
6093 const char **skip_constants, unsigned int skip_constants_count)
6094{
6095 unsigned int index, state_index, usage, element_index, technique_index;
6096 struct d3dx_parameter *param;
6097 struct d3dx_object *object;
6098 struct d3dx_state *state;
6099 HRESULT hr = E_FAIL;
6100
6101 technique_index = read_u32(ptr);
6102 TRACE("technique_index: %u.\n", technique_index);
6103
6104 index = read_u32(ptr);
6105 TRACE("index: %u.\n", index);
6106
6107 element_index = read_u32(ptr);
6108 TRACE("element_index: %u.\n", element_index);
6109
6110 state_index = read_u32(ptr);
6111 TRACE("state_index: %u.\n", state_index);
6112
6113 usage = read_u32(ptr);
6114 TRACE("usage: %u.\n", usage);
6115
6116 if (technique_index == 0xffffffff)
6117 {
6118 struct d3dx_parameter *parameter;
6119 struct d3dx_sampler *sampler;
6120
6121 if (index >= effect->params.count)
6122 {
6123 FIXME("Index out of bounds: index %u >= parameter count %u.\n", index, effect->params.count);
6124 return E_FAIL;
6125 }
6126
6127 parameter = &effect->params.parameters[index].param;
6128 if (element_index != 0xffffffff)
6129 {
6130 if (element_index >= parameter->element_count && parameter->element_count != 0)
6131 {
6132 FIXME("Index out of bounds: element_index %u >= element_count %u.\n", element_index, parameter->element_count);
6133 return E_FAIL;
6134 }
6135
6136 if (parameter->element_count)
6137 parameter = &parameter->members[element_index];
6138 }
6139
6140 sampler = parameter->data;
6141 if (state_index >= sampler->state_count)
6142 {
6143 FIXME("Index out of bounds: state_index %u >= state_count %u.\n", state_index, sampler->state_count);
6144 return E_FAIL;
6145 }
6146
6147 state = &sampler->states[state_index];
6148 }
6149 else
6150 {
6151 struct d3dx_technique *technique;
6152 struct d3dx_pass *pass;
6153
6154 if (technique_index >= effect->technique_count)
6155 {
6156 FIXME("Index out of bounds: technique_index %u >= technique_count %u.\n", technique_index,
6157 effect->technique_count);
6158 return E_FAIL;
6159 }
6160
6161 technique = &effect->techniques[technique_index];
6162 if (index >= technique->pass_count)
6163 {
6164 FIXME("Index out of bounds: index %u >= pass_count %u.\n", index, technique->pass_count);
6165 return E_FAIL;
6166 }
6167
6168 pass = &technique->passes[index];
6169 if (state_index >= pass->state_count)
6170 {
6171 FIXME("Index out of bounds: state_index %u >= state_count %u.\n", state_index, pass->state_count);
6172 return E_FAIL;
6173 }
6174
6175 state = &pass->states[state_index];
6176 }
6177
6178 TRACE("State operation %#x (%s).\n", state->operation, state_table[state->operation].name);
6179 param = &state->parameter;
6180 TRACE("Using object id %u.\n", param->object_id);
6181 object = &effect->objects[param->object_id];
6182
6183 TRACE("Usage %u: class %s, type %s.\n", usage, debug_d3dxparameter_class(param->class),
6185 switch (usage)
6186 {
6187 case 0:
6188 switch (param->type)
6189 {
6191 case D3DXPT_PIXELSHADER:
6192 state->type = ST_CONSTANT;
6193 if (FAILED(hr = d3dx9_copy_data(effect, param->object_id, ptr)))
6194 return hr;
6195
6196 if (object->data)
6197 {
6198 if (FAILED(hr = d3dx9_create_object(effect, object)))
6199 return hr;
6200 if (FAILED(hr = d3dx_create_param_eval(&effect->params, object->data, object->size, param->type,
6201 &param->param_eval, get_version_counter_ptr(effect),
6202 skip_constants, skip_constants_count)))
6203 return hr;
6204 }
6205 break;
6206
6207 case D3DXPT_BOOL:
6208 case D3DXPT_INT:
6209 case D3DXPT_FLOAT:
6210 case D3DXPT_STRING:
6211 state->type = ST_FXLC;
6212 if (FAILED(hr = d3dx9_copy_data(effect, param->object_id, ptr)))
6213 return hr;
6214 if (FAILED(hr = d3dx_create_param_eval(&effect->params, object->data, object->size, param->type,
6215 &param->param_eval, get_version_counter_ptr(effect), NULL, 0)))
6216 return hr;
6217 break;
6218
6219 default:
6220 FIXME("Unhandled type %s\n", debug_d3dxparameter_type(param->type));
6221 break;
6222 }
6223 break;
6224
6225 case 1:
6226 state->type = ST_PARAMETER;
6227 if (FAILED(hr = d3dx9_copy_data(effect, param->object_id, ptr)))
6228 return hr;
6229
6230 TRACE("Looking for parameter %s.\n", debugstr_a(object->data));
6231 state->referenced_param = get_parameter_by_name(&effect->params, NULL, object->data);
6232 if (state->referenced_param)
6233 {
6234 struct d3dx_parameter *refpar = state->referenced_param;
6235
6236 TRACE("Mapping to parameter %p, having object id %u.\n", refpar, refpar->object_id);
6237 if (refpar->type == D3DXPT_VERTEXSHADER || refpar->type == D3DXPT_PIXELSHADER)
6238 {
6239 struct d3dx_object *refobj = &effect->objects[refpar->object_id];
6240
6241 if (!refpar->param_eval)
6242 {
6243 if (FAILED(hr = d3dx_create_param_eval(&effect->params, refobj->data, refobj->size,
6244 refpar->type, &refpar->param_eval, get_version_counter_ptr(effect),
6245 skip_constants, skip_constants_count)))
6246 return hr;
6247 }
6248 }
6249 }
6250 else
6251 {
6252 FIXME("Referenced parameter %s not found.\n", (char *)object->data);
6253 return D3DXERR_INVALIDDATA;
6254 }
6255 break;
6256
6257 case 2:
6258 state->type = ST_ARRAY_SELECTOR;
6259 if (FAILED(hr = d3dx9_copy_data(effect, param->object_id, ptr)))
6260 return hr;
6261 hr = d3dx_parse_array_selector(effect, state, skip_constants, skip_constants_count);
6262 break;
6263
6264 default:
6265 FIXME("Unknown usage %u.\n", usage);
6266 break;
6267 }
6268
6269 return hr;
6270}
6271
6272static BOOL param_set_top_level_param(void *top_level_param, struct d3dx_parameter *param)
6273{
6274 param->top_level_param = top_level_param;
6275 return FALSE;
6276}
6277
6278static HRESULT d3dx_parse_effect(struct d3dx_effect *effect, const char *data, UINT data_size,
6279 uint32_t start, const char **skip_constants, unsigned int skip_constants_count)
6280{
6281 unsigned int string_count, resource_count, params_count, shader_count;
6282 const char *ptr = data + start;
6283 unsigned int i;
6284 HRESULT hr;
6285
6286 params_count = read_u32(&ptr);
6287 TRACE("Parameter count: %u.\n", params_count);
6288
6289 effect->technique_count = read_u32(&ptr);
6290 TRACE("Technique count: %u.\n", effect->technique_count);
6291
6292 /* This value appears to be equal to a number of shader variables, with each pass contributing
6293 one additional slot. */
6294 shader_count = read_u32(&ptr);
6295 TRACE("Shader count: %u.\n", shader_count);
6296
6297 effect->object_count = read_u32(&ptr);
6298 TRACE("Object count: %u.\n", effect->object_count);
6299
6300 effect->objects = calloc(effect->object_count, sizeof(*effect->objects));
6301 if (!effect->objects)
6302 {
6303 ERR("Out of memory.\n");
6304 hr = E_OUTOFMEMORY;
6305 goto err_out;
6306 }
6307
6308 if (FAILED(hr = d3dx_init_parameters_store(&effect->params, params_count)))
6309 {
6310 hr = E_OUTOFMEMORY;
6311 goto err_out;
6312 }
6313
6314 for (i = 0; i < effect->params.count; ++i)
6315 {
6316 param_set_magic_number(&effect->params.parameters[i].param);
6317 hr = d3dx_parse_effect_parameter(effect, &effect->params.parameters[i], data, &ptr, effect->objects);
6318 if (hr != D3D_OK)
6319 {
6320 WARN("Failed to parse parameter %u.\n", i);
6321 goto err_out;
6322 }
6323 walk_parameter_tree(&effect->params.parameters[i].param, param_set_top_level_param, &effect->params.parameters[i]);
6324 add_param_to_tree(effect, &effect->params.parameters[i].param, NULL, 0, 0);
6325 }
6326
6327 if (effect->technique_count)
6328 {
6329 effect->techniques = calloc(effect->technique_count, sizeof(*effect->techniques));
6330 if (!effect->techniques)
6331 {
6332 ERR("Out of memory.\n");
6333 hr = E_OUTOFMEMORY;
6334 goto err_out;
6335 }
6336
6337 for (i = 0; i < effect->technique_count; ++i)
6338 {
6339 TRACE("Parsing technique %u.\n", i);
6340 hr = d3dx_parse_effect_technique(effect, &effect->techniques[i], data, &ptr, effect->objects);
6341 if (hr != D3D_OK)
6342 {
6343 WARN("Failed to parse technique %u.\n", i);
6344 goto err_out;
6345 }
6346 }
6347 }
6348
6349 string_count = read_u32(&ptr);
6350 TRACE("String count: %u.\n", string_count);
6351
6352 resource_count = read_u32(&ptr);
6353 TRACE("Resource count: %u.\n", resource_count);
6354
6355 for (i = 0; i < string_count; ++i)
6356 {
6357 unsigned int id;
6358
6359 id = read_u32(&ptr);
6360 TRACE("id: %u.\n", id);
6361
6362 if (FAILED(hr = d3dx9_copy_data(effect, id, &ptr)))
6363 goto err_out;
6364
6365 if (effect->objects[id].data)
6366 {
6367 if (FAILED(hr = d3dx9_create_object(effect, &effect->objects[id])))
6368 goto err_out;
6369 }
6370 }
6371
6372 for (i = 0; i < resource_count; ++i)
6373 {
6374 TRACE("parse resource %u.\n", i);
6375
6376 hr = d3dx_parse_resource(effect, data, &ptr, skip_constants, skip_constants_count);
6377 if (hr != D3D_OK)
6378 {
6379 WARN("Failed to parse resource %u.\n", i);
6380 goto err_out;
6381 }
6382 }
6383
6384 for (i = 0; i < effect->params.count; ++i)
6385 {
6386 if (FAILED(hr = d3dx_pool_sync_shared_parameter(effect->pool, &effect->params.parameters[i])))
6387 goto err_out;
6388 effect->params.parameters[i].version_counter = get_version_counter_ptr(effect);
6389 set_dirty(&effect->params.parameters[i].param);
6390 }
6391 return D3D_OK;
6392
6393err_out:
6394
6395 if (effect->techniques)
6396 {
6397 for (i = 0; i < effect->technique_count; ++i)
6398 free_technique(&effect->techniques[i]);
6399 free(effect->techniques);
6400 effect->techniques = NULL;
6401 }
6402
6404
6405 if (effect->objects)
6406 {
6407 for (i = 0; i < effect->object_count; ++i)
6408 {
6409 free_object(&effect->objects[i]);
6410 }
6411 free(effect->objects);
6412 effect->objects = NULL;
6413 }
6414
6415 return hr;
6416}
6417
6418#define INITIAL_CONST_NAMES_SIZE 4
6419
6420static char *next_valid_constant_name(char **string)
6421{
6422 char *ret = *string;
6423 char *next;
6424
6425 while (*ret && !isalpha(*ret) && *ret != '_')
6426 ++ret;
6427 if (!*ret)
6428 return NULL;
6429
6430 next = ret + 1;
6431 while (isalpha(*next) || isdigit(*next) || *next == '_')
6432 ++next;
6433 if (*next)
6434 *next++ = 0;
6435 *string = next;
6436 return ret;
6437}
6438
6439static const char **parse_skip_constants_string(char *skip_constants_string, unsigned int *names_count)
6440{
6441 const char **names, **new_alloc;
6442 const char *name;
6443 char *s;
6444 unsigned int size = INITIAL_CONST_NAMES_SIZE;
6445
6446 names = malloc(sizeof(*names) * size);
6447 if (!names)
6448 return NULL;
6449
6450 *names_count = 0;
6451 s = skip_constants_string;
6452 while ((name = next_valid_constant_name(&s)))
6453 {
6454 if (*names_count == size)
6455 {
6456 size *= 2;
6457 new_alloc = realloc(names, sizeof(*names) * size);
6458 if (!new_alloc)
6459 {
6460 free(names);
6461 return NULL;
6462 }
6463 names = new_alloc;
6464 }
6465 names[(*names_count)++] = name;
6466 }
6467 new_alloc = realloc(names, *names_count * sizeof(*names));
6468 if (!new_alloc)
6469 return names;
6470 return new_alloc;
6471}
6472
6474 struct IDirect3DDevice9 *device, const char *data, SIZE_T data_size,
6475 unsigned int flags, struct ID3DXEffectPool *pool, const char *skip_constants_string)
6476{
6477 unsigned int skip_constants_count = 0;
6478 char *skip_constants_buffer = NULL;
6479 const char **skip_constants = NULL;
6480 const char *ptr = data;
6482 unsigned int i, j;
6483 HRESULT hr;
6484
6485 effect->ID3DXEffect_iface.lpVtbl = &ID3DXEffect_Vtbl;
6486 effect->ref = 1;
6487
6488 effect->flags = flags;
6489
6491
6492 tag = read_u32(&ptr);
6493 TRACE("Tag: %#x.\n", tag);
6494
6495 if (!(flags & D3DXFX_NOT_CLONEABLE))
6496 {
6497 if (!(effect->source = malloc(data_size)))
6498 return E_OUTOFMEMORY;
6499 memcpy(effect->source, data, data_size);
6500 effect->source_size = data_size;
6501 }
6502
6503 if (pool)
6504 {
6506 pool->lpVtbl->AddRef(pool);
6507 }
6508
6510 effect->device = device;
6511
6512 if (skip_constants_string)
6513 {
6514 if (!(flags & D3DXFX_NOT_CLONEABLE) && !(effect->skip_constants_string = strdup(skip_constants_string)))
6515 {
6516 hr = E_OUTOFMEMORY;
6517 goto fail;
6518 }
6519
6520 if (!(skip_constants_buffer = strdup(skip_constants_string)))
6521 {
6522 hr = E_OUTOFMEMORY;
6523 goto fail;
6524 }
6525
6526 if (!(skip_constants = parse_skip_constants_string(skip_constants_buffer, &skip_constants_count)))
6527 {
6528 free(skip_constants_buffer);
6529 hr = E_OUTOFMEMORY;
6530 goto fail;
6531 }
6532 }
6533 offset = read_u32(&ptr);
6534 TRACE("Offset: %#x.\n", offset);
6535
6536 hr = d3dx_parse_effect(effect, ptr, data_size, offset, skip_constants, skip_constants_count);
6537 if (hr != D3D_OK)
6538 {
6539 FIXME("Failed to parse effect.\n");
6540 free(skip_constants_buffer);
6541 free(skip_constants);
6542 goto fail;
6543 }
6544
6545 for (i = 0; i < skip_constants_count; ++i)
6546 {
6547 struct d3dx_parameter *param;
6548 param = get_parameter_by_name(&effect->params, NULL, skip_constants[i]);
6549 if (param)
6550 {
6551 for (j = 0; j < effect->technique_count; ++j)
6552 {
6553 if (is_parameter_used(param, &effect->techniques[j]))
6554 {
6555 WARN("skip_constants parameter %s is used in technique %u.\n",
6556 debugstr_a(skip_constants[i]), j);
6557 free(skip_constants_buffer);
6558 free(skip_constants);
6560 goto fail;
6561 }
6562 }
6563 }
6564 else
6565 {
6566 TRACE("skip_constants parameter %s not found.\n",
6567 debugstr_a(skip_constants[i]));
6568 }
6569 }
6570
6571 free(skip_constants_buffer);
6572 free(skip_constants);
6573
6574 /* initialize defaults - check because of unsupported ascii effects */
6575 if (effect->techniques)
6576 {
6577 effect->active_technique = &effect->techniques[0];
6578 effect->active_pass = NULL;
6579 }
6580
6581 return D3D_OK;
6582
6583fail:
6584 if (effect->techniques)
6585 {
6586 for (i = 0; i < effect->technique_count; ++i)
6587 free_technique(&effect->techniques[i]);
6588 free(effect->techniques);
6589 }
6590
6591 if (effect->params.parameters)
6592 {
6593 for (i = 0; i < effect->params.count; ++i)
6594 free_top_level_parameter(&effect->params.parameters[i]);
6595 free(effect->params.parameters);
6596 }
6597
6598 if (effect->objects)
6599 {
6600 for (i = 0; i < effect->object_count; ++i)
6601 free_object(&effect->objects[i]);
6602 free(effect->objects);
6603 }
6604
6606 if (pool)
6607 pool->lpVtbl->Release(pool);
6608 free(effect->source);
6609 free(effect->skip_constants_string);
6610 return hr;
6611}
6612
6614 const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
6615 UINT flags, ID3DBlob **errors, struct ID3DXEffectPool *pool, const char *skip_constants_string)
6616{
6617#if D3DX_SDK_VERSION <= 36
6619#else
6620 UINT compile_flags = 0;
6621#endif
6622 ID3DBlob *bytecode = NULL, *temp_errors = NULL;
6623 const char *ptr = data;
6624 unsigned int tag;
6625 HRESULT hr;
6626
6627 TRACE("effect %p, device %p, data %p, data_size %Iu, defines %p, include %p, flags %#x, errors %p, "
6628 "pool %p, skip_constants %s.\n",
6629 effect, device, data, data_size, defines, include, flags, errors, pool,
6630 debugstr_a(skip_constants_string));
6631
6632 tag = read_u32(&ptr);
6633
6634 if (tag == d3dx9_effect_version(9, 1))
6635 return d3dx9_effect_init_from_binary(effect, device, data, data_size, flags, pool, skip_constants_string);
6636
6637 TRACE("HLSL ASCII effect, trying to compile it.\n");
6638 compile_flags |= flags & ~(D3DXFX_NOT_CLONEABLE | D3DXFX_LARGEADDRESSAWARE);
6639 hr = D3DCompile(data, data_size, NULL, defines, include,
6640 NULL, "fx_2_0", compile_flags, 0, &bytecode, &temp_errors);
6641 if (FAILED(hr))
6642 {
6643 WARN("Failed to compile ASCII effect.\n");
6644 if (bytecode)
6645 ID3D10Blob_Release(bytecode);
6646 if (temp_errors)
6647 {
6648 const char *error_string = ID3D10Blob_GetBufferPointer(temp_errors);
6649 const char *string_ptr;
6650
6651 while (*error_string)
6652 {
6653 string_ptr = error_string;
6654 while (*string_ptr && *string_ptr != '\n' && *string_ptr != '\r'
6655 && string_ptr - error_string < 80)
6656 ++string_ptr;
6657 TRACE("%s\n", debugstr_an(error_string, string_ptr - error_string));
6658 error_string = string_ptr;
6659 while (*error_string == '\n' || *error_string == '\r')
6660 ++error_string;
6661 }
6662 }
6663 if (errors)
6664 *errors = temp_errors;
6665 else if (temp_errors)
6666 ID3D10Blob_Release(temp_errors);
6667 return hr;
6668 }
6669 if (!bytecode)
6670 {
6671 FIXME("No output from effect compilation.\n");
6672 return D3DERR_INVALIDCALL;
6673 }
6674 if (errors)
6675 *errors = temp_errors;
6676 else if (temp_errors)
6677 ID3D10Blob_Release(temp_errors);
6678
6679 hr = d3dx9_effect_init_from_binary(effect, device, ID3D10Blob_GetBufferPointer(bytecode),
6680 ID3D10Blob_GetBufferSize(bytecode), flags, pool, skip_constants_string);
6681 ID3D10Blob_Release(bytecode);
6682 return hr;
6683}
6684
6685HRESULT WINAPI D3DXCreateEffectEx(struct IDirect3DDevice9 *device, const void *srcdata, UINT srcdatalen,
6686 const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skip_constants, DWORD flags,
6687 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilation_errors)
6688{
6689 struct d3dx_effect *object;
6690 HRESULT hr;
6691
6692 TRACE("device %p, srcdata %p, srcdatalen %u, defines %p, include %p, "
6693 "skip_constants %p, flags %#lx, pool %p, effect %p, compilation_errors %p.\n",
6694 device, srcdata, srcdatalen, defines, include,
6695 skip_constants, flags, pool, effect, compilation_errors);
6696
6697 if (compilation_errors)
6698 *compilation_errors = NULL;
6699
6700 if (!device || !srcdata)
6701 return D3DERR_INVALIDCALL;
6702
6703 if (!srcdatalen)
6704 return E_FAIL;
6705
6706 /* Native dll allows effect to be null so just return D3D_OK after doing basic checks */
6707 if (!effect)
6708 return D3D_OK;
6709
6710 object = calloc(1, sizeof(*object));
6711 if (!object)
6712 return E_OUTOFMEMORY;
6713
6714 hr = d3dx9_effect_init(object, device, srcdata, srcdatalen, (const D3D_SHADER_MACRO *)defines,
6715 (ID3DInclude *)include, flags, (ID3DBlob **)compilation_errors, pool, skip_constants);
6716 if (FAILED(hr))
6717 {
6718 WARN("Failed to create effect object, hr %#lx.\n", hr);
6719 return hr;
6720 }
6721
6722 *effect = &object->ID3DXEffect_iface;
6723
6724 TRACE("Created ID3DXEffect %p\n", object);
6725
6726 return D3D_OK;
6727}
6728
6730 const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags,
6731 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
6732{
6733 TRACE("device %p, data %p, data_size %u, defines %p, include %p, flags %#lx, pool %p, "
6734 "effect %p, messages %p.\n", device, data, data_size, defines,
6735 include, flags, pool, effect, messages);
6736
6737 return D3DXCreateEffectEx(device, data, data_size, defines, include, NULL, flags, pool, effect, messages);
6738}
6739
6741 const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
6743{
6744 TRACE("compiler %p, data %p, data_size %Iu, defines %p, include %p, eflags %#x, messages %p.\n",
6745 compiler, data, data_size, defines, include, eflags, messages);
6746
6748 compiler->ref = 1;
6749
6750 FIXME("ID3DXEffectCompiler implementation is only a stub.\n");
6751
6752 return D3D_OK;
6753}
6754
6756 ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
6757{
6759 HRESULT hr;
6760
6761 TRACE("data %p, data_size %u, defines %p, include %p, flags %#lx, compiler %p, messages %p.\n",
6762 data, data_size, defines, include, flags, compiler, messages);
6763
6764 if (!data || !compiler)
6765 {
6766 WARN("Invalid arguments supplied\n");
6767 return D3DERR_INVALIDCALL;
6768 }
6769
6770 object = calloc(1, sizeof(*object));
6771 if (!object)
6772 return E_OUTOFMEMORY;
6773
6774 hr = d3dx9_effect_compiler_init(object, data, data_size, (const D3D_SHADER_MACRO *)defines,
6776 if (FAILED(hr))
6777 {
6778 WARN("Failed to initialize effect compiler\n");
6779 free(object);
6780 return hr;
6781 }
6782
6783 *compiler = &object->ID3DXEffectCompiler_iface;
6784
6785 TRACE("Created ID3DXEffectCompiler %p\n", object);
6786
6787 return D3D_OK;
6788}
6789
6790/*** IUnknown methods ***/
6791static HRESULT WINAPI d3dx_effect_pool_QueryInterface(ID3DXEffectPool *iface, REFIID riid, void **object)
6792{
6793 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
6794
6795 if (IsEqualGUID(riid, &IID_IUnknown) ||
6796 IsEqualGUID(riid, &IID_ID3DXEffectPool))
6797 {
6798 iface->lpVtbl->AddRef(iface);
6799 *object = iface;
6800 return S_OK;
6801 }
6802
6803 WARN("Interface %s not found\n", debugstr_guid(riid));
6804
6805 return E_NOINTERFACE;
6806}
6807
6808static ULONG WINAPI d3dx_effect_pool_AddRef(ID3DXEffectPool *iface)
6809{
6812
6813 TRACE("%p increasing refcount to %lu.\n", pool, refcount);
6814
6815 return refcount;
6816}
6817
6819{
6820 unsigned int i;
6821
6822 for (i = 0; i < pool->size; ++i)
6823 {
6824 if (pool->shared_data[i].count)
6825 {
6826 unsigned int j;
6827
6828 WARN("Releasing pool with referenced parameters.\n");
6829
6830 param_set_data_pointer(&pool->shared_data[i].parameters[0]->param, NULL, FALSE, TRUE);
6831 pool->shared_data[i].parameters[0]->shared_data = NULL;
6832
6833 for (j = 1; j < pool->shared_data[i].count; ++j)
6834 {
6835 walk_parameter_tree(&pool->shared_data[i].parameters[j]->param, param_zero_data_func, NULL);
6836 pool->shared_data[i].parameters[j]->shared_data = NULL;
6837 }
6838 free(pool->shared_data[i].parameters);
6839 }
6840 }
6841 free(pool->shared_data);
6842 free(pool);
6843}
6844
6845static ULONG WINAPI d3dx_effect_pool_Release(ID3DXEffectPool *iface)
6846{
6849
6850 TRACE("%p decreasing refcount to %lu.\n", pool, refcount);
6851
6852 if (!refcount)
6854
6855 return refcount;
6856}
6857
6858static const struct ID3DXEffectPoolVtbl ID3DXEffectPool_Vtbl =
6859{
6860 /*** IUnknown methods ***/
6864};
6865
6866static inline struct d3dx_effect_pool *unsafe_impl_from_ID3DXEffectPool(ID3DXEffectPool *iface)
6867{
6868 if (!iface)
6869 return NULL;
6870
6871 assert(iface->lpVtbl == &ID3DXEffectPool_Vtbl);
6872 return impl_from_ID3DXEffectPool(iface);
6873}
6874
6876{
6877 struct d3dx_effect_pool *object;
6878
6879 TRACE("pool %p.\n", pool);
6880
6881 if (!pool)
6882 return D3DERR_INVALIDCALL;
6883
6884 object = calloc(1, sizeof(*object));
6885 if (!object)
6886 return E_OUTOFMEMORY;
6887
6888 object->ID3DXEffectPool_iface.lpVtbl = &ID3DXEffectPool_Vtbl;
6889 object->refcount = 1;
6890
6891 *pool = &object->ID3DXEffectPool_iface;
6892
6893 return S_OK;
6894}
6895
6897 const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags,
6898 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
6899{
6900 struct d3dx_include_from_file include_from_file;
6901 const void *buffer;
6902 unsigned int size;
6903 char *filename_a;
6904 HRESULT ret;
6905
6906 TRACE("device %p, srcfile %s, defines %p, include %p, skipconstants %s, "
6907 "flags %#lx, pool %p, effect %p, messages %p.\n",
6908 device, debugstr_w(srcfile), defines, include, debugstr_a(skipconstants),
6909 flags, pool, effect, messages);
6910
6911 if (!device || !srcfile)
6912 return D3DERR_INVALIDCALL;
6913
6914 if (!include)
6915 {
6916 include_from_file.ID3DXInclude_iface.lpVtbl = &d3dx_include_from_file_vtbl;
6917 include = &include_from_file.ID3DXInclude_iface;
6918 }
6919
6920 size = WideCharToMultiByte(CP_ACP, 0, srcfile, -1, NULL, 0, NULL, NULL);
6921 filename_a = malloc(size);
6922 if (!filename_a)
6923 return E_OUTOFMEMORY;
6924 WideCharToMultiByte(CP_ACP, 0, srcfile, -1, filename_a, size, NULL, NULL);
6925
6928 if (FAILED(ret))
6929 {
6931 free(filename_a);
6932 return D3DXERR_INVALIDDATA;
6933 }
6934
6936 effect, messages);
6937
6940 free(filename_a);
6941 return ret;
6942}
6943
6945 const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags,
6946 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
6947{
6948 WCHAR *srcfileW;
6949 HRESULT ret;
6950 DWORD len;
6951
6952 TRACE("device %p, srcfile %s, defines %p, include %p, skipconstants %s, "
6953 "flags %#lx, pool %p, effect %p, messages %p.\n",
6954 device, debugstr_a(srcfile), defines, include, debugstr_a(skipconstants),
6955 flags, pool, effect, messages);
6956
6957 if (!srcfile)
6958 return D3DERR_INVALIDCALL;
6959
6960 len = MultiByteToWideChar(CP_ACP, 0, srcfile, -1, NULL, 0);
6961 srcfileW = malloc(len * sizeof(*srcfileW));
6962 MultiByteToWideChar(CP_ACP, 0, srcfile, -1, srcfileW, len);
6963
6964 ret = D3DXCreateEffectFromFileExW(device, srcfileW, defines, include, skipconstants, flags, pool, effect, messages);
6965 free(srcfileW);
6966
6967 return ret;
6968}
6969
6971 const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool,
6972 struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
6973{
6974 TRACE("(void): relay\n");
6976 effect, messages);
6977}
6978
6980 const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool,
6981 struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
6982{
6983 TRACE("(void): relay\n");
6985 effect, messages);
6986}
6987
6989 const WCHAR *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants,
6990 DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
6991{
6992 HRSRC resinfo;
6993 void *buffer;
6994 DWORD size;
6995
6996 TRACE("device %p, srcmodule %p, srcresource %s, defines %p, include %p, skipconstants %s, "
6997 "flags %#lx, pool %p, effect %p, messages %p.\n",
6998 device, srcmodule, debugstr_w(srcresource), defines, include, debugstr_a(skipconstants),
6999 flags, pool, effect, messages);
7000
7001 if (!device)
7002 return D3DERR_INVALIDCALL;
7003
7004 if (!(resinfo = FindResourceW(srcmodule, srcresource, (const WCHAR *)RT_RCDATA)))
7005 return D3DXERR_INVALIDDATA;
7006
7007 if (FAILED(load_resource_into_memory(srcmodule, resinfo, &buffer, &size)))
7008 return D3DXERR_INVALIDDATA;
7009
7011 skipconstants, flags, pool, effect, messages);
7012}
7013
7015 const char *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include,
7016 const char *skipconstants, DWORD flags, struct ID3DXEffectPool *pool,
7017 struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
7018{
7019 HRSRC resinfo;
7020 void *buffer;
7021 DWORD size;
7022
7023 TRACE("device %p, srcmodule %p, srcresource %s, defines %p, include %p, skipconstants %s, "
7024 "flags %#lx, pool %p, effect %p, messages %p.\n",
7025 device, srcmodule, debugstr_a(srcresource), defines, include, debugstr_a(skipconstants),
7026 flags, pool, effect, messages);
7027
7028 if (!device)
7029 return D3DERR_INVALIDCALL;
7030
7031 if (!(resinfo = FindResourceA(srcmodule, srcresource, (const char *)RT_RCDATA)))
7032 return D3DXERR_INVALIDDATA;
7033
7034 if (FAILED(load_resource_into_memory(srcmodule, resinfo, &buffer, &size)))
7035 return D3DXERR_INVALIDDATA;
7036
7038 skipconstants, flags, pool, effect, messages);
7039}
7040
7042 const WCHAR *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags,
7043 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
7044{
7045 TRACE("(void): relay\n");
7046 return D3DXCreateEffectFromResourceExW(device, srcmodule, srcresource, defines, include, NULL,
7047 flags, pool, effect, messages);
7048}
7049
7051 const char *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags,
7052 struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
7053{
7054 TRACE("(void): relay\n");
7055 return D3DXCreateEffectFromResourceExA(device, srcmodule, srcresource, defines, include, NULL,
7056 flags, pool, effect, messages);
7057}
7058
7060 ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
7061{
7062 void *buffer;
7063 HRESULT ret;
7064 DWORD size;
7065
7066 TRACE("srcfile %s, defines %p, include %p, flags %#lx, compiler %p, messages %p.\n",
7067 debugstr_w(srcfile), defines, include, flags, compiler, messages);
7068
7069 if (!srcfile)
7070 return D3DERR_INVALIDCALL;
7071
7072 ret = map_view_of_file(srcfile, &buffer, &size);
7073
7074 if (FAILED(ret))
7075 return D3DXERR_INVALIDDATA;
7076
7079
7080 return ret;
7081}
7082
7084 ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
7085{
7086 WCHAR *srcfileW;
7087 HRESULT ret;
7088 DWORD len;
7089
7090 TRACE("srcfile %s, defines %p, include %p, flags %#lx, compiler %p, messages %p.\n",
7091 debugstr_a(srcfile), defines, include, flags, compiler, messages);
7092
7093 if (!srcfile)
7094 return D3DERR_INVALIDCALL;
7095
7096 len = MultiByteToWideChar(CP_ACP, 0, srcfile, -1, NULL, 0);
7097 srcfileW = malloc(len * sizeof(*srcfileW));
7098 MultiByteToWideChar(CP_ACP, 0, srcfile, -1, srcfileW, len);
7099
7101 free(srcfileW);
7102
7103 return ret;
7104}
7105
7107 const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags,
7108 ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
7109{
7110 HRSRC resinfo;
7111 void *buffer;
7112 DWORD size;
7113
7114 TRACE("srcmodule %p, srcresource %s, defines %p, include %p, flags %#lx, compiler %p, messages %p.\n",
7115 srcmodule, debugstr_a(srcresource), defines, include, flags, compiler, messages);
7116
7117 if (!(resinfo = FindResourceA(srcmodule, srcresource, (const char *)RT_RCDATA)))
7118 return D3DXERR_INVALIDDATA;
7119
7120 if (FAILED(load_resource_into_memory(srcmodule, resinfo, &buffer, &size)))
7121 return D3DXERR_INVALIDDATA;
7122
7124}
7125
7127 const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags,
7128 ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
7129{
7130 HRSRC resinfo;
7131 void *buffer;
7132 DWORD size;
7133
7134 TRACE("srcmodule %p, srcresource %s, defines %p, include %p, flags %#lx, compiler %p, messages %p.\n",
7135 srcmodule, debugstr_w(srcresource), defines, include, flags, compiler, messages);
7136
7137 if (!(resinfo = FindResourceW(srcmodule, srcresource, (const WCHAR *)RT_RCDATA)))
7138 return D3DXERR_INVALIDDATA;
7139
7140 if (FAILED(load_resource_into_memory(srcmodule, resinfo, &buffer, &size)))
7141 return D3DXERR_INVALIDDATA;
7142
7144}
7145
7146HRESULT WINAPI D3DXDisassembleEffect(ID3DXEffect *effect, BOOL enable_color_code, ID3DXBuffer **disassembly)
7147{
7148 FIXME("(%p, %u, %p): stub\n", effect, enable_color_code, disassembly);
7149
7150 return D3DXERR_INVALIDDATA;
7151}
Type
Definition: Type.h:7
#define isalpha(c)
Definition: acclib.h:74
#define isdigit(c)
Definition: acclib.h:68
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
static int state
Definition: maze.c:121
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
Definition: list.h:39
static float(WINAPI *pD2D1Tan)(float angle)
#define D3DERR_INVALIDCALL
Definition: d3d10_private.h:42
@ D3DRS_VERTEXBLEND
Definition: d3d8types.h:783
@ D3DRS_SHADEMODE
Definition: d3d8types.h:731
@ D3DRS_FOGDENSITY
Definition: d3d8types.h:751
@ D3DRS_STENCILENABLE
Definition: d3d8types.h:755
@ D3DRS_FOGEND
Definition: d3d8types.h:750
@ D3DRS_WRAP0
Definition: d3d8types.h:764
@ D3DRS_FOGSTART
Definition: d3d8types.h:749
@ D3DRS_STENCILZFAIL
Definition: d3d8types.h:757
@ D3DRS_CULLMODE
Definition: d3d8types.h:738
@ D3DRS_ALPHATESTENABLE
Definition: d3d8types.h:734
@ D3DRS_EMISSIVEMATERIALSOURCE
Definition: d3d8types.h:782
@ D3DRS_ZENABLE
Definition: d3d8types.h:729
@ D3DRS_STENCILWRITEMASK
Definition: d3d8types.h:762
@ D3DRS_POINTSCALE_B
Definition: d3d8types.h:791
@ D3DRS_STENCILFAIL
Definition: d3d8types.h:756
@ D3DRS_FOGVERTEXMODE
Definition: d3d8types.h:775
@ D3DRS_ZFUNC
Definition: d3d8types.h:739
@ D3DRS_SRCBLEND
Definition: d3d8types.h:736
@ D3DRS_WRAP1
Definition: d3d8types.h:765
@ D3DRS_MULTISAMPLEMASK
Definition: d3d8types.h:794
@ D3DRS_CLIPPLANEENABLE
Definition: d3d8types.h:784
@ D3DRS_WRAP2
Definition: d3d8types.h:766
@ D3DRS_ALPHAFUNC
Definition: d3d8types.h:741
@ D3DRS_WRAP4
Definition: d3d8types.h:768
@ D3DRS_SPECULARMATERIALSOURCE
Definition: d3d8types.h:780
@ D3DRS_DESTBLEND
Definition: d3d8types.h:737
@ D3DRS_COLORVERTEX
Definition: d3d8types.h:776
@ D3DRS_TWEENFACTOR
Definition: d3d8types.h:801
@ D3DRS_POINTSIZE_MIN
Definition: d3d8types.h:787
@ D3DRS_FOGCOLOR
Definition: d3d8types.h:747
@ D3DRS_POINTSCALEENABLE
Definition: d3d8types.h:789
@ D3DRS_NORMALIZENORMALS
Definition: d3d8types.h:778
@ D3DRS_POINTSIZE_MAX
Definition: d3d8types.h:798
@ D3DRS_WRAP6
Definition: d3d8types.h:770
@ D3DRS_AMBIENTMATERIALSOURCE
Definition: d3d8types.h:781
@ D3DRS_WRAP5
Definition: d3d8types.h:769
@ D3DRS_FILLMODE
Definition: d3d8types.h:730
@ D3DRS_PATCHEDGESTYLE
Definition: d3d8types.h:795
@ D3DRS_CLIPPING
Definition: d3d8types.h:772
@ D3DRS_DITHERENABLE
Definition: d3d8types.h:742
@ D3DRS_WRAP7
Definition: d3d8types.h:771
@ D3DRS_STENCILREF
Definition: d3d8types.h:760
@ D3DRS_POINTSPRITEENABLE
Definition: d3d8types.h:788
@ D3DRS_WRAP3
Definition: d3d8types.h:767
@ D3DRS_BLENDOP
Definition: d3d8types.h:802
@ D3DRS_POINTSCALE_C
Definition: d3d8types.h:792
@ D3DRS_ALPHABLENDENABLE
Definition: d3d8types.h:743
@ D3DRS_LOCALVIEWER
Definition: d3d8types.h:777
@ D3DRS_STENCILFUNC
Definition: d3d8types.h:759
@ D3DRS_FOGTABLEMODE
Definition: d3d8types.h:748
@ D3DRS_POINTSCALE_A
Definition: d3d8types.h:790
@ D3DRS_COLORWRITEENABLE
Definition: d3d8types.h:800
@ D3DRS_SPECULARENABLE
Definition: d3d8types.h:745
@ D3DRS_ZWRITEENABLE
Definition: d3d8types.h:733
@ D3DRS_ALPHAREF
Definition: d3d8types.h:740
@ D3DRS_DEBUGMONITORTOKEN
Definition: d3d8types.h:797
@ D3DRS_DIFFUSEMATERIALSOURCE
Definition: d3d8types.h:779
@ D3DRS_STENCILPASS
Definition: d3d8types.h:758
@ D3DRS_AMBIENT
Definition: d3d8types.h:774
@ D3DRS_POINTSIZE
Definition: d3d8types.h:786
@ D3DRS_INDEXEDVERTEXBLENDENABLE
Definition: d3d8types.h:799
@ D3DRS_STENCILMASK
Definition: d3d8types.h:761
@ D3DRS_LIGHTING
Definition: d3d8types.h:773
@ D3DRS_RANGEFOGENABLE
Definition: d3d8types.h:754
@ D3DRS_TEXTUREFACTOR
Definition: d3d8types.h:763
@ D3DRS_MULTISAMPLEANTIALIAS
Definition: d3d8types.h:793
@ D3DRS_LASTPIXEL
Definition: d3d8types.h:735
@ D3DRS_FOGENABLE
Definition: d3d8types.h:744
@ D3DTSS_ALPHAARG2
Definition: d3d8types.h:917
@ D3DTSS_COLOROP
Definition: d3d8types.h:912
@ D3DTSS_BUMPENVMAT11
Definition: d3d8types.h:921
@ D3DTSS_TEXCOORDINDEX
Definition: d3d8types.h:922
@ D3DTSS_ALPHAOP
Definition: d3d8types.h:915
@ D3DTSS_BUMPENVMAT01
Definition: d3d8types.h:919
@ D3DTSS_BUMPENVLSCALE
Definition: d3d8types.h:932
@ D3DTSS_BUMPENVMAT10
Definition: d3d8types.h:920
@ D3DTSS_RESULTARG
Definition: d3d8types.h:938
@ D3DTSS_BUMPENVLOFFSET
Definition: d3d8types.h:933
@ D3DTSS_COLORARG0
Definition: d3d8types.h:936
@ D3DTSS_COLORARG1
Definition: d3d8types.h:913
@ D3DTSS_TEXTURETRANSFORMFLAGS
Definition: d3d8types.h:934
@ D3DTSS_BUMPENVMAT00
Definition: d3d8types.h:918
@ D3DTSS_ALPHAARG1
Definition: d3d8types.h:916
@ D3DTSS_COLORARG2
Definition: d3d8types.h:914
@ D3DTSS_ALPHAARG0
Definition: d3d8types.h:937
@ D3DPOOL_DEFAULT
Definition: d3d8types.h:709
@ D3DTS_TEXTURE0
Definition: d3d8types.h:957
@ D3DTS_VIEW
Definition: d3d8types.h:955
@ D3DTS_PROJECTION
Definition: d3d8types.h:956
#define D3DTS_WORLD
Definition: d3d8types.h:85
#define IDirect3DTexture9_GetLevelDesc(p, a, b)
Definition: d3d9.h:860
#define IDirect3DVolumeTexture9_GetLevelDesc(p, a, b)
Definition: d3d9.h:955
#define IDirect3DDevice9_CreatePixelShader(p, a, b)
Definition: d3d9.h:1441
#define IDirect3DStateBlock9_Release(p)
Definition: d3d9.h:1128
#define IDirect3DVertexShader9_AddRef(p)
Definition: d3d9.h:1050
#define IDirect3DDevice9_EndStateBlock(p, a)
Definition: d3d9.h:1396
#define IDirect3DCubeTexture9_GetLevelDesc(p, a, b)
Definition: d3d9.h:765
#define IDirect3DDevice9_Release(p)
Definition: d3d9.h:1336
#define IDirect3DBaseTexture9_Release(p)
Definition: d3d9.h:663
#define IDirect3DBaseTexture9_AddRef(p)
Definition: d3d9.h:662
#define IDirect3DStateBlock9_Apply(p)
Definition: d3d9.h:1132
#define IDirect3DDevice9_BeginStateBlock(p)
Definition: d3d9.h:1395
#define IDirect3DStateBlock9_Capture(p)
Definition: d3d9.h:1131
#define IDirect3DDevice9_AddRef(p)
Definition: d3d9.h:1335
#define IDirect3DDevice9_CreateVertexShader(p, a, b)
Definition: d3d9.h:1426
#define IDirect3DPixelShader9_AddRef(p)
Definition: d3d9.h:1088
@ D3DRS_ENABLEADAPTIVETESSELLATION
Definition: d3d9types.h:1028
@ D3DRS_WRAP10
Definition: d3d9types.h:1042
@ D3DRS_POSITIONDEGREE
Definition: d3d9types.h:1017
@ D3DRS_SEPARATEALPHABLENDENABLE
Definition: d3d9types.h:1048
@ D3DRS_SRGBWRITEENABLE
Definition: d3d9types.h:1038
@ D3DRS_COLORWRITEENABLE2
Definition: d3d9types.h:1035
@ D3DRS_CCW_STENCILZFAIL
Definition: d3d9types.h:1031
@ D3DRS_COLORWRITEENABLE1
Definition: d3d9types.h:1034
@ D3DRS_CCW_STENCILFAIL
Definition: d3d9types.h:1030
@ D3DRS_WRAP13
Definition: d3d9types.h:1045
@ D3DRS_MINTESSELLATIONLEVEL
Definition: d3d9types.h:1022
@ D3DRS_ADAPTIVETESS_X
Definition: d3d9types.h:1024
@ D3DRS_WRAP12
Definition: d3d9types.h:1044
@ D3DRS_CCW_STENCILPASS
Definition: d3d9types.h:1032
@ D3DRS_WRAP11
Definition: d3d9types.h:1043
@ D3DRS_NORMALDEGREE
Definition: d3d9types.h:1018
@ D3DRS_ADAPTIVETESS_W
Definition: d3d9types.h:1027
@ D3DRS_WRAP15
Definition: d3d9types.h:1047
@ D3DRS_ADAPTIVETESS_Y
Definition: d3d9types.h:1025
@ D3DRS_TWOSIDEDSTENCILMODE
Definition: d3d9types.h:1029
@ D3DRS_BLENDOPALPHA
Definition: d3d9types.h:1051
@ D3DRS_DEPTHBIAS
Definition: d3d9types.h:1039
@ D3DRS_BLENDFACTOR
Definition: d3d9types.h:1037
@ D3DRS_COLORWRITEENABLE3
Definition: d3d9types.h:1036
@ D3DRS_SRCBLENDALPHA
Definition: d3d9types.h:1049
@ D3DRS_WRAP8
Definition: d3d9types.h:1040
@ D3DRS_WRAP9
Definition: d3d9types.h:1041
@ D3DRS_SLOPESCALEDEPTHBIAS
Definition: d3d9types.h:1020
@ D3DRS_CCW_STENCILFUNC
Definition: d3d9types.h:1033
@ D3DRS_MAXTESSELLATIONLEVEL
Definition: d3d9types.h:1023
@ D3DRS_ANTIALIASEDLINEENABLE
Definition: d3d9types.h:1021
@ D3DRS_SCISSORTESTENABLE
Definition: d3d9types.h:1019
@ D3DRS_DESTBLENDALPHA
Definition: d3d9types.h:1050
@ D3DRS_ADAPTIVETESS_Z
Definition: d3d9types.h:1026
@ D3DRS_WRAP14
Definition: d3d9types.h:1046
@ D3DTSS_CONSTANT
Definition: d3d9types.h:1184
@ D3DSAMP_ADDRESSW
Definition: d3d9types.h:1235
@ D3DSAMP_MIPFILTER
Definition: d3d9types.h:1239
@ D3DSAMP_MAXMIPLEVEL
Definition: d3d9types.h:1241
@ D3DSAMP_SRGBTEXTURE
Definition: d3d9types.h:1243
@ D3DSAMP_DMAPOFFSET
Definition: d3d9types.h:1245
@ D3DSAMP_MAXANISOTROPY
Definition: d3d9types.h:1242
@ D3DSAMP_BORDERCOLOR
Definition: d3d9types.h:1236
@ D3DSAMP_ELEMENTINDEX
Definition: d3d9types.h:1244
@ D3DSAMP_MINFILTER
Definition: d3d9types.h:1238
@ D3DSAMP_ADDRESSU
Definition: d3d9types.h:1233
@ D3DSAMP_MAGFILTER
Definition: d3d9types.h:1237
@ D3DSAMP_ADDRESSV
Definition: d3d9types.h:1234
@ D3DSAMP_MIPMAPLODBIAS
Definition: d3d9types.h:1240
#define D3DVERTEXTEXTURESAMPLER0
Definition: d3d9types.h:202
#define D3D_OK
Definition: d3d.h:106
#define D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY
Definition: d3dcompiler.h:54
static SIZE_T const char const D3D_SHADER_MACRO ID3DInclude * include
Definition: asm.c:31
static SIZE_T const char const D3D_SHADER_MACRO * defines
Definition: asm.c:31
HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages)
Definition: compiler.c:639
#define D3DXERR_INVALIDDATA
Definition: compiler.c:53
D3DLIGHTTYPE
Definition: d3dtypes.h:554
struct ID3DXBuffer ID3DXBuffer
Definition: d3dx8core.h:51
static BOOL is_param_type_sampler(D3DXPARAMETER_TYPE type)
HRESULT d3dx_param_eval_set_shader_constants(ID3DXEffectStateManager *manager, struct IDirect3DDevice9 *device, struct d3dx_param_eval *peval, BOOL update_all)
Definition: preshader.c:1755
static struct d3dx_top_level_parameter * top_level_parameter_from_parameter(struct d3dx_parameter *param)
static BOOL is_param_dirty(struct d3dx_parameter *param, ULONG64 update_version)
static ULONG64 next_update_version(ULONG64 *version_counter)
CRITICAL_SECTION from_file_mutex
Definition: shader.c:242
BOOL is_param_eval_input_dirty(struct d3dx_param_eval *peval, ULONG64 update_version)
Definition: preshader.c:1716
HRESULT map_view_of_file(const WCHAR *filename, void **buffer, DWORD *length)
Definition: util.c:211
static void set_number(void *outdata, D3DXPARAMETER_TYPE outtype, const void *indata, D3DXPARAMETER_TYPE intype)
HRESULT d3dx_evaluate_parameter(struct d3dx_param_eval *peval, const struct d3dx_parameter *param, void *param_value)
Definition: preshader.c:1722
const char * debug_d3dxparameter_type(D3DXPARAMETER_TYPE t)
Definition: util.c:344
static BOOL is_top_level_parameter(struct d3dx_parameter *param)
HRESULT d3dx_create_param_eval(struct d3dx_parameters_store *parameters, void *byte_code, unsigned int byte_code_size, D3DXPARAMETER_TYPE type, struct d3dx_param_eval **peval, ULONG64 *version_counter, const char **skip_constants, unsigned int skip_constants_count)
Definition: preshader.c:1232
void d3dx_free_param_eval(struct d3dx_param_eval *peval)
Definition: preshader.c:1357
const struct ID3DXIncludeVtbl d3dx_include_from_file_vtbl
Definition: shader.c:328
#define SET_D3D_STATE(base_effect,...)
const char * debug_d3dxparameter_class(D3DXPARAMETER_CLASS c)
Definition: util.c:328
HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, void **buffer, DWORD *length)
Definition: util.c:261
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define annotation(x)
Definition: dispex.idl:19
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT32 uint32_t
Definition: types.h:75
static uint32_t read_u32(const char **ptr)
Definition: utils.h:24
static HRESULT d3dx_parse_state(struct d3dx_effect *effect, struct d3dx_state *state, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5657
#define INITIAL_SHARED_DATA_SIZE
Definition: effect.c:204
static HRESULT d3dx_parse_effect_technique(struct d3dx_effect *effect, struct d3dx_technique *technique, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5900
static BOOL param_on_lost_device(void *data, struct d3dx_parameter *param)
Definition: effect.c:4119
static HRESULT WINAPI d3dx_effect_GetVertexShader(ID3DXEffect *iface, D3DXHANDLE parameter, IDirect3DVertexShader9 **shader)
Definition: effect.c:3660
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetInt(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT *n)
Definition: effect.c:4764
static HRESULT WINAPI d3dx_effect_GetMatrixTransposeArray(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
Definition: effect.c:3423
static HRESULT WINAPI d3dx_effect_SetMatrixTranspose(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix)
Definition: effect.c:3305
static void param_set_magic_number(struct d3dx_parameter *param)
Definition: effect.c:5362
HRESULT WINAPI D3DXCreateEffectFromFileExW(struct IDirect3DDevice9 *device, const WCHAR *srcfile, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:6896
static HRESULT d3dx_parse_effect_annotation(struct d3dx_effect *effect, struct d3dx_parameter *anno, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5626
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixPointerArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
Definition: effect.c:4881
static HRESULT WINAPI d3dx_effect_SetMatrixArray(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
Definition: effect.c:3139
static HRESULT d3dx_parse_effect_pass(struct d3dx_effect *effect, struct d3dx_pass *pass, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5804
static HRESULT WINAPI d3dx_effect_OnLostDevice(ID3DXEffect *iface)
Definition: effect.c:4166
static HRESULT WINAPI d3dx_effect_QueryInterface(ID3DXEffect *iface, REFIID riid, void **object)
Definition: effect.c:1965
static HRESULT WINAPI d3dx_effect_SetMatrix(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix)
Definition: effect.c:3070
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetString(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const char *string)
Definition: effect.c:4945
static BOOL walk_parameter_tree(struct d3dx_parameter *param, walk_parameter_dep_func param_func, void *data)
Definition: effect.c:1268
static ULONG64 * get_version_counter_ptr(struct d3dx_effect *effect)
Definition: effect.c:1286
static void free_top_level_parameter(struct d3dx_top_level_parameter *param)
Definition: effect.c:633
static struct d3dx_parameter_block * get_valid_parameter_block(D3DXHANDLE handle)
Definition: effect.c:516
static D3DXHANDLE WINAPI d3dx_effect_GetFunction(ID3DXEffect *iface, UINT index)
Definition: effect.c:2360
static BOOL walk_parameter_dep(struct d3dx_parameter *param, walk_parameter_dep_func param_func, void *data)
Definition: effect.c:3877
static unsigned int get_annotation_from_object(struct d3dx_effect *effect, D3DXHANDLE object, struct d3dx_parameter **annotations)
Definition: effect.c:1228
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetDesc(ID3DXEffectCompiler *iface, D3DXEFFECT_DESC *desc)
Definition: effect.c:4581
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetFunctionByName(ID3DXEffectCompiler *iface, const char *name)
Definition: effect.c:4688
static HRESULT WINAPI d3dx_effect_EndPass(ID3DXEffect *iface)
Definition: effect.c:4049
static D3DXHANDLE WINAPI d3dx_effect_EndParameterBlock(ID3DXEffect *iface)
Definition: effect.c:4240
static HRESULT WINAPI d3dx_effect_GetMatrixPointerArray(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
Definition: effect.c:3265
static HRESULT WINAPI d3dx_effect_GetInt(ID3DXEffect *iface, D3DXHANDLE parameter, INT *n)
Definition: effect.c:2669
static HRESULT WINAPI d3dx_effect_SetIntArray(ID3DXEffect *iface, D3DXHANDLE parameter, const INT *n, UINT count)
Definition: effect.c:2707
static HRESULT WINAPI d3dx_effect_GetVectorArray(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXVECTOR4 *vector, UINT count)
Definition: effect.c:3029
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetBoolArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const BOOL *b, UINT count)
Definition: effect.c:4741
static D3DXHANDLE WINAPI d3dx_effect_GetPass(ID3DXEffect *iface, D3DXHANDLE technique, UINT index)
Definition: effect.c:2314
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetFloat(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float f)
Definition: effect.c:4787
static struct d3dx_technique * get_technique_by_name(struct d3dx_effect *effect, const char *name)
Definition: effect.c:459
static HRESULT WINAPI d3dx_effect_GetIntArray(ID3DXEffect *iface, D3DXHANDLE parameter, INT *n, UINT count)
Definition: effect.c:2746
static void d3dx9_set_light_parameter(enum LIGHT_TYPE op, D3DLIGHT9 *light, void *value)
Definition: effect.c:1357
static HRESULT WINAPI d3dx_effect_SetMatrixTransposePointerArray(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
Definition: effect.c:3464
static HRESULT WINAPI d3dx_effect_GetDevice(ID3DXEffect *iface, struct IDirect3DDevice9 **device)
Definition: effect.c:4098
static HRESULT d3dx9_effect_init_from_binary(struct d3dx_effect *effect, struct IDirect3DDevice9 *device, const char *data, SIZE_T data_size, unsigned int flags, struct ID3DXEffectPool *pool, const char *skip_constants_string)
Definition: effect.c:6473
static HRESULT WINAPI d3dx_effect_SetString(ID3DXEffect *iface, D3DXHANDLE parameter, const char *string)
Definition: effect.c:3545
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixTransposeArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
Definition: effect.c:4913
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetPassDesc(ID3DXEffectCompiler *iface, D3DXHANDLE pass, D3DXPASS_DESC *desc)
Definition: effect.c:4604
static HRESULT d3dx9_apply_pass_states(struct d3dx_effect *effect, struct d3dx_pass *pass, BOOL update_all)
Definition: effect.c:1745
#define INT_FLOAT_MULTI_INVERSE
Definition: effect.c:31
static ULONG WINAPI d3dx_effect_pool_AddRef(ID3DXEffectPool *iface)
Definition: effect.c:6808
static HRESULT WINAPI d3dx_effect_SetInt(ID3DXEffect *iface, D3DXHANDLE parameter, INT n)
Definition: effect.c:2623
HRESULT WINAPI D3DXCreateEffectCompiler(const char *data, UINT data_size, const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
Definition: effect.c:6755
static ULONG WINAPI d3dx_effect_AddRef(ID3DXEffect *iface)
Definition: effect.c:1982
HRESULT WINAPI D3DXCreateEffectFromFileW(struct IDirect3DDevice9 *device, const WCHAR *srcfile, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:6970
static BOOL is_same_parameter(void *param1_, struct d3dx_parameter *param2)
Definition: effect.c:1807
HRESULT WINAPI D3DXCreateEffectPool(ID3DXEffectPool **pool)
Definition: effect.c:6875
static HRESULT WINAPI d3dx_effect_GetFloatArray(ID3DXEffect *iface, D3DXHANDLE parameter, float *f, UINT count)
Definition: effect.c:2851
static HRESULT d3dx9_apply_state(struct d3dx_effect *effect, struct d3dx_pass *pass, struct d3dx_state *state, unsigned int parent_index, BOOL update_all)
Definition: effect.c:1609
static void free_parameter_data(struct d3dx_parameter *param, BOOL child)
Definition: effect.c:591
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetTechnique(ID3DXEffectCompiler *iface, UINT index)
Definition: effect.c:4652
static int param_rb_compare(const void *key, const struct wine_rb_entry *entry)
Definition: effect.c:735
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetTexture(struct ID3DXEffectCompiler *iface, D3DXHANDLE parameter, struct IDirect3DBaseTexture9 **texture)
Definition: effect.c:4969
static void free_technique(struct d3dx_technique *technique)
Definition: effect.c:676
HRESULT WINAPI D3DXDisassembleEffect(ID3DXEffect *effect, BOOL enable_color_code, ID3DXBuffer **disassembly)
Definition: effect.c:7146
static void free_parameter(struct d3dx_parameter *param, BOOL element, BOOL child)
Definition: effect.c:603
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameterElement(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, UINT index)
Definition: effect.c:4644
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetFloatArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const float *f, UINT count)
Definition: effect.c:4801
static HRESULT WINAPI d3dx_effect_GetFloat(ID3DXEffect *iface, D3DXHANDLE parameter, float *f)
Definition: effect.c:2792
HRESULT WINAPI D3DXCreateEffectFromResourceA(struct IDirect3DDevice9 *device, HMODULE srcmodule, const char *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:7050
static void * record_parameter(struct d3dx_effect *effect, struct d3dx_parameter *param, unsigned int bytes)
Definition: effect.c:1296
#define INT_FLOAT_MULTI
Definition: effect.c:30
static HRESULT WINAPI d3dx_effect_CloneEffect(ID3DXEffect *iface, IDirect3DDevice9 *device, ID3DXEffect **out)
Definition: effect.c:4369
static HRESULT WINAPI d3dx_effect_GetStateManager(ID3DXEffect *iface, ID3DXEffectStateManager **manager)
Definition: effect.c:4202
static D3DXHANDLE WINAPI d3dx_effect_GetParameterByName(ID3DXEffect *iface, D3DXHANDLE parameter, const char *name)
Definition: effect.c:2165
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixTranspose(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix)
Definition: effect.c:4905
static ULONG WINAPI ID3DXEffectCompilerImpl_Release(ID3DXEffectCompiler *iface)
Definition: effect.c:4565
static HRESULT WINAPI d3dx_effect_GetMatrixTransposePointerArray(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
Definition: effect.c:3505
static BOOL walk_param_eval_dep(struct d3dx_param_eval *param_eval, walk_parameter_dep_func param_func, void *data)
Definition: effect.c:3834
LIGHT_TYPE
Definition: effect.c:72
@ LT_ATTENUATION0
Definition: effect.c:81
@ LT_THETA
Definition: effect.c:84
@ LT_SPECULAR
Definition: effect.c:75
@ LT_DIFFUSE
Definition: effect.c:74
@ LT_RANGE
Definition: effect.c:79
@ LT_ATTENUATION2
Definition: effect.c:83
@ LT_AMBIENT
Definition: effect.c:76
@ LT_TYPE
Definition: effect.c:73
@ LT_POSITION
Definition: effect.c:77
@ LT_DIRECTION
Definition: effect.c:78
@ LT_ATTENUATION1
Definition: effect.c:82
@ LT_PHI
Definition: effect.c:85
@ LT_FALLOFF
Definition: effect.c:80
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetVector(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
Definition: effect.c:4817
static HRESULT WINAPI ID3DXEffectCompilerImpl_QueryInterface(ID3DXEffectCompiler *iface, REFIID riid, void **object)
Definition: effect.c:4537
static void set_matrix(struct d3dx_parameter *param, const D3DXMATRIX *matrix, void *dst_data)
Definition: effect.c:852
static bool copy_parameter(struct d3dx_effect *dst_effect, const struct d3dx_effect *src_effect, struct d3dx_parameter *dst, const struct d3dx_parameter *src)
Definition: effect.c:4313
HRESULT WINAPI D3DXCreateEffectFromResourceExW(struct IDirect3DDevice9 *device, HMODULE srcmodule, const WCHAR *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:6988
static void set_vector(struct d3dx_parameter *param, const D3DXVECTOR4 *vector, void *dst_data)
Definition: effect.c:826
static BOOL is_parameter_used(struct d3dx_parameter *param, struct d3dx_technique *tech)
Definition: effect.c:3918
static HRESULT set_string(char **param_data, const char *string)
Definition: effect.c:892
static HRESULT WINAPI d3dx_effect_SetMatrixTransposeArray(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
Definition: effect.c:3379
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixTransposePointerArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
Definition: effect.c:4937
static HRESULT WINAPI d3dx_effect_SetTechnique(ID3DXEffect *iface, D3DXHANDLE technique)
Definition: effect.c:3713
static DWORD d3dx9_effect_version(DWORD major, DWORD minor)
Definition: effect.c:1129
static HRESULT WINAPI d3dx_effect_GetDesc(ID3DXEffect *iface, D3DXEFFECT_DESC *desc)
Definition: effect.c:2006
static HRESULT d3dx_parse_effect(struct d3dx_effect *effect, const char *data, UINT data_size, uint32_t start, const char **skip_constants, unsigned int skip_constants_count)
Definition: effect.c:6278
static void free_parameter_block(struct d3dx_parameter_block *block)
Definition: effect.c:716
SHADER_CONSTANT_TYPE
Definition: effect.c:89
@ SCT_PSINT
Definition: effect.c:95
@ SCT_VSBOOL
Definition: effect.c:91
@ SCT_VSINT
Definition: effect.c:92
@ SCT_VSFLOAT
Definition: effect.c:90
@ SCT_PSBOOL
Definition: effect.c:94
@ SCT_PSFLOAT
Definition: effect.c:93
static struct d3dx_effect_pool * impl_from_ID3DXEffectPool(ID3DXEffectPool *iface)
Definition: effect.c:1952
struct d3dx_parameter * get_parameter_by_name(struct d3dx_parameters_store *store, struct d3dx_parameter *parameter, const char *name)
Definition: effect.c:1041
static HRESULT WINAPI d3dx_effect_GetPassDesc(ID3DXEffect *iface, D3DXHANDLE pass_handle, D3DXPASS_DESC *desc)
Definition: effect.c:2077
static struct d3dx_effect * impl_from_ID3DXEffect(ID3DXEffect *iface)
Definition: effect.c:1959
static HRESULT WINAPI d3dx_effect_GetBool(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL *b)
Definition: effect.c:2536
HRESULT WINAPI D3DXCreateEffectCompilerFromResourceA(HMODULE srcmodule, const char *srcresource, const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
Definition: effect.c:7106
static HRESULT WINAPI ID3DXEffectCompilerImpl_CompileShader(ID3DXEffectCompiler *iface, D3DXHANDLE function, const char *target, DWORD flags, ID3DXBuffer **shader, ID3DXBuffer **error_msgs, ID3DXConstantTable **constant_table)
Definition: effect.c:5024
HRESULT WINAPI D3DXCreateEffectCompilerFromFileA(const char *srcfile, const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
Definition: effect.c:7083
static void d3dx9_set_material_parameter(enum MATERIAL_TYPE op, D3DMATERIAL9 *material, void *value)
Definition: effect.c:1424
static D3DXHANDLE WINAPI d3dx_effect_GetParameter(ID3DXEffect *iface, D3DXHANDLE parameter, UINT index)
Definition: effect.c:2136
static HRESULT WINAPI d3dx_effect_GetTechniqueDesc(ID3DXEffect *iface, D3DXHANDLE technique, D3DXTECHNIQUE_DESC *desc)
Definition: effect.c:2056
static const char ** parse_skip_constants_string(char *skip_constants_string, unsigned int *names_count)
Definition: effect.c:6439
static struct d3dx_effect_pool * unsafe_impl_from_ID3DXEffectPool(ID3DXEffectPool *iface)
Definition: effect.c:6866
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetBoolArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *b, UINT count)
Definition: effect.c:4749
static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigned int bytes, void *dst_data)
Definition: effect.c:904
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetLiteral(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *literal)
Definition: effect.c:5009
static HRESULT WINAPI d3dx_effect_SetBool(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL b)
Definition: effect.c:2517
static HRESULT WINAPI d3dx_effect_GetBoolArray(ID3DXEffect *iface, D3DXHANDLE parameter, BOOL *b, UINT count)
Definition: effect.c:2597
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetTexture(struct ID3DXEffectCompiler *iface, D3DXHANDLE parameter, struct IDirect3DBaseTexture9 *texture)
Definition: effect.c:4961
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetTechniqueByName(ID3DXEffectCompiler *iface, const char *name)
Definition: effect.c:4659
static char * next_valid_constant_name(char **string)
Definition: effect.c:6420
STATE_CLASS
Definition: effect.c:44
@ SC_NPATCHMODE
Definition: effect.c:49
@ SC_TEXTURE
Definition: effect.c:54
@ SC_TEXTURESTAGE
Definition: effect.c:55
@ SC_UNKNOWN
Definition: effect.c:59
@ SC_TRANSFORM
Definition: effect.c:56
@ SC_LIGHTENABLE
Definition: effect.c:45
@ SC_SHADERCONST
Definition: effect.c:58
@ SC_MATERIAL
Definition: effect.c:48
@ SC_SAMPLERSTATE
Definition: effect.c:53
@ SC_RENDERSTATE
Definition: effect.c:51
@ SC_VERTEXSHADER
Definition: effect.c:57
@ SC_SETSAMPLER
Definition: effect.c:52
@ SC_PIXELSHADER
Definition: effect.c:50
@ SC_LIGHT
Definition: effect.c:47
@ SC_FVF
Definition: effect.c:46
MATERIAL_TYPE
Definition: effect.c:63
@ MT_EMISSIVE
Definition: effect.c:67
@ MT_POWER
Definition: effect.c:68
@ MT_DIFFUSE
Definition: effect.c:64
@ MT_AMBIENT
Definition: effect.c:65
@ MT_SPECULAR
Definition: effect.c:66
static D3DXHANDLE WINAPI d3dx_effect_GetAnnotationByName(ID3DXEffect *iface, D3DXHANDLE object, const char *name)
Definition: effect.c:2395
static const struct ID3DXEffectCompilerVtbl ID3DXEffectCompiler_Vtbl
Definition: effect.c:5034
static D3DXHANDLE WINAPI d3dx_effect_GetTechniqueByName(ID3DXEffect *iface, const char *name)
Definition: effect.c:2295
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixPointerArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXMATRIX **matrix, UINT count)
Definition: effect.c:4889
BOOL(* walk_parameter_dep_func)(void *data, struct d3dx_parameter *param)
Definition: effect.c:230
static HRESULT WINAPI d3dx_effect_SetVector(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXVECTOR4 *vector)
Definition: effect.c:2875
static HRESULT d3dx_set_shader_constants(struct d3dx_effect *effect, struct d3dx_pass *pass, struct d3dx_parameter *param, BOOL vs, BOOL update_all)
Definition: effect.c:1563
static HRESULT WINAPI d3dx_effect_GetValue(ID3DXEffect *iface, D3DXHANDLE parameter, void *data, UINT bytes)
Definition: effect.c:2452
static void add_param_to_tree(struct d3dx_effect *effect, struct d3dx_parameter *param, struct d3dx_parameter *parent, char separator, unsigned int element)
Definition: effect.c:5367
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetValue(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const void *data, UINT bytes)
Definition: effect.c:4711
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetPass(ID3DXEffectCompiler *iface, D3DXHANDLE technique, UINT index)
Definition: effect.c:4666
static HRESULT d3dx_parse_value(struct d3dx_effect *effect, struct d3dx_parameter *param, void *value, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5142
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVertexShader(struct ID3DXEffectCompiler *iface, D3DXHANDLE parameter, struct IDirect3DVertexShader9 **shader)
Definition: effect.c:4985
HRESULT WINAPI D3DXCreateEffectFromResourceExA(struct IDirect3DDevice9 *device, HMODULE srcmodule, const char *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:7014
static HRESULT WINAPI d3dx_effect_SetStateManager(ID3DXEffect *iface, ID3DXEffectStateManager *manager)
Definition: effect.c:4188
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixTranspose(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix)
Definition: effect.c:4897
static D3DXHANDLE WINAPI d3dx_effect_GetPassByName(ID3DXEffect *iface, D3DXHANDLE technique, const char *name)
Definition: effect.c:2332
static HRESULT WINAPI d3dx_effect_GetParameterDesc(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXPARAMETER_DESC *desc)
Definition: effect.c:2026
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetBool(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL *b)
Definition: effect.c:4734
HRESULT WINAPI D3DXCreateEffect(struct IDirect3DDevice9 *device, const void *data, UINT data_size, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:6729
static void free_parameter_object_data(struct d3dx_parameter *param, const void *data, unsigned int bytes)
Definition: effect.c:547
static HRESULT d3dx_set_shader_const_state(struct d3dx_effect *effect, enum SHADER_CONSTANT_TYPE op, UINT index, struct d3dx_parameter *param, void *value_ptr)
Definition: effect.c:1467
HRESULT WINAPI D3DXCreateEffectEx(struct IDirect3DDevice9 *device, const void *srcdata, UINT srcdatalen, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skip_constants, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilation_errors)
Definition: effect.c:6685
static HRESULT d3dx_parse_resource(struct d3dx_effect *effect, const char *data, const char **ptr, const char **skip_constants, unsigned int skip_constants_count)
Definition: effect.c:6092
static ULONG WINAPI d3dx_effect_pool_Release(ID3DXEffectPool *iface)
Definition: effect.c:6845
static HRESULT WINAPI d3dx_effect_FindNextValidTechnique(ID3DXEffect *iface, D3DXHANDLE technique, D3DXHANDLE *next_technique)
Definition: effect.c:3788
static HRESULT WINAPI d3dx_effect_BeginPass(ID3DXEffect *iface, UINT pass)
Definition: effect.c:4005
HRESULT WINAPI D3DXCreateEffectCompilerFromFileW(const WCHAR *srcfile, const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
Definition: effect.c:7059
HRESULT WINAPI D3DXCreateEffectFromFileA(struct IDirect3DDevice9 *device, const char *srcfile, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:6979
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVector(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXVECTOR4 *vector)
Definition: effect.c:4825
static HRESULT d3dx_parse_effect_typedef(struct d3dx_effect *effect, struct d3dx_parameter *param, const char *data, const char **ptr, struct d3dx_parameter *parent, UINT flags)
Definition: effect.c:5432
static void free_state(struct d3dx_state *state)
Definition: effect.c:524
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixTransposeArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
Definition: effect.c:4921
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetAnnotationByName(ID3DXEffectCompiler *iface, D3DXHANDLE object, const char *name)
Definition: effect.c:4703
static unsigned int get_recorded_parameter_size(const struct d3dx_recorded_parameter *record)
Definition: effect.c:711
static D3DXHANDLE get_technique_handle(struct d3dx_technique *technique)
Definition: effect.c:449
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrix(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix)
Definition: effect.c:4849
static HRESULT WINAPI d3dx_effect_pool_QueryInterface(ID3DXEffectPool *iface, REFIID riid, void **object)
Definition: effect.c:6791
static void free_sampler(struct d3dx_sampler *sampler)
Definition: effect.c:534
static HRESULT WINAPI ID3DXEffectCompilerImpl_CompileEffect(ID3DXEffectCompiler *iface, DWORD flags, ID3DXBuffer **effect, ID3DXBuffer **error_msgs)
Definition: effect.c:5016
UINT op
Definition: effect.c:235
static HRESULT WINAPI d3dx_effect_SetArrayRange(ID3DXEffect *iface, D3DXHANDLE parameter, UINT start, UINT end)
Definition: effect.c:3681
const char * name
Definition: effect.c:236
static HRESULT WINAPI d3dx_effect_OnResetDevice(ID3DXEffect *iface)
Definition: effect.c:4179
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetInt(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT n)
Definition: effect.c:4757
static HRESULT WINAPI d3dx_effect_SetBoolArray(ID3DXEffect *iface, D3DXHANDLE parameter, const BOOL *b, UINT count)
Definition: effect.c:2555
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrixArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
Definition: effect.c:4873
static HRESULT WINAPI d3dx_effect_ApplyParameterBlock(ID3DXEffect *iface, D3DXHANDLE parameter_block)
Definition: effect.c:4265
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameter(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, UINT index)
Definition: effect.c:4620
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFunctionDesc(ID3DXEffectCompiler *iface, D3DXHANDLE shader, D3DXFUNCTION_DESC *desc)
Definition: effect.c:4612
static D3DXHANDLE WINAPI d3dx_effect_GetCurrentTechnique(ID3DXEffect *iface)
Definition: effect.c:3732
static HRESULT d3dx_parse_sampler(struct d3dx_effect *effect, struct d3dx_sampler *sampler, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5102
#define INITIAL_CONST_NAMES_SIZE
Definition: effect.c:6418
static HRESULT WINAPI d3dx_effect_End(ID3DXEffect *iface)
Definition: effect.c:4066
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetIntArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const INT *n, UINT count)
Definition: effect.c:4771
static HRESULT d3dx9_create_object(struct d3dx_effect *effect, struct d3dx_object *object)
Definition: effect.c:5993
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetVectorArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXVECTOR4 *vector, UINT count)
Definition: effect.c:4841
static struct d3dx_parameter * get_parameter_element_by_name(struct d3dx_parameters_store *store, struct d3dx_parameter *parameter, const char *name)
Definition: effect.c:959
static BOOL WINAPI d3dx_effect_IsParameterUsed(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXHANDLE technique)
Definition: effect.c:3938
static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDevice9 *device, const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include, UINT flags, ID3DBlob **errors, struct ID3DXEffectPool *pool, const char *skip_constants_string)
Definition: effect.c:6613
static void free_pass(struct d3dx_pass *pass)
Definition: effect.c:647
static HRESULT WINAPI d3dx_effect_SetVectorArray(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXVECTOR4 *vector, UINT count)
Definition: effect.c:2972
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetIntArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, INT *n, UINT count)
Definition: effect.c:4779
static HRESULT d3dx9_effect_compiler_init(struct ID3DXEffectCompilerImpl *compiler, const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include, UINT eflags, ID3DBlob **messages)
Definition: effect.c:6740
static const struct ID3DXEffectPoolVtbl ID3DXEffectPool_Vtbl
Definition: effect.c:6858
static ULONG64 next_effect_update_version(struct d3dx_effect *effect)
Definition: effect.c:1291
static HRESULT d3dx9_parse_name(char **name, const char *ptr)
Definition: effect.c:5301
static HRESULT WINAPI d3dx_effect_GetMatrixTranspose(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix)
Definition: effect.c:3341
static HRESULT d3dx_parse_effect_parameter(struct d3dx_effect *effect, struct d3dx_top_level_parameter *param, const char *data, const char **ptr, struct d3dx_object *objects)
Definition: effect.c:5732
static HRESULT WINAPI d3dx_effect_SetMatrixPointerArray(ID3DXEffect *iface, D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
Definition: effect.c:3224
static BOOL param_zero_data_func(void *dummy, struct d3dx_parameter *param)
Definition: effect.c:1911
static HRESULT WINAPI d3dx_effect_GetString(ID3DXEffect *iface, D3DXHANDLE parameter, const char **string)
Definition: effect.c:3560
static HRESULT WINAPI d3dx_effect_CommitChanges(ID3DXEffect *iface)
Definition: effect.c:4035
static void get_vector(struct d3dx_parameter *param, D3DXVECTOR4 *vector)
Definition: effect.c:813
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetFunction(ID3DXEffectCompiler *iface, UINT index)
Definition: effect.c:4681
static D3DXHANDLE WINAPI d3dx_effect_GetTechnique(ID3DXEffect *iface, UINT index)
Definition: effect.c:2278
static ULONG WINAPI d3dx_effect_Release(ID3DXEffect *iface)
Definition: effect.c:1992
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetString(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const char **string)
Definition: effect.c:4953
HRESULT d3dx_init_parameters_store(struct d3dx_parameters_store *store, unsigned int count)
Definition: effect.c:743
static HRESULT WINAPI d3dx_effect_BeginParameterBlock(ID3DXEffect *iface)
Definition: effect.c:4220
static D3DXHANDLE WINAPI d3dx_effect_GetAnnotation(ID3DXEffect *iface, D3DXHANDLE object, UINT index)
Definition: effect.c:2374
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetPassByName(ID3DXEffectCompiler *iface, D3DXHANDLE technique, const char *name)
Definition: effect.c:4673
static BOOL param_set_top_level_param(void *top_level_param, struct d3dx_parameter *param)
Definition: effect.c:6272
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetValue(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, void *data, UINT bytes)
Definition: effect.c:4719
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFloat(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float *f)
Definition: effect.c:4794
static HRESULT WINAPI d3dx_effect_GetVector(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXVECTOR4 *vector)
Definition: effect.c:2929
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXMATRIX *matrix, UINT count)
Definition: effect.c:4865
static void param_set_data_pointer(struct d3dx_parameter *param, unsigned char *data, BOOL child, BOOL free_data)
Definition: effect.c:1790
static void set_dirty(struct d3dx_parameter *param)
Definition: effect.c:1329
HRESULT WINAPI D3DXCreateEffectFromFileExA(struct IDirect3DDevice9 *device, const char *srcfile, const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skipconstants, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:6944
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetArrayRange(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, UINT start, UINT end)
Definition: effect.c:4993
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetMatrixTransposePointerArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXMATRIX **matrix, UINT count)
Definition: effect.c:4929
static D3DXHANDLE get_pass_handle(struct d3dx_pass *pass)
Definition: effect.c:454
static D3DXHANDLE get_parameter_handle(struct d3dx_parameter *parameter)
Definition: effect.c:444
static ULONG WINAPI ID3DXEffectCompilerImpl_AddRef(ID3DXEffectCompiler *iface)
Definition: effect.c:4555
static void get_matrix(struct d3dx_parameter *param, D3DXMATRIX *matrix, BOOL transpose)
Definition: effect.c:834
HRESULT WINAPI D3DXCreateEffectCompilerFromResourceW(HMODULE srcmodule, const WCHAR *srcresource, const D3DXMACRO *defines, ID3DXInclude *include, DWORD flags, ID3DXEffectCompiler **compiler, ID3DXBuffer **messages)
Definition: effect.c:7126
static HRESULT WINAPI d3dx_effect_GetPool(ID3DXEffect *iface, ID3DXEffectPool **pool)
Definition: effect.c:3689
static HRESULT WINAPI d3dx_effect_Begin(ID3DXEffect *iface, UINT *passes, DWORD flags)
Definition: effect.c:3953
static HRESULT d3dx_pool_sync_shared_parameter(struct d3dx_effect_pool *pool, struct d3dx_top_level_parameter *param)
Definition: effect.c:1831
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameterBySemantic(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const char *semantic)
Definition: effect.c:4636
STATE_TYPE
Definition: effect.c:99
@ ST_FXLC
Definition: effect.c:102
@ ST_PARAMETER
Definition: effect.c:101
@ ST_CONSTANT
Definition: effect.c:100
@ ST_ARRAY_SELECTOR
Definition: effect.c:103
static HRESULT WINAPI d3dx_effect_SetFloatArray(ID3DXEffect *iface, D3DXHANDLE parameter, const float *f, UINT count)
Definition: effect.c:2811
void d3dx_parameters_store_cleanup(struct d3dx_parameters_store *store)
Definition: effect.c:754
static HRESULT d3dx_parse_init_value(struct d3dx_effect *effect, struct d3dx_parameter *param, const char *data, const char *ptr, struct d3dx_object *objects)
Definition: effect.c:5252
static HRESULT WINAPI d3dx_effect_GetPixelShader(ID3DXEffect *iface, D3DXHANDLE parameter, IDirect3DPixelShader9 **shader)
Definition: effect.c:3639
static HRESULT WINAPI d3dx_effect_SetTexture(ID3DXEffect *iface, D3DXHANDLE parameter, IDirect3DBaseTexture9 *texture)
Definition: effect.c:3579
static HRESULT d3dx_parse_array_selector(struct d3dx_effect *effect, struct d3dx_state *state, const char **skip_constants, unsigned int skip_constants_count)
Definition: effect.c:6035
static HRESULT WINAPI d3dx_effect_GetFunctionDesc(ID3DXEffect *iface, D3DXHANDLE shader, D3DXFUNCTION_DESC *desc)
Definition: effect.c:2128
static D3DXHANDLE WINAPI d3dx_effect_GetFunctionByName(ID3DXEffect *iface, const char *name)
Definition: effect.c:2367
static HRESULT WINAPI d3dx_effect_SetValue(ID3DXEffect *iface, D3DXHANDLE parameter, const void *data, UINT bytes)
Definition: effect.c:2425
static struct d3dx_parameter * get_annotation_by_name(struct d3dx_effect *effect, unsigned int count, struct d3dx_parameter *annotations, const char *name)
Definition: effect.c:997
static struct d3dx_pass * get_valid_pass(struct d3dx_effect *effect, D3DXHANDLE pass)
Definition: effect.c:487
HRESULT WINAPI D3DXCreateEffectFromResourceW(struct IDirect3DDevice9 *device, HMODULE srcmodule, const WCHAR *srcresource, const D3DXMACRO *defines, struct ID3DXInclude *include, DWORD flags, struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **messages)
Definition: effect.c:7041
static struct d3dx_technique * get_valid_technique(struct d3dx_effect *effect, D3DXHANDLE technique)
Definition: effect.c:474
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetTechniqueDesc(ID3DXEffectCompiler *iface, D3DXHANDLE technique, D3DXTECHNIQUE_DESC *desc)
Definition: effect.c:4596
static void * param_get_data_and_dirtify(struct d3dx_effect *effect, struct d3dx_parameter *param, unsigned int bytes, BOOL value_changed)
Definition: effect.c:1346
#define PARAMETER_FLAG_SHARED
Definition: effect.c:36
static struct ID3DXEffectCompilerImpl * impl_from_ID3DXEffectCompiler(ID3DXEffectCompiler *iface)
Definition: effect.c:4531
#define INITIAL_POOL_SIZE
Definition: effect.c:38
static struct d3dx_parameter * get_valid_parameter(struct d3dx_effect *effect, D3DXHANDLE parameter)
Definition: effect.c:505
static void free_effect_pool(struct d3dx_effect_pool *pool)
Definition: effect.c:6818
static HRESULT WINAPI d3dx_effect_GetMatrixArray(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix, UINT count)
Definition: effect.c:3183
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetMatrix(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix)
Definition: effect.c:4857
static BOOL walk_state_dep(struct d3dx_state *state, walk_parameter_dep_func param_func, void *data)
Definition: effect.c:3861
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetFloatArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, float *f, UINT count)
Definition: effect.c:4809
static void d3dx_effect_cleanup(struct d3dx_effect *effect)
Definition: effect.c:769
static HRESULT d3dx9_get_param_value_ptr(struct d3dx_pass *pass, struct d3dx_state *state, void **param_value, struct d3dx_parameter **out_param, BOOL update_all, BOOL *param_dirty)
Definition: effect.c:1134
static void set_matrix_transpose(struct d3dx_parameter *param, const D3DXMATRIX *matrix, void *dst_data)
Definition: effect.c:878
#define INITIAL_PARAM_BLOCK_SIZE
Definition: effect.c:39
static const char parameter_block_magic_string[4]
Definition: effect.c:34
static HRESULT WINAPI d3dx_effect_SetFloat(ID3DXEffect *iface, D3DXHANDLE parameter, float f)
Definition: effect.c:2770
static D3DXHANDLE WINAPI d3dx_effect_GetParameterBySemantic(ID3DXEffect *iface, D3DXHANDLE parameter, const char *semantic)
Definition: effect.c:2187
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetAnnotation(ID3DXEffectCompiler *iface, D3DXHANDLE object, UINT index)
Definition: effect.c:4695
static const char parameter_magic_string[4]
Definition: effect.c:33
static D3DXHANDLE WINAPI d3dx_effect_GetParameterElement(ID3DXEffect *iface, D3DXHANDLE parameter, UINT index)
Definition: effect.c:2249
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetVectorArray(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const D3DXVECTOR4 *vector, UINT count)
Definition: effect.c:4833
static void free_object(struct d3dx_object *object)
Definition: effect.c:529
static D3DXHANDLE WINAPI ID3DXEffectCompilerImpl_GetParameterByName(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, const char *name)
Definition: effect.c:4628
static HRESULT WINAPI d3dx_effect_GetTexture(ID3DXEffect *iface, D3DXHANDLE parameter, IDirect3DBaseTexture9 **texture)
Definition: effect.c:3614
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetLiteral(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL literal)
Definition: effect.c:5002
static HRESULT WINAPI ID3DXEffectCompilerImpl_SetBool(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, BOOL b)
Definition: effect.c:4727
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetPixelShader(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, struct IDirect3DPixelShader9 **shader)
Definition: effect.c:4977
static const struct ID3DXEffectVtbl ID3DXEffect_Vtbl
Definition: effect.c:4441
static HRESULT WINAPI d3dx_effect_GetMatrix(ID3DXEffect *iface, D3DXHANDLE parameter, D3DXMATRIX *matrix)
Definition: effect.c:3105
static const struct @283 state_table[]
static HRESULT WINAPI ID3DXEffectCompilerImpl_GetParameterDesc(ID3DXEffectCompiler *iface, D3DXHANDLE parameter, D3DXPARAMETER_DESC *desc)
Definition: effect.c:4588
static HRESULT WINAPI d3dx_effect_ValidateTechnique(ID3DXEffect *iface, D3DXHANDLE technique)
Definition: effect.c:3741
static void d3dx_pool_release_shared_parameter(struct d3dx_top_level_parameter *param)
Definition: effect.c:1917
static HRESULT d3dx9_copy_data(struct d3dx_effect *effect, unsigned int object_id, const char **ptr)
Definition: effect.c:5326
#define UnmapViewOfFile
Definition: compat.h:746
#define CP_ACP
Definition: compat.h:109
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
#define stricmp(_String1, _String2)
Definition: compat.h:24
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
static const WCHAR separator[]
Definition: asmname.c:65
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
Definition: res.c:155
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP void *__cdecl _recalloc(void *, size_t, size_t) __WINE_ALLOC_SIZE(2
_ACRTIMP int __cdecl atoi(const char *)
Definition: string.c:1720
_ACRTIMP char *__cdecl strchr(const char *, int)
Definition: string.c:3291
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP size_t __cdecl strcspn(const char *, const char *)
Definition: string.c:3498
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
_ACRTIMP int __cdecl strncmp(const char *, const char *, size_t)
Definition: string.c:3335
static char * strdup(const char *buf)
Definition: string.h:83
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
#define D3DXFX_DONOTSAVESTATE
Definition: d3dx9effect.h:24
#define D3DX_PARAMETER_ANNOTATION
Definition: d3dx9effect.h:32
#define D3DXFX_DONOTSAVESAMPLERSTATE
Definition: d3dx9effect.h:26
#define D3DXFX_NOT_CLONEABLE
Definition: d3dx9effect.h:27
#define D3DXFX_DONOTSAVESHADERSTATE
Definition: d3dx9effect.h:25
#define D3DXFX_LARGEADDRESSAWARE
Definition: d3dx9effect.h:28
@ D3DXINC_LOCAL
Definition: d3dx9shader.h:288
@ D3DXPC_SCALAR
Definition: d3dx9shader.h:62
@ D3DXPC_MATRIX_COLUMNS
Definition: d3dx9shader.h:65
@ D3DXPC_STRUCT
Definition: d3dx9shader.h:67
@ D3DXPC_MATRIX_ROWS
Definition: d3dx9shader.h:64
@ D3DXPC_VECTOR
Definition: d3dx9shader.h:63
@ D3DXPC_OBJECT
Definition: d3dx9shader.h:66
#define ID3DXInclude_Close(p, a)
Definition: d3dx9shader.h:304
const char * D3DXHANDLE
Definition: d3dx9shader.h:48
#define ID3DXInclude_Open(p, a, b, c, d, e)
Definition: d3dx9shader.h:303
D3DXPARAMETER_TYPE
Definition: d3dx9shader.h:72
@ D3DXPT_STRING
Definition: d3dx9shader.h:77
@ D3DXPT_TEXTURE
Definition: d3dx9shader.h:78
@ D3DXPT_SAMPLER3D
Definition: d3dx9shader.h:86
@ D3DXPT_VERTEXSHADER
Definition: d3dx9shader.h:89
@ D3DXPT_TEXTURE1D
Definition: d3dx9shader.h:79
@ D3DXPT_SAMPLERCUBE
Definition: d3dx9shader.h:87
@ D3DXPT_FLOAT
Definition: d3dx9shader.h:76
@ D3DXPT_TEXTURECUBE
Definition: d3dx9shader.h:82
@ D3DXPT_PIXELSHADER
Definition: d3dx9shader.h:88
@ D3DXPT_BOOL
Definition: d3dx9shader.h:74
@ D3DXPT_INT
Definition: d3dx9shader.h:75
@ D3DXPT_VOID
Definition: d3dx9shader.h:73
@ D3DXPT_SAMPLER
Definition: d3dx9shader.h:83
@ D3DXPT_SAMPLER1D
Definition: d3dx9shader.h:84
@ D3DXPT_SAMPLER2D
Definition: d3dx9shader.h:85
@ D3DXPT_TEXTURE3D
Definition: d3dx9shader.h:81
@ D3DXPT_TEXTURE2D
Definition: d3dx9shader.h:80
DWORD IDirect3DDevice9
Definition: dxva2api.idl:22
size_t const old_size
Definition: expand.cpp:65
size_t const new_size
Definition: expand.cpp:66
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble t
Definition: gl.h:2047
GLdouble n
Definition: glext.h:7729
GLenum GLuint texture
Definition: glext.h:6295
GLenum src
Definition: glext.h:6340
GLuint GLuint * names
Definition: glext.h:11545
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
const GLubyte * c
Definition: glext.h:8905
GLuint sampler
Definition: glext.h:7283
GLuint shader
Definition: glext.h:6030
GLuint index
Definition: glext.h:6031
GLfloat f
Definition: glext.h:7540
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLsizei GLboolean transpose
Definition: glext.h:6077
GLuint GLenum matrix
Definition: glext.h:9407
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLfloat param
Definition: glext.h:5796
GLenum GLsizei len
Definition: glext.h:6722
GLuint id
Definition: glext.h:5910
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum light
Definition: glfuncs.h:170
unsigned int UINT
Definition: sysinfo.c:13
static ID3DXConstantTable ** constant_table
Definition: hlsl_d3d9.c:32
const char cursor[]
Definition: icontest.c:13
REFIID riid
Definition: atlbase.h:39
ULONG AddRef()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
#define b
Definition: ke_i.h:79
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
if(dx< 0)
Definition: linetemp.h:194
#define matches(FN)
Definition: match.h:70
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
char string[160]
Definition: util.h:11
unsigned __int64 ULONG64
Definition: imports.h:198
static const CLSID * objects[]
Definition: apphelp.c:112
static PVOID ptr
Definition: dispmode.c:27
#define sprintf
Definition: sprintf.c:45
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static ULONG ** element_count
Definition: exception.c:124
static vector_t * vs
Definition: server.c:146
static HWND child
Definition: cursoricon.c:298
static BYTE parameters[]
Definition: asn.c:558
#define min(a, b)
Definition: monoChain.cc:55
int k
Definition: mpi.c:3369
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
short WCHAR
Definition: pedump.c:58
#define RT_RCDATA
Definition: pedump.c:372
long LONG
Definition: pedump.c:60
png_const_structrp png_const_inforp int * unit
Definition: png.h:2392
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
static unsigned __int64 next
Definition: rand_nt.c:6
#define calloc
Definition: rosglue.h:14
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
#define wine_rb_entry
Definition: rbtree.h:404
#define WINE_RB_ENTRY_VALUE
Definition: rbtree.h:414
#define wine_rb_put
Definition: rbtree.h:410
#define wine_rb_init
Definition: rbtree.h:406
#define wine_rb_get
Definition: rbtree.h:409
#define memset(x, y, z)
Definition: compat.h:39
#define minor(rdev)
Definition: propsheet.cpp:929
#define major(rdev)
Definition: propsheet.cpp:928
#define TRACE(s)
Definition: solgame.cpp:4
ID3DXEffectCompiler ID3DXEffectCompiler_iface
Definition: effect.c:219
unsigned int size
Definition: effect.c:212
ID3DXEffectPool ID3DXEffectPool_iface
Definition: effect.c:208
ULONG64 version_counter
Definition: effect.c:214
struct d3dx_shared_data * shared_data
Definition: effect.c:211
D3DMATERIAL9 current_material
Definition: effect.c:193
ULONG64 version_counter
Definition: effect.c:189
struct d3dx_technique * active_technique
Definition: effect.c:185
SIZE_T source_size
Definition: effect.c:200
unsigned int technique_count
Definition: effect.c:174
unsigned int object_count
Definition: effect.c:175
struct d3dx_technique * techniques
Definition: effect.c:176
struct d3dx_pass * active_pass
Definition: effect.c:186
BOOL material_updated
Definition: effect.c:194
D3DLIGHT9 current_light[8]
Definition: effect.c:191
struct ID3DXEffectStateManager * manager
Definition: effect.c:182
unsigned int light_updated
Definition: effect.c:192
struct d3dx_object * objects
Definition: effect.c:177
struct IDirect3DDevice9 * device
Definition: effect.c:183
struct d3dx_effect_pool * pool
Definition: effect.c:184
struct d3dx_parameters_store params
Definition: effect.c:180
ID3DXEffect ID3DXEffect_iface
Definition: effect.c:171
DWORD begin_flags
Definition: effect.c:188
LONG ref
Definition: effect.c:172
struct list parameter_block_list
Definition: effect.c:196
char * source
Definition: effect.c:199
struct d3dx_parameter_block * current_parameter_block
Definition: effect.c:197
char * skip_constants_string
Definition: effect.c:201
DWORD flags
Definition: effect.c:178
BOOL started
Definition: effect.c:187
ID3DXInclude ID3DXInclude_iface
struct d3dx_parameter * param
Definition: effect.c:110
unsigned int size
Definition: effect.c:108
void * data
Definition: effect.c:109
BOOL creation_failed
Definition: effect.c:111
struct d3dx_effect * effect
Definition: effect.c:156
struct list entry
Definition: effect.c:157
char magic_string[ARRAY_SIZE(parameter_block_magic_string)]
Definition: effect.c:155
struct d3dx_parameter * members
struct d3dx_param_eval * param_eval
unsigned int member_count
unsigned int object_id
D3DXPARAMETER_TYPE type
char magic_string[4]
unsigned int element_count
unsigned int rows
D3DXPARAMETER_CLASS class
unsigned int columns
struct d3dx_top_level_parameter * parameters
unsigned int full_name_tmp_size
struct wine_rb_tree tree
struct d3dx_parameter * annotations
Definition: effect.c:136
char * name
Definition: effect.c:131
unsigned int annotation_count
Definition: effect.c:133
struct d3dx_state * states
Definition: effect.c:135
ULONG64 update_version
Definition: effect.c:138
unsigned int state_count
Definition: effect.c:132
unsigned int bytes
Definition: effect.c:166
struct d3dx_parameter * param
Definition: effect.c:165
struct d3dx_state * states
Definition: effect.c:126
UINT state_count
Definition: effect.c:125
unsigned int count
ULONG64 update_version
enum STATE_TYPE type
Definition: effect.c:118
unsigned int operation
Definition: effect.c:116
struct d3dx_parameter * referenced_param
Definition: effect.c:120
struct d3dx_parameter parameter
Definition: effect.c:119
unsigned int index
Definition: effect.c:117
struct d3dx_pass * passes
Definition: effect.c:148
struct d3dx_parameter * annotations
Definition: effect.c:147
unsigned int pass_count
Definition: effect.c:144
struct IDirect3DStateBlock9 * saved_state
Definition: effect.c:150
char * name
Definition: effect.c:143
unsigned int annotation_count
Definition: effect.c:145
unsigned int annotation_count
struct d3dx_shared_data * shared_data
struct d3dx_parameter * annotations
struct d3dx_parameter param
Definition: devices.h:37
Definition: copy.c:22
Definition: name.c:39
struct member * members
Definition: locator.c:515
Definition: rbtree.h:30
Definition: ecma_167.h:138
Definition: tools.h:99
static COORD Position
Definition: mouse.c:34
#define max(a, b)
Definition: svc.c:63
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
float FLOAT
Definition: typedefs.h:69
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
pass
Definition: typegen.h:25
Definition: pdh_main.c:64
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION Direction
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
static unsigned int block
Definition: xmlmemory.c:101
unsigned char BYTE
Definition: xxhash.c:193