[D3D] Use vertex arrays when possible.

Lionel Ulmer lionel.ulmer at free.fr
Sun Nov 23 12:45:50 CST 2003


Despite leading to a performance loss on my old TNT2U (really wonder why
though), this may help on more recent hardware.

Would be interested in 3DMark2000 benchmarks before and after this patch.

Changelog:
 - use vertex arrays when possible

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	Sun Nov 16 13:29:36 2003
+++ dlls/ddraw/d3ddevice/mesa.c	Sun Nov 23 17:59:02 2003
@@ -836,42 +836,36 @@
     return DD_OK;
 }
 
-static void draw_primitive_start_GL(D3DPRIMITIVETYPE d3dpt)
+static GLenum convert_D3D_ptype_to_GL(D3DPRIMITIVETYPE d3dpt)
 {
     switch (d3dpt) {
         case D3DPT_POINTLIST:
-            TRACE("Start POINTS\n");
-	    glBegin(GL_POINTS);
-	    break;
+            TRACE(" primitive type is POINTS\n");
+	    return GL_POINTS;
 
 	case D3DPT_LINELIST:
-	    TRACE("Start LINES\n");
-	    glBegin(GL_LINES);
-	    break;
-
+	    TRACE(" primitive type is LINES\n");
+	    return GL_LINES;
+		
 	case D3DPT_LINESTRIP:
-	    TRACE("Start LINE_STRIP\n");
-	    glBegin(GL_LINE_STRIP);
-	    break;
-
+	    TRACE(" primitive type is LINE_STRIP\n");
+	    return GL_LINE_STRIP;
+	    
 	case D3DPT_TRIANGLELIST:
-	    TRACE("Start TRIANGLES\n");
-	    glBegin(GL_TRIANGLES);
-	    break;
-
+	    TRACE(" primitive type is TRIANGLES\n");
+	    return GL_TRIANGLES;
+	    
 	case D3DPT_TRIANGLESTRIP:
-	    TRACE("Start TRIANGLE_STRIP\n");
-	    glBegin(GL_TRIANGLE_STRIP);
-	    break;
-
+	    TRACE(" primitive type is TRIANGLE_STRIP\n");
+	    return GL_TRIANGLE_STRIP;
+	    
 	case D3DPT_TRIANGLEFAN:
-	    TRACE("Start TRIANGLE_FAN\n");
-	    glBegin(GL_TRIANGLE_FAN);
-	    break;
-
+	    TRACE(" primitive type is TRIANGLE_FAN\n");
+	    return GL_TRIANGLE_FAN;
+	    
 	default:
 	    FIXME("Unhandled primitive %08x\n", d3dpt);
-	    break;
+	    return GL_POINTS;
     }
 }
 
@@ -1305,7 +1299,8 @@
     BOOLEAN vertex_lighted = FALSE;
     IDirect3DDeviceGLImpl* glThis = (IDirect3DDeviceGLImpl*) This;
     int num_active_stages = 0;
-
+    int num_tex_index = ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT);
+    
     /* I put the trace before the various locks... So as to better understand where locks occur :-) */
     if (TRACE_ON(ddraw)) {
         TRACE(" Vertex format : "); dump_flexible_vertex(d3dvtVertexType);
@@ -1356,167 +1351,228 @@
     draw_primitive_handle_GL_state(This,
 				   (d3dvtVertexType & D3DFVF_POSITION_MASK) != D3DFVF_XYZ,
 				   vertex_lighted);
-    draw_primitive_start_GL(d3dptPrimitiveType);
 
-    /* Some fast paths first before the generic case.... */
-    if ((d3dvtVertexType == D3DFVF_VERTEX) && (num_active_stages <= 1)) {
-	int index;
-	
-	for (index = 0; index < dwIndexCount; index++) {
-	    int i = (dwIndices == NULL) ? index : dwIndices[index];
-	    D3DVALUE *normal = 
-	      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->normal.lpvData) + i * lpD3DDrawPrimStrideData->normal.dwStride);
-	    D3DVALUE *tex_coord =
-	      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[0].lpvData) + i * lpD3DDrawPrimStrideData->textureCoords[0].dwStride);
-	    D3DVALUE *position =
-	      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
-	    
-	    handle_normal(normal);
-	    handle_texture(tex_coord);
-	    handle_xyz(position);
-	    
-	    TRACE_(ddraw_geom)(" %f %f %f / %f %f %f (%f %f)\n",
-			       position[0], position[1], position[2],
-			       normal[0], normal[1], normal[2],
-			       tex_coord[0], tex_coord[1]);
+    /* First, see if we can use the OpenGL vertex arrays... This is very limited
+       for now to some 'special' cases where we can do a direct mapping between D3D
+       types and GL types.
+
+       Note that in the future all calls will go through vertex arrays but the arrays
+       will be generated by this function. */
+    if (((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZ) && /* Standard XYZ vertices */
+	(((d3dvtVertexType & (D3DFVF_DIFFUSE|D3DFVF_SPECULAR)) == 0) || /* Either no colours */
+	 (((d3dvtVertexType & D3DFVF_DIFFUSE) != 0) && /* Or diffuse only but the Alpha component is not used */
+	  (This->state_block.render_state[D3DRENDERSTATE_ALPHATESTENABLE - 1] == FALSE) &&
+	  (This->state_block.render_state[D3DRENDERSTATE_ALPHABLENDENABLE - 1] == FALSE)))) {
+	int tex_stage;
+	TRACE(" using GL vertex arrays for performance !\n");
+	/* First, the vertices (we are sure we have some :-) */
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glVertexPointer(3, GL_FLOAT, lpD3DDrawPrimStrideData->position.dwStride, lpD3DDrawPrimStrideData->position.lpvData);
+	/* Then the normals */
+	if (d3dvtVertexType & D3DFVF_NORMAL) {
+	    glEnableClientState(GL_NORMAL_ARRAY);
+	    glNormalPointer(GL_FLOAT, lpD3DDrawPrimStrideData->normal.dwStride, lpD3DDrawPrimStrideData->normal.lpvData);
+	}
+	/* Then the diffuse colour */
+	if (d3dvtVertexType & D3DFVF_DIFFUSE) {
+	    glEnableClientState(GL_COLOR_ARRAY);
+	    glColorPointer(3, GL_UNSIGNED_BYTE, lpD3DDrawPrimStrideData->normal.dwStride,
+			   ((char *) lpD3DDrawPrimStrideData->diffuse.lpvData));
+	}
+	/* Then the various textures */
+	for (tex_stage = 0; tex_stage < num_active_stages; tex_stage++) {
+	    int tex_index = This->state_block.texture_stage_state[tex_stage][D3DTSS_TEXCOORDINDEX - 1] & 0x0000FFFF;
+	    if (tex_index >= num_tex_index) {
+		WARN("Default texture coordinate not handled in the vertex array path !!!\n");
+		tex_index = num_tex_index - 1;
+	    }
+	    if (GL_extensions.glClientActiveTexture) {
+		GL_extensions.glClientActiveTexture(GL_TEXTURE0_WINE + tex_stage);
+	    }
+	    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	    glTexCoordPointer(2, GL_FLOAT, lpD3DDrawPrimStrideData->textureCoords[tex_index].dwStride,
+			      lpD3DDrawPrimStrideData->textureCoords[tex_index].lpvData);
+	}
+	if (dwIndices != NULL) {
+	    glDrawElements(convert_D3D_ptype_to_GL(d3dptPrimitiveType), dwIndexCount, GL_UNSIGNED_SHORT, dwIndices);
+	} else {
+	    glDrawArrays(convert_D3D_ptype_to_GL(d3dptPrimitiveType), 0, dwIndexCount);
+	}
+	glDisableClientState(GL_VERTEX_ARRAY);
+	if (d3dvtVertexType & D3DFVF_NORMAL) {
+	    glDisableClientState(GL_NORMAL_ARRAY);
 	}
-    } else if ((d3dvtVertexType == D3DFVF_TLVERTEX) && (num_active_stages <= 1)) {
-	int index;
+	if (d3dvtVertexType & D3DFVF_DIFFUSE) {
+	    glDisableClientState(GL_COLOR_ARRAY);
+	}
+	for (tex_stage = 0; tex_stage < num_active_stages; tex_stage++) {
+	    if (GL_extensions.glClientActiveTexture) {
+		GL_extensions.glClientActiveTexture(GL_TEXTURE0_WINE + tex_stage);
+	    }
+	    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+	}
+    } else {
+	glBegin(convert_D3D_ptype_to_GL(d3dptPrimitiveType));
 	
-	for (index = 0; index < dwIndexCount; index++) {
-	    int i = (dwIndices == NULL) ? index : dwIndices[index];
-	    DWORD *color_d = 
-	      (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
-	    DWORD *color_s = 
-	      (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
-	    D3DVALUE *tex_coord =
-	      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[0].lpvData) + i * lpD3DDrawPrimStrideData->textureCoords[0].dwStride);
-	    D3DVALUE *position =
-	      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
-
-	    handle_diffuse_and_specular(&(This->state_block), glThis->fog_table, color_d, color_s, TRUE);
-	    handle_texture(tex_coord);
-	    handle_xyzrhw(position);
-
-	    TRACE_(ddraw_geom)(" %f %f %f %f / %02lx %02lx %02lx %02lx - %02lx %02lx %02lx %02lx (%f %f)\n",
-			       position[0], position[1], position[2], position[3], 
-			       (*color_d >> 16) & 0xFF,
-			       (*color_d >>  8) & 0xFF,
-			       (*color_d >>  0) & 0xFF,
-			       (*color_d >> 24) & 0xFF,
-			       (*color_s >> 16) & 0xFF,
-			       (*color_s >>  8) & 0xFF,
-			       (*color_s >>  0) & 0xFF,
-			       (*color_s >> 24) & 0xFF,
-			       tex_coord[0], tex_coord[1]);
-	} 
-    } else if (((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZ) ||
-	       ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZRHW)) {
-        /* This is the 'slow path' but that should support all possible vertex formats out there...
-	   Note that people should write a fast path for all vertex formats out there...
-	*/  
-	int index;
-	int num_tex_index = ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT);
-	static const D3DVALUE no_index[] = { 0.0, 0.0, 0.0, 0.0 };
-	  
-	for (index = 0; index < dwIndexCount; index++) {
-	    int i = (dwIndices == NULL) ? index : dwIndices[index];
-	    int tex_stage;
-
-	    if (d3dvtVertexType & D3DFVF_NORMAL) { 
-	        D3DVALUE *normal = 
-		  (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->normal.lpvData) + i * lpD3DDrawPrimStrideData->normal.dwStride);	    
+	/* Some fast paths first before the generic case.... */
+	if ((d3dvtVertexType == D3DFVF_VERTEX) && (num_active_stages <= 1)) {
+	    int index;
+	    
+	    for (index = 0; index < dwIndexCount; index++) {
+		int i = (dwIndices == NULL) ? index : dwIndices[index];
+		D3DVALUE *normal = 
+		    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->normal.lpvData) + i * lpD3DDrawPrimStrideData->normal.dwStride);
+		D3DVALUE *tex_coord =
+		    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[0].lpvData) + i * lpD3DDrawPrimStrideData->textureCoords[0].dwStride);
+		D3DVALUE *position =
+		    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
+		
 		handle_normal(normal);
-	    }
-	    if ((d3dvtVertexType & (D3DFVF_DIFFUSE|D3DFVF_SPECULAR)) == (D3DFVF_DIFFUSE|D3DFVF_SPECULAR)) {
-	        DWORD *color_d = 
-		  (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
+		handle_texture(tex_coord);
+		handle_xyz(position);
+		
+		TRACE_(ddraw_geom)(" %f %f %f / %f %f %f (%f %f)\n",
+				   position[0], position[1], position[2],
+				   normal[0], normal[1], normal[2],
+				   tex_coord[0], tex_coord[1]);
+	    }
+	} else if ((d3dvtVertexType == D3DFVF_TLVERTEX) && (num_active_stages <= 1)) {
+	    int index;
+	    
+	    for (index = 0; index < dwIndexCount; index++) {
+		int i = (dwIndices == NULL) ? index : dwIndices[index];
+		DWORD *color_d = 
+		    (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
 		DWORD *color_s = 
-		  (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
-		handle_diffuse_and_specular(&(This->state_block), glThis->fog_table, color_d, color_s, vertex_lighted);
-	    } else {
-	        if (d3dvtVertexType & D3DFVF_SPECULAR) { 
-		    DWORD *color_s = 
-		      (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
-		    handle_specular(&(This->state_block), color_s, vertex_lighted);
-		} else if (d3dvtVertexType & D3DFVF_DIFFUSE) {
+		    (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
+		D3DVALUE *tex_coord =
+		    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[0].lpvData) + i * lpD3DDrawPrimStrideData->textureCoords[0].dwStride);
+		D3DVALUE *position =
+		    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
+		
+		handle_diffuse_and_specular(&(This->state_block), glThis->fog_table, color_d, color_s, TRUE);
+		handle_texture(tex_coord);
+		handle_xyzrhw(position);
+		
+		TRACE_(ddraw_geom)(" %f %f %f %f / %02lx %02lx %02lx %02lx - %02lx %02lx %02lx %02lx (%f %f)\n",
+				   position[0], position[1], position[2], position[3], 
+				   (*color_d >> 16) & 0xFF,
+				   (*color_d >>  8) & 0xFF,
+				   (*color_d >>  0) & 0xFF,
+				   (*color_d >> 24) & 0xFF,
+				   (*color_s >> 16) & 0xFF,
+				   (*color_s >>  8) & 0xFF,
+				   (*color_s >>  0) & 0xFF,
+				   (*color_s >> 24) & 0xFF,
+				   tex_coord[0], tex_coord[1]);
+	    } 
+	} else if (((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZ) ||
+		   ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZRHW)) {
+	    /* This is the 'slow path' but that should support all possible vertex formats out there...
+	       Note that people should write a fast path for all vertex formats out there...
+	       */  
+	    int index;
+	    static const D3DVALUE no_index[] = { 0.0, 0.0, 0.0, 0.0 };
+	    
+	    for (index = 0; index < dwIndexCount; index++) {
+		int i = (dwIndices == NULL) ? index : dwIndices[index];
+		int tex_stage;
+		
+		if (d3dvtVertexType & D3DFVF_NORMAL) { 
+		    D3DVALUE *normal = 
+			(D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->normal.lpvData) + i * lpD3DDrawPrimStrideData->normal.dwStride);	    
+		    handle_normal(normal);
+		}
+		if ((d3dvtVertexType & (D3DFVF_DIFFUSE|D3DFVF_SPECULAR)) == (D3DFVF_DIFFUSE|D3DFVF_SPECULAR)) {
 		    DWORD *color_d = 
-		      (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
-		    handle_diffuse(&(This->state_block), color_d, vertex_lighted);
+			(DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
+		    DWORD *color_s = 
+			(DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
+		    handle_diffuse_and_specular(&(This->state_block), glThis->fog_table, color_d, color_s, vertex_lighted);
+		} else {
+		    if (d3dvtVertexType & D3DFVF_SPECULAR) { 
+			DWORD *color_s = 
+			    (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
+			handle_specular(&(This->state_block), color_s, vertex_lighted);
+		    } else if (d3dvtVertexType & D3DFVF_DIFFUSE) {
+			DWORD *color_d = 
+			    (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
+			handle_diffuse(&(This->state_block), color_d, vertex_lighted);
+		    }
 		}
-	    }
-
-	    for (tex_stage = 0; tex_stage < num_active_stages; tex_stage++) {
-	        int tex_index = This->state_block.texture_stage_state[tex_stage][D3DTSS_TEXCOORDINDEX - 1] & 0x0000FFFF;
-		if (tex_index >= num_tex_index) {
-		    handle_textures((D3DVALUE *) no_index, tex_stage);
-		 } else {
-		     D3DVALUE *tex_coord =
-		       (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[tex_index].lpvData) + 
-				     i * lpD3DDrawPrimStrideData->textureCoords[tex_index].dwStride);
-		     handle_textures(tex_coord, tex_stage);
+		
+		for (tex_stage = 0; tex_stage < num_active_stages; tex_stage++) {
+		    int tex_index = This->state_block.texture_stage_state[tex_stage][D3DTSS_TEXCOORDINDEX - 1] & 0x0000FFFF;
+		    if (tex_index >= num_tex_index) {
+			handle_textures((D3DVALUE *) no_index, tex_stage);
+		    } else {
+			D3DVALUE *tex_coord =
+			    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[tex_index].lpvData) + 
+					  i * lpD3DDrawPrimStrideData->textureCoords[tex_index].dwStride);
+			handle_textures(tex_coord, tex_stage);
+		    }
 		}
-	    }
-	    
-	    if ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZ) {
-	        D3DVALUE *position =
-		  (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
-		handle_xyz(position);
-	    } else if ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZRHW) {
-	        D3DVALUE *position =
-		  (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
-		handle_xyzrhw(position);
-	    }
-
-	    if (TRACE_ON(ddraw_geom)) {
-	        int tex_index;
-
+		
 		if ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZ) {
 		    D3DVALUE *position =
-		      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
-		    TRACE_(ddraw_geom)(" %f %f %f", position[0], position[1], position[2]);
+			(D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
+		    handle_xyz(position);
 		} else if ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZRHW) {
 		    D3DVALUE *position =
-		      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
-		    TRACE_(ddraw_geom)(" %f %f %f %f", position[0], position[1], position[2], position[3]);
-		}
-	        if (d3dvtVertexType & D3DFVF_NORMAL) { 
-		    D3DVALUE *normal = 
-		      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->normal.lpvData) + i * lpD3DDrawPrimStrideData->normal.dwStride);	    
-		    TRACE_(ddraw_geom)(" / %f %f %f", normal[0], normal[1], normal[2]);
-		}
-		if (d3dvtVertexType & D3DFVF_DIFFUSE) {
-		    DWORD *color_d = 
-		      (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
-		    TRACE_(ddraw_geom)(" / %02lx %02lx %02lx %02lx",
-				       (*color_d >> 16) & 0xFF,
-				       (*color_d >>  8) & 0xFF,
-				       (*color_d >>  0) & 0xFF,
-				       (*color_d >> 24) & 0xFF);
+			(D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
+		    handle_xyzrhw(position);
 		}
-	        if (d3dvtVertexType & D3DFVF_SPECULAR) { 
-		    DWORD *color_s = 
-		      (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
-		    TRACE_(ddraw_geom)(" / %02lx %02lx %02lx %02lx",
-				       (*color_s >> 16) & 0xFF,
-				       (*color_s >>  8) & 0xFF,
-				       (*color_s >>  0) & 0xFF,
-				       (*color_s >> 24) & 0xFF);
-		}
-		for (tex_index = 0; tex_index < ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT); tex_index++) {
-                    D3DVALUE *tex_coord =
-		      (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[tex_index].lpvData) + 
-				    i * lpD3DDrawPrimStrideData->textureCoords[tex_index].dwStride);
-		    TRACE_(ddraw_geom)(" / %f %f", tex_coord[0], tex_coord[1]);
+		
+		if (TRACE_ON(ddraw_geom)) {
+		    int tex_index;
+		    
+		    if ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZ) {
+			D3DVALUE *position =
+			    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
+			TRACE_(ddraw_geom)(" %f %f %f", position[0], position[1], position[2]);
+		    } else if ((d3dvtVertexType & D3DFVF_POSITION_MASK) == D3DFVF_XYZRHW) {
+			D3DVALUE *position =
+			    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->position.lpvData) + i * lpD3DDrawPrimStrideData->position.dwStride);
+			TRACE_(ddraw_geom)(" %f %f %f %f", position[0], position[1], position[2], position[3]);
+		    }
+		    if (d3dvtVertexType & D3DFVF_NORMAL) { 
+			D3DVALUE *normal = 
+			    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->normal.lpvData) + i * lpD3DDrawPrimStrideData->normal.dwStride);	    
+			TRACE_(ddraw_geom)(" / %f %f %f", normal[0], normal[1], normal[2]);
+		    }
+		    if (d3dvtVertexType & D3DFVF_DIFFUSE) {
+			DWORD *color_d = 
+			    (DWORD *) (((char *) lpD3DDrawPrimStrideData->diffuse.lpvData) + i * lpD3DDrawPrimStrideData->diffuse.dwStride);
+			TRACE_(ddraw_geom)(" / %02lx %02lx %02lx %02lx",
+					   (*color_d >> 16) & 0xFF,
+					   (*color_d >>  8) & 0xFF,
+					   (*color_d >>  0) & 0xFF,
+					   (*color_d >> 24) & 0xFF);
+		    }
+		    if (d3dvtVertexType & D3DFVF_SPECULAR) { 
+			DWORD *color_s = 
+			    (DWORD *) (((char *) lpD3DDrawPrimStrideData->specular.lpvData) + i * lpD3DDrawPrimStrideData->specular.dwStride);
+			TRACE_(ddraw_geom)(" / %02lx %02lx %02lx %02lx",
+					   (*color_s >> 16) & 0xFF,
+					   (*color_s >>  8) & 0xFF,
+					   (*color_s >>  0) & 0xFF,
+					   (*color_s >> 24) & 0xFF);
+		    }
+		    for (tex_index = 0; tex_index < ((d3dvtVertexType & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT); tex_index++) {
+			D3DVALUE *tex_coord =
+			    (D3DVALUE *) (((char *) lpD3DDrawPrimStrideData->textureCoords[tex_index].lpvData) + 
+					  i * lpD3DDrawPrimStrideData->textureCoords[tex_index].dwStride);
+			TRACE_(ddraw_geom)(" / %f %f", tex_coord[0], tex_coord[1]);
+		    }
+		    TRACE_(ddraw_geom)("\n");
 		}
-		TRACE_(ddraw_geom)("\n");
 	    }
+	} else {
+	    ERR(" matrix weighting not handled yet....\n");
 	}
-    } else {
-        ERR(" matrix weighting not handled yet....\n");
+	
+	glEnd();
     }
-    
-    glEnd();
 
     /* Whatever the case, disable the color material stuff */
     glDisable(GL_COLOR_MATERIAL);
@@ -4203,6 +4259,7 @@
 	    /* We query the ARB version to be the most portable we can... */
 	    GL_extensions.glActiveTexture = pglXGetProcAddressARB("glActiveTextureARB");
 	    GL_extensions.glMultiTexCoord2fv = pglXGetProcAddressARB("glMultiTexCoord2fv");
+	    GL_extensions.glClientActiveTexture = pglXGetProcAddressARB("glClientActiveTextureARB");
 	}
     }
     
--- dlls/ddraw_CVS/gl_api.h	Fri Oct  3 17:10:21 2003
+++ dlls/ddraw/gl_api.h	Sat Nov 22 19:22:07 2003
@@ -40,6 +40,7 @@
 GL_API_FUNCTION(glColor4ub)
 GL_API_FUNCTION(glColorMask)
 GL_API_FUNCTION(glColorMaterial)
+GL_API_FUNCTION(glColorPointer)
 GL_API_FUNCTION(glCopyPixels)
 GL_API_FUNCTION(glCopyTexSubImage2D)
 GL_API_FUNCTION(glCullFace)
@@ -48,9 +49,13 @@
 GL_API_FUNCTION(glDepthMask)
 GL_API_FUNCTION(glDepthRange)
 GL_API_FUNCTION(glDisable)
+GL_API_FUNCTION(glDisableClientState)
+GL_API_FUNCTION(glDrawArrays)
 GL_API_FUNCTION(glDrawBuffer)
+GL_API_FUNCTION(glDrawElements)
 GL_API_FUNCTION(glDrawPixels)
 GL_API_FUNCTION(glEnable)
+GL_API_FUNCTION(glEnableClientState)
 GL_API_FUNCTION(glEnd)
 GL_API_FUNCTION(glFlush)
 GL_API_FUNCTION(glFogf)
@@ -77,6 +82,7 @@
 GL_API_FUNCTION(glMultMatrixf)
 GL_API_FUNCTION(glNormal3f)
 GL_API_FUNCTION(glNormal3fv)
+GL_API_FUNCTION(glNormalPointer)
 GL_API_FUNCTION(glOrtho)
 GL_API_FUNCTION(glPixelStorei)
 GL_API_FUNCTION(glPolygonMode)
@@ -94,6 +100,7 @@
 GL_API_FUNCTION(glStencilOp)
 GL_API_FUNCTION(glTexCoord2f)
 GL_API_FUNCTION(glTexCoord2fv)
+GL_API_FUNCTION(glTexCoordPointer)
 GL_API_FUNCTION(glTexEnvf)
 GL_API_FUNCTION(glTexEnvfv)
 GL_API_FUNCTION(glTexEnvi)
@@ -106,6 +113,7 @@
 GL_API_FUNCTION(glVertex3f)
 GL_API_FUNCTION(glVertex3fv)
 GL_API_FUNCTION(glVertex4f)
+GL_API_FUNCTION(glVertexPointer)
 GL_API_FUNCTION(glViewport)
 GL_API_FUNCTION(glXCreateContext)
 GL_API_FUNCTION(glXDestroyContext)
--- dlls/ddraw_CVS/gl_private.h	Fri Oct  3 17:10:21 2003
+++ dlls/ddraw/gl_private.h	Sat Nov 22 19:23:52 2003
@@ -82,6 +82,7 @@
 #define glColor3ub pglColor3ub
 #define glColor4ub pglColor4ub
 #define glColorMask pglColorMask
+#define glColorPointer pglColorPointer
 #define glCopyPixels pglCopyPixels
 #define glCopyTexSubImage2D pglCopyTexSubImage2D
 #define glColorMaterial pglColorMaterial
@@ -91,9 +92,13 @@
 #define glDepthMask pglDepthMask
 #define glDepthRange pglDepthRange
 #define glDisable pglDisable
+#define glDisableClientState pglDisableClientState
+#define glDrawArrays pglDrawArrays
 #define glDrawBuffer pglDrawBuffer
+#define glDrawElements pglDrawElements
 #define glDrawPixels pglDrawPixels
 #define glEnable pglEnable
+#define glEnableClientState pglEnableClientState
 #define glEnd pglEnd
 #define glFlush pglFlush
 #define glFogf pglFogf
@@ -120,6 +125,7 @@
 #define glMultMatrixf pglMultMatrixf
 #define glNormal3f pglNormal3f
 #define glNormal3fv pglNormal3fv
+#define glNormalPointer pglNormalPointer
 #define glOrtho pglOrtho
 #define glPixelStorei pglPixelStorei
 #define glPolygonMode pglPolygonMode
@@ -137,6 +143,7 @@
 #define glStencilOp pglStencilOp
 #define glTexCoord2f pglTexCoord2f
 #define glTexCoord2fv pglTexCoord2fv
+#define glTexCoordPointer pglTexCoordPointer
 #define glTexEnvf pglTexEnvf
 #define glTexEnvfv pglTexEnvfv
 #define glTexEnvi pglTexEnvi
@@ -149,6 +156,7 @@
 #define glVertex3f pglVertex3f
 #define glVertex3fv pglVertex3fv
 #define glVertex4f pglVertex4f
+#define glVertexPointer pglVertexPointer
 #define glViewport pglViewport
 #define glXCreateContext pglXCreateContext
 #define glXDestroyContext pglXDestroyContext
--- dlls/ddraw_CVS/mesa_private.h	Mon Nov 10 19:42:20 2003
+++ dlls/ddraw/mesa_private.h	Sat Nov 22 18:01:20 2003
@@ -174,6 +174,7 @@
     GLint max_texture_units;
     void (*glActiveTexture)(GLenum texture);
     void (*glMultiTexCoord2fv)(GLenum target, const GLfloat *v);
+    void (*glClientActiveTexture)(GLenum texture);
 } GL_EXTENSIONS_LIST; 
 extern GL_EXTENSIONS_LIST GL_extensions;
 


More information about the wine-patches mailing list