[1/3] WineD3D: Improve drawStridedSlow a bit

Stefan Dösinger stefan at codeweavers.com
Tue Jan 16 16:43:28 CST 2007


This patch tries to reduce the number of if statements in the drawStridedSlow 
per vertex loop. It removes checks for unsupported attributes, a fixme for 
them is printed after parsing the stream source anyway. The code reading the 
data locations and doing the actual gl calls are combined to check each 
pointer twice. The default values for unspecified attributes is set before 
the loop, this avoids a check against iteration == 1 every loop if lpData == 
NULL.
-------------- next part --------------
From 81f75511727f40ddbfdf4e1ef78ecfb53d289017 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Sat, 13 Jan 2007 14:21:41 +0100
Subject: [PATCH] WineD3D: Improve drawStridedSlow a bit

---
 dlls/wined3d/drawprim.c |  123 ++++++++++++++++------------------------------
 1 files changed, 43 insertions(+), 80 deletions(-)

diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index b46192e..f7df49c 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -615,9 +615,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
     const long                *pIdxBufL     = NULL;
     LONG                       vx_index;
     float x  = 0.0f, y  = 0.0f, z = 0.0f;  /* x,y,z coordinates          */
-    float nx = 0.0f, ny = 0.0, nz = 0.0f;  /* normal x,y,z coordinates   */
     float rhw = 0.0f;                      /* rhw                        */
-    float ptSize = 0.0f;                   /* Point size                 */
     DWORD diffuseColor = 0xFFFFFFFF;       /* Diffuse Color              */
     DWORD specularColor = 0;               /* Specular Color             */
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
@@ -635,6 +633,19 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
     VTRACE(("glBegin(%x)\n", glPrimType));
     glBegin(glPrimType);
 
+    /* Default settings for data that is not passed */
+    if (sd->u.s.normal.lpData == NULL) {
+        glNormal3f(0, 0, 1);
+    }
+    if(sd->u.s.diffuse.lpData != NULL) {
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    if(sd->u.s.specular.lpData != NULL) {
+        if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
+            GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
+        }
+    }
+
     /* We shouldn't start this function if any VBO is involved. Should I put a safety check here?
      * Guess it's not necessary(we crash then anyway) and would only eat CPU time
      */
@@ -645,6 +656,10 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
         /* Initialize diffuse color */
         diffuseColor = 0xFFFFFFFF;
 
+        /* Blending data and Point sizes are not supported by this function. They are not supported by the fixed
+         * function pipeline at all. A Fixme for them is printed after decoding the vertex declaration
+         */
+
         /* For indexed data, we need to go a few more strides in */
         if (idxData != NULL) {
 
@@ -658,68 +673,6 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
             }
         }
 
-        /* Position Information ------------------ */
-        if (sd->u.s.position.lpData != NULL) {
-
-            float *ptrToCoords = (float *)(sd->u.s.position.lpData + (SkipnStrides * sd->u.s.position.dwStride));
-            x = ptrToCoords[0];
-            y = ptrToCoords[1];
-            z = ptrToCoords[2];
-            rhw = 1.0;
-            VTRACE(("x,y,z=%f,%f,%f\n", x,y,z));
-
-            /* RHW follows, only if transformed, ie 4 floats were provided */
-            if (sd->u.s.position_transformed) {
-                rhw = ptrToCoords[3];
-                VTRACE(("rhw=%f\n", rhw));
-            }
-        }
-
-        /* Blending data -------------------------- */
-        if (sd->u.s.blendWeights.lpData != NULL) {
-            /* float *ptrToCoords = (float *)(sd->u.s.blendWeights.lpData + (SkipnStrides * sd->u.s.blendWeights.dwStride)); */
-            FIXME("Blending not supported yet\n");
-
-            if (sd->u.s.blendMatrixIndices.lpData != NULL) {
-                /*DWORD *ptrToCoords = (DWORD *)(sd->u.s.blendMatrixIndices.lpData + (SkipnStrides * sd->u.s.blendMatrixIndices.dwStride));*/
-            }
-        }
-
-        /* Vertex Normal Data (untransformed only)- */
-        if (sd->u.s.normal.lpData != NULL) {
-
-            float *ptrToCoords = (float *)(sd->u.s.normal.lpData + (SkipnStrides * sd->u.s.normal.dwStride));
-            nx = ptrToCoords[0];
-            ny = ptrToCoords[1];
-            nz = ptrToCoords[2];
-            VTRACE(("nx,ny,nz=%f,%f,%f\n", nx, ny, nz));
-        }
-
-        /* Point Size ----------------------------- */
-        if (sd->u.s.pSize.lpData != NULL) {
-
-            float *ptrToCoords = (float *)(sd->u.s.pSize.lpData + (SkipnStrides * sd->u.s.pSize.dwStride));
-            ptSize = ptrToCoords[0];
-            VTRACE(("ptSize=%f\n", ptSize));
-            FIXME("No support for ptSize yet\n");
-        }
-
-        /* Diffuse -------------------------------- */
-        if (sd->u.s.diffuse.lpData != NULL) {
-
-            DWORD *ptrToCoords = (DWORD *)(sd->u.s.diffuse.lpData + (SkipnStrides * sd->u.s.diffuse.dwStride));
-            diffuseColor = ptrToCoords[0];
-            VTRACE(("diffuseColor=%lx\n", diffuseColor));
-        }
-
-        /* Specular  -------------------------------- */
-        if (sd->u.s.specular.lpData != NULL) {
-
-            DWORD *ptrToCoords = (DWORD *)(sd->u.s.specular.lpData + (SkipnStrides * sd->u.s.specular.dwStride));
-            specularColor = ptrToCoords[0];
-            VTRACE(("specularColor=%lx\n", specularColor));
-        }
-
         /* Texture coords --------------------------- */
         for (textureNo = 0, texture_idx = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
 
@@ -835,7 +788,11 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
 
         /* Diffuse -------------------------------- */
         if (sd->u.s.diffuse.lpData != NULL) {
-	  glColor4ub(D3DCOLOR_B_R(diffuseColor),
+            DWORD *ptrToCoords = (DWORD *)(sd->u.s.diffuse.lpData + (SkipnStrides * sd->u.s.diffuse.dwStride));
+            diffuseColor = ptrToCoords[0];
+            VTRACE(("diffuseColor=%lx\n", diffuseColor));
+
+            glColor4ub(D3DCOLOR_B_R(diffuseColor),
 		     D3DCOLOR_B_G(diffuseColor),
 		     D3DCOLOR_B_B(diffuseColor),
 		     D3DCOLOR_B_A(diffuseColor));
@@ -844,12 +801,14 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
 		    D3DCOLOR_B_G(diffuseColor),
 		    D3DCOLOR_B_B(diffuseColor),
 		    D3DCOLOR_B_A(diffuseColor)));
-        } else {
-            if (vx_index == 0) glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
         }
 
         /* Specular ------------------------------- */
         if (sd->u.s.specular.lpData != NULL) {
+            DWORD *ptrToCoords = (DWORD *)(sd->u.s.specular.lpData + (SkipnStrides * sd->u.s.specular.dwStride));
+            specularColor = ptrToCoords[0];
+            VTRACE(("specularColor=%lx\n", specularColor));
+
             /* special case where the fog density is stored in the diffuse alpha channel */
             if(This->stateBlock->renderState[WINED3DRS_FOGENABLE] &&
               (This->stateBlock->renderState[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || sd->u.s.position.dwType == WINED3DDECLTYPE_FLOAT4 )&&
@@ -879,27 +838,31 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
                 /* Do not worry if specular colour missing and disable request */
                 VTRACE(("Specular color extensions not supplied\n"));
             }
-        } else {
-            if (vx_index == 0) {
-                if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
-                    GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
-                } else {
-                    /* Do not worry if specular colour missing and disable request */
-                    VTRACE(("Specular color extensions not supplied\n"));
-                }
-            }
         }
 
         /* Normal -------------------------------- */
         if (sd->u.s.normal.lpData != NULL) {
-            VTRACE(("glNormal:nx,ny,nz=%f,%f,%f\n", nx,ny,nz));
-            glNormal3f(nx, ny, nz);
-        } else {
-            if (vx_index == 0) glNormal3f(0, 0, 1);
+            float *ptrToCoords = (float *)(sd->u.s.normal.lpData + (SkipnStrides * sd->u.s.normal.dwStride));
+
+            VTRACE(("glNormal:nx,ny,nz=%f,%f,%f\n", ptrToCoords[0], ptrToCoords[1], ptrToCoords[2]));
+            glNormal3f(ptrToCoords[0], ptrToCoords[1], ptrToCoords[2]);
         }
 
         /* Position -------------------------------- */
         if (sd->u.s.position.lpData != NULL) {
+            float *ptrToCoords = (float *)(sd->u.s.position.lpData + (SkipnStrides * sd->u.s.position.dwStride));
+            x = ptrToCoords[0];
+            y = ptrToCoords[1];
+            z = ptrToCoords[2];
+            rhw = 1.0;
+            VTRACE(("x,y,z=%f,%f,%f\n", x,y,z));
+
+            /* RHW follows, only if transformed, ie 4 floats were provided */
+            if (sd->u.s.position_transformed) {
+                rhw = ptrToCoords[3];
+                VTRACE(("rhw=%f\n", rhw));
+            }
+
             if (1.0f == rhw || ((rhw < eps) && (rhw > -eps))) {
                 VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z));
                 glVertex3f(x, y, z);
-- 
1.4.4.3



More information about the wine-patches mailing list