My apologies if my first patch was unclear.
Here is a slightly modified git diff http://wine.1045685.n5.nabble.com/file/n2806011/patch patch
along with the relevant make test output http://wine.1045685.n5.nabble.com/file/n2806011/maketestoutput maketestoutput
The relevant part of the make test output: ../../../tools/runtest -q -P wine -M d3dx9_36.dll -T ../../.. -p d3dx9_36_test.exe.so mesh.c && touch mesh.ok 0x684e7c86 (nil) 0x32fcf8 0x123170
And the relevant statements are, in test/mesh.c:
D3DVERTEXELEMENT9 *decl;
static const D3DVERTEXELEMENT9 decl1[3] = { {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 0xC, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, D3DDECL_END(), };
hr = D3DXCreateMesh(1, 3, D3DXMESH_MANAGED, (LPD3DVERTEXELEMENT9 *)&decl1, NULL, &d3dxmesh); todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
decl = HeapAlloc(GetProcessHeap(), 0, sizeof(decl1)); if (!decl) { skip("Couldn't create declaration copy\n"); return; } memcpy(decl, decl1, sizeof(decl1));
hr = D3DXCreateMesh(1, 3, D3DXMESH_MANAGED, &decl, NULL, &d3dxmesh); todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
return;
and in mesh.c:
HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options, CONST LPD3DVERTEXELEMENT9 *declaration, LPDIRECT3DDEVICE9 device, LPD3DXMESH *mesh) { printf("%p %p\n", declaration, *declaration);
Now
LPD3DVERTEXELEMENT9 is a D3DVERTEXELEMENT9 *, http://msdn.microsoft.com/en-us/library/bb172630%28VS.85%29.aspx
so LPD3DVERTEXELEMENT9 * is a D3DVERTEXELEMENT9 **, and to get at the underlying D3DVERTEXELEMENT9 array, I believe I need to access *declaration, e.g., (*declaration)[0], [1], etc.
Notably, if I use the HeapAlloc + memcpy approach, the test _fail_ in Windows (I only tried once fyi), so at the moment it seems like one thing works in Wine, another in Windows.
Thank you Misha