> It seems that during the porting of d3d8 to use wined3d some of there
> was some breakage.  Age of Mythology was working fine, but now all
> vertex data is totally messed up (2D is menus and stuff is fine).  It
> has been this way in CVS for the past few days, when I first noticed
> it.  I thought it might be my local changes so I didn't report it, but
> testing with the new 0.9.9 it had the same behavior (i.e. not my fault
> :)
> 
> After debugging things for a while it seems that problem lies in
> vertex data with RHW set.  It seems that AoM is using all pre-lit and
> pre-transformed vertex data and this is not being processes properly. 
> I think the problem is with drawprim.c:drawStridedSlow() but I haven't
> been able to figure out exactly where yet.  If anyone has any ideas
> (or patches!) I'd be glad to help debug.
> 
> Regards,
>   Aric

Right now d3d8's SetVertexShader is disabled because d3d8 shaders don't work
using wined3d yet. Last week I experimented a bit with it and I managed to
get some simple vertex shader examples working (for instance
http://www.codesampler.com/source/dx8_vs11_shader_simple.zip and the dolphin
sample from sdk although with small issues). If I run bigger apps like
3dmark2001 and others there are huge drawing issues. I'm not very familiar
with the shader/drawing code (and vertex shaders in general) so it is very
difficult for me to debug. You can try the patch attached to this email but
it is far from complete. If you or someone else with enough experience can
look at it, you're welcome as my time is limited.

Regards,
Roderick

-- 
"Feel free" mit GMX FreeMail!
Monat für Monat 10 FreeSMS inklusive! http://www.gmx.net
Index: dlls/d3d8/device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.145
diff -u -r1.145 device.c
--- dlls/d3d8/device.c	28 Feb 2006 12:10:27 -0000	1.145
+++ dlls/d3d8/device.c	4 Mar 2006 13:33:37 -0000
@@ -1090,8 +1090,8 @@
             FIXME("(%p) : Number of shaders exceeds the maximum number of possible shaders\n", This);
             hrc = D3DERR_INVALIDCALL;
         } else {
-            /* IDirect3DVertexShader8Impl *shader = This->vShaders[pShader - (VS_HIGHESTFIXEDFXF + 1)]; */
-            /* hrc =  IWineD3DDevice_SetVertexShader(This->WineD3DDevice, 0 == shader ? NULL : shader->wineD3DVertexShader); */
+            IDirect3DVertexShader8Impl *shader = This->vShaders[pShader - (VS_HIGHESTFIXEDFXF + 1)];
+            hrc =  IWineD3DDevice_SetVertexShader(This->WineD3DDevice, 0 == shader ? NULL : shader->wineD3DVertexShader);
         }
     }
     TRACE("(%p) : returning hr(%lu)\n", This, hrc);
Index: dlls/wined3d/device.c
===================================================================
RCS file: /home/wine/wine/dlls/wined3d/device.c,v
retrieving revision 1.139
diff -u -r1.139 device.c
--- dlls/wined3d/device.c	2 Mar 2006 17:12:33 -0000	1.139
+++ dlls/wined3d/device.c	4 Mar 2006 13:33:43 -0000
@@ -1622,6 +1622,23 @@
     D3DCREATEOBJECTINSTANCE(object, VertexShader)
 
     TRACE("(%p) : Created Vertex shader %p\n", This, *ppVertexShader);
+
+    /* If a vertex declaration has been passed, save it to the vertex shader, this affects d3d8 only.
+    *  Further set the declaration before calling SetFunction as it needs the declaration.
+    */
+    if (pDeclaration != NULL) {
+        IWineD3DVertexDeclaration *vertexDeclaration;
+        hr = IWineD3DDevice_CreateVertexDeclaration(iface, pDeclaration, &vertexDeclaration ,NULL);
+        if (D3D_OK == hr) {
+            TRACE("(%p) : Setting vertex declaration to %p\n", This, vertexDeclaration);
+            object->vertexDeclaration = vertexDeclaration;
+        } else {
+            FIXME("(%p) : Failed to set the declaration, returning D3DERR_INVALIDCALL\n", iface);
+            IWineD3DVertexShader_Release(*ppVertexShader);
+            return D3DERR_INVALIDCALL;
+        }
+    }
+
     hr = IWineD3DVertexShader_SetFunction(*ppVertexShader, pFunction);
 
     if (D3D_OK != hr) {
@@ -1639,21 +1656,6 @@
 
 #endif
 
-
-    /* If a vertex declaration has been passed, save it to the vertex shader, this affects d3d8 only. */
-    if (pDeclaration != NULL) {
-        IWineD3DVertexDeclaration *vertexDeclaration;
-        hr = IWineD3DDevice_CreateVertexDeclaration(iface, pDeclaration, &vertexDeclaration ,NULL);
-        if (D3D_OK == hr) {
-            TRACE("(%p) : Setting vertex declaration to %p\n", This, vertexDeclaration);
-            object->vertexDeclaration = vertexDeclaration;
-        } else {
-            FIXME("(%p) : Failed to set the declaration, returning D3DERR_INVALIDCALL\n", iface);
-            IWineD3DVertexShader_Release(*ppVertexShader);
-            return D3DERR_INVALIDCALL;
-        }
-    }
-
     return D3D_OK;
 }
 
Index: dlls/wined3d/vertexshader.c
===================================================================
RCS file: /home/wine/wine/dlls/wined3d/vertexshader.c,v
retrieving revision 1.23
diff -u -r1.23 vertexshader.c
--- dlls/wined3d/vertexshader.c	6 Feb 2006 11:15:00 -0000	1.23
+++ dlls/wined3d/vertexshader.c	4 Mar 2006 13:33:44 -0000
@@ -1059,6 +1059,126 @@
   return nComponents;
 }
 
+static void ParseVertexDeclarationUsage(IWineD3DVertexShaderImpl *This, INT usage, INT arrayNo)
+{
+    switch(usage & 0xFFFF) {
+        case D3DDECLUSAGE_POSITION:
+            if((usage & 0xF0000) >> 16 == 0) { /* tween data */
+                TRACE("Setting position to %d\n", arrayNo);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION]     = arrayNo;
+                This->namedArrays = TRUE;
+            } else {
+                /* TODO: position indexes go from 0-8!!*/
+                TRACE("Setting position 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
+                /* robots uses positions up to 8, the position arrays are just packed.*/
+                if ((usage & 0xF0000) >> 16 > 1) {
+                    TRACE("Loaded for position %d (greater than 2)\n", (usage & 0xF0000) >> 16);
+                }
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION2 + ((usage & 0xF0000) >> 16) -1] = arrayNo;
+                This->declaredArrays = TRUE;
+            }
+        break;
+        case D3DDECLUSAGE_BLENDINDICES:
+            /* not supported by openGL */
+            TRACE("Setting BLENDINDICES to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDINDICES] = arrayNo;
+            This->declaredArrays = TRUE;
+            if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended BLENDINDICES\n");
+        break;
+        case D3DDECLUSAGE_BLENDWEIGHT:
+            TRACE("Setting BLENDWEIGHT to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDWEIGHT]  = arrayNo;
+            This->namedArrays = TRUE;
+            if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended blend weights\n");
+        break;
+        case D3DDECLUSAGE_NORMAL:
+            if((usage & 0xF0000) >> 16 == 0) { /* tween data */
+                TRACE("Setting normal to %d\n", arrayNo);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL]   = arrayNo;
+                This->namedArrays = TRUE;
+            } else {
+                TRACE("Setting normal 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL2]   = arrayNo;
+                This->declaredArrays = TRUE;
+            }
+        break;
+        case D3DDECLUSAGE_PSIZE:
+            TRACE("Setting PSIZE to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_PSIZE]        = arrayNo;
+            This->namedArrays = TRUE;
+            if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended PSIZE\n");
+        break;
+        case D3DDECLUSAGE_COLOR:
+            if((usage & 0xF0000) >> 16 == 0)  {
+                TRACE("Setting DIFFUSE to %d\n", arrayNo);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DIFFUSE]  = arrayNo;
+                This->namedArrays = TRUE;
+            } else {
+                TRACE("Setting SPECULAR to %d\n", arrayNo);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR] = arrayNo;
+                This->namedArrays = TRUE;
+            }
+        break;
+        case D3DDECLUSAGE_TEXCOORD:
+            This->namedArrays = TRUE;
+            /* only 7 texture coords have been designed for, so run a quick sanity check */
+            if ((usage & 0xF0000) >> 16 > 7) {
+                FIXME("(%p) : Program uses texture coordinate %d but only 0-7 have been implemented\n", This, (usage & 0xF0000) >> 16);
+            } else {
+                TRACE("Setting TEXCOORD %d  to %d\n", ((usage & 0xF0000) >> 16), arrayNo);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TEXCOORD0 + ((usage & 0xF0000) >> 16)] = arrayNo;
+            }
+        break;
+        /* The following aren't supported by openGL,
+            if we get them then everything needs to be mapped to numbered attributes instead of named ones.
+            this should be caught in the first pass */
+        case D3DDECLUSAGE_TANGENT:
+            TRACE("Setting TANGENT to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TANGENT]      = arrayNo;
+            This->declaredArrays = TRUE;
+        break;
+        case D3DDECLUSAGE_BINORMAL:
+            TRACE("Setting BINORMAL to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BINORMAL]     = arrayNo;
+            This->declaredArrays = TRUE;
+        break;
+        case D3DDECLUSAGE_TESSFACTOR:
+            TRACE("Setting TESSFACTOR to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TESSFACTOR]   = arrayNo;
+            This->declaredArrays = TRUE;
+        break;
+        case D3DDECLUSAGE_POSITIONT:
+            if((usage & 0xF0000) >> 16 == 0) { /* tween data */
+                FIXME("Setting positiont to %d\n", arrayNo);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT] = arrayNo;
+                This->namedArrays = TRUE;
+            } else {
+                FIXME("Setting positiont 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
+                This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT2] = arrayNo;
+                This->declaredArrays = TRUE;
+            if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended positiont\n");
+            }
+        break;
+        case D3DDECLUSAGE_FOG:
+            /* supported by OpenGL */
+            TRACE("Setting FOG to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_FOG]          = arrayNo;
+            This->namedArrays = TRUE;
+        break;
+        case D3DDECLUSAGE_DEPTH:
+            TRACE("Setting DEPTH to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DEPTH]        = arrayNo;
+            This->declaredArrays = TRUE;
+        break;
+        case D3DDECLUSAGE_SAMPLE:
+            TRACE("Setting SAMPLE to %d\n", arrayNo);
+            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SAMPLE]       = arrayNo;
+            This->declaredArrays = TRUE;
+        break;
+        default:
+        FIXME("Unrecognised dcl %08x", usage & 0xFFFF);
+    }
+}
 /**
  * Function parser ...
  */
@@ -1119,6 +1239,15 @@
     /* TODO: renumbering of attributes if the values are higher than the highest supported attribute but the total number of attributes is less than the highest supported attribute */
     This->highestConstant = -1;
 
+    if(This->vertexDeclaration) {
+	for (i = 0 ; i < ((IWineD3DVertexDeclarationImpl*)This->vertexDeclaration)->declarationWNumElements - 1; ++i) {
+    	    WINED3DVERTEXELEMENT *element = ((IWineD3DVertexDeclarationImpl*)This->vertexDeclaration)->pDeclarationWine + i;
+    	    BYTE usage = element->Usage;
+    	    BYTE arrayNo = element->Reg;
+    	    ParseVertexDeclarationUsage(This, usage, arrayNo);
+	}
+    }
+
 
   /**
    * First pass to determine what we need to declare:
@@ -1153,123 +1282,7 @@
                 if (curOpcode->opcode == D3DSIO_DCL){
                     INT usage = *pToken++;
                     INT arrayNo = (*pToken++ & 0x00001FFF);
-                    switch(usage & 0xFFFF) {
-                    case D3DDECLUSAGE_POSITION:
-                        if((usage & 0xF0000) >> 16 == 0) { /* tween data */
-                            TRACE("Setting position to %d\n", arrayNo);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION]     = arrayNo;
-                            This->namedArrays = TRUE;
-                        } else {
-                            /* TODO: position indexes go from 0-8!!*/
-                            TRACE("Setting position 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
-                            /* robots uses positions up to 8, the position arrays are just packed.*/
-                            if ((usage & 0xF0000) >> 16 > 1) {
-                                TRACE("Loaded for position %d (greater than 2)\n", (usage & 0xF0000) >> 16);
-                            }
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION2 + ((usage & 0xF0000) >> 16) -1] = arrayNo;
-                            This->declaredArrays = TRUE;
-                        }
-                    break;
-                    case D3DDECLUSAGE_BLENDINDICES:
-                        /* not supported by openGL */
-                        TRACE("Setting BLENDINDICES to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDINDICES] = arrayNo;
-                        This->declaredArrays = TRUE;
-                        if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended BLENDINDICES\n");
-                    break;
-                    case D3DDECLUSAGE_BLENDWEIGHT:
-                         TRACE("Setting BLENDWEIGHT to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDWEIGHT]  = arrayNo;
-                        This->namedArrays = TRUE;
-                        if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended blend weights\n");
-                    break;
-                    case D3DDECLUSAGE_NORMAL:
-                        if((usage & 0xF0000) >> 16 == 0) { /* tween data */
-                            TRACE("Setting normal to %d\n", arrayNo);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL]   = arrayNo;
-                            This->namedArrays = TRUE;
-                        } else {
-                            TRACE("Setting normal 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL2]   = arrayNo;
-                            This->declaredArrays = TRUE;
-                        }
-                    break;
-                    case D3DDECLUSAGE_PSIZE:
-                        TRACE("Setting PSIZE to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_PSIZE]        = arrayNo;
-                        This->namedArrays = TRUE;
-                        if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended PSIZE\n");
-                    break;
-                    case D3DDECLUSAGE_COLOR:
-                        if((usage & 0xF0000) >> 16 == 0)  {
-                            TRACE("Setting DIFFUSE to %d\n", arrayNo);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DIFFUSE]  = arrayNo;
-                            This->namedArrays = TRUE;
-                        } else {
-                            TRACE("Setting SPECULAR to %d\n", arrayNo);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR] = arrayNo;
-                            This->namedArrays = TRUE;
-                        }
-                    break;
-                    case D3DDECLUSAGE_TEXCOORD:
-                        This->namedArrays = TRUE;
-                        /* only 7 texture coords have been designed for, so run a quick sanity check */
-                        if ((usage & 0xF0000) >> 16 > 7) {
-                            FIXME("(%p) : Program uses texture coordinate %d but only 0-7 have been implemented\n", This, (usage & 0xF0000) >> 16);
-                        } else {
-                            TRACE("Setting TEXCOORD %d  to %d\n", ((usage & 0xF0000) >> 16), arrayNo);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TEXCOORD0 + ((usage & 0xF0000) >> 16)] = arrayNo;
-                        }
-                    break;
-                    /* The following aren't supported by openGL,
-                        if we get them then everything needs to be mapped to numbered attributes instead of named ones.
-                        this should be caught in the first pass */
-                    case D3DDECLUSAGE_TANGENT:
-                        TRACE("Setting TANGENT to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TANGENT]      = arrayNo;
-                        This->declaredArrays = TRUE;
-                    break;
-                    case D3DDECLUSAGE_BINORMAL:
-                        TRACE("Setting BINORMAL to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BINORMAL]     = arrayNo;
-                        This->declaredArrays = TRUE;
-                    break;
-                    case D3DDECLUSAGE_TESSFACTOR:
-                        TRACE("Setting TESSFACTOR to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TESSFACTOR]   = arrayNo;
-                        This->declaredArrays = TRUE;
-                    break;
-                    case D3DDECLUSAGE_POSITIONT:
-                        if((usage & 0xF0000) >> 16 == 0) { /* tween data */
-                            FIXME("Setting positiont to %d\n", arrayNo);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT] = arrayNo;
-                            This->namedArrays = TRUE;
-                        } else {
-                            FIXME("Setting positiont 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
-                            This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT2] = arrayNo;
-                            This->declaredArrays = TRUE;
-                        if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended positiont\n");
-                        }
-                    break;
-                    case D3DDECLUSAGE_FOG:
-                        /* supported by OpenGL */
-                        TRACE("Setting FOG to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_FOG]          = arrayNo;
-                        This->namedArrays = TRUE;
-                    break;
-                    case D3DDECLUSAGE_DEPTH:
-                        TRACE("Setting DEPTH to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DEPTH]        = arrayNo;
-                        This->declaredArrays = TRUE;
-                    break;
-                    case D3DDECLUSAGE_SAMPLE:
-                        TRACE("Setting SAMPLE to %d\n", arrayNo);
-                        This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SAMPLE]       = arrayNo;
-                        This->declaredArrays = TRUE;
-                    break;
-                    default:
-                    FIXME("Unrecognised dcl %08x", usage & 0xFFFF);
-                    }
+    		    ParseVertexDeclarationUsage(This, usage, arrayNo); 
                 } else if(curOpcode->opcode == D3DSIO_DEF) {
                             This->constantsUsedBitmap[*pToken & 0xFF] = VS_CONSTANT_CONSTANT;
                             FIXME("Constant %ld\n", *pToken & 0xFF);
@@ -1327,7 +1340,7 @@
         This->namedArrays = FALSE;
     }
     /* TODO: validate
-        nUseAddressRegister < = GL_MAX_PROGRAM_ADDRESS_REGISTERS_AR
+        nUseAddressRegister < = GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
         nUseTempRegister    <=  GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
     */
 


Reply via email to