wined3d: declaration/FVF conversion test
Vitaly Budovski
vbudovsk at cs.rmit.edu.au
Sat Jun 17 05:16:24 CDT 2006
Ivan Gyurdiev wrote:
> Hi, I'm attaching test, which demonstrates incorrect behavior of
> SetFVF and SetVertexDeclaration.
> Windows converts one to the other and backwards (at least partially),
> and we do not such thing - this breaks at least 2 demos (dx9_hlsl_*)
>
> I'm posting it here, because:
>
> - I don't have Windows, and I need someone to try it on machine with
> pixel shader support (preferably 3.0, will need to enable pshaders and
> GLSL registry key). The whole first part of the test checks decl to
> fvf conversions, and they're almost all set to 0 in order to pass on
> H. Verbeet and V. Margolen's setups [ which have no pshaders ]. MSDN
> has a whole page on how to convert to an fvf, and the values there are
> definitely *not* 0, so that's why I'm suspicious.
>
> - Secondly, I am leaving for NYC in 2 days to look for a place to
> live, so I have limited time to clean up the test (ok/trace usage and
> the like), and I have no time to implement the fix. I am hoping
> someone else can finish it, because afterwards I go to Denver for a
> month, where I will have limited computing capabilities. Then I start
> a full time job back at NYC, so I'll be pretty busy. Anyway, I'm sure
> Jave has shaders under control and will be done with sm 2, 3, 4, 5..
> 10 by the end of the summer whether I help or not :)
Hi,
I've attached a patch which seems to fix the first set of failures. This
sets FVF values(from converted declarations) which were not set before.
I'm still getting a lot of 0 results myself. Pretty sure I have
everything enabled.
Comments?
-------------- next part --------------
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index e635352..7116d2f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4480,6 +4480,66 @@ static HRESULT WINAPI IWineD3DDeviceImpl
}
if (NULL != pDecl) {
+ DWORD fvf = 0;
+ D3DVERTEXELEMENT9 * declaration = ((IWineD3DVertexDeclarationImpl *)pDecl)->pDeclaration9;
+ if(D3DDECLTYPE_FLOAT3 == declaration->Type &&
+ D3DDECLUSAGE_POSITION == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = D3DFVF_XYZ;
+ } else if(D3DDECLTYPE_FLOAT4 == declaration->Type &&
+ D3DDECLUSAGE_POSITIONT == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = D3DFVF_XYZRHW;
+ } else if(D3DDECLTYPE_FLOAT1 == declaration->Type &&
+ D3DDECLUSAGE_BLENDWEIGHT == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_XYZB1*/;
+ } else if(D3DDECLTYPE_FLOAT2 == declaration->Type &&
+ D3DDECLUSAGE_BLENDWEIGHT == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_XYZB2*/;
+ } else if(D3DDECLTYPE_FLOAT3 == declaration->Type &&
+ D3DDECLUSAGE_BLENDWEIGHT == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_XYZB3*/;
+ } else if(D3DDECLTYPE_FLOAT4 == declaration->Type &&
+ D3DDECLUSAGE_BLENDWEIGHT == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_XYZB4*/;
+ } else if(D3DDECLTYPE_UBYTE4 == declaration->Type &&
+ D3DDECLUSAGE_BLENDINDICES == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_XYZB5*/;
+ } else if(D3DDECLTYPE_FLOAT3 == declaration->Type &&
+ D3DDECLUSAGE_NORMAL == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_NORMAL*/;
+ } else if(D3DDECLTYPE_FLOAT1 == declaration->Type &&
+ D3DDECLUSAGE_PSIZE == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_PSIZE*/;
+ } else if(D3DDECLTYPE_D3DCOLOR == declaration->Type &&
+ D3DDECLUSAGE_COLOR == declaration->Usage &&
+ 0 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_DIFFUSE*/;
+ } else if(D3DDECLTYPE_D3DCOLOR == declaration->Type &&
+ D3DDECLUSAGE_COLOR == declaration->Usage &&
+ 1 == declaration->UsageIndex) {
+ fvf = 0/*D3DFVF_SPECULAR*/;
+ } else if(D3DDECLTYPE_FLOAT1 == declaration->Type &&
+ D3DDECLUSAGE_TEXCOORD == declaration->Usage) {
+ fvf = 0/*D3DFVF_TEXCOORDSIZE1(declaration->UsageIndex)*/;
+ } else if(D3DDECLTYPE_FLOAT2 == declaration->Type &&
+ D3DDECLUSAGE_TEXCOORD == declaration->Usage) {
+ fvf = 0/*D3DFVF_TEXCOORDSIZE2(declaration->UsageIndex)*/;
+ } else if(D3DDECLTYPE_FLOAT3 == declaration->Type &&
+ D3DDECLUSAGE_TEXCOORD == declaration->Usage) {
+ fvf = 0/*D3DFVF_TEXCOORDSIZE3(declaration->UsageIndex)*/;
+ } else if(D3DDECLTYPE_FLOAT4 == declaration->Type &&
+ D3DDECLUSAGE_TEXCOORD == declaration->Usage) {
+ fvf = 0/*D3DFVF_TEXCOORDSIZE4(declaration->UsageIndex)*/;
+ }
+ IWineD3DDeviceImpl_SetFVF(iface, fvf);
IWineD3DVertexDeclaration_AddRef(pDecl);
}
if (NULL != oldDecl) {
More information about the wine-devel
mailing list