On Wed, Jun 8, 2011 at 8:32 PM, Stefan Dösinger <[email protected]> wrote:
> On Wednesday 08 June 2011 18:51:41 Michael Mc Donnell wrote:
>> unsigned int faces[] = {0, 1, 2};
>> unsigned int num_faces = sizeof(faces) / 3;
> Does this do what you want? As far as I can see you want ARRAY_SIZE(faces) /
> 3.
You're right that was a bug
>
>> + struct {
>> + D3DXVECTOR3 position0;
>> + D3DXVECTOR3 position1;
>> + D3DXVECTOR3 normal;
>> + DWORD color;
>> + } vertices[] = {
>> ...
> Another style nitpick: Bracket placing.
Change it to brackets on new lines? I actually copied the style from
the method above mine. Is this better?:
+ struct
+ {
+ D3DXVECTOR3 position0;
+ D3DXVECTOR3 position1;
+ D3DXVECTOR3 normal;
+ DWORD color;
+ } vertices[] =
+ {
+ { { 0.0f, 1.0f, 0.f}, { 1.0f, 0.0f, 0.f}, {0.0f, 0.0f,
1.0f}, 0xffff0000 },
+ { { 1.0f, -1.0f, 0.f}, {-1.0f, -1.0f, 0.f}, {0.0f, 0.0f,
1.0f}, 0xff00ff00 },
+ { {-1.0f, -1.0f, 0.f}, {-1.0f, 1.0f, 0.f}, {0.0f, 0.0f,
1.0f}, 0xff0000ff },
+ };
>
>> + /* Two null pointers. Setting only the mesh to null will result in an
>> + * exception on Windows.
>> + */
>> + hr = mesh->lpVtbl->UpdateSemantics(NULL, NULL);
> I think setting the instance pointer to NULL when invoking a method doesn't
> need a test, it will give you odd results. What you show here is that native
> checks the only method parameter before it accesses the object instance.
> Remember, usually apps will invoke this via C++:
>
> mesh->UpdateSemantics(declaration);
>
> Similarly it isn't necessary to check iface or This against NULL in the
> implementations.
Ok, I've removed that check. That wasn't what was causing the
exception though. The problem was that it failed to get a device on
the testbot. I had forgotten to set the mesh to NULL, so in the
cleanup part it tried to release a random pointer, which caused an
exception.
On a side note, failing to get a device means that the d3dx tests are
always skipped on the testbot?
> Otherwise this looks OK
Ok, I'll try again later.
From a152a15ab80dca9f3abec897b50d2c326cc684c5 Mon Sep 17 00:00:00 2001
From: Michael Mc Donnell <[email protected]>
Date: Tue, 24 May 2011 19:43:47 +0200
Subject: d3dx9/test: Add UpdateSemantics test.
To: wine-patches <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------1.7.5.4"
This is a multi-part message in MIME format.
--------------1.7.5.4
Content-Type: text/plain; charset=UTF-8; format=fixed
Content-Transfer-Encoding: 8bit
Removed a superfluous test.
Added NULL check before releasing mesh.
Changed struct declaration style.
---
dlls/d3dx9_36/tests/mesh.c | 278 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 278 insertions(+), 0 deletions(-)
--------------1.7.5.4
Content-Type: text/x-patch; name="0001-d3dx9-test-Add-UpdateSemantics-test.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="0001-d3dx9-test-Add-UpdateSemantics-test.patch"
diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index 9b924fd..cff4cce 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -2,6 +2,7 @@
* Copyright 2008 David Adam
* Copyright 2008 Luis Busquets
* Copyright 2009 Henri Verbeet for CodeWeavers
+ * Copyright 2011 Michael Mc Donnell
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -89,6 +90,93 @@ static BOOL compare_face(face a, face b)
return (a[0]==b[0] && a[1] == b[1] && a[2] == b[2]);
}
+struct test_context
+{
+ HWND hwnd;
+ IDirect3D9 *d3d;
+ IDirect3DDevice9 *device;
+};
+
+/* Initializes a test context struct. Use it to initialize DirectX.
+ *
+ * Returns NULL if an error occured.
+ */
+static struct test_context* new_test_context(void)
+{
+ HRESULT hr;
+ HWND hwnd = NULL;
+ IDirect3D9 *d3d = NULL;
+ IDirect3DDevice9 *device = NULL;
+ D3DPRESENT_PARAMETERS d3dpp = {0};
+ struct test_context *test_context;
+
+ hwnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
+ if (!hwnd)
+ {
+ skip("Couldn't create application window\n");
+ goto error;
+ }
+
+ d3d = Direct3DCreate9(D3D_SDK_VERSION);
+ if (!d3d)
+ {
+ skip("Couldn't create IDirect3D9 object\n");
+ goto error;
+ }
+
+ memset(&d3dpp, 0, sizeof(d3dpp));
+ d3dpp.Windowed = TRUE;
+ d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
+ hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
+ D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device);
+ if (FAILED(hr))
+ {
+ skip("Couldn't create IDirect3DDevice9 object %#x\n", hr);
+ goto error;
+ }
+
+ test_context = HeapAlloc(GetProcessHeap(), 0, sizeof(*test_context));
+ if (!test_context)
+ {
+ skip("Couldn't allocate memory for test_context\n");
+ goto error;
+ }
+ test_context->hwnd = hwnd;
+ test_context->d3d = d3d;
+ test_context->device = device;
+
+ return test_context;
+
+error:
+ if (device)
+ IDirect3DDevice9_Release(device);
+
+ if (d3d)
+ IDirect3D9_Release(d3d);
+
+ if (hwnd)
+ DestroyWindow(hwnd);
+
+ return NULL;
+}
+
+static void free_test_context(struct test_context *test_context)
+{
+ if (!test_context)
+ return;
+
+ if (test_context->device)
+ IDirect3DDevice9_Release(test_context->device);
+
+ if (test_context->d3d)
+ IDirect3D9_Release(test_context->d3d);
+
+ if (test_context->hwnd)
+ DestroyWindow(test_context->hwnd);
+
+ HeapFree(GetProcessHeap(), 0, test_context);
+}
+
struct mesh
{
DWORD number_of_vertices;
@@ -4259,6 +4347,195 @@ static void D3DXGenerateAdjacencyTest(void)
if (d3dxmesh) d3dxmesh->lpVtbl->Release(d3dxmesh);
}
+static void test_update_semantics(void)
+{
+ HRESULT hr;
+ struct test_context *test_context = NULL;
+ ID3DXMesh *mesh = NULL;
+ D3DVERTEXELEMENT9 declaration0[] =
+ {
+ {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+ {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
+ {0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+ D3DDECL_END()
+ };
+ D3DVERTEXELEMENT9 declaration_pos_type_color[] =
+ {
+ {0, 0, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+ {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
+ {0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+ D3DDECL_END()
+ };
+ D3DVERTEXELEMENT9 declaration_double_usage[] =
+ {
+ {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+ {0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+ {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
+ {0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+ D3DDECL_END()
+ };
+ D3DVERTEXELEMENT9 declaration_undefined_type[] =
+ {
+ {0, 0, D3DDECLTYPE_UNUSED+1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+ {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
+ {0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+ D3DDECL_END()
+ };
+ D3DVERTEXELEMENT9 declaration_not_4_byte_aligned_offset[] =
+ {
+ {0, 3, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
+ {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
+ {0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
+ D3DDECL_END()
+ };
+ struct
+ {
+ D3DXVECTOR3 position0;
+ D3DXVECTOR3 position1;
+ D3DXVECTOR3 normal;
+ DWORD color;
+ } vertices[] =
+ {
+ { { 0.0f, 1.0f, 0.f}, { 1.0f, 0.0f, 0.f}, {0.0f, 0.0f, 1.0f}, 0xffff0000 },
+ { { 1.0f, -1.0f, 0.f}, {-1.0f, -1.0f, 0.f}, {0.0f, 0.0f, 1.0f}, 0xff00ff00 },
+ { {-1.0f, -1.0f, 0.f}, {-1.0f, 1.0f, 0.f}, {0.0f, 0.0f, 1.0f}, 0xff0000ff },
+ };
+ unsigned int faces[] = {0, 1, 2};
+ unsigned int attributes[] = {0};
+ unsigned int num_faces = ARRAY_SIZE(faces) / 3;
+ unsigned int num_vertices = ARRAY_SIZE(vertices);
+ int offset = 12;
+ DWORD options = D3DXMESH_32BIT | D3DXMESH_SYSTEMMEM;
+ void *vertex_buffer;
+ void *index_buffer;
+ DWORD *attributes_buffer;
+ D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE];
+ D3DVERTEXELEMENT9 *decl_ptr;
+
+ test_context = new_test_context();
+ if (!test_context)
+ {
+ skip("Couldn't create a test_context\n");
+ goto cleanup;
+ }
+
+ hr = D3DXCreateMesh(num_faces, num_vertices, options, declaration0,
+ test_context->device, &mesh);
+ if (FAILED(hr))
+ {
+ skip("Couldn't create test mesh %#x\n", hr);
+ goto cleanup;
+ }
+
+ mesh->lpVtbl->LockVertexBuffer(mesh, 0, &vertex_buffer);
+ memcpy(vertex_buffer, vertices, sizeof(vertices));
+ mesh->lpVtbl->UnlockVertexBuffer(mesh);
+
+ mesh->lpVtbl->LockIndexBuffer(mesh, 0, &index_buffer);
+ memcpy(index_buffer, faces, sizeof(faces));
+ mesh->lpVtbl->UnlockIndexBuffer(mesh);
+
+ mesh->lpVtbl->LockAttributeBuffer(mesh, 0, &attributes_buffer);
+ memcpy(attributes_buffer, attributes, sizeof(attributes));
+ mesh->lpVtbl->UnlockAttributeBuffer(mesh);
+
+ /* Get the declaration and try to change it */
+ hr = mesh->lpVtbl->GetDeclaration(mesh, declaration);
+ if (FAILED(hr))
+ {
+ skip("Couldn't get mesh declaration %#x\n", hr);
+ goto cleanup;
+ }
+
+ for (decl_ptr = declaration; decl_ptr->Stream != 0xFF; decl_ptr++)
+ {
+ if (decl_ptr->Usage == D3DDECLUSAGE_POSITION)
+ {
+ /* Use second vertex position instead of first */
+ decl_ptr->Offset = offset;
+ }
+ }
+
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration);
+ todo_wine ok(hr == D3D_OK, "Test UpdateSematics, got %#x expected %#x\n", hr, D3D_OK);
+
+ /* Check that declaration was written by getting it again */
+ memset(declaration, 0, sizeof(declaration));
+ hr = mesh->lpVtbl->GetDeclaration(mesh, declaration);
+ if (FAILED(hr))
+ {
+ skip("Couldn't get mesh declaration %#x\n", hr);
+ goto cleanup;
+ }
+
+ for (decl_ptr = declaration; decl_ptr->Stream != 0xFF; decl_ptr++)
+ {
+ if (decl_ptr->Usage == D3DDECLUSAGE_POSITION)
+ {
+ todo_wine ok(decl_ptr->Offset == offset, "Test UpdateSematics, got offset %d expected %d\n",
+ decl_ptr->Offset, offset);
+ }
+ }
+
+ /* UpdateSemantics does not check for a bigger vertex size */
+ memset(declaration, 0, sizeof(declaration));
+ hr = mesh->lpVtbl->GetDeclaration(mesh, declaration);
+ if (FAILED(hr))
+ {
+ skip("Couldn't get mesh declaration %#x\n", hr);
+ goto cleanup;
+ }
+
+ for (decl_ptr = declaration; decl_ptr->Stream != 0xFF; decl_ptr++)
+ {
+ if (decl_ptr->Type == D3DDECLTYPE_FLOAT3)
+ {
+ decl_ptr->Type = D3DDECLTYPE_FLOAT4;
+ }
+ }
+
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration);
+ todo_wine ok(hr == D3D_OK, "Test UpdateSematics for bigger vertex size, "
+ "got %#x expected D3D_OK\n", hr);
+
+ /* Null pointer declaration */
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, NULL);
+ todo_wine ok(hr == D3DERR_INVALIDCALL, "Test UpdateSematics null pointer declaration, "
+ "got %#x expected D3DERR_INVALIDCALL\n", hr);
+
+ /* Set the position type to color instead of float3 */
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_pos_type_color);
+ todo_wine ok(hr == D3D_OK, "Test UpdateSematics position type color, "
+ "got %#x expected D3D_OK\n", hr);
+
+ /* The following test cases show that invalid declarations are accepted
+ * with a D3D_OK. An access violations occurs however, if any of the
+ * functions that use the declaration is called, i.e. GetDeclaration and
+ * DrawSubset.
+ */
+
+ /* Double usage (invalid declaration) */
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_double_usage);
+ todo_wine ok(hr == D3D_OK, "Test UpdateSematics double usage, "
+ "got %#x expected D3D_OK\n", hr);
+
+ /* Set the position to an undefined type (invalid declaration) */
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_undefined_type);
+ todo_wine ok(hr == D3D_OK, "Test UpdateSematics undefined type, "
+ "got %#x expected D3D_OK\n", hr);
+
+ /* Use a not 4 byte aligned offset (invalid declaration) */
+ hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_not_4_byte_aligned_offset);
+ todo_wine ok(hr == D3D_OK, "Test UpdateSematics not 4 byte aligned offset, "
+ "got %#x expected D3D_OK\n", hr);
+
+cleanup:
+ if (mesh)
+ mesh->lpVtbl->Release(mesh);
+
+ free_test_context(test_context);
+}
+
START_TEST(mesh)
{
D3DXBoundProbeTest();
@@ -4277,4 +4554,5 @@ START_TEST(mesh)
test_get_decl_vertex_size();
test_fvf_decl_conversion();
D3DXGenerateAdjacencyTest();
+ test_update_semantics();
}
--------------1.7.5.4--
From 198b58442a1404e346e19fdb68989f5e00aca379 Mon Sep 17 00:00:00 2001
From: Michael Mc Donnell <[email protected]>
Date: Tue, 24 May 2011 19:44:48 +0200
Subject: d3dx9: Implement UpdateSemantics mesh method.
To: wine-patches <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------1.7.5.4"
This is a multi-part message in MIME format.
--------------1.7.5.4
Content-Type: text/plain; charset=UTF-8; format=fixed
Content-Transfer-Encoding: 8bit
Removed superfluous test.
---
dlls/d3dx9_36/mesh.c | 45 +++++++++++++++++++++++++++++++++++++++++--
dlls/d3dx9_36/tests/mesh.c | 30 ++++++++++++++--------------
2 files changed, 57 insertions(+), 18 deletions(-)
--------------1.7.5.4
Content-Type: text/x-patch; name="0002-d3dx9-Implement-UpdateSemantics-mesh-method.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="0002-d3dx9-Implement-UpdateSemantics-mesh-method.patch"
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index cfadb75..ddf3a2e 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -6,6 +6,7 @@
* Copyright (C) 2009 David Adam
* Copyright (C) 2010 Tony Wasserka
* Copyright (C) 2011 Dylan Smith
+ * Copyright (C) 2011 Michael Mc Donnell
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -106,7 +107,8 @@ static ULONG WINAPI ID3DXMeshImpl_Release(ID3DXMesh *iface)
{
IDirect3DIndexBuffer9_Release(This->index_buffer);
IDirect3DVertexBuffer9_Release(This->vertex_buffer);
- IDirect3DVertexDeclaration9_Release(This->vertex_declaration);
+ if (This->vertex_declaration)
+ IDirect3DVertexDeclaration9_Release(This->vertex_declaration);
IDirect3DDevice9_Release(This->device);
HeapFree(GetProcessHeap(), 0, This->attrib_buffer);
HeapFree(GetProcessHeap(), 0, This->attrib_table);
@@ -127,6 +129,12 @@ static HRESULT WINAPI ID3DXMeshImpl_DrawSubset(ID3DXMesh *iface, DWORD attrib_id
TRACE("(%p)->(%u)\n", This, attrib_id);
+ if (!This->vertex_declaration)
+ {
+ WARN("Can't draw a mesh with an invalid vertex declaration.\n");
+ return E_FAIL;
+ }
+
vertex_size = iface->lpVtbl->GetNumBytesPerVertex(iface);
hr = IDirect3DDevice9_SetVertexDeclaration(This->device, This->vertex_declaration);
@@ -194,6 +202,11 @@ static HRESULT WINAPI ID3DXMeshImpl_GetDeclaration(ID3DXMesh *iface, D3DVERTEXEL
TRACE("(%p)\n", This);
if (declaration == NULL) return D3DERR_INVALIDCALL;
+ if (!This->vertex_declaration)
+ {
+ WARN("Can't get vertex declaration because it's invalid.\n");
+ return E_FAIL;
+ }
return IDirect3DVertexDeclaration9_GetDeclaration(This->vertex_declaration,
declaration,
@@ -208,6 +221,12 @@ static DWORD WINAPI ID3DXMeshImpl_GetNumBytesPerVertex(ID3DXMesh *iface)
TRACE("iface (%p)\n", This);
+ if (!This->vertex_declaration)
+ {
+ WARN("Can't get number of bytes per vertex of an invalid vertex declaration.\n");
+ return E_FAIL;
+ }
+
IDirect3DVertexDeclaration9_GetDeclaration(This->vertex_declaration,
declaration,
&numelements);
@@ -603,11 +622,31 @@ cleanup:
static HRESULT WINAPI ID3DXMeshImpl_UpdateSemantics(ID3DXMesh *iface, D3DVERTEXELEMENT9 declaration[MAX_FVF_DECL_SIZE])
{
+ HRESULT hr;
ID3DXMeshImpl *This = impl_from_ID3DXMesh(iface);
+ if (!declaration)
+ return D3DERR_INVALIDCALL;
- FIXME("(%p)->(%p): stub\n", This, declaration);
+ TRACE("(%p)->(%p)\n", This, declaration);
- return E_NOTIMPL;
+ if (This->vertex_declaration)
+ IDirect3DVertexDeclaration9_Release(This->vertex_declaration);
+
+ /* An application can pass an invalid declaration to UpdateSemantics and
+ * still expect D3D_OK (see tests). If the declaration is invalid, then
+ * subsequent calls to GetDeclaration, GetNumBytesPerVertex, and DrawSubset,
+ * which use the declaration, will fail.
+ */
+ hr = IDirect3DDevice9_CreateVertexDeclaration(This->device,
+ declaration,
+ &This->vertex_declaration);
+ if (FAILED(hr))
+ {
+ WARN("Invalid declaration passed to UpdateSemantics.\n");
+ This->vertex_declaration = NULL;
+ }
+
+ return D3D_OK;
}
/*** ID3DXMesh ***/
diff --git a/dlls/d3dx9_36/tests/mesh.c b/dlls/d3dx9_36/tests/mesh.c
index cff4cce..6174044 100644
--- a/dlls/d3dx9_36/tests/mesh.c
+++ b/dlls/d3dx9_36/tests/mesh.c
@@ -4457,7 +4457,7 @@ static void test_update_semantics(void)
}
hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration);
- todo_wine ok(hr == D3D_OK, "Test UpdateSematics, got %#x expected %#x\n", hr, D3D_OK);
+ ok(hr == D3D_OK, "Test UpdateSematics, got %#x expected %#x\n", hr, D3D_OK);
/* Check that declaration was written by getting it again */
memset(declaration, 0, sizeof(declaration));
@@ -4472,8 +4472,8 @@ static void test_update_semantics(void)
{
if (decl_ptr->Usage == D3DDECLUSAGE_POSITION)
{
- todo_wine ok(decl_ptr->Offset == offset, "Test UpdateSematics, got offset %d expected %d\n",
- decl_ptr->Offset, offset);
+ ok(decl_ptr->Offset == offset, "Test UpdateSematics, got offset %d expected %d\n",
+ decl_ptr->Offset, offset);
}
}
@@ -4495,18 +4495,18 @@ static void test_update_semantics(void)
}
hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration);
- todo_wine ok(hr == D3D_OK, "Test UpdateSematics for bigger vertex size, "
- "got %#x expected D3D_OK\n", hr);
+ ok(hr == D3D_OK, "Test UpdateSematics for bigger vertex size, "
+ "got %#x expected D3D_OK\n", hr);
/* Null pointer declaration */
hr = mesh->lpVtbl->UpdateSemantics(mesh, NULL);
- todo_wine ok(hr == D3DERR_INVALIDCALL, "Test UpdateSematics null pointer declaration, "
- "got %#x expected D3DERR_INVALIDCALL\n", hr);
+ ok(hr == D3DERR_INVALIDCALL, "Test UpdateSematics null pointer declaration, "
+ "got %#x expected D3DERR_INVALIDCALL\n", hr);
/* Set the position type to color instead of float3 */
hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_pos_type_color);
- todo_wine ok(hr == D3D_OK, "Test UpdateSematics position type color, "
- "got %#x expected D3D_OK\n", hr);
+ ok(hr == D3D_OK, "Test UpdateSematics position type color, "
+ "got %#x expected D3D_OK\n", hr);
/* The following test cases show that invalid declarations are accepted
* with a D3D_OK. An access violations occurs however, if any of the
@@ -4516,18 +4516,18 @@ static void test_update_semantics(void)
/* Double usage (invalid declaration) */
hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_double_usage);
- todo_wine ok(hr == D3D_OK, "Test UpdateSematics double usage, "
- "got %#x expected D3D_OK\n", hr);
+ ok(hr == D3D_OK, "Test UpdateSematics double usage, "
+ "got %#x expected D3D_OK\n", hr);
/* Set the position to an undefined type (invalid declaration) */
hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_undefined_type);
- todo_wine ok(hr == D3D_OK, "Test UpdateSematics undefined type, "
- "got %#x expected D3D_OK\n", hr);
+ ok(hr == D3D_OK, "Test UpdateSematics undefined type, "
+ "got %#x expected D3D_OK\n", hr);
/* Use a not 4 byte aligned offset (invalid declaration) */
hr = mesh->lpVtbl->UpdateSemantics(mesh, declaration_not_4_byte_aligned_offset);
- todo_wine ok(hr == D3D_OK, "Test UpdateSematics not 4 byte aligned offset, "
- "got %#x expected D3D_OK\n", hr);
+ ok(hr == D3D_OK, "Test UpdateSematics not 4 byte aligned offset, "
+ "got %#x expected D3D_OK\n", hr);
cleanup:
if (mesh)
--------------1.7.5.4--