2009/12/31 Rico Schüller <kgbricola(a)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 =
&effect->anonymous_shaders[effect->anonymous_shader_current];
hr = parse_fx10_anonymous_shader(effect, o->type, shader);
if (FAILED(hr)) return hr;
++effect->anonymous_shader_current;
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.