Combine texturing for D3D3 and 7 by thunking 3 to 7.

diff --git a/dlls/ddraw/d3ddevice/main.c b/dlls/ddraw/d3ddevice/main.c
index b0cbf68..f140de2 100644
--- a/dlls/ddraw/d3ddevice/main.c
+++ b/dlls/ddraw/d3ddevice/main.c
@@ -453,9 +453,9 @@
 }
 
 HRESULT WINAPI
-Main_IDirect3DDeviceImpl_7_SetTexture(LPDIRECT3DDEVICE7 iface,
-                                      DWORD dwStage,
-                                      LPDIRECTDRAWSURFACE7 lpTexture)
+Main_IDirect3DDeviceImpl_7_3T_SetTexture(LPDIRECT3DDEVICE7 iface,
+					 DWORD dwStage,
+					 LPDIRECTDRAWSURFACE7 lpTexture)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwStage, lpTexture);
@@ -827,16 +827,6 @@
 }
 
 HRESULT WINAPI
-Main_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
-                                      DWORD dwStage,
-                                      LPDIRECT3DTEXTURE2 lpTexture2)
-{
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
-    FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwStage, lpTexture2);
-    return DD_OK;
-}
-
-HRESULT WINAPI
 Main_IDirect3DDeviceImpl_2_SwapTextureHandles(LPDIRECT3DDEVICE2 iface,
                                               LPDIRECT3DTEXTURE2 lpD3DTex1,
                                               LPDIRECT3DTEXTURE2 lpD3DTex2)
@@ -1728,3 +1718,14 @@
                                                lpD3DEnumTextureProc,
                                                lpArg);
 }
+
+HRESULT WINAPI
+Thunk_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
+				       DWORD dwStage,
+				       LPDIRECT3DTEXTURE2 lpTexture2)
+{
+    TRACE("(%p)->(%ld,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, lpTexture2);
+    return IDirect3DDevice7_SetTexture(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
+				       dwStage,
+				       COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture2, IDirectDrawSurface7, lpTexture2));
+}
diff --git a/dlls/ddraw/d3ddevice/main.h b/dlls/ddraw/d3ddevice/main.h
index 3ce3f66..cfd74df 100644
--- a/dlls/ddraw/d3ddevice/main.h
+++ b/dlls/ddraw/d3ddevice/main.h
@@ -206,9 +206,9 @@
                                       LPDIRECTDRAWSURFACE7* lpTexture);
 
 HRESULT WINAPI
-Main_IDirect3DDeviceImpl_7_SetTexture(LPDIRECT3DDEVICE7 iface,
-                                      DWORD dwStage,
-                                      LPDIRECTDRAWSURFACE7 lpTexture);
+Main_IDirect3DDeviceImpl_7_3T_SetTexture(LPDIRECT3DDEVICE7 iface,
+					 DWORD dwStage,
+					 LPDIRECTDRAWSURFACE7 lpTexture);
 
 HRESULT WINAPI
 Main_IDirect3DDeviceImpl_7_3T_GetTextureStageState(LPDIRECT3DDEVICE7 iface,
@@ -366,11 +366,6 @@
                                       LPDIRECT3DTEXTURE2* lplpTexture2);
 
 HRESULT WINAPI
-Main_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
-                                      DWORD dwStage,
-                                      LPDIRECT3DTEXTURE2 lpTexture2);
-
-HRESULT WINAPI
 Main_IDirect3DDeviceImpl_2_SwapTextureHandles(LPDIRECT3DDEVICE2 iface,
                                               LPDIRECT3DTEXTURE2 lpD3DTex1,
                                               LPDIRECT3DTEXTURE2 lpD3DTex2);
@@ -757,3 +752,8 @@
 Thunk_IDirect3DDeviceImpl_1_EnumTextureFormats(LPDIRECT3DDEVICE iface,
                                                LPD3DENUMTEXTUREFORMATSCALLBACK lpD3DEnumTextureProc,
                                                LPVOID lpArg);
+
+HRESULT WINAPI
+Thunk_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
+				       DWORD dwStage,
+				       LPDIRECT3DTEXTURE2 lpTexture2);
diff --git a/dlls/ddraw/d3ddevice/mesa.c b/dlls/ddraw/d3ddevice/mesa.c
index 277485e..4c22a0b 100644
--- a/dlls/ddraw/d3ddevice/mesa.c
+++ b/dlls/ddraw/d3ddevice/mesa.c
@@ -1282,11 +1282,11 @@
 }
 
 HRESULT WINAPI
-GL_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
-				    DWORD dwStage,
-				    LPDIRECT3DTEXTURE2 lpTexture2)
+GL_IDirect3DDeviceImpl_7_3T_SetTexture(LPDIRECT3DDEVICE7 iface,
+				       DWORD dwStage,
+				       LPDIRECTDRAWSURFACE7 lpTexture2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
     
     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwStage, lpTexture2);
     
@@ -1301,11 +1301,11 @@
 	glBindTexture(GL_TEXTURE_2D, 0);
         glDisable(GL_TEXTURE_2D);
     } else {
-        IDirectDrawSurfaceImpl *tex_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, lpTexture2);
+        IDirectDrawSurfaceImpl *tex_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, lpTexture2);
 	IDirect3DTextureGLImpl *tex_glimpl = (IDirect3DTextureGLImpl *) tex_impl->tex_private;
 	
 	This->current_texture[dwStage] = tex_impl;
-	IDirectDrawSurface7_AddRef(ICOM_INTERFACE(tex_impl, IDirectDrawSurface7));
+	IDirectDrawSurface7_AddRef(ICOM_INTERFACE(tex_impl, IDirectDrawSurface7)); /* Not sure about this either */
 
 	TRACE(" activating OpenGL texture %d.\n", tex_glimpl->tex_name);
 	
@@ -1375,7 +1375,7 @@
     XCAST(DrawIndexedPrimitiveVB) Main_IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB,
     XCAST(ComputeSphereVisibility) Main_IDirect3DDeviceImpl_7_3T_ComputeSphereVisibility,
     XCAST(GetTexture) Main_IDirect3DDeviceImpl_7_GetTexture,
-    XCAST(SetTexture) Main_IDirect3DDeviceImpl_7_SetTexture,
+    XCAST(SetTexture) GL_IDirect3DDeviceImpl_7_3T_SetTexture,
     XCAST(GetTextureStageState) Main_IDirect3DDeviceImpl_7_3T_GetTextureStageState,
     XCAST(SetTextureStageState) GL_IDirect3DDeviceImpl_7_3T_SetTextureStageState,
     XCAST(ValidateDevice) Main_IDirect3DDeviceImpl_7_3T_ValidateDevice,
@@ -1443,7 +1443,7 @@
     XCAST(DrawIndexedPrimitiveVB) Main_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveVB,
     XCAST(ComputeSphereVisibility) Thunk_IDirect3DDeviceImpl_3_ComputeSphereVisibility,
     XCAST(GetTexture) Main_IDirect3DDeviceImpl_3_GetTexture,
-    XCAST(SetTexture) GL_IDirect3DDeviceImpl_3_SetTexture,
+    XCAST(SetTexture) Thunk_IDirect3DDeviceImpl_3_SetTexture,
     XCAST(GetTextureStageState) Thunk_IDirect3DDeviceImpl_3_GetTextureStageState,
     XCAST(SetTextureStageState) Thunk_IDirect3DDeviceImpl_3_SetTextureStageState,
     XCAST(ValidateDevice) Thunk_IDirect3DDeviceImpl_3_ValidateDevice,