Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
39d4656b
Commit
39d4656b
authored
May 24, 2011
by
Michael Mc Donnell
Committed by
Alexandre Julliard
Jun 22, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d3dx9: Implement UpdateSemantics mesh method.
parent
4df270a8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
104 additions
and
37 deletions
+104
-37
mesh.c
dlls/d3dx9_36/mesh.c
+81
-14
mesh.c
dlls/d3dx9_36/tests/mesh.c
+23
-23
No files found.
dlls/d3dx9_36/mesh.c
View file @
39d4656b
...
...
@@ -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
...
...
@@ -52,7 +53,10 @@ typedef struct ID3DXMeshImpl
DWORD
options
;
DWORD
fvf
;
IDirect3DDevice9
*
device
;
D3DVERTEXELEMENT9
cached_declaration
[
MAX_FVF_DECL_SIZE
];
IDirect3DVertexDeclaration9
*
vertex_declaration
;
UINT
vertex_declaration_size
;
UINT
num_elem
;
IDirect3DVertexBuffer9
*
vertex_buffer
;
IDirect3DIndexBuffer9
*
index_buffer
;
DWORD
*
attrib_buffer
;
...
...
@@ -106,7 +110,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 +132,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
);
...
...
@@ -186,32 +197,31 @@ static DWORD WINAPI ID3DXMeshImpl_GetFVF(ID3DXMesh *iface)
return
This
->
fvf
;
}
static
void
copy_declaration
(
D3DVERTEXELEMENT9
*
dst
,
const
D3DVERTEXELEMENT9
*
src
,
UINT
num_elem
)
{
memcpy
(
dst
,
src
,
num_elem
*
sizeof
(
*
src
));
}
static
HRESULT
WINAPI
ID3DXMeshImpl_GetDeclaration
(
ID3DXMesh
*
iface
,
D3DVERTEXELEMENT9
declaration
[
MAX_FVF_DECL_SIZE
])
{
ID3DXMeshImpl
*
This
=
impl_from_ID3DXMesh
(
iface
);
UINT
numelements
;
TRACE
(
"(%p)
\n
"
,
This
);
if
(
declaration
==
NULL
)
return
D3DERR_INVALIDCALL
;
return
IDirect3DVertexDeclaration9_GetDeclaration
(
This
->
vertex_declaration
,
declaration
,
&
numelements
)
;
copy_declaration
(
declaration
,
This
->
cached_declaration
,
This
->
num_elem
);
return
D3D_OK
;
}
static
DWORD
WINAPI
ID3DXMeshImpl_GetNumBytesPerVertex
(
ID3DXMesh
*
iface
)
{
ID3DXMeshImpl
*
This
=
impl_from_ID3DXMesh
(
iface
);
UINT
numelements
;
D3DVERTEXELEMENT9
declaration
[
MAX_FVF_DECL_SIZE
]
=
{
D3DDECL_END
()
};
TRACE
(
"iface (%p)
\n
"
,
This
);
IDirect3DVertexDeclaration9_GetDeclaration
(
This
->
vertex_declaration
,
declaration
,
&
numelements
);
return
D3DXGetDeclVertexSize
(
declaration
,
0
);
return
This
->
vertex_declaration_size
;
}
static
DWORD
WINAPI
ID3DXMeshImpl_GetOptions
(
ID3DXMesh
*
iface
)
...
...
@@ -603,11 +613,61 @@ cleanup:
static
HRESULT
WINAPI
ID3DXMeshImpl_UpdateSemantics
(
ID3DXMesh
*
iface
,
D3DVERTEXELEMENT9
declaration
[
MAX_FVF_DECL_SIZE
])
{
HRESULT
hr
;
ID3DXMeshImpl
*
This
=
impl_from_ID3DXMesh
(
iface
);
UINT
vertex_declaration_size
;
int
i
;
FIXME
(
"(%p)->(%p): stub
\n
"
,
This
,
declaration
);
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
declaration
);
return
E_NOTIMPL
;
if
(
!
declaration
)
{
WARN
(
"Invalid declaration. Can't use NULL declaration.
\n
"
);
return
D3DERR_INVALIDCALL
;
}
/* New declaration must be same size as original */
vertex_declaration_size
=
D3DXGetDeclVertexSize
(
declaration
,
declaration
[
0
].
Stream
);
if
(
vertex_declaration_size
!=
This
->
vertex_declaration_size
)
{
WARN
(
"Invalid declaration. New vertex size does not match the orginal vertex size.
\n
"
);
return
D3DERR_INVALIDCALL
;
}
/* New declaration must not contain non-zero Stream value */
for
(
i
=
0
;
declaration
[
i
].
Stream
!=
0xff
;
i
++
)
{
if
(
declaration
[
i
].
Stream
!=
0
)
{
WARN
(
"Invalid declaration. New declaration contains non-zero Stream value.
\n
"
);
return
D3DERR_INVALIDCALL
;
}
}
This
->
num_elem
=
i
+
1
;
copy_declaration
(
This
->
cached_declaration
,
declaration
,
This
->
num_elem
);
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 DrawSubset will fail. This is handled by setting the
* vertex declaration to NULL.
* GetDeclaration, GetNumBytesPerVertex must, however, use the new
* invalid declaration. This is handled by them using the cached vertex
* declaration instead of the actual vertex declaration.
*/
hr
=
IDirect3DDevice9_CreateVertexDeclaration
(
This
->
device
,
declaration
,
&
This
->
vertex_declaration
);
if
(
FAILED
(
hr
))
{
WARN
(
"Using invalid declaration. Calls to DrawSubset will fail.
\n
"
);
This
->
vertex_declaration
=
NULL
;
}
return
D3D_OK
;
}
/*** ID3DXMesh ***/
...
...
@@ -1652,6 +1712,8 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
HRESULT
hr
;
DWORD
fvf
;
IDirect3DVertexDeclaration9
*
vertex_declaration
;
UINT
vertex_declaration_size
;
UINT
num_elem
;
IDirect3DVertexBuffer9
*
vertex_buffer
;
IDirect3DIndexBuffer9
*
index_buffer
;
DWORD
*
attrib_buffer
;
...
...
@@ -1674,6 +1736,7 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
for
(
i
=
0
;
declaration
[
i
].
Stream
!=
0xff
;
i
++
)
if
(
declaration
[
i
].
Stream
!=
0
)
return
D3DERR_INVALIDCALL
;
num_elem
=
i
+
1
;
if
(
options
&
D3DXMESH_32BIT
)
index_format
=
D3DFMT_INDEX32
;
...
...
@@ -1734,10 +1797,11 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
WARN
(
"Unexpected return value %x from IDirect3DDevice9_CreateVertexDeclaration.
\n
"
,
hr
);
return
hr
;
}
vertex_declaration_size
=
D3DXGetDeclVertexSize
(
declaration
,
declaration
[
0
].
Stream
);
/* Create vertex buffer */
hr
=
IDirect3DDevice9_CreateVertexBuffer
(
device
,
numvertices
*
D3DXGetDeclVertexSize
(
declaration
,
declaration
[
0
].
Stream
)
,
numvertices
*
vertex_declaration_size
,
vertex_usage
,
fvf
,
vertex_pool
,
...
...
@@ -1787,7 +1851,10 @@ HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options,
object
->
device
=
device
;
IDirect3DDevice9_AddRef
(
device
);
copy_declaration
(
object
->
cached_declaration
,
declaration
,
num_elem
);
object
->
vertex_declaration
=
vertex_declaration
;
object
->
vertex_declaration_size
=
vertex_declaration_size
;
object
->
num_elem
=
num_elem
;
object
->
vertex_buffer
=
vertex_buffer
;
object
->
index_buffer
=
index_buffer
;
object
->
attrib_buffer
=
attrib_buffer
;
...
...
dlls/d3dx9_36/tests/mesh.c
View file @
39d4656b
...
...
@@ -4490,7 +4490,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
));
...
...
@@ -4505,8 +4505,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
);
}
}
...
...
@@ -4516,7 +4516,7 @@ static void test_update_semantics(void)
memset
(
declaration
,
filler_a
,
sizeof
(
declaration
));
memcpy
(
declaration
,
declaration0
,
sizeof
(
declaration0
));
hr
=
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration
);
todo_wine
ok
(
hr
==
D3D_OK
,
"Test UpdateSematics, "
ok
(
hr
==
D3D_OK
,
"Test UpdateSematics, "
"got %#x expected D3D_OK
\n
"
,
hr
);
memset
(
declaration
,
filler_b
,
sizeof
(
declaration
));
hr
=
mesh
->
lpVtbl
->
GetDeclaration
(
mesh
,
declaration
);
...
...
@@ -4549,13 +4549,13 @@ static void test_update_semantics(void)
}
hr
=
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration
);
todo_wine
ok
(
hr
==
D3D_OK
,
"Test UpdateSematics for overlapping fields, "
"got %#x expected D3D_OK
\n
"
,
hr
);
ok
(
hr
==
D3D_OK
,
"Test UpdateSematics for overlapping fields, "
"got %#x expected D3D_OK
\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 NULL, smaller or larger declarations,
* and declarations with non-zero Stream values are not accepted.
...
...
@@ -4567,8 +4567,8 @@ static void test_update_semantics(void)
/* Null declaration (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid 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
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
vertex_size
,
exp_vertex_size
);
...
...
@@ -4581,8 +4581,8 @@ static void test_update_semantics(void)
/* Smaller vertex declaration (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid declaration */
hr
=
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration_smaller
);
todo_wine
ok
(
hr
==
D3DERR_INVALIDCALL
,
"Test UpdateSematics for smaller vertex declaration, "
"got %#x expected D3DERR_INVALIDCALL
\n
"
,
hr
);
ok
(
hr
==
D3DERR_INVALIDCALL
,
"Test UpdateSematics for smaller vertex declaration, "
"got %#x expected D3DERR_INVALIDCALL
\n
"
,
hr
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
vertex_size
,
exp_vertex_size
);
...
...
@@ -4595,8 +4595,8 @@ static void test_update_semantics(void)
/* Larger vertex declaration (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid declaration */
hr
=
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration_larger
);
todo_wine
ok
(
hr
==
D3DERR_INVALIDCALL
,
"Test UpdateSematics for larger vertex declaration, "
"got %#x expected D3DERR_INVALIDCALL
\n
"
,
hr
);
ok
(
hr
==
D3DERR_INVALIDCALL
,
"Test UpdateSematics for larger vertex declaration, "
"got %#x expected D3DERR_INVALIDCALL
\n
"
,
hr
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
vertex_size
,
exp_vertex_size
);
...
...
@@ -4609,7 +4609,7 @@ static void test_update_semantics(void)
/* Use multiple streams and keep the same vertex size (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid declaration */
hr
=
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration_multiple_streams
);
todo_wine
ok
(
hr
==
D3DERR_INVALIDCALL
,
"Test UpdateSematics using multiple streams, "
ok
(
hr
==
D3DERR_INVALIDCALL
,
"Test UpdateSematics using multiple streams, "
"got %#x expected D3DERR_INVALIDCALL
\n
"
,
hr
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
...
...
@@ -4629,8 +4629,8 @@ static void test_update_semantics(void)
/* Double usage (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid 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
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
vertex_size
,
exp_vertex_size
);
...
...
@@ -4638,13 +4638,13 @@ static void test_update_semantics(void)
hr
=
mesh
->
lpVtbl
->
GetDeclaration
(
mesh
,
declaration
);
ok
(
hr
==
D3D_OK
,
"Couldn't get vertex declaration. Got %#x, expected D3D_OK
\n
"
,
hr
);
equal
=
memcmp
(
declaration
,
declaration_double_usage
,
sizeof
(
declaration_double_usage
));
todo_wine
ok
(
equal
==
0
,
"Vertex declarations were not equal
\n
"
);
ok
(
equal
==
0
,
"Vertex declarations were not equal
\n
"
);
/* Set the position to an undefined type (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid 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
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
vertex_size
,
exp_vertex_size
);
...
...
@@ -4652,12 +4652,12 @@ static void test_update_semantics(void)
hr
=
mesh
->
lpVtbl
->
GetDeclaration
(
mesh
,
declaration
);
ok
(
hr
==
D3D_OK
,
"Couldn't get vertex declaration. Got %#x, expected D3D_OK
\n
"
,
hr
);
equal
=
memcmp
(
declaration
,
declaration_undefined_type
,
sizeof
(
declaration_undefined_type
));
todo_wine
ok
(
equal
==
0
,
"Vertex declarations were not equal
\n
"
);
ok
(
equal
==
0
,
"Vertex declarations were not equal
\n
"
);
/* Use a not 4 byte aligned offset (invalid declaration) */
mesh
->
lpVtbl
->
UpdateSemantics
(
mesh
,
declaration0
);
/* Set a valid 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, "
ok
(
hr
==
D3D_OK
,
"Test UpdateSematics not 4 byte aligned offset, "
"got %#x expected D3D_OK
\n
"
,
hr
);
vertex_size
=
mesh
->
lpVtbl
->
GetNumBytesPerVertex
(
mesh
);
ok
(
vertex_size
==
exp_vertex_size
,
"Got vertex declaration size %u, expected %u
\n
"
,
...
...
@@ -4667,7 +4667,7 @@ static void test_update_semantics(void)
ok
(
hr
==
D3D_OK
,
"Couldn't get vertex declaration. Got %#x, expected D3D_OK
\n
"
,
hr
);
equal
=
memcmp
(
declaration
,
declaration_not_4_byte_aligned_offset
,
sizeof
(
declaration_not_4_byte_aligned_offset
));
todo_wine
ok
(
equal
==
0
,
"Vertex declarations were not equal
\n
"
);
ok
(
equal
==
0
,
"Vertex declarations were not equal
\n
"
);
cleanup:
if
(
mesh
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment