[PATCH 2/2] d3dx9: Get rid of constants modification bitmasks.

Paul Gofman gofmanp at gmail.com
Mon Aug 28 16:32:33 CDT 2017


On 08/28/2017 09:00 PM, Matteo Bruni wrote:
>
>> @@ -971,10 +946,30 @@ static HRESULT get_constants_desc(unsigned int *byte_code, struct d3dx_const_tab
>>           if (FAILED(hr = init_set_constants_param(out, ctab, hc, inputs_param[index])))
>>               goto cleanup;
>>       }
>> +    if (pres)
>> +        append_pres_const_set(out, pres);
>>       if (out->const_set_count)
>>       {
>>           struct d3dx_const_param_eval_output *new_alloc;
>>
>> +        qsort(out->const_set, out->const_set_count, sizeof(*out->const_set), compare_const_set);
>> +        for (i = 0; i < out->const_set_count - 1; ++i)
>> +        {
>> +            if (out->const_set[i].constant_class == D3DXPC_FORCE_DWORD
>> +                    && out->const_set[i + 1].constant_class == D3DXPC_FORCE_DWORD
>> +                    && out->const_set[i].table == out->const_set[i + 1].table
>> +                    && out->const_set[i].register_index + out->const_set[i].register_count
>> +                    >= out->const_set[i + 1].register_index)
>> +            {
>> +                out->const_set[i].register_count = out->const_set[i + 1].register_index
>> +                        + out->const_set[i + 1].register_count - out->const_set[i].register_index;
> I think this might lose account of some registers. E.g. consider the
> case where const_set[i] has register_index == 0 and register_count ==
> 4 while const_set[i + 1] has register_index == 1 and register_count ==
> 1. This would seem to lose track of the last two components.
>
> I know that preshaders found in the wild seem not to overwrite already
> written output registers but I wouldn't feel safe with (silently)
> depending on it.
This 'if' selects just preshader output constants. The entries for 
const_set handled (merged) in this 'if' are those provided preshader 
instructions which output anything to shader constants. They can 
potentially overlap (that's why '>=' in the last 'if' check).  I am not 
sure what can be wrong with that? We track preshader output as a single 
"commit", the same does native implementation according to our tests.





More information about the wine-devel mailing list