H. Verbeet : wined3d: Fix D3DCOLOR swizzling in shaders.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 7 07:13:04 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 219ca7c2a0adbe36fdcbe294aab1298d63e9ae9d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=219ca7c2a0adbe36fdcbe294aab1298d63e9ae9d

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Sat Aug  5 18:15:42 2006 +0200

wined3d: Fix D3DCOLOR swizzling in shaders.

---

 dlls/wined3d/vertexshader.c |   30 ++++++++++++++++++++++++------
 1 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index e837772..3427dff 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -661,13 +661,31 @@ BOOL vshader_input_is_color(
     IWineD3DVertexShaderImpl* This = (IWineD3DVertexShaderImpl*) iface;
     DWORD usage_token = This->semantics_in[regnum].usage;
     DWORD usage = (usage_token & D3DSP_DCL_USAGE_MASK) >> D3DSP_DCL_USAGE_SHIFT;
+    DWORD usage_idx = (usage_token & D3DSP_DCL_USAGEINDEX_MASK) >> D3DSP_DCL_USAGEINDEX_SHIFT;
 
-    /* FIXME: D3D8 shader: the semantics token is not the way to 
-     * determine color info, since it is just a fake map to shader inputs */
-    if (This->vertexDeclaration != NULL)
-        return FALSE; 
-    else
-        return usage == D3DDECLUSAGE_COLOR;
+    IWineD3DVertexDeclarationImpl *vertexDeclaration = NULL;
+    if (This->vertexDeclaration) {
+        /* D3D8 declaration */
+        vertexDeclaration = (IWineD3DVertexDeclarationImpl *)This->vertexDeclaration;
+    } else {
+        /* D3D9 declaration */
+        vertexDeclaration = (IWineD3DVertexDeclarationImpl *)((IWineD3DDeviceImpl *)This->wineD3DDevice)->stateBlock->vertexDecl;
+    }
+
+    if (vertexDeclaration) {
+        int i;
+        /* Find the declaration element that matches our register, then check
+         * if it has D3DCOLOR as it's type. This works for both d3d8 and d3d9. */
+        for (i = 0; i < vertexDeclaration->declarationWNumElements-1; ++i) {
+            WINED3DVERTEXELEMENT *element = vertexDeclaration->pDeclarationWine + i;
+            if ((element->Usage == usage && element->UsageIndex == usage_idx)) {
+                return element->Type == WINED3DDECLTYPE_D3DCOLOR;
+            }
+        }
+    }
+
+    ERR("Either no vertexdeclaration present, or register not matched. This should never happen.\n");
+    return FALSE;
 }
 
 /** Generate a vertex shader string using either GL_VERTEX_PROGRAM_ARB




More information about the wine-cvs mailing list