Module: wine Branch: master Commit: b554cdbb5a33965e906669c0f971bc4331d60a7d URL: http://source.winehq.org/git/wine.git/?a=commit;h=b554cdbb5a33965e906669c0f9...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu Jul 17 18:00:21 2008 -0500
d3d: D3DDECLTYPE_UNUSED is not valid in vertex declarations.
---
dlls/d3d9/tests/vertexdeclaration.c | 55 +++++++++++++++++++++++++++++++++++ dlls/wined3d/vertexdeclaration.c | 6 ++++ 2 files changed, 61 insertions(+), 0 deletions(-)
diff --git a/dlls/d3d9/tests/vertexdeclaration.c b/dlls/d3d9/tests/vertexdeclaration.c index 292087f..ad7b873 100644 --- a/dlls/d3d9/tests/vertexdeclaration.c +++ b/dlls/d3d9/tests/vertexdeclaration.c @@ -786,6 +786,60 @@ static void test_vertex_declaration_alignment( } }
+static void test_unused_type( + IDirect3DDevice9* device) { + + HRESULT hr; + IDirect3DVertexDeclaration9* result_decl = NULL; + int i; + + static const D3DVERTEXELEMENT9 test_elements[][3] = + { + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_COLOR , 0 }, + D3DDECL_END() + }, + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 0 }, + D3DDECL_END() + }, + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 1 }, + D3DDECL_END() + }, + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 12}, + D3DDECL_END() + }, + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 1, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 12}, + D3DDECL_END() + }, + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_NORMAL, 0 }, + D3DDECL_END() + }, + { + { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 1, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_NORMAL, 0 }, + D3DDECL_END() + }, + }; + + for(i = 0; i < sizeof(test_elements) / sizeof(test_elements[0]); i++) { + result_decl = NULL; + hr = IDirect3DDevice9_CreateVertexDeclaration(device, test_elements[i], &result_decl); + ok(hr == E_FAIL, "CreateVertexDeclaration for declaration %d returned %#x, expected E_FAIL(%#x)\n", + i, hr, E_FAIL); + if(result_decl) IDirect3DVertexDeclaration9_Release(result_decl); + } +} START_TEST(vertexdeclaration) { static D3DVERTEXELEMENT9 simple_decl[] = { @@ -821,4 +875,5 @@ START_TEST(vertexdeclaration) test_fvf_decl_conversion(device_ptr); test_fvf_decl_management(device_ptr); test_vertex_declaration_alignment(device_ptr); + test_unused_type(device_ptr); } diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c index 0802b1f..936ef57 100644 --- a/dlls/wined3d/vertexdeclaration.c +++ b/dlls/wined3d/vertexdeclaration.c @@ -159,6 +159,12 @@ static HRESULT WINAPI IWineD3DVertexDeclarationImpl_SetDeclaration(IWineD3DVerte */ if(This->pDeclarationWine[i].Stream >= MAX_STREAMS) continue;
+ if(This->pDeclarationWine[i].Type == WINED3DDECLTYPE_UNUSED) { + WARN("The application tries to use WINED3DDECLTYPE_UNUSED, returning E_FAIL\n"); + /* The caller will release the vdecl, which will free This->pDeclarationWine */ + return E_FAIL; + } + if(This->pDeclarationWine[i].Offset & 0x3) { WARN("Declaration element %d is not 4 byte aligned(%d), returning E_FAIL\n", i, This->pDeclarationWine[i].Offset); HeapFree(GetProcessHeap(), 0, This->pDeclarationWine);