[v10 1/4] d3dx9: Implement fxlc constants (expressions) in effect.
gofmanp at gmail.com
Mon Apr 11 12:11:25 CDT 2016
On 04/11/2016 08:05 PM, Paul Gofman wrote:
> On 04/11/2016 07:52 PM, Matteo Bruni wrote:
>> 2016-04-07 17:41 GMT+02:00 Paul Gofman <gofmanp at gmail.com>:
>>> +static HRESULT set_constants_param(struct d3dx_regstore *rs, struct d3dx_const_tab *const_tab,
>>> + D3DXHANDLE hc, struct d3dx_parameter *param)
>>> + ID3DXConstantTable *ctab = const_tab->ctab;
>>> + D3DXCONSTANT_DESC desc;
>>> + unsigned int const_count, param_count, i, j, n, table, start_offset;
>>> + unsigned int minor, major, major_stride, param_offset;
>>> + BOOL transpose, get_element;
>>> + ID3DXConstantTable_GetConstantDesc(ctab, hc, &desc, &const_count);
>> This isn't correct, although it currently works. const_count is
>> supposed to be an inout parameter for GetConstantDesc() (you could
>> potentially have multiple instances of the same constant in different
>> register sets). The current implementation of GetConstantDesc()
>> doesn't check the parameter and blindly returns only the first
>> descriptor, also setting const_count to 1 (actually the following
>> descriptors aren't even parsed currently by the constant table code
>> IIRC) so this ends up working, although that's a bug and at some point
>> it might get fixed which would in turn break this.
>> Also it's a bit of an "overload" to use the same variable here and as
>> the count of constant elements / members in the following lines, it's
>> probably nicer to use two separate variables.
>> BTW you're using GetConstantDesc() correctly in get_constants_desc().
> I was looking into GetConstantsDesc() implementation to get the idea how
> constants count can be > 1 there, and saw there that the count is
> ultimately 1, that's why left it like that. Do you think it is OK just
> to set count to 1 prior to the call? As I get MSDN text for this count >
> 1 is possible only for samplers and we should not get here for samplers
Oh, please ignore this, actually the value type constant may also appear
multiple types if it is used in different register index. So I suggest
to initialize count to 1 before the call and put a FIXME if count != 1
on return. Making the real implementation for > 1 will be just a dead
code for now until GetConstantsDesc actually support this.
More information about the wine-devel