Stefan Dösinger : wined3d: Move vertex fixups into their own function.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 21 13:49:22 CDT 2006


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Jul 21 13:43:22 2006 +0200

wined3d: Move vertex fixups into their own function.

---

 dlls/wined3d/vertexbuffer.c |  127 ++++++++++++++++++++++---------------------
 1 files changed, 66 insertions(+), 61 deletions(-)

diff --git a/dlls/wined3d/vertexbuffer.c b/dlls/wined3d/vertexbuffer.c
index 9317b4c..b67a1ca 100644
--- a/dlls/wined3d/vertexbuffer.c
+++ b/dlls/wined3d/vertexbuffer.c
@@ -98,8 +98,70 @@ static DWORD    WINAPI IWineD3DVertexBuf
     return IWineD3DResourceImpl_GetPriority((IWineD3DResource *)iface);
 }
 
+static void fixup_vertices(BYTE *src, BYTE *dst, int stride, int num, BYTE *pos, BOOL haspos, BYTE *diffuse, BOOL hasdiffuse, BYTE *specular, BOOL hasspecular) {
+    int i;
+    float x, y, z, w;
+
+    for(i = num - 1; i >= 0; i--) {
+        if(haspos) {
+            float *p = (float *) (((int) src + (int) pos) + i * stride);
+
+            /* rhw conversion like in drawStridedSlow */
+            if(p[3] == 1.0 || ((p[3] < eps) && (p[3] > -eps))) {
+                x = p[0];
+                y = p[1];
+                z = p[2];
+                w = 1.0;
+            } else {
+                w = 1.0 / p[3];
+                x = p[0] * w;
+                y = p[1] * w;
+                z = p[2] * w;
+            }
+            p = (float *) ((int) dst + i * stride + (int) pos);
+            p[0] = x;
+            p[1] = y;
+            p[2] = z;
+            p[3] = w;
+        }
+        if(hasdiffuse) {
+            DWORD srcColor, *dstColor = (DWORD *) (dst + i * stride + (int) diffuse);
+            srcColor = * (DWORD *) ( ((int) src + (int) diffuse) + i * stride);
+
+            /* Color conversion like in drawStridedSlow. watch out for little endianity
+            * If we want that stuff to work on big endian machines too we have to consider more things
+            *
+            * 0xff000000: Alpha mask
+            * 0x00ff0000: Blue mask
+            * 0x0000ff00: Green mask
+            * 0x000000ff: Red mask
+            */
+
+            *dstColor = 0;
+            *dstColor |= (srcColor & 0xff00ff00)      ;   /* Alpha Green */
+            *dstColor |= (srcColor & 0x00ff0000) >> 16;   /* Red */
+            *dstColor |= (srcColor & 0x000000ff) << 16;   /* Blue */
+        }
+        if(hasspecular) {
+            DWORD srcColor, *dstColor = (DWORD *) (dst + i * stride + (int) specular);
+            srcColor = * (DWORD *) ( ((int) src + (int) specular) + i * stride);
+
+            /* Simmilar to diffuse
+             * TODO: Write the alpha value out for fog coords
+             */
+            *dstColor = 0;
+            *dstColor |= (srcColor & 0xff00ff00)      ;   /* Alpha Green */
+            *dstColor |= (srcColor & 0x00ff0000) >> 16;   /* Red */
+            *dstColor |= (srcColor & 0x000000ff) << 16;   /* Blue */
+        }
+    }
+}
+
 static void     WINAPI IWineD3DVertexBufferImpl_PreLoad(IWineD3DVertexBuffer *iface) {
     IWineD3DVertexBufferImpl *This = (IWineD3DVertexBufferImpl *) iface;
+    BYTE *data;
+    UINT start = 0, end = 0, stride = 0;
+    BOOL useVertexShaderFunction = FALSE, fixup = FALSE;
     TRACE("(%p)->()\n", This);
 
     if(This->Flags & VBFLAG_LOAD) {
@@ -114,10 +176,6 @@ static void     WINAPI IWineD3DVertexBuf
     if(This->vbo) {
         WineDirect3DVertexStridedData strided;
         IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
-        BOOL useVertexShaderFunction = FALSE, fixup = FALSE;
-        BYTE *data;
-        UINT i;
-        UINT start = 0, end = 0, stride = 0;
 
         if(This->Flags & VBFLAG_DIRTY) {
             /* Update the old buffer on unlock, use the old desc */
@@ -237,63 +295,10 @@ static void     WINAPI IWineD3DVertexBuf
             }
             memcpy(data, This->resource.allocatedMemory + start, end - start);
 
-            for(i = 0; i < ( end - start) / stride; i++) {
-                if(strided.u.s.position_transformed) {
-                    float *p = (float *) (((int) This->resource.allocatedMemory + 
-                       (int) strided.u.s.position.lpData) + start + i * stride);
-                    float x, y, z, w;
-
-                    /* rhw conversion like in drawStridedSlow */
-                    if(p[3] == 1.0 || ((p[3] < eps) && (p[3] > -eps))) {
-                        x = p[0];
-                        y = p[1];
-                        z = p[2];
-                        w = 1.0;
-                    } else {
-                        w = 1.0 / p[3];
-                        x = p[0] * w;
-                        y = p[1] * w;
-                        z = p[2] * w;
-                    }
-                    p = (float *) ((int) data + i * stride + (int) strided.u.s.position.lpData);
-                    p[0] = x;
-                    p[1] = y;
-                    p[2] = z;
-                    p[3] = w;
-                }
-                if(strided.u.s.diffuse.dwType == WINED3DDECLTYPE_SHORT4 || strided.u.s.diffuse.dwType == WINED3DDECLTYPE_D3DCOLOR) {
-                    DWORD srcColor, *dstColor = (DWORD *) (data + i * stride + (int) strided.u.s.diffuse.lpData);
-                    srcColor = * (DWORD *) ( ((int) This->resource.allocatedMemory + (int) strided.u.s.diffuse.lpData) + start + i * stride);
-
-                    /* Color conversion like in drawStridedSlow. watch out for little endianity
-                     * If we want that stuff to work on big endian machines too we have to consider more things
-                     *
-                     * 0xff000000: Alpha mask
-                     * 0x00ff0000: Blue mask
-                     * 0x0000ff00: Green mask
-                     * 0x000000ff: Red mask
-                     */
-
-                    *dstColor = 0;
-                    *dstColor |= (srcColor & 0xff00ff00)      ;   /* Alpha Green */
-                    *dstColor |= (srcColor & 0x00ff0000) >> 16;   /* Red */
-                    *dstColor |= (srcColor & 0x000000ff) << 16;   /* Blue */
-                } else if (strided.u.s.diffuse.lpData != NULL) {
-                    FIXME("Type is %ld\n", strided.u.s.diffuse.dwType);
-                }
-                if(strided.u.s.specular.dwType == WINED3DDECLTYPE_SHORT4 || strided.u.s.specular.dwType == WINED3DDECLTYPE_D3DCOLOR) {
-                    DWORD srcColor, *dstColor = (DWORD *) (data + i * stride + (int) strided.u.s.specular.lpData);
-                    srcColor = * (DWORD *) ( ((int) This->resource.allocatedMemory + (int) strided.u.s.specular.lpData) + start + i * stride);
-
-                    /* Color conversion like in drawStridedSlow. watch out for little endianity
-                     * If we want that stuff to work on big endian machines too we have to consider more things
-                     */
-                    *dstColor = 0;
-                    *dstColor |= (srcColor & 0xff00ff00)      ;   /* Alpha Green */
-                    *dstColor |= (srcColor & 0x00ff0000) >> 16;   /* Red */
-                    *dstColor |= (srcColor & 0x000000ff) << 16;   /* Blue */
-                }
-            }
+            fixup_vertices(data, data, stride, ( end - start) / stride,
+                           strided.u.s.position.lpData, strided.u.s.position_transformed,
+                           strided.u.s.diffuse.lpData, strided.u.s.diffuse.dwType == WINED3DDECLTYPE_SHORT4 || strided.u.s.diffuse.dwType == WINED3DDECLTYPE_D3DCOLOR,
+                           strided.u.s.specular.lpData, strided.u.s.specular.dwType == WINED3DDECLTYPE_SHORT4 || strided.u.s.specular.dwType == WINED3DDECLTYPE_D3DCOLOR);
         } else {
             data = This->resource.allocatedMemory + start;
         }




More information about the wine-cvs mailing list