On 03/19/2016 12:56 AM, Matteo Bruni wrote:
- while (param->member_count && param->element_count)
- {
if (param->element_count > 1)
{
FIXME("Unexpected param having both elements and members.\n");
return D3DERR_INVALIDCALL;
}
param = ¶m->members[0];
- }
I don't quite understand what you're trying to do here but it doesn't look right.
That is related to the strange case I met in the real world effect data when the parameter has structure class, element_count 1, member_count > 1. As I understood from the pre-existing effect parsing code, element_count 1 together with member_count > 0 (and > 1) is legal. When element_count is 1, and member_count > 1, members contain an "array" of 1 element, which is actual struct parameter with element_count = 0 and member_count is the same as in parent weird parameter. It is what existing d3dx9_parse_effect_typedef understands (element_count is taking precedence over member_count). I could not reproduce this struct representation compiling effect from fxc code yet, but seen it in real world effect. CTAB structure in the shader which correspond to used that strange struct parameter does not have this weirdness and has element count 0, so I cannot match CTAB parameter to effect parameter without going a level deeper in effect parameter.
The existing effect parsing code clearly assumes that if both element_count > 0 and member_count > 0, element_count is taking precedence (that is, members array has element_count elements). I am not sure if it considers illegal element_count > 1 and member_count > 0, but I do not know currently how to treat this (if it is ever possible) as did not see such an example, so currently this is a FIXME in the code (which will hopefully never happen).