[PATCH] D3D: D3DDECLTYPE_UNUSED is not valid in vertex =

Stefan Doesinger stefan at codeweavers.com
Thu Jul 17 18:00:21 CDT 2008


declarations=0A=
=0A=
This test and patch are a side product of debugging a bug in=0A=
CIV4. I don't think any app will ever depend on this, but still=0A=
it can't hurt=0A=
---=0A=
 dlls/d3d9/tests/vertexdeclaration.c |   55 =
+++++++++++++++++++++++++++++++++++=0A=
 dlls/wined3d/vertexdeclaration.c    |    6 ++++=0A=
 2 files changed, 61 insertions(+), 0 deletions(-)=0A=
=0A=
diff --git a/dlls/d3d9/tests/vertexdeclaration.c =
b/dlls/d3d9/tests/vertexdeclaration.c=0A=
index 292087f..41ff0ac 100644=0A=
--- a/dlls/d3d9/tests/vertexdeclaration.c=0A=
+++ b/dlls/d3d9/tests/vertexdeclaration.c=0A=
@@ -786,6 +786,60 @@ static void test_vertex_declaration_alignment(=0A=
     }=0A=
 }=0A=
 =0A=
+static void test_unused_type(=0A=
+    IDirect3DDevice9* device) {=0A=
+=0A=
+    HRESULT hr;=0A=
+    IDirect3DVertexDeclaration9* result_decl =3D NULL;=0A=
+    int i;=0A=
+=0A=
+    CONST D3DVERTEXELEMENT9 test_elements[5][3] =3D=0A=
+    {=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_COLOR   , 0 },=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 0 },=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 1 },=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 12},=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 1, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_TEXCOORD, 12},=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 0, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_NORMAL,   0 },=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+        {=0A=
+            { 0, 0,  D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 },=0A=
+            { 1, 16, D3DDECLTYPE_UNUSED, 0, D3DDECLUSAGE_NORMAL,   0 },=0A=
+            D3DDECL_END()=0A=
+        },=0A=
+    };=0A=
+=0A=
+    for(i =3D 0; i < sizeof(test_elements) / sizeof(test_elements[0]); =
i++) {=0A=
+        result_decl =3D NULL;=0A=
+        hr =3D IDirect3DDevice9_CreateVertexDeclaration(device, =
test_elements[i], &result_decl);=0A=
+        ok(hr =3D=3D E_FAIL, "CreateVertexDeclaration for declaration =
%d returned %#x, expected E_FAIL(%#x)\n",=0A=
+                              i, hr, E_FAIL);=0A=
+        if(result_decl) =
IDirect3DVertexDeclaration9_Release(result_decl);=0A=
+    }=0A=
+}=0A=
 START_TEST(vertexdeclaration)=0A=
 {=0A=
     static D3DVERTEXELEMENT9 simple_decl[] =3D {=0A=
@@ -821,4 +875,5 @@ START_TEST(vertexdeclaration)=0A=
     test_fvf_decl_conversion(device_ptr);=0A=
     test_fvf_decl_management(device_ptr);=0A=
     test_vertex_declaration_alignment(device_ptr);=0A=
+    test_unused_type(device_ptr);=0A=
 }=0A=
diff --git a/dlls/wined3d/vertexdeclaration.c =
b/dlls/wined3d/vertexdeclaration.c=0A=
index 0802b1f..936ef57 100644=0A=
--- a/dlls/wined3d/vertexdeclaration.c=0A=
+++ b/dlls/wined3d/vertexdeclaration.c=0A=
@@ -159,6 +159,12 @@ static HRESULT WINAPI =
IWineD3DVertexDeclarationImpl_SetDeclaration(IWineD3DVerte=0A=
          */=0A=
         if(This->pDeclarationWine[i].Stream >=3D MAX_STREAMS) continue;=0A=
 =0A=
+        if(This->pDeclarationWine[i].Type =3D=3D =
WINED3DDECLTYPE_UNUSED) {=0A=
+            WARN("The application tries to use WINED3DDECLTYPE_UNUSED, =
returning E_FAIL\n");=0A=
+            /* The caller will release the vdecl, which will free =
This->pDeclarationWine */=0A=
+            return E_FAIL;=0A=
+        }=0A=
+=0A=
         if(This->pDeclarationWine[i].Offset & 0x3) {=0A=
             WARN("Declaration element %d is not 4 byte aligned(%d), =
returning E_FAIL\n", i, This->pDeclarationWine[i].Offset);=0A=
             HeapFree(GetProcessHeap(), 0, This->pDeclarationWine);=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0017_01C8ECB6.0A1D8950--




More information about the wine-patches mailing list