[PATCH 2/3] d3dx9: Support relative addressing in preshader.

Paul Gofman gofmanp at gmail.com
Thu Mar 23 19:57:33 CDT 2017


On 03/24/2017 03:31 AM, Matteo Bruni wrote:
> 2017-03-24 0:39 GMT+01:00 Paul Gofman <gofmanp at gmail.com>:
>> On 03/24/2017 01:57 AM, Matteo Bruni wrote:
>>> 2017-03-23 16:06 GMT+01:00 Paul Gofman <gofmanp at gmail.com>:
>>>> Signed-off-by: Paul Gofman <gofmanp at gmail.com>
>>>> ---
>>>>    dlls/d3dx9_36/preshader.c    | 103
>>>> ++++++++++++++++++++++++++++++++++++-------
>>>>    dlls/d3dx9_36/tests/effect.c |  38 ++++++++--------
>>>>    2 files changed, 106 insertions(+), 35 deletions(-)
>>>>
>>>> diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c
>>>> index 9aedc99..2974ffd 100644
>>>> --- a/dlls/d3dx9_36/preshader.c
>>>> +++ b/dlls/d3dx9_36/preshader.c
>>>> @@ -191,6 +191,8 @@ struct d3dx_pres_operand
>>>>        /* offset is component index, not register index, e. g.
>>>>           offset for component c3.y is 13 (3 * 4 + 1) */
>>>>        unsigned int offset;
>>>> +    enum pres_reg_tables base_reg_table;
>>>> +    unsigned int base_reg_offset;
>>>>    };
>>> It would be nicer to create a struct for storing together table and
>>> offset and to pass it around to the various functions taking both
>>> arguments, like parse_pres_reg().
>>> It should probably be a separate patch before this one.
>> Actually I can't guess the case when base_reg_table would be not a floating
>> constant preshader input. Maybe I just remove this variable and check with
>> FIXME during parsing?
> Sure, that's fine. Still the struct seems useful for parameter
> passing, if not right there in struct d3dx_pres_operand.
>
>>>> +    size = rs->table_sizes[table] *
>>>> table_info[table].reg_component_count;
>>>> +    if (offset >= size)
>>>> +    {
>>>> +        if ((offset & 255) < size)
>>>> +            offset &= 255;
>>>> +        else
>>>> +            offset = offset % size;
>>>> +    }
>>> Is this just to try and avoid the modulo operation in some cases or is
>>> there a deeper reason?
>>> If the former, you could extend that to all the power-of-two sizes by
>>> first checking if that's the case (!(size & size - 1)) and, if so,
>>> and-ing offset with the mask (size - 1). That's assuming the compiler
>>> doesn't do the same optimization already.
>>>
>>> Let me know if there is some other reason instead.
>> Just doing (offset % size) will lead to different results and will break the
>> tests. The logic in this out of range index checking is a bit mind breaking.
> I guess there was a deeper reason indeed ;)
>
> Is that visible in the tests included in this series? Either way,
> maybe add a comment so that it's obvious why that thing is there.
>
Oh, I was sure that yes, but just checked once again and it worked 
without that first check. It could happen that either (most likely) I 
need it on some other testing I made in process, or potentially could 
happen that it was "helping" before I figured out the correct way for 
floating constant table indexing. I will check that and either remove 
this check or add another test (probably as a separate patch, as it 
would likely require effect blob update).



More information about the wine-devel mailing list