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