Michael Mc Donnell : d3dx9: Added D3DXOptimizeFaces semi-stub.

Alexandre Julliard julliard at winehq.org
Thu May 3 14:23:49 CDT 2012


Module: wine
Branch: master
Commit: 5a14f5b37e2f2317a980aed4af4080c262c93787
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5a14f5b37e2f2317a980aed4af4080c262c93787

Author: Michael Mc Donnell <michael at mcdonnell.dk>
Date:   Fri Mar 30 19:02:20 2012 +0200

d3dx9: Added D3DXOptimizeFaces semi-stub.

---

 dlls/d3dx9_36/d3dx9_36.spec |    2 +-
 dlls/d3dx9_36/mesh.c        |   68 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletions(-)

diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index b0f7988..94893d3 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -228,7 +228,7 @@
 @ stdcall D3DXMatrixTransformation2D(ptr ptr float ptr ptr float ptr)
 @ stdcall D3DXMatrixTranslation(ptr float float float)
 @ stdcall D3DXMatrixTranspose(ptr ptr)
-@ stub D3DXOptimizeFaces(ptr long long long ptr)
+@ stdcall D3DXOptimizeFaces(ptr long long long ptr)
 @ stub D3DXOptimizeVertices(ptr long long long ptr)
 @ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
 @ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
diff --git a/dlls/d3dx9_36/mesh.c b/dlls/d3dx9_36/mesh.c
index be8ca60..9c1853a 100644
--- a/dlls/d3dx9_36/mesh.c
+++ b/dlls/d3dx9_36/mesh.c
@@ -6700,3 +6700,71 @@ cleanup:
 
     return hr;
 }
+
+/*************************************************************************
+ * D3DXOptimizeFaces    (D3DX9_36.@)
+ *
+ * Re-orders the faces so the vertex cache is used optimally.
+ *
+ * PARAMS
+ *   indices           [I] Pointer to an index buffer belonging to a mesh.
+ *   num_faces         [I] Number of faces in the mesh.
+ *   num_vertices      [I] Number of vertices in the mesh.
+ *   indices_are_32bit [I] Specifies whether indices are 32- or 16-bit.
+ *   face_remap        [I/O] The new order the faces should be drawn in.
+ *
+ * RETURNS
+ *   Success: D3D_OK.
+ *   Failure: D3DERR_INVALIDCALL.
+ *
+ * BUGS
+ *   The face re-ordering does not use the vertex cache optimally.
+ *
+ */
+HRESULT WINAPI D3DXOptimizeFaces(LPCVOID indices,
+                                 UINT num_faces,
+                                 UINT num_vertices,
+                                 BOOL indices_are_32bit,
+                                 DWORD *face_remap)
+{
+    UINT i;
+    UINT j = num_faces - 1;
+    UINT limit_16_bit = 2 << 15; /* According to MSDN */
+    HRESULT hr = D3D_OK;
+
+    FIXME("(%p, %u, %u, %s, %p): semi-stub. Face order will not be optimal.\n",
+          indices, num_faces, num_vertices,
+          indices_are_32bit ? "TRUE" : "FALSE", face_remap);
+
+    if (!indices_are_32bit && num_faces >= limit_16_bit)
+    {
+        WARN("Number of faces must be less than %d when using 16-bit indices.\n",
+             limit_16_bit);
+        hr = D3DERR_INVALIDCALL;
+        goto error;
+    }
+
+    if (!face_remap)
+    {
+        WARN("Face remap pointer is NULL.\n");
+        hr = D3DERR_INVALIDCALL;
+        goto error;
+    }
+
+    /* The faces are drawn in reverse order for simple meshes. This ordering
+     * is not optimal for complicated meshes, but will not break anything
+     * either. The ordering should be changed to take advantage of the vertex
+     * cache on the graphics card.
+     *
+     * TODO Re-order to take advantage of vertex cache.
+     */
+    for (i = 0; i < num_faces; i++)
+    {
+        face_remap[i] = j--;
+    }
+
+    return D3D_OK;
+
+error:
+    return hr;
+}




More information about the wine-cvs mailing list