On Wed, Jun 8, 2011 at 8:32 PM, Stefan Dösinger <stefandoesin...@gmx.at> 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 <mich...@mcdonnell.dk> Date: Tue, 24 May 2011 19:43:47 +0200 Subject: d3dx9/test: Add UpdateSemantics test. To: wine-patches <wine-patc...@winehq.org> 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 <mich...@mcdonnell.dk> Date: Tue, 24 May 2011 19:44:48 +0200 Subject: d3dx9: Implement UpdateSemantics mesh method. To: wine-patches <wine-patc...@winehq.org> 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--