[PATCH 2/3] d3dx9: Support relative addressing in preshader.
Paul Gofman
gofmanp at gmail.com
Fri Mar 24 09:29:51 CDT 2017
On 03/24/2017 05:10 PM, Matteo Bruni wrote:
> 2017-03-24 2:16 GMT+01:00 Paul Gofman <gofmanp at gmail.com>:
>>
>> Sorry, I messed up things actually, base register actually can come from
>> temporary (register) table also, which happens in the test. So I will
>> introduce extra structure for registers.
> So I had a look at my stuff. As you know it has got very little and
> specific testing and is most likely missing some cases but I see that:
> - for relative addressing I accept any register type as base but
> expect only temporary registers as index (i.e. I look for "flags" == 1
> and then for the "base" fields only when parsing TEMP registers)
> - for CONST registers the "flags" != 0 field has a different meaning.
> In that case it is an offset in the IMMED table and there is no
> additional "base" register type + index in the effect bytecode, so
> it's indexed like imm["flags" + cidx].
>
What is seen from my tests for relative addressing (all these cases
below are present in the test currently there in the last patch I sent,
though I will add another test in the updated patch which covers more
cases, and also has a non-zero absolute offset, which helped me to
discovered and fix the bug):
1. Temporary register or constant float (e. g. c0) register can be used
as base register in relative addressing. Temporary register is used by
compiler when it needs to do some precompute for the index value, like
rounding, multiplying by stride for structure or any other arithmetic
with indexes, otherwise cX registers are used directly.
2. If the value being indexed is 4x vectors aligned, the main register
being indexed is cX, it is directly indexed by base register;
3. If the value we are indexing into is some vector, or matrix, or
anything not 4x aligned, compiler generates a code doing the indexing
through a 'dot' instructions with base register indexing immediate
constants to dot with.
This is basically present in the test I sent (doing a trace with +d3dx
will show preshaders with these relative addressing types, the string to
easily find the code in the output is 'imm['). in the next update I will
include another test which is a bit more complicated in terms of this
'dot' arithmetic.
So unless I am missing something I don't see yet how flags have a
different meaning for const or immed registers, it looks very
straightforward and matches the test.
More information about the wine-devel
mailing list