[PATCH 6/6] d3dx9: Merge constant setting for child parameters when possible.

Matteo Bruni matteo.mystral at gmail.com
Mon May 29 18:03:46 CDT 2017


2017-05-29 20:44 GMT+02:00 Paul Gofman <gofmanp at gmail.com>:
> On 05/29/2017 09:24 PM, Matteo Bruni wrote:
>>
>> 2017-05-24 11:46 GMT+02:00 Paul Gofman <gofmanp at gmail.com>:
>>
>>> +            if (!(const_set->table == current_table &&
>>> current_start_offset == start_offset
>>> +                    && const_set->direct_copy ==
>>> first_const->direct_copy
>>> +                    && current_data == const_set->param->data
>>> +                    && (const_set->direct_copy ||
>>> (first_const->param->type == const_set->param->type
>>> +                    && first_const->param->class ==
>>> const_set->param->class
>>> +                    && first_const->param->columns ==
>>> const_set->param->columns
>>> +                    && first_const->param->rows ==
>>> const_set->param->rows
>>> +                    && first_const->register_count ==
>>> const_set->register_count
>>> +                    && (i == const_tab->const_set_count - 1
>>> +                    || first_const->param->element_count ==
>>> const_set->param->element_count)))))
>>> +            {
>>> +                TRACE("direct_copy %u, i %u, index %u, param %s.%s,
>>> current_data %p, const_set->param->data %p, "\
>>> +                        "current_start_offset %u, start_offset %u,
>>> const_set->table %u, current_table %u.\n",
>>> +                        const_set->direct_copy, i, index,
>>> debugstr_a(param->name),
>>> +                        debugstr_a(const_set->param->name),
>>> current_data, const_set->param->data,
>>> +                        current_start_offset, start_offset,
>>> const_set->table, current_table);
>>> +                break;
>>> +            }
>>
>> This looks like a debug trace.
>>
>>> +        TRACE("Merging %u child parameters for %s, not merging %u,
>>> direct_copy %u.\n", i - index,
>>> +                debugstr_a(param->name), const_tab->const_set_count - i,
>>> first_const->direct_copy);
>>
>> I guess it's intentional that you're printing this even when not
>> merging anything, in that case the TRACE sounds a bit awkward though.
>> Maybe have a separate TRACE for that case?
>
> Both traces are to have a possibility to check from trace log what is merged
> and not "merged" and why, for performance analysis. If you think it is more
> of debug I can remove it, though since it is in initialization only I was
> thinking it does not add too much noise.

The first trace feels pretty noisy to me for upstream Wine, do you
think it would be useful in a trace attached on a generic bug to
figure out potential performance improvements?

The "Merging" one is fine, I'm just a tiny bit annoyed by the "Merged
0 child" case.

>> Just for my own curiosity, do you think it's significant to merge
>> non-direct_copy entries? Not that it hurts anything to have it.
>>
>>
> Yes, it is crucial together with the next patches I did not send yet. Even
> in this patchset removing extra const_set entries is beneficial: it removes
> a lot of dirty checks when skipping const_set's from the same parameter on
> CommitChanges, and also initializing the data for inner loops less times. In
> the next patches which is not there yet I:
>
> - Factor out type conversion which can be used for an array of values,
> removing switching for each value being set;
>
> - Introduce a separate path for setting scalar and vectors (which is simpler
> than general matrix case an quite often may be grouped effectively even when
> it is not 'direct_copy');
>
> - Optimize matrix settings loops.
>
>     Copying ~100 element array with transpose is quite a common case.
> Merging them in a one const_set and doing that things further is a huge
> optimization actually.

Cool. Optimizing the transposed matrix case is probably worthy by itself.



More information about the wine-devel mailing list