[PATCH 2/2] d3d10: Parse effect shaders as anonymous shaders.

Henri Verbeet hverbeet at gmail.com
Thu Dec 31 10:52:36 CST 2009

2009/12/31 Rico Schüller <kgbricola at web.de>:
>      struct d3d10_effect_shader_variable *s;
> +    v->data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct d3d10_effect_shader_variable));
> +    s = v->data;

I think this would be nicer:
s = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*s));
v->data = s;

That's mostly my fault for writing it like that in the first place,
but we might as well fix that.

> +        default:
> +            ERR("This should not happen!\n");
> +            break;
You'll probably want to return E_FAIL here.

> +    struct d3d10_effect_variable *v = &e->anonymous_shaders[e->anonymous_shader_current];
> +    struct d3d10_effect_type *t = &e->anonymous_shader_type[e->anonymous_shader_current];
> +            hr = parse_fx10_anonymous_shader(o->pass->technique->effect, o->type);
> +            o->data = &o->pass->technique->effect->anonymous_shaders[o->pass->technique->effect->anonymous_shader_current-1];
If you create a structure for anonymous shaders, you can store that in
a single array. You can then pass a pointer to that structure to
parse_fx10_anonymous_shader(), and handle "anonymous_shader_current"
in parse_fx10_object(). E.g.:

struct d3d10_effect *effect = o->pass->technique->effect;
struct d3d10_effect_anonymous_shader *shader =

hr = parse_fx10_anonymous_shader(effect, o->type, shader);
if (FAILED(hr)) return hr;

o->data = shader;

Note that you should also validate that "anonymous_shader_current" <
"anonymous_shader_count". The count is supposed to be correct, but the
.fx might lie about it, possibly on purpose.

More information about the wine-devel mailing list