[PATCH 4/5] d3dx9_36: Implemented ID3DXConstantTable_SetMatrix and ID3DXConstantTable_SetMatrixArray

Matteo Bruni matteo.mystral at gmail.com
Fri Jan 21 10:47:48 CST 2011


2011/1/21 Michael Stefaniuc <mstefani at redhat.com>:
> On 01/21/2011 06:56 AM, Travis Athougies wrote:
>> On Thu, Jan 20, 2011 at 7:27 AM, Matteo Bruni<matteo.mystral at gmail.com>
>>  wrote:
>>>
>>> 2011/1/20 Travis Athougies<iammisc at gmail.com>:
>>>>
>>>> +            /* D3DXMATRIX is a union, one of whose elements is an
>>>> array, so it can be cast to a float pointer */
>>>> +           if (is_vertex_shader(This->desc.Version))
>>>> +               IDirect3DDevice9_SetVertexShaderConstantF(device,
>>>> desc.RegisterIndex + i, (float *)(matrix + i),
>>>> +                        desc.RegisterCount);
>>>> +           else
>>>> +               IDirect3DDevice9_SetPixelShaderConstantF(device,
>>>> desc.RegisterIndex + i, (float *)(matrix + i),
>>>> +                        desc.RegisterCount);
>>>
>>> Can't you just pass matrix->m[i] as parameter, instead of that cast?
>>>
>>
>> Uh no. If I were to do that, matrix->m[1] would be the second row, not
>> the second matrix. I'm trying to get at the second matrix. To
>> illustrate this, suppose the matrix were at 0x8000 (not going to
>> happen, but just pretend). matrix->m[1] would be at 0x8010, since
>> floats are 4 bytes. However, the next matrix is actually at 0x8040
>> (since sizeof(float) * 16 [the number of elements in the matrix] =
>> 64).
>
> So you want a pointer to the first element of the "i"th matrix, right?
>    &matrix[i]._11
> No cast, no explicit pointer arithmetic.
>

Oh, right, I misread that (and Michael's suggestion is good). But then
I would expect the register index to be incremented by
desc.RegisterCount at each iteration. RegisterCount is supposedly 4,
but what if it is not? This calls for some SetMatrixArray tests.




More information about the wine-devel mailing list