Resubmit D3D8 Surface -> WineD3D

Roderick Colenbrander thunderbird2k at gmx.net
Tue Feb 14 04:30:15 CST 2006


Hi,

This is a resubmit of my d3d8 surface patches (based on Oliver Stieber his 
work). The previous set of patches were cut in pieces while this (slightly 
changed version) is one incremental patch. It moves the d3d8 surface 
structure over to wined3d. As moving all code over in one step to wined3d is 
not a good idea the old d3d8 code had to be made compatible with the new 
structure. This change required me to import some structures from the 
wined3d_private.h header untill the move is over (the wined3d header can't be 
included by d3d8 as it conflicts with d3d8_private.h). Further some pieces of 
surface code were moved over to wined3d.

Regards,
Roderick Colenbrander
-------------- next part --------------
Index: dlls/d3d8/cubetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/cubetexture.c,v
retrieving revision 1.21
diff -u -r1.21 cubetexture.c
--- dlls/d3d8/cubetexture.c	10 Nov 2005 12:14:59 -0000	1.21
+++ dlls/d3d8/cubetexture.c	14 Feb 2006 10:20:28 -0000
@@ -143,27 +143,27 @@
     ENTER_GL();
 
     for (i = 0; i < This->levels; i++) {
-      if (i == 0 && This->surfaces[0][0]->textureName != 0 && This->Dirty == FALSE) {
+      if (i == 0 && D3D8_SURFACE(This->surfaces[0][0])->textureName != 0 && This->Dirty == FALSE) {
 	glEnable(GL_TEXTURE_CUBE_MAP_ARB);
 #if defined(GL_VERSION_1_3)
-	glBindTexture(GL_TEXTURE_CUBE_MAP, This->surfaces[0][0]->textureName);
+	glBindTexture(GL_TEXTURE_CUBE_MAP, D3D8_SURFACE(This->surfaces[0][0])->textureName);
 #else
-        glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, This->surfaces[0][0]->textureName);
+        glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, D3D8_SURFACE(This->surfaces[0][0])->textureName);
 #endif
 	checkGLcall("glBindTexture");
-	TRACE("Texture %p (level %d) given name %d\n", This->surfaces[0][0], i, This->surfaces[0][0]->textureName);
+	TRACE("Texture %p (level %d) given name %d\n", This->surfaces[0][0], i, D3D8_SURFACE(This->surfaces[0][0])->textureName);
 	/* No need to walk through all mip-map levels, since already all assigned */
 	i = This->levels;
       } else {
 	if (i == 0) {
-	  if (This->surfaces[0][0]->textureName == 0) {
-	    glGenTextures(1, &This->surfaces[0][0]->textureName);
+	  if (D3D8_SURFACE(This->surfaces[0][0])->textureName == 0) {
+	    glGenTextures(1, &(D3D8_SURFACE(This->surfaces[0][0]))->textureName);
 	    checkGLcall("glGenTextures");
-	    TRACE("Texture %p (level %d) given name %d\n", This->surfaces[0][i], i, This->surfaces[0][0]->textureName);
+	    TRACE("Texture %p (level %d) given name %d\n", This->surfaces[0][i], i, D3D8_SURFACE(This->surfaces[0][0])->textureName);
 	  }
 
 #if defined(GL_VERSION_1_3)
-	  glBindTexture(GL_TEXTURE_CUBE_MAP, This->surfaces[0][0]->textureName);
+	  glBindTexture(GL_TEXTURE_CUBE_MAP, D3D8_SURFACE(This->surfaces[0][0])->textureName);
 #else
 	  glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, This->surfaces[0][0]->textureName);
 #endif
@@ -275,7 +275,7 @@
     IDirect3DCubeTexture8Impl *This = (IDirect3DCubeTexture8Impl *)iface;
     This->Dirty = TRUE;
     TRACE("(%p) : dirtyfication of faceType(%d) Level (0)\n", This, FaceType);    
-    return IDirect3DSurface8Impl_AddDirtyRect((LPDIRECT3DSURFACE8) This->surfaces[FaceType][0], pDirtyRect);
+    return IWineD3DSurface_AddDirtyRect( (IWineD3DSurface*)(This->surfaces[FaceType][0])->wineD3DSurface, pDirtyRect);
 }
 
 
Index: dlls/d3d8/d3d8_main.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_main.c,v
retrieving revision 1.23
diff -u -r1.23 d3d8_main.c
--- dlls/d3d8/d3d8_main.c	6 Jul 2005 19:08:05 -0000	1.23
+++ dlls/d3d8/d3d8_main.c	14 Feb 2006 10:20:28 -0000
@@ -17,6 +17,7 @@
  */
 
 #include "config.h"
+//#include "initguid.h"
 
 #include <stdarg.h>
 
Index: dlls/d3d8/d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.69
diff -u -r1.69 d3d8_private.h
--- dlls/d3d8/d3d8_private.h	3 Nov 2005 09:54:31 -0000	1.69
+++ dlls/d3d8/d3d8_private.h	14 Feb 2006 10:20:29 -0000
@@ -64,8 +64,13 @@
 
 #include <stdarg.h>
 
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#define COBJMACROS
 #include "windef.h"
 #include "winbase.h"
+#include "wingdi.h"
+#include "wine/debug.h"
 #include "d3d8.h"
 #include "wine/wined3d_interface.h"
 
@@ -674,6 +679,92 @@
 extern HRESULT WINAPI IDirect3DSwapChain8Impl_Present(LPDIRECT3DSWAPCHAIN8 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion);
 extern HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer);
 
+/* Below follow the definitions of some WineD3D structures which are needed during the D3D8->WineD3D transition. */
+typedef struct IWineD3DSurfaceImpl    IWineD3DSurfaceImpl;
+typedef struct PrivateData
+{
+    struct PrivateData* next;
+
+    GUID tag;
+    DWORD flags; /* DDSPD_* */
+    DWORD uniqueness_value;
+
+    union
+    {
+        LPVOID data;
+        LPUNKNOWN object;
+    } ptr;
+
+    DWORD size;
+} PrivateData;
+
+typedef struct IWineD3DResourceClass
+{
+    /* IUnknown fields */
+    LONG                    ref;     /* Note: Ref counting not required */
+
+    /* WineD3DResource Information */
+    IUnknown               *parent;
+    D3DRESOURCETYPE         resourceType;
+    void                   *wineD3DDevice;
+    D3DPOOL                 pool;
+    UINT                    size;
+    DWORD                   usage;
+    WINED3DFORMAT           format;
+    BYTE                   *allocatedMemory;
+    PrivateData            *privateData;
+
+} IWineD3DResourceClass;
+
+typedef struct _WINED3DSURFACET_DESC
+{
+    D3DMULTISAMPLE_TYPE MultiSampleType;
+    DWORD               MultiSampleQuality;
+    UINT                Width;
+    UINT                Height;
+} WINED3DSURFACET_DESC;
+
+struct IWineD3DSurfaceImpl
+{
+    /* IUnknown & IWineD3DResource Information     */
+    const IWineD3DSurfaceVtbl *lpVtbl;
+    IWineD3DResourceClass     resource;
+
+    /* IWineD3DSurface fields */
+    IUnknown                 *container;
+    WINED3DSURFACET_DESC      currentDesc;
+
+    UINT                      textureName;
+    UINT                      bytesPerPixel;
+
+    /* TODO: move this off into a management class(maybe!) */
+    BOOL                      nonpow2;
+
+    UINT                      pow2Width;
+    UINT                      pow2Height;
+    UINT                      pow2Size;
+
+#if 0
+    /* precalculated x and y scalings for texture coords */
+    float                     pow2scalingFactorX; /* =  (Width  / pow2Width ) */
+    float                     pow2scalingFactorY; /* =  (Height / pow2Height) */
+#endif
+
+    BOOL                      lockable;
+    BOOL                      discard;
+    BOOL                      locked;
+    BOOL                      activeLock;
+    
+    RECT                      lockedRect;
+    RECT                      dirtyRect;
+    BOOL                      Dirty;
+    
+    BOOL                      inTexture;
+    BOOL                      inPBuffer;
+
+    glDescriptor              glDescription;
+};
+
 
 /* ----------------- */
 /* IDirect3DSurface8 */
@@ -691,28 +782,12 @@
 {
     /* IUnknown fields */
     const IDirect3DSurface8Vtbl *lpVtbl;
-    LONG                   ref;
+    LONG                         ref;
 
     /* IDirect3DSurface8 fields */
-    IDirect3DDevice8Impl   *Device;
-    D3DRESOURCETYPE         ResourceType;
-
-    IUnknown               *Container;
-    D3DSURFACE_DESC         myDesc;
-    BYTE                   *allocatedMemory;
-    UINT                    textureName;
-    UINT                    bytesPerPixel;
-
-    BOOL                    lockable;
-    BOOL                    locked;
-    RECT                    lockedRect;
-    RECT                    dirtyRect;
-    BOOL                    Dirty;
-    BOOL                    inTexture;
-    BOOL                    inPBuffer;
-
-    IWineD3DSurface        *wineD3DSurface;
+    IWineD3DSurface             *wineD3DSurface;
 };
+#define D3D8_SURFACE(a) ((IWineD3DSurfaceImpl*)(a->wineD3DSurface))
 
 /* IUnknown: */
 extern HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 iface,REFIID refiid,LPVOID *obj);
Index: dlls/d3d8/device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.140
diff -u -r1.140 device.c
--- dlls/d3d8/device.c	7 Feb 2006 16:02:19 -0000	1.140
+++ dlls/d3d8/device.c	14 Feb 2006 10:20:30 -0000
@@ -304,6 +304,45 @@
     return ref;
 }
 
+/* The function below is needed during the D3D8->WineD3D transition
+   in order to release various surfaces like the front- and backBuffer.
+   When the transition is complete code similar to this will be executed
+   by IWineD3DDevice_Release.
+*/
+void IDirect3DDevice8_CleanUp(IDirect3DDevice8Impl *This)
+{
+    LPDIRECT3DSURFACE8 stencilBufferParent;
+    /* Release the buffers (with sanity checks)*/
+    if(This->stencilBufferTarget != NULL && (IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8)This->stencilBufferTarget) >0)){
+        if(This->depthStencilBuffer != This->stencilBufferTarget)
+        TRACE("(%p) Something's still holding the depthStencilBuffer\n",This);
+    }
+    This->stencilBufferTarget = NULL;
+
+    if(This->renderTarget != NULL) {
+        IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8)This->renderTarget);
+        This->renderTarget = NULL;
+    }
+
+    if(This->depthStencilBuffer != NULL) {
+        stencilBufferParent = (LPDIRECT3DSURFACE8)D3D8_SURFACE(This->depthStencilBuffer)->resource.parent;
+        if(stencilBufferParent != NULL) {
+            IDirect3DSurface8_Release(stencilBufferParent);
+            This->depthStencilBuffer = NULL;
+        }
+    }
+
+    if(This->backBuffer != NULL) {
+        IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8)This->backBuffer);
+        This->backBuffer = NULL;
+    }
+
+    if(This->frontBuffer != NULL) {
+        IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8)This->frontBuffer);
+        This->frontBuffer = NULL;
+    }
+}
+
 ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) {
     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
@@ -313,8 +352,8 @@
     if (ref == 0) {
         IDirect3DDevice8Impl_CleanRender(iface);
         IDirect3D8_Release((LPDIRECT3D8) This->direct3d8);
+	IDirect3DDevice8_CleanUp(This);
         IWineD3DDevice_Release(This->WineD3DDevice);
-
         if (glXGetCurrentContext() == This->glCtx) {
             glXMakeCurrent(This->display, None, NULL);
         }
@@ -401,11 +440,11 @@
     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
     TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot);
 
-    if (D3DFMT_A8R8G8B8 != pSur->myDesc.Format) {
+    if (D3DFMT_A8R8G8B8 != D3D8_SURFACE(pSur)->resource.format) {
       ERR("(%p) : surface(%p) has an invalid format\n", This, pCursorBitmap);
       return D3DERR_INVALIDCALL;
     }
-    if (32 != pSur->myDesc.Height || 32 != pSur->myDesc.Width) {
+    if (32 != D3D8_SURFACE(pSur)->currentDesc.Height || 32 != D3D8_SURFACE(pSur)->currentDesc.Width) {
       ERR("(%p) : surface(%p) has an invalid size\n", This, pCursorBitmap);
       return D3DERR_INVALIDCALL;
     }
@@ -655,18 +694,18 @@
     for (i = 0; i < object->levels; i++) 
     {
         IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]);
-        object->surfaces[i]->Container = (IUnknown*) object;
-        object->surfaces[i]->myDesc.Usage = Usage;
-        object->surfaces[i]->myDesc.Pool = Pool;
+        D3D8_SURFACE(object->surfaces[i])->container = (IUnknown*) object;
+        D3D8_SURFACE(object->surfaces[i])->resource.usage = Usage;
+        D3D8_SURFACE(object->surfaces[i])->resource.pool = Pool;
 	/** 
 	 * As written in msdn in IDirect3DTexture8::LockRect
 	 *  Textures created in D3DPOOL_DEFAULT are not lockable.
 	 */
 	if (D3DPOOL_DEFAULT == Pool) {
-	  object->surfaces[i]->lockable = FALSE;
+	  D3D8_SURFACE(object->surfaces[i])->lockable = FALSE;
 	}
 
-        TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[i], object->surfaces[i]->allocatedMemory);
+        TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[i], D3D8_SURFACE(object->surfaces[i])->resource.allocatedMemory);
         tmpW = max(1, tmpW / 2);
         tmpH = max(1, tmpH / 2);
     }
@@ -805,22 +844,21 @@
         /* Create the 6 faces */
         for (j = 0; j < 6; j++) {
            IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
-           object->surfaces[j][i]->Container = (IUnknown*) object;
-           object->surfaces[j][i]->myDesc.Usage = Usage;
-           object->surfaces[j][i]->myDesc.Pool = Pool;
+           D3D8_SURFACE(object->surfaces[j][i])->container = (IUnknown*) object;
+           D3D8_SURFACE(object->surfaces[j][i])->resource.usage = Usage;
+           D3D8_SURFACE(object->surfaces[j][i])->resource.pool = Pool;
 	   /** 
 	    * As written in msdn in IDirect3DCubeTexture8::LockRect
 	    *  Textures created in D3DPOOL_DEFAULT are not lockable.
 	    */
 	   if (D3DPOOL_DEFAULT == Pool) {
-	     object->surfaces[j][i]->lockable = FALSE;
+	     D3D8_SURFACE(object->surfaces[j][i])->lockable = FALSE;
 	   }
 
-           TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[j][i], object->surfaces[j][i]->allocatedMemory);
+           TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[j][i], D3D8_SURFACE(object->surfaces[j][i])->resource.allocatedMemory);
         }
         tmpW = max(1, tmpW / 2);
     }
-
     TRACE("(%p) : Iface@%p\n", This, object);
     *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8) object;
     return D3D_OK;
@@ -875,233 +913,81 @@
 
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) {
+
+HRESULT  WINAPI IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface,D3DRESOURCETYPE Type, UINT Usage,D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality)  {
+    HRESULT hrc;
     IDirect3DSurface8Impl *object;
-    IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
-    
-    object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
-    if (NULL == object) {
-      *ppSurface = NULL;
-      return D3DERR_OUTOFVIDEOMEMORY;
+    IDirect3DDevice8Impl  *This = (IDirect3DDevice8Impl *)iface;
+    TRACE("(%p) Relay\n", This);
+    if(MultisampleQuality < 0) { 
+        FIXME("MultisampleQuality out of range %ld, substituting 0 \n", MultisampleQuality);
+        /*FIXME: Find out what windows does with a MultisampleQuality < 0 */
+        MultisampleQuality=0;
     }
-    *ppSurface = (LPDIRECT3DSURFACE8) object;
-    object->lpVtbl = &Direct3DSurface8_Vtbl;
-    object->Device = This;
-    object->ResourceType = D3DRTYPE_SURFACE;
-    object->Container = (IUnknown*) This;
 
-    object->ref = 1;
-    object->myDesc.Width  = Width;
-    object->myDesc.Height = Height;
-    object->myDesc.Format = Format;
-    object->myDesc.Type = D3DRTYPE_SURFACE;
-    object->myDesc.Usage = D3DUSAGE_RENDERTARGET;
-    object->myDesc.Pool = D3DPOOL_DEFAULT;
-    object->myDesc.MultiSampleType = MultiSample;
-    object->bytesPerPixel = D3DFmtGetBpp(This, Format);
-    if (Format == D3DFMT_DXT1) { 
-        object->myDesc.Size = (Width * object->bytesPerPixel)/2 * Height;  /* DXT1 is half byte per pixel */
-    } else {
-        object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
+    if(MultisampleQuality > 0){
+        FIXME("MultisampleQuality set to %ld, bstituting 0  \n" , MultisampleQuality);
+        /*
+        MultisampleQuality
+        [in] Quality level. The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D8::CheckDeviceMultiSampleType. Passing a larger value returns the error D3DERR_INVALIDCALL. The MultisampleQuality values of paired render targets, depth stencil surfaces, and the MultiSample type must all match.
+        */
+        MultisampleQuality=0;
     }
-    object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
-    object->lockable = Lockable;
-    object->locked = FALSE;
-    memset(&object->lockedRect, 0, sizeof(RECT));
-    IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object);
+    /*FIXME: Check MAX bounds of MultisampleQuality*/
 
-    TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), Lockable, *ppSurface, object->allocatedMemory, object->myDesc.Size);
-    return D3D_OK;
-}
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) {
-    IDirect3DSurface8Impl *object;
-
-    IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
-
-    object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+    /* Allocate the storage for the device */
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
     if (NULL == object) {
-      *ppSurface = NULL;
-      return D3DERR_OUTOFVIDEOMEMORY;
+        FIXME("Allocation of memory failed\n");
+        *ppSurface = NULL;
+        return D3DERR_OUTOFVIDEOMEMORY;
     }
-    *ppSurface = (LPDIRECT3DSURFACE8) object;
-    object->lpVtbl = &Direct3DSurface8_Vtbl;
-    object->Device = This;
-    object->ResourceType = D3DRTYPE_SURFACE;
-    object->Container = (IUnknown*) This;
 
+    object->lpVtbl = &Direct3DSurface8_Vtbl;
     object->ref = 1;
-    object->myDesc.Width  = Width;
-    object->myDesc.Height = Height;
-    object->myDesc.Format = Format;
-    object->myDesc.Type = D3DRTYPE_SURFACE;
-    object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL;
-    object->myDesc.Pool = D3DPOOL_DEFAULT;
-    object->myDesc.MultiSampleType = MultiSample;
-    object->bytesPerPixel = D3DFmtGetBpp(This, Format);
-    if (Format == D3DFMT_DXT1) { 
-        object->myDesc.Size = (Width * object->bytesPerPixel)/2 * Height; /* DXT1 is half byte per pixel */
+
+    TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
+
+    hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, Format, Lockable, Discard, Level,  &object->wineD3DSurface, Type, Usage, Pool,MultiSample,MultisampleQuality, NULL,(IUnknown *)object);
+    if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
+       /* free up object */
+        FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This);
+        HeapFree(GetProcessHeap(), 0, object);
+        *ppSurface = NULL;
     } else {
-        object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
+        *ppSurface = (LPDIRECT3DSURFACE8) object;
     }
-    object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
-    object->lockable = (D3DFMT_D16_LOCKABLE == Format) ? TRUE : FALSE;
-    object->locked = FALSE;
-    memset(&object->lockedRect, 0, sizeof(RECT));
-    IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object);
+    return hrc;
+}
 
-    TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size);
-    return D3D_OK;
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) {
+    TRACE("Relay\n");
+
+    return IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0);
+}
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) {
+    TRACE("Relay\n");
+    /* TODO: Verify that Discard is false */
+    return IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE, 0 /* Level */
+                                               ,ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_DEPTHSTENCIL,
+                                                D3DPOOL_DEFAULT, MultiSample, 0);
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) {
-    IDirect3DSurface8Impl *object;
 
-    IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) {
+    TRACE("Relay\n");
 
-    object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
-    *ppSurface = (LPDIRECT3DSURFACE8) object;
-    object->lpVtbl = &Direct3DSurface8_Vtbl;
-    object->Device = This;
-    object->ResourceType = D3DRTYPE_SURFACE;
-    object->Container = (IUnknown*) This;
+    return IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Loackable */ , FALSE /*Discard*/ , 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, 0 /* Usage (undefined/none) */ , D3DPOOL_SCRATCH, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
+}
 
-    object->ref = 1;
-    object->myDesc.Width  = Width;
-    object->myDesc.Height = Height;
-    object->myDesc.Format = Format;
-    object->myDesc.Type = D3DRTYPE_SURFACE;
-    object->myDesc.Usage = 0;
-    object->myDesc.Pool = D3DPOOL_SYSTEMMEM;
-    object->bytesPerPixel = D3DFmtGetBpp(This, Format);
-    /* DXTn mipmaps use the same number of 'levels' down to eg. 8x1, but since
-       it is based around 4x4 pixel blocks it requires padding, so allocate enough
-       space!                                                                      */
-    if (Format == D3DFMT_DXT1) { 
-        object->myDesc.Size = ((max(Width,4) * object->bytesPerPixel) * max(Height,4)) / 2; /* DXT1 is half byte per pixel */
-    } else if (Format == D3DFMT_DXT2 || Format == D3DFMT_DXT3 || 
-               Format == D3DFMT_DXT4 || Format == D3DFMT_DXT5) { 
-        object->myDesc.Size = ((max(Width,4) * object->bytesPerPixel) * max(Height,4));
-    } else {
-        object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
-    }
-    object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
-    object->lockable = TRUE;
-    object->locked = FALSE;
-    memset(&object->lockedRect, 0, sizeof(RECT));
-    IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object);
-
-    TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size);
-    return D3D_OK;
-}
-HRESULT  WINAPI  IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, 
-                                                IDirect3DSurface8* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects,
-                                                IDirect3DSurface8* pDestinationSurface, CONST POINT* pDestPointsArray) {
-
-    HRESULT rc = D3D_OK;
-    IDirect3DBaseTexture8* texture = NULL;
-
-
-    IDirect3DSurface8Impl* src = (IDirect3DSurface8Impl*) pSourceSurface;
-    IDirect3DSurface8Impl* dst = (IDirect3DSurface8Impl*) pDestinationSurface;
-
-    IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
-    TRACE("(%p) pSrcSur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", This,
-          pSourceSurface, pSourceRectsArray, cRects, pDestinationSurface, pDestPointsArray);
-
-    /* Note: Not sure about the d3dfmt_unknown bit, but seems to avoid a problem inside
-         a sample and doesn't seem to break anything as far as I can tell               */
-    if (src->myDesc.Format != dst->myDesc.Format && (dst->myDesc.Format != D3DFMT_UNKNOWN)) {
-        TRACE("Formats do not match (%x,%s) / (%x,%s)\n", 
-               src->myDesc.Format, debug_d3dformat(src->myDesc.Format), 
-               dst->myDesc.Format, debug_d3dformat(dst->myDesc.Format));
-        rc = D3DERR_INVALIDCALL;
-
-    } else if (dst->myDesc.Format == D3DFMT_UNKNOWN) {
-        TRACE("Converting dest to same format as source, since dest was unknown\n");
-        dst->myDesc.Format = src->myDesc.Format;
-
-        /* Convert container as well */
-        rc = IDirect3DSurface8Impl_GetContainer((LPDIRECT3DSURFACE8) dst, &IID_IDirect3DBaseTexture8, (void**) &texture); /* FIXME: Which refid? */
-        if (SUCCEEDED(rc) && NULL != texture) {
-            ((IDirect3DBaseTexture8Impl*) texture)->format = src->myDesc.Format;
-	    /** Releasing texture after GetContainer */
-	    IDirect3DBaseTexture8_Release(texture);
-	    texture = NULL;
-        }
-    }
-
-    /* Quick if complete copy ... */
-    if (SUCCEEDED(rc)) {
-      if (cRects == 0 && pSourceRectsArray == NULL && pDestPointsArray == NULL) {
-
-	if (src->myDesc.Width == dst->myDesc.Width && src->myDesc.Height == dst->myDesc.Height) {
-	  
-	  D3DLOCKED_RECT lrSrc;
-	  D3DLOCKED_RECT lrDst;
-	  IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) src, &lrSrc, NULL, D3DLOCK_READONLY);
-	  IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, NULL, 0L);
-	  TRACE("Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d\n", dst->myDesc.Width, dst->myDesc.Height);
-	  
-	  memcpy(lrDst.pBits, lrSrc.pBits, src->myDesc.Size);
-	  
-	  IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src);
-	  rc = IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst);
-	  TRACE("Unlocked src and dst\n");
-	  
-	} else {
-	  
-	  FIXME("Wanted to copy all surfaces but size not compatible\n");
-	  rc = D3DERR_INVALIDCALL;
-	  
-	}
+HRESULT  WINAPI  IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8 *pSourceSurface, CONST RECT *pSourceRects, UINT cRects, IDirect3DSurface8 *pDestinationSurface, CONST POINT *pDestPoints) {
+    IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
 
-      } else {
-	
-	if (NULL != pSourceRectsArray && NULL != pDestPointsArray) {
-
-	  int bytesPerPixel = ((IDirect3DSurface8Impl*) pSourceSurface)->bytesPerPixel;
-	  unsigned int i;
-
-	  /* Copy rect by rect */
-	  for (i = 0; i < cRects; i++) {
-            CONST RECT*  r = &pSourceRectsArray[i];
-            CONST POINT* p = &pDestPointsArray[i];
-            int copyperline;
-            int j;
-            D3DLOCKED_RECT lrSrc;
-            D3DLOCKED_RECT lrDst;
-            RECT dest_rect;
- 
-            TRACE("Copying rect %d (%ld,%ld),(%ld,%ld) -> (%ld,%ld)\n", i, r->left, r->top, r->right, r->bottom, p->x, p->y);
-            if (src->myDesc.Format == D3DFMT_DXT1) { 
-	      copyperline = ((r->right - r->left) * bytesPerPixel)/2; /* DXT1 is half byte per pixel */
-            } else {
-                copyperline = ((r->right - r->left) * bytesPerPixel);
-            }
-            IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) src, &lrSrc, r, D3DLOCK_READONLY);
-            dest_rect.left  = p->x;
-            dest_rect.top   = p->y;
-            dest_rect.right = p->x + (r->right - r->left);
-            dest_rect.bottom= p->y + (r->bottom - r->top);
-            IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, &dest_rect, 0L);
-            TRACE("Locked src and dst\n");
-
-            /* Find where to start */
-            for (j = 0; j < (r->bottom - r->top - 1); j++) {
-	      memcpy((char*) lrDst.pBits + (j * lrDst.Pitch), (char*) lrSrc.pBits + (j * lrSrc.Pitch), copyperline);
-            }
-            IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src);
-            rc = IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst);
-            TRACE("Unlocked src and dst\n");
-	  }
-	} else {
-	  FIXME("Wanted to copy partial surfaces not implemented\n");
-	  rc = D3DERR_INVALIDCALL;		  
-	}
-      }
-    }
+    TRACE("(%p) Relay\n" , This);
 
-    return rc;
+    return IWineD3DDevice_CopyRects(This->WineD3DDevice, pSourceSurface == NULL ? NULL : ((IDirect3DSurface8Impl *)pSourceSurface)->wineD3DSurface,
+            pSourceRects, cRects, pDestinationSurface == NULL ? NULL : ((IDirect3DSurface8Impl *)pDestinationSurface)->wineD3DSurface, pDestPoints);
 }
+
 HRESULT  WINAPI  IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture, IDirect3DBaseTexture8* pDestinationTexture) {
     IDirect3DBaseTexture8Impl* src = (IDirect3DBaseTexture8Impl*) pSourceTexture;
     IDirect3DBaseTexture8Impl* dst = (IDirect3DBaseTexture8Impl*) pDestinationTexture;
@@ -1189,7 +1075,7 @@
 
     FIXME("(%p) : Should return whole screen, only returns GL context window in top left corner\n", This);
 
-    if (D3DFMT_A8R8G8B8 != ((IDirect3DSurface8Impl*) pDestSurface)->myDesc.Format) {
+    if (D3DFMT_A8R8G8B8 != D3D8_SURFACE(((IDirect3DSurface8Impl*)pDestSurface))->resource.format) {
       ERR("(%p) : surface(%p) has an invalid format\n", This, pDestSurface);
       return D3DERR_INVALIDCALL;
     }
@@ -1263,8 +1149,8 @@
 
     if (SUCCEEDED(hr)) {
 	/* Finally, reset the viewport as the MSDN states. */
-	viewport.Height = ((IDirect3DSurface8Impl*)pRenderTarget)->myDesc.Height;
-	viewport.Width  = ((IDirect3DSurface8Impl*)pRenderTarget)->myDesc.Width;
+	viewport.Height = D3D8_SURFACE(((IDirect3DSurface8Impl*)pRenderTarget))->currentDesc.Height;
+	viewport.Width  = D3D8_SURFACE(((IDirect3DSurface8Impl*)pRenderTarget))->currentDesc.Width;
 	viewport.X      = 0;
 	viewport.Y      = 0;
 	viewport.MaxZ   = 1.0f;
@@ -1318,7 +1204,6 @@
     printf("Hit Enter ...\n");
     getchar();
 #endif
-
     if ((This->frontBuffer != This->renderTarget) && (This->backBuffer != This->renderTarget)) {
 #if 0
 	GLenum prev_read;
@@ -1351,11 +1236,11 @@
       hr = IDirect3DSurface8_GetContainer((LPDIRECT3DSURFACE8) This->renderTarget, &IID_IDirect3DBaseTexture8, (void**) &cont);
       if (SUCCEEDED(hr) && NULL != cont) {
 	/** always dirtify for now. we must find a better way to see that surface have been modified */
-	This->renderTarget->inPBuffer = TRUE;
-	This->renderTarget->inTexture = FALSE;
+	D3D8_SURFACE(This->renderTarget)->inPBuffer = TRUE;
+	D3D8_SURFACE(This->renderTarget)->inTexture = FALSE;
       	IDirect3DBaseTexture8Impl_SetDirty(cont, TRUE);
 	IDirect3DBaseTexture8_PreLoad(cont);
-	This->renderTarget->inPBuffer = FALSE;
+	D3D8_SURFACE(This->renderTarget)->inPBuffer = FALSE;
 	IDirect3DBaseTexture8Impl_Release(cont);
 	cont = NULL;
       }
@@ -1429,14 +1314,14 @@
             /* Note gl uses lower left, width/height */
             TRACE("(%p) %p Rect=(%ld,%ld)->(%ld,%ld) glRect=(%ld,%ld), len=%ld, hei=%ld\n", This, curRect,
                   curRect->x1, curRect->y1, curRect->x2, curRect->y2,
-                  curRect->x1, (This->renderTarget->myDesc.Height - curRect->y2), 
+                  curRect->x1, (D3D8_SURFACE(This->renderTarget)->currentDesc.Height - curRect->y2), 
                   curRect->x2 - curRect->x1, curRect->y2 - curRect->y1);
-            glScissor(curRect->x1, (This->renderTarget->myDesc.Height - curRect->y2), 
+            glScissor(curRect->x1, (D3D8_SURFACE(This->renderTarget)->currentDesc.Height - curRect->y2), 
                       curRect->x2 - curRect->x1, curRect->y2 - curRect->y1);
             checkGLcall("glScissor");
         } else {
             glScissor(This->StateBlock->viewport.X, 
-                      (This->renderTarget->myDesc.Height - (This->StateBlock->viewport.Y + This->StateBlock->viewport.Height)), 
+                      (D3D8_SURFACE(This->renderTarget)->currentDesc.Height - (This->StateBlock->viewport.Y + This->StateBlock->viewport.Height)), 
                       This->StateBlock->viewport.Width, 
                       This->StateBlock->viewport.Height);
             checkGLcall("glScissor");
@@ -1662,7 +1547,7 @@
     glDepthRange(pViewport->MinZ, pViewport->MaxZ);
     checkGLcall("glDepthRange");
     /* Note: GL requires lower left, DirectX supplies upper left */
-    glViewport(pViewport->X, (This->renderTarget->myDesc.Height - (pViewport->Y + pViewport->Height)), 
+    glViewport(pViewport->X, (D3D8_SURFACE(This->renderTarget)->currentDesc.Height - (pViewport->Y + pViewport->Height)), 
                pViewport->Width, pViewport->Height);
     checkGLcall("glViewport");
 
@@ -4577,10 +4462,10 @@
   int nCfgs = 0;
   int attribs[256];
   int nAttribs = 0;
-  D3DFORMAT BackBufferFormat = ((IDirect3DSurface8Impl*) RenderSurface)->myDesc.Format;
-  D3DFORMAT StencilBufferFormat = (NULL != StencilSurface) ? ((IDirect3DSurface8Impl*) StencilSurface)->myDesc.Format : 0;
-  UINT Width = ((IDirect3DSurface8Impl*) RenderSurface)->myDesc.Width;
-  UINT Height = ((IDirect3DSurface8Impl*) RenderSurface)->myDesc.Height;
+  D3DFORMAT BackBufferFormat = D3D8_SURFACE(((IDirect3DSurface8Impl*) RenderSurface))->resource.format;
+  D3DFORMAT StencilBufferFormat = (NULL != StencilSurface) ? D3D8_SURFACE(((IDirect3DSurface8Impl*) StencilSurface))->resource.format : 0;
+  UINT Width = D3D8_SURFACE(((IDirect3DSurface8Impl*) RenderSurface))->currentDesc.Width;
+  UINT Height = D3D8_SURFACE(((IDirect3DSurface8Impl*) RenderSurface))->currentDesc.Height;
   IDirect3DSurface8Impl* tmp;
 
   IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
@@ -4727,8 +4612,8 @@
 #endif
     }
 
-    if (BackBufferFormat != This->renderTarget->myDesc.Format && 
-	StencilBufferFormat != This->stencilBufferTarget->myDesc.Format) {
+    if (BackBufferFormat != D3D8_SURFACE(This->renderTarget)->resource.format && 
+	StencilBufferFormat != D3D8_SURFACE(This->stencilBufferTarget)->resource.format) {
       nAttribs = 0;
       PUSH2(GLX_PBUFFER_WIDTH,  Width);
       PUSH2(GLX_PBUFFER_HEIGHT, Height);
Index: dlls/d3d8/resource.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/resource.c,v
retrieving revision 1.12
diff -u -r1.12 resource.c
--- dlls/d3d8/resource.c	27 May 2005 20:17:36 -0000	1.12
+++ dlls/d3d8/resource.c	14 Feb 2006 10:20:30 -0000
@@ -113,15 +113,15 @@
 
     switch (This->ResourceType) { 
     case D3DRTYPE_SURFACE:
-      return ((IDirect3DSurface8Impl*) This)->myDesc.Pool;
+      return D3D8_SURFACE(((IDirect3DSurface8Impl*) This))->resource.pool;
     case D3DRTYPE_TEXTURE:
-      return ((IDirect3DTexture8Impl*) This)->surfaces[0]->myDesc.Pool;
+      return D3D8_SURFACE(((IDirect3DTexture8Impl*) This)->surfaces[0])->resource.pool;
     case D3DRTYPE_VOLUME:
       return ((IDirect3DVolume8Impl*) This)->myDesc.Pool;
     case D3DRTYPE_VOLUMETEXTURE:
       return ((IDirect3DVolumeTexture8Impl*) This)->volumes[0]->myDesc.Pool;
     case D3DRTYPE_CUBETEXTURE:
-      return ((IDirect3DCubeTexture8Impl*) This)->surfaces[0][0]->myDesc.Pool;
+      return D3D8_SURFACE(((IDirect3DCubeTexture8Impl*) This)->surfaces[0][0])->resource.pool;
     case D3DRTYPE_VERTEXBUFFER:
       return ((IDirect3DVertexBuffer8Impl*) This)->currentDesc.Pool;
     case D3DRTYPE_INDEXBUFFER:
Index: dlls/d3d8/surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.47
diff -u -r1.47 surface.c
--- dlls/d3d8/surface.c	29 Sep 2005 10:31:22 -0000	1.47
+++ dlls/d3d8/surface.c	14 Feb 2006 10:20:31 -0000
@@ -1,9 +1,7 @@
 /*
  * IDirect3DSurface8 implementation
  *
- * Copyright 2002-2004 Jason Edmeades
- * Copyright 2002-2003 Raphael Junqueira
- * Copyright 2004 Christian Costa
+ * Copyright 2005 Oliver Stieber
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -21,44 +19,30 @@
  */
 
 #include "config.h"
-#include "wine/port.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-
-#define COBJMACROS
-#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "wingdi.h"
-#include "wine/debug.h"
-
 #include "d3d8_private.h"
 
-WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
+WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
 
-/* IDirect3DVolume IUnknown parts follow: */
-HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 iface,REFIID riid,LPVOID *ppobj)
-{
+/* IDirect3DSurface8 IUnknown parts follow: */
+HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 iface, REFIID riid, LPVOID *ppobj) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
 
     if (IsEqualGUID(riid, &IID_IUnknown)
+        || IsEqualGUID(riid, &IID_IDirect3DResource8)
         || IsEqualGUID(riid, &IID_IDirect3DSurface8)) {
-        IDirect3DSurface8Impl_AddRef(iface);
+        IUnknown_AddRef(iface);
         *ppobj = This;
         return D3D_OK;
     }
 
-    WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
+    WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
     return E_NOINTERFACE;
 }
 
 ULONG WINAPI IDirect3DSurface8Impl_AddRef(LPDIRECT3DSURFACE8 iface) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
+    InterlockedIncrement(&D3D8_SURFACE(This)->resource.ref);
 
     TRACE("(%p) : AddRef from %ld\n", This, ref - 1);
 
@@ -72,54 +56,51 @@
     TRACE("(%p) : ReleaseRef to %ld\n", This, ref);
 
     if (ref == 0) {
-      HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
-      HeapFree(GetProcessHeap(), 0, This);
+        IWineD3DSurface_Release(This->wineD3DSurface);
+        HeapFree(GetProcessHeap(), 0, This);
     }
+    else
+	InterlockedDecrement(&D3D8_SURFACE(This)->resource.ref);
+    
     return ref;
 }
 
-/* IDirect3DSurface8: */
-HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(LPDIRECT3DSURFACE8 iface, IDirect3DDevice8** ppDevice) {
+/* IDirect3DSurface8 IDirect3DResource8 Interface follow: */
+HRESULT WINAPI IDirect3DSurface8Impl_GetDevice(LPDIRECT3DSURFACE8 iface, IDirect3DDevice8 **ppDevice) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-    TRACE("(%p) : returning %p\n", This, This->Device);
-    *ppDevice = (LPDIRECT3DDEVICE8) This->Device;
-    /**
-     * Note  Calling this method will increase the internal reference count 
-     * on the IDirect3DDevice8 interface. 
-     */
-    IDirect3DDevice8Impl_AddRef(*ppDevice);
-    return D3D_OK;
+    return IDirect3DResource8Impl_GetDevice((LPDIRECT3DRESOURCE8) This, ppDevice);
 }
 
-HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
+HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, CONST void *pData, DWORD SizeOfData, DWORD Flags) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-    FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    TRACE("(%p) Relay\n", This);
+    return IWineD3DSurface_SetPrivateData(This->wineD3DSurface, refguid, pData, SizeOfData, Flags);
 }
 
-HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
+HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-    FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    TRACE("(%p) Relay\n", This);
+    return IWineD3DSurface_GetPrivateData(This->wineD3DSurface, refguid, pData, pSizeOfData);
 }
 
 HRESULT WINAPI IDirect3DSurface8Impl_FreePrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-    FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    TRACE("(%p) Relay\n", This);
+    return IWineD3DSurface_FreePrivateData(This->wineD3DSurface, refguid);
 }
 
-HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void** ppContainer) {
+/* IDirect3DSurface8 Interface follow: */
+HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void **ppContainer) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
     HRESULT res;
-    res = IUnknown_QueryInterface(This->Container, riid, ppContainer);
+    res = IUnknown_QueryInterface(D3D8_SURFACE(This)->container, riid, ppContainer);
     if (E_NOINTERFACE == res) { 
       /**
        * If the surface is created using CreateImageSurface, CreateRenderTarget, 
        * or CreateDepthStencilSurface, the surface is considered stand alone. In this case, 
        * GetContainer will return the Direct3D device used to create the surface. 
        */
-      res = IUnknown_QueryInterface(This->Container, &IID_IDirect3DDevice8, ppContainer);
+      res = IUnknown_QueryInterface(D3D8_SURFACE(This)->container, &IID_IDirect3DDevice8, ppContainer);
     }
     TRACE("(%p) : returning %p\n", This, *ppContainer);
     return res;
@@ -127,24 +108,37 @@
 
 HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(LPDIRECT3DSURFACE8 iface, D3DSURFACE_DESC *pDesc) {
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
+    WINED3DSURFACE_DESC    wined3ddesc;
+    UINT                   tmpInt = -1;
+    TRACE("(%p) Relay\n", This);
+
+    /* As d3d8 and d3d8 structures differ, pass in ptrs to where data needs to go */
+    memset(&wined3ddesc, 0, sizeof(wined3ddesc));
+    wined3ddesc.Format              = (WINED3DFORMAT *)&pDesc->Format;
+    wined3ddesc.Type                = &pDesc->Type;
+    wined3ddesc.Usage               = &pDesc->Usage;
+    wined3ddesc.Pool                = &pDesc->Pool;
+    wined3ddesc.Size                = &tmpInt;
+    wined3ddesc.MultiSampleType     = &pDesc->MultiSampleType;
+    wined3ddesc.Width               = &pDesc->Width;
+    wined3ddesc.Height              = &pDesc->Height;
 
-    TRACE("(%p) : copying into %p\n", This, pDesc);
-    memcpy(pDesc, &This->myDesc, sizeof(D3DSURFACE_DESC));
-    return D3D_OK;
+    return IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc);
 }
 
+#define D3D8_SURFACE_GET_DEVICE(a) ((IDirect3DDevice8Impl*)((IDirect3DTexture8Impl*)(D3D8_SURFACE(a)->container))->Device)
 HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
     HRESULT hr;
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
   
     /* fixme: should we really lock as such? */
-    if (This->inTexture && This->inPBuffer) {
+    if (D3D8_SURFACE(This)->inTexture && D3D8_SURFACE(This)->inPBuffer) {
 	FIXME("Warning: Surface is in texture memory or pbuffer\n");
-	This->inTexture = 0;
-	This->inPBuffer = 0;
+	D3D8_SURFACE(This)->inTexture = 0;
+	D3D8_SURFACE(This)->inPBuffer = 0;
     }
     
-    if (FALSE == This->lockable) {
+    if (FALSE == D3D8_SURFACE(This)->lockable) {
       /* Note: UpdateTextures calls CopyRects which calls this routine to populate the 
             texture regions, and since the destination is an unlockable region we need
             to tolerate this                                                           */
@@ -152,60 +146,60 @@
       /*return D3DERR_INVALIDCALL; */
     }
 
-    if (This == This->Device->backBuffer || This == This->Device->renderTarget || This == This->Device->frontBuffer || This->Device->depthStencilBuffer) {
-      if (This == This->Device->backBuffer) {
-	TRACE("(%p, backBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory);
-      } else if (This == This->Device->frontBuffer) {
-	TRACE("(%p, frontBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory);
-      } else if (This == This->Device->renderTarget) {
-	TRACE("(%p, renderTarget) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory);
-      } else if (This == This->Device->depthStencilBuffer) {
-	TRACE("(%p, stencilBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory);
+    if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget || This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer || D3D8_SURFACE_GET_DEVICE(This)->depthStencilBuffer) {
+      if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer) {
+	TRACE("(%p, backBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, D3D8_SURFACE(This)->resource.allocatedMemory);
+      } else if (This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer) {
+	TRACE("(%p, frontBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, D3D8_SURFACE(This)->resource.allocatedMemory);
+      } else if (This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget) {
+	TRACE("(%p, renderTarget) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, D3D8_SURFACE(This)->resource.allocatedMemory);
+      } else if (This == D3D8_SURFACE_GET_DEVICE(This)->depthStencilBuffer) {
+	TRACE("(%p, stencilBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, D3D8_SURFACE(This)->resource.allocatedMemory);
       }
     } else {
-      TRACE("(%p) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory);
+      TRACE("(%p) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, D3D8_SURFACE(This)->resource.allocatedMemory);
     }
 
     /* DXTn formats don't have exact pitches as they are to the new row of blocks,
          where each block is 4x4 pixels, 8 bytes (dxt1) and 16 bytes (dxt2/3/4/5)      
           ie pitch = (width/4) * bytes per block                                  */
-    if (This->myDesc.Format == D3DFMT_DXT1) /* DXT1 is 8 bytes per block */
-        pLockedRect->Pitch = (This->myDesc.Width/4) * 8;
-    else if (This->myDesc.Format == D3DFMT_DXT2 || This->myDesc.Format == D3DFMT_DXT3 ||
-             This->myDesc.Format == D3DFMT_DXT4 || This->myDesc.Format == D3DFMT_DXT5) /* DXT2/3/4/5 is 16 bytes per block */
-        pLockedRect->Pitch = (This->myDesc.Width/4) * 16;
+    if (D3D8_SURFACE(This)->resource.format == D3DFMT_DXT1) /* DXT1 is 8 bytes per block */
+        pLockedRect->Pitch = (D3D8_SURFACE(This)->currentDesc.Width/4) * 8;
+    else if (D3D8_SURFACE(This)->resource.format == D3DFMT_DXT2 || D3D8_SURFACE(This)->resource.format == D3DFMT_DXT3 ||
+             D3D8_SURFACE(This)->resource.format == D3DFMT_DXT4 || D3D8_SURFACE(This)->resource.format == D3DFMT_DXT5) /* DXT2/3/4/5 is 16 bytes per block */
+        pLockedRect->Pitch = (D3D8_SURFACE(This)->currentDesc.Width/4) * 16;
     else
-        pLockedRect->Pitch = This->bytesPerPixel * This->myDesc.Width;  /* Bytes / row */    
+        pLockedRect->Pitch = D3D8_SURFACE(This)->bytesPerPixel * D3D8_SURFACE(This)->currentDesc.Width;  /* Bytes / row */    
 
     if (NULL == pRect) {
-      pLockedRect->pBits = This->allocatedMemory;
-      This->lockedRect.left   = 0;
-      This->lockedRect.top    = 0;
-      This->lockedRect.right  = This->myDesc.Width;
-      This->lockedRect.bottom = This->myDesc.Height;
-      TRACE("Locked Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", &This->lockedRect, This->lockedRect.left, This->lockedRect.top, This->lockedRect.right, This->lockedRect.bottom);
+      pLockedRect->pBits = D3D8_SURFACE(This)->resource.allocatedMemory;
+      D3D8_SURFACE(This)->lockedRect.left   = 0;
+      D3D8_SURFACE(This)->lockedRect.top    = 0;
+      D3D8_SURFACE(This)->lockedRect.right  = D3D8_SURFACE(This)->currentDesc.Width;
+      D3D8_SURFACE(This)->lockedRect.bottom = D3D8_SURFACE(This)->currentDesc.Height;
+      TRACE("Locked Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", &D3D8_SURFACE(This)->lockedRect, D3D8_SURFACE(This)->lockedRect.left, D3D8_SURFACE(This)->lockedRect.top, D3D8_SURFACE(This)->lockedRect.right, D3D8_SURFACE(This)->lockedRect.bottom);
     } else {
       TRACE("Lock Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
 
-      if (This->myDesc.Format == D3DFMT_DXT1) { /* DXT1 is half byte per pixel */
-          pLockedRect->pBits = This->allocatedMemory + (pLockedRect->Pitch * pRect->top) + ((pRect->left * This->bytesPerPixel/2));
+      if (D3D8_SURFACE(This)->resource.format == D3DFMT_DXT1) { /* DXT1 is half byte per pixel */
+          pLockedRect->pBits = D3D8_SURFACE(This)->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top) + ((pRect->left * D3D8_SURFACE(This)->bytesPerPixel/2));
       } else {
-          pLockedRect->pBits = This->allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * This->bytesPerPixel);
+          pLockedRect->pBits = D3D8_SURFACE(This)->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * D3D8_SURFACE(This)->bytesPerPixel);
       }
-      This->lockedRect.left   = pRect->left;
-      This->lockedRect.top    = pRect->top;
-      This->lockedRect.right  = pRect->right;
-      This->lockedRect.bottom = pRect->bottom;
+      D3D8_SURFACE(This)->lockedRect.left   = pRect->left;
+      D3D8_SURFACE(This)->lockedRect.top    = pRect->top;
+      D3D8_SURFACE(This)->lockedRect.right  = pRect->right;
+      D3D8_SURFACE(This)->lockedRect.bottom = pRect->bottom;
     }
 
 
-    if (0 == This->myDesc.Usage) { /* classic surface */
+    if (0 == D3D8_SURFACE(This)->resource.usage) { /* classic surface */
 
       /* Nothing to do ;) */
 
-    } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage && !(Flags&D3DLOCK_DISCARD)) { /* render surfaces */
+    } else if (D3DUSAGE_RENDERTARGET & D3D8_SURFACE(This)->resource.usage && !(Flags&D3DLOCK_DISCARD)) { /* render surfaces */
       
-      if (This == This->Device->backBuffer || This == This->Device->renderTarget || This == This->Device->frontBuffer) {
+      if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget || This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer) {
 	GLint  prev_store;
 	GLint  prev_read;
 	
@@ -215,7 +209,7 @@
 	 * for render->surface copy begin to begin of allocatedMemory
 	 * unlock can be more easy
 	 */
-	pLockedRect->pBits = This->allocatedMemory;
+	pLockedRect->pBits = D3D8_SURFACE(This)->resource.allocatedMemory;
 	
 	glFlush();
 	vcheckGLcall("glFlush");
@@ -224,27 +218,27 @@
 	glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
 	vcheckGLcall("glIntegerv");
 
-	if (This == This->Device->backBuffer) {
+	if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer) {
 	  glReadBuffer(GL_BACK);
-	} else if (This == This->Device->frontBuffer || This == This->Device->renderTarget) {
+	} else if (This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget) {
 	  glReadBuffer(GL_FRONT);
-	} else if (This == This->Device->depthStencilBuffer) {
+	} else if (This == D3D8_SURFACE_GET_DEVICE(This)->depthStencilBuffer) {
 	  ERR("Stencil Buffer lock unsupported for now\n");
 	}
 	vcheckGLcall("glReadBuffer");
 
 	{
 	  long j;
-          GLenum format = D3DFmt2GLFmt(This->Device, This->myDesc.Format);
-          GLenum type   = D3DFmt2GLType(This->Device, This->myDesc.Format);
-	  for (j = This->lockedRect.top; j < This->lockedRect.bottom - This->lockedRect.top; ++j) {
-	    glReadPixels(This->lockedRect.left, 
-			 This->lockedRect.bottom - j - 1, 
-			 This->lockedRect.right - This->lockedRect.left, 
+          GLenum format = D3DFmt2GLFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format);
+          GLenum type   = D3DFmt2GLType(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format);
+	  for (j = D3D8_SURFACE(This)->lockedRect.top; j < D3D8_SURFACE(This)->lockedRect.bottom - D3D8_SURFACE(This)->lockedRect.top; ++j) {
+	    glReadPixels(D3D8_SURFACE(This)->lockedRect.left, 
+			 D3D8_SURFACE(This)->lockedRect.bottom - j - 1, 
+			 D3D8_SURFACE(This)->lockedRect.right - D3D8_SURFACE(This)->lockedRect.left, 
 			 1,
 			 format, 
                          type, 
-                         (char *)pLockedRect->pBits + (pLockedRect->Pitch * (j-This->lockedRect.top)));
+                         (char *)pLockedRect->pBits + (pLockedRect->Pitch * (j-D3D8_SURFACE(This)->lockedRect.top)));
 	    vcheckGLcall("glReadPixels");
 	  }
 	}
@@ -255,15 +249,15 @@
 	LEAVE_GL();
 
       } else {
-	FIXME("unsupported locking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+	FIXME("unsupported locking to Rendering surface surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
       }
 
-    } else if (D3DUSAGE_DEPTHSTENCIL & This->myDesc.Usage) { /* stencil surfaces */
+    } else if (D3DUSAGE_DEPTHSTENCIL & D3D8_SURFACE(This)->resource.usage) { /* stencil surfaces */
 
-      FIXME("TODO stencil depth surface locking surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      FIXME("TODO stencil depth surface locking surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
 
     } else {
-      FIXME("unsupported locking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      FIXME("unsupported locking to surface surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
     }
 
     if (Flags & (D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_READONLY)) {
@@ -273,12 +267,12 @@
        * Dirtify on lock
        * as seen in msdn docs
        */
-      IDirect3DSurface8Impl_AddDirtyRect(iface, &This->lockedRect);
+      IWineD3DSurface_AddDirtyRect(This->wineD3DSurface, &D3D8_SURFACE(This)->lockedRect);
 
       /** Dirtify Container if needed */
-      if (NULL != This->Container) {
+      if (NULL != D3D8_SURFACE(This)->container) {
 	IDirect3DBaseTexture8* cont = NULL;
-	hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont);
+	hr = IUnknown_QueryInterface(D3D8_SURFACE(This)->container, &IID_IDirect3DBaseTexture8, (void**) &cont);
 	
 	if (SUCCEEDED(hr) && NULL != cont) {
 	  IDirect3DBaseTexture8Impl_SetDirty(cont, TRUE);
@@ -288,9 +282,9 @@
       }
     }
 
-    TRACE("returning memory@%p, pitch(%d) dirtyfied(%d)\n", pLockedRect->pBits, pLockedRect->Pitch, This->Dirty);
+    TRACE("returning memory@%p, pitch(%d) dirtyfied(%d)\n", pLockedRect->pBits, pLockedRect->Pitch, D3D8_SURFACE(This)->Dirty);
 
-    This->locked = TRUE;
+    D3D8_SURFACE(This)->locked = TRUE;
     return D3D_OK;
 }
 
@@ -298,38 +292,38 @@
     GLint skipBytes = 0;
     IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
 
-    if (FALSE == This->locked) {
+    if (FALSE == D3D8_SURFACE(This)->locked) {
       ERR("trying to Unlock an unlocked surf@%p\n", This);  
       return D3DERR_INVALIDCALL;
     }
 
-    if (This == This->Device->backBuffer || This == This->Device->frontBuffer || This->Device->depthStencilBuffer || This == This->Device->renderTarget) {
-      if (This == This->Device->backBuffer) {
-	TRACE("(%p, backBuffer) : dirtyfied(%d)\n", This, This->Dirty);
-      } else if (This == This->Device->frontBuffer) {
-	TRACE("(%p, frontBuffer) : dirtyfied(%d)\n", This, This->Dirty);
-      } else if (This == This->Device->depthStencilBuffer) {
-	TRACE("(%p, stencilBuffer) : dirtyfied(%d)\n", This, This->Dirty);
-      } else if (This == This->Device->renderTarget) {
-	TRACE("(%p, renderTarget) : dirtyfied(%d)\n", This, This->Dirty);
+    if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer || D3D8_SURFACE_GET_DEVICE(This)->depthStencilBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget) {
+      if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer) {
+	TRACE("(%p, backBuffer) : dirtyfied(%d)\n", This, D3D8_SURFACE(This)->Dirty);
+      } else if (This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer) {
+	TRACE("(%p, frontBuffer) : dirtyfied(%d)\n", This, D3D8_SURFACE(This)->Dirty);
+      } else if (This == D3D8_SURFACE_GET_DEVICE(This)->depthStencilBuffer) {
+	TRACE("(%p, stencilBuffer) : dirtyfied(%d)\n", This, D3D8_SURFACE(This)->Dirty);
+      } else if (This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget) {
+	TRACE("(%p, renderTarget) : dirtyfied(%d)\n", This, D3D8_SURFACE(This)->Dirty);
       }
     } else {
-      TRACE("(%p) : dirtyfied(%d)\n", This, This->Dirty);
+      TRACE("(%p) : dirtyfied(%d)\n", This, D3D8_SURFACE(This)->Dirty);
     }
 
-    if (FALSE == This->Dirty) {
+    if (FALSE == D3D8_SURFACE(This)->Dirty) {
       TRACE("(%p) : Not Dirtified so nothing to do, return now\n", This);
       goto unlock_end;
     }
 
-    if (0 == This->myDesc.Usage) { /* classic surface */
+    if (0 == D3D8_SURFACE(This)->resource.usage) { /* classic surface */
       /**
        * nothing to do
        * waiting to reload the surface via IDirect3DDevice8::UpdateTexture
        */
-    } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
+    } else if (D3DUSAGE_RENDERTARGET & D3D8_SURFACE(This)->resource.usage) { /* render surfaces */
 
-      if (This == This->Device->backBuffer || This == This->Device->frontBuffer || This == This->Device->renderTarget) {
+      if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget) {
 	GLint  prev_store;
 	GLint  prev_draw;
 	GLint  prev_rasterpos[4];
@@ -350,10 +344,10 @@
         /* glDrawPixels transforms the raster position as though it was a vertex -
            we want to draw at screen position 0,0 - Set up ortho (rhw) mode as   
            per drawprim (and leave set - it will sort itself out due to last_was_rhw */
-        if (!This->Device->last_was_rhw) {
+        if (!D3D8_SURFACE_GET_DEVICE(This)->last_was_rhw) {
 
             double X, Y, height, width, minZ, maxZ;
-            This->Device->last_was_rhw = TRUE;
+            D3D8_SURFACE_GET_DEVICE(This)->last_was_rhw = TRUE;
 
             /* Transformed already into viewport coordinates, so we do not need transform
                matrices. Reset all matrices to identity and leave the default matrix in world 
@@ -369,12 +363,12 @@
             checkGLcall("glLoadIdentity");
 
             /* Set up the viewport to be full viewport */
-            X      = This->Device->StateBlock->viewport.X;
-            Y      = This->Device->StateBlock->viewport.Y;
-            height = This->Device->StateBlock->viewport.Height;
-            width  = This->Device->StateBlock->viewport.Width;
-            minZ   = This->Device->StateBlock->viewport.MinZ;
-            maxZ   = This->Device->StateBlock->viewport.MaxZ;
+            X      = D3D8_SURFACE_GET_DEVICE(This)->StateBlock->viewport.X;
+            Y      = D3D8_SURFACE_GET_DEVICE(This)->StateBlock->viewport.Y;
+            height = D3D8_SURFACE_GET_DEVICE(This)->StateBlock->viewport.Height;
+            width  = D3D8_SURFACE_GET_DEVICE(This)->StateBlock->viewport.Width;
+            minZ   = D3D8_SURFACE_GET_DEVICE(This)->StateBlock->viewport.MinZ;
+            maxZ   = D3D8_SURFACE_GET_DEVICE(This)->StateBlock->viewport.MaxZ;
             TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
             glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
             checkGLcall("glOrtho");
@@ -385,34 +379,34 @@
             checkGLcall("glTranslatef(0.5, 0.5, 0)");
         }
 
-	if (This == This->Device->backBuffer) {
+	if (This == D3D8_SURFACE_GET_DEVICE(This)->backBuffer) {
 	  glDrawBuffer(GL_BACK);
-	} else if (This == This->Device->frontBuffer || This == This->Device->renderTarget) {
+	} else if (This == D3D8_SURFACE_GET_DEVICE(This)->frontBuffer || This == D3D8_SURFACE_GET_DEVICE(This)->renderTarget) {
 	  glDrawBuffer(GL_FRONT);
 	}
 	vcheckGLcall("glDrawBuffer");
 
     /* If not fullscreen, we need to skip a number of bytes to find the next row of data */
     glGetIntegerv(GL_UNPACK_ROW_LENGTH, &skipBytes);
-    glPixelStorei(GL_UNPACK_ROW_LENGTH, This->myDesc.Width);
+    glPixelStorei(GL_UNPACK_ROW_LENGTH, D3D8_SURFACE(This)->currentDesc.Width);
 
     /* And back buffers are not blended */
     glDisable(GL_BLEND);
 
-	glRasterPos3i(This->lockedRect.left, This->lockedRect.top, 1);
+	glRasterPos3i(D3D8_SURFACE(This)->lockedRect.left, D3D8_SURFACE(This)->lockedRect.top, 1);
 	vcheckGLcall("glRasterPos2f");
-	switch (This->myDesc.Format) {
+	switch (D3D8_SURFACE(This)->resource.format) {
 	case D3DFMT_R5G6B5:
 	  {
-	    glDrawPixels(This->lockedRect.right - This->lockedRect.left, (This->lockedRect.bottom - This->lockedRect.top)-1,
-			 GL_RGB, GL_UNSIGNED_SHORT_5_6_5, This->allocatedMemory);
+	    glDrawPixels(D3D8_SURFACE(This)->lockedRect.right - D3D8_SURFACE(This)->lockedRect.left, (D3D8_SURFACE(This)->lockedRect.bottom - D3D8_SURFACE(This)->lockedRect.top)-1,
+			 GL_RGB, GL_UNSIGNED_SHORT_5_6_5, D3D8_SURFACE(This)->resource.allocatedMemory);
 	    vcheckGLcall("glDrawPixels");
 	  }
 	  break;
 	case D3DFMT_R8G8B8:
 	  {
-	    glDrawPixels(This->lockedRect.right - This->lockedRect.left, (This->lockedRect.bottom - This->lockedRect.top)-1,
-			 GL_RGB, GL_UNSIGNED_BYTE, This->allocatedMemory);
+	    glDrawPixels(D3D8_SURFACE(This)->lockedRect.right - D3D8_SURFACE(This)->lockedRect.left, (D3D8_SURFACE(This)->lockedRect.bottom - D3D8_SURFACE(This)->lockedRect.top)-1,
+			 GL_RGB, GL_UNSIGNED_BYTE, D3D8_SURFACE(This)->resource.allocatedMemory);
 	    vcheckGLcall("glDrawPixels");
 	  }
 	  break;
@@ -420,15 +414,15 @@
 	  {
 	    glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
 	    vcheckGLcall("glPixelStorei");
-	    glDrawPixels(This->lockedRect.right - This->lockedRect.left, (This->lockedRect.bottom - This->lockedRect.top)-1,
-			 GL_BGRA, GL_UNSIGNED_BYTE, This->allocatedMemory);
+	    glDrawPixels(D3D8_SURFACE(This)->lockedRect.right - D3D8_SURFACE(This)->lockedRect.left, (D3D8_SURFACE(This)->lockedRect.bottom - D3D8_SURFACE(This)->lockedRect.top)-1,
+			 GL_BGRA, GL_UNSIGNED_BYTE, D3D8_SURFACE(This)->resource.allocatedMemory);
 	    vcheckGLcall("glDrawPixels");
 	    glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
 	    vcheckGLcall("glPixelStorei");
 	  }
 	  break;
 	default:
-	  FIXME("Unsupported Format %u in locking func\n", This->myDesc.Format);
+	  FIXME("Unsupported Format %u in locking func\n", D3D8_SURFACE(This)->resource.format);
 	}
 
         glPixelZoom(1.0,1.0);
@@ -440,101 +434,101 @@
 
     /* Reset to previous pack row length / blending state */
     glPixelStorei(GL_UNPACK_ROW_LENGTH, skipBytes);
-    if (This->Device->StateBlock->renderstate[D3DRS_ALPHABLENDENABLE]) glEnable(GL_BLEND);
+    if (D3D8_SURFACE_GET_DEVICE(This)->StateBlock->renderstate[D3DRS_ALPHABLENDENABLE]) glEnable(GL_BLEND);
 
 	LEAVE_GL();
 
 	/** restore clean dirty state */
-	IDirect3DSurface8Impl_CleanDirtyRect(iface);
+	IWineD3DSurface_CleanDirtyRect(This->wineD3DSurface);
 
       } else {
-	FIXME("unsupported unlocking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+	FIXME("unsupported unlocking to Rendering surface surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
       }
 
-    } else if (D3DUSAGE_DEPTHSTENCIL & This->myDesc.Usage) { /* stencil surfaces */
+    } else if (D3DUSAGE_DEPTHSTENCIL & D3D8_SURFACE(This)->resource.usage) { /* stencil surfaces */
     
-      if (This == This->Device->depthStencilBuffer) {
-	FIXME("TODO stencil depth surface unlocking surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      if (This == D3D8_SURFACE_GET_DEVICE(This)->depthStencilBuffer) {
+	FIXME("TODO stencil depth surface unlocking surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
       } else {
-	FIXME("unsupported unlocking to StencilDepth surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+	FIXME("unsupported unlocking to StencilDepth surface surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
       }
 
     } else {
-      FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, D3D8_SURFACE(This)->resource.usage);
     }
 
 unlock_end:
-    This->locked = FALSE;
-    memset(&This->lockedRect, 0, sizeof(RECT));
+    D3D8_SURFACE(This)->locked = FALSE;
+    memset(&D3D8_SURFACE(This)->lockedRect, 0, sizeof(RECT));
     return D3D_OK;
 }
 
-
 const IDirect3DSurface8Vtbl Direct3DSurface8_Vtbl =
 {
+    /* IUnknown */
     IDirect3DSurface8Impl_QueryInterface,
     IDirect3DSurface8Impl_AddRef,
     IDirect3DSurface8Impl_Release,
+    /* IDirect3DResource8 */
     IDirect3DSurface8Impl_GetDevice,
     IDirect3DSurface8Impl_SetPrivateData,
     IDirect3DSurface8Impl_GetPrivateData,
     IDirect3DSurface8Impl_FreePrivateData,
+    /* IDirect3DSurface8 */
     IDirect3DSurface8Impl_GetContainer,
     IDirect3DSurface8Impl_GetDesc,
     IDirect3DSurface8Impl_LockRect,
-    IDirect3DSurface8Impl_UnlockRect,
+    IDirect3DSurface8Impl_UnlockRect
 };
 
-
 HRESULT WINAPI IDirect3DSurface8Impl_LoadTexture(LPDIRECT3DSURFACE8 iface, UINT gl_target, UINT gl_level) {
   IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-
-  if (This->inTexture)
+  if (D3D8_SURFACE(This)->inTexture)
     return D3D_OK;
-  if (This->inPBuffer) {
+  if (D3D8_SURFACE(This)->inPBuffer) {
     ENTER_GL();
     if (gl_level != 0)
       FIXME("Surface in texture is only supported for level 0\n");
-    else if (This->myDesc.Format == D3DFMT_P8 || This->myDesc.Format == D3DFMT_A8P8 ||
-        This->myDesc.Format == D3DFMT_DXT1 || This->myDesc.Format == D3DFMT_DXT2 ||
-        This->myDesc.Format == D3DFMT_DXT3 || This->myDesc.Format == D3DFMT_DXT4 ||
-        This->myDesc.Format == D3DFMT_DXT5)
-      FIXME("Format %d not supported\n", This->myDesc.Format);
+    else if (D3D8_SURFACE(This)->resource.format == D3DFMT_P8 || D3D8_SURFACE(This)->resource.format == D3DFMT_A8P8 ||
+        D3D8_SURFACE(This)->resource.format == D3DFMT_DXT1 || D3D8_SURFACE(This)->resource.format == D3DFMT_DXT2 ||
+        D3D8_SURFACE(This)->resource.format == D3DFMT_DXT3 || D3D8_SURFACE(This)->resource.format == D3DFMT_DXT4 ||
+        D3D8_SURFACE(This)->resource.format == D3DFMT_DXT5)
+      FIXME("Format %d not supported\n", D3D8_SURFACE(This)->resource.format);
     else {
 	glCopyTexImage2D(gl_target,
 			 0,
-			 D3DFmt2GLIntFmt(This->Device,
-		         This->myDesc.Format),
+			 D3DFmt2GLIntFmt(D3D8_SURFACE_GET_DEVICE(This),
+		         D3D8_SURFACE(This)->resource.format),
 			 0,
 			 0,/*This->surfaces[j][i]->myDesc.Height-1,*/
-			 This->myDesc.Width,
-			 This->myDesc.Height,
+			 D3D8_SURFACE(This)->currentDesc.Width,
+			 D3D8_SURFACE(This)->currentDesc.Height,
 			 0);
 	TRACE("Updating target %d\n", gl_target);
-	This->inTexture = TRUE;
+	D3D8_SURFACE(This)->inTexture = TRUE;
     }
     LEAVE_GL();
     return D3D_OK;
   }
   
-  if ((This->myDesc.Format == D3DFMT_P8 || This->myDesc.Format == D3DFMT_A8P8) && 
-      !GL_SUPPORT_DEV(EXT_PALETTED_TEXTURE, This->Device)) {
+  if ((D3D8_SURFACE(This)->resource.format == D3DFMT_P8 || D3D8_SURFACE(This)->resource.format == D3DFMT_A8P8) && 
+      !GL_SUPPORT_DEV(EXT_PALETTED_TEXTURE, D3D8_SURFACE_GET_DEVICE(This))) {
     /**
      * wanted a paletted texture and not really support it in HW 
      * so software emulation code begin
      */
     UINT i;
-    PALETTEENTRY* pal = This->Device->palettes[This->Device->currentPalette];
-    VOID* surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->myDesc.Width * This->myDesc.Height * sizeof(DWORD));
+    PALETTEENTRY* pal = D3D8_SURFACE_GET_DEVICE(This)->palettes[D3D8_SURFACE_GET_DEVICE(This)->currentPalette];
+    VOID* surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, D3D8_SURFACE(This)->currentDesc.Width * D3D8_SURFACE(This)->currentDesc.Height * sizeof(DWORD));
     BYTE* dst = surface;
-    BYTE* src = (BYTE*) This->allocatedMemory;
+    BYTE* src = (BYTE*) D3D8_SURFACE(This)->resource.allocatedMemory;
           
-    for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) {
+    for (i = 0; i < D3D8_SURFACE(This)->currentDesc.Width * D3D8_SURFACE(This)->currentDesc.Height; i++) {
       BYTE color = *src++;
       *dst++ = pal[color].peRed;
       *dst++ = pal[color].peGreen;
       *dst++ = pal[color].peBlue;
-      if (This->myDesc.Format == D3DFMT_A8P8)
+      if (D3D8_SURFACE(This)->resource.format == D3DFMT_A8P8)
 	*dst++ = pal[color].peFlags; 
       else
 	*dst++ = 0xFF; 
@@ -546,8 +540,8 @@
 	  gl_target,
 	  gl_level, 
 	  GL_RGBA,
-	  This->myDesc.Width, 
-	  This->myDesc.Height, 
+	  D3D8_SURFACE(This)->currentDesc.Width, 
+	  D3D8_SURFACE(This)->currentDesc.Height, 
 	  0, 
 	  GL_RGBA,
 	  GL_UNSIGNED_BYTE,
@@ -555,8 +549,8 @@
     glTexImage2D(gl_target,
 		 gl_level, 
 		 GL_RGBA,
-		 This->myDesc.Width,
-		 This->myDesc.Height,
+		 D3D8_SURFACE(This)->currentDesc.Width,
+		 D3D8_SURFACE(This)->currentDesc.Height,
 		 0,
 		 GL_RGBA,
 		 GL_UNSIGNED_BYTE,
@@ -569,32 +563,32 @@
     return D3D_OK;    
   }
 
-  if (This->myDesc.Format == D3DFMT_DXT1 || 
-      This->myDesc.Format == D3DFMT_DXT2 || 
-      This->myDesc.Format == D3DFMT_DXT3 || 
-      This->myDesc.Format == D3DFMT_DXT4 || 
-      This->myDesc.Format == D3DFMT_DXT5) {
-    if (GL_SUPPORT_DEV(EXT_TEXTURE_COMPRESSION_S3TC, This->Device)) {
+  if (D3D8_SURFACE(This)->resource.format == D3DFMT_DXT1 || 
+      D3D8_SURFACE(This)->resource.format == D3DFMT_DXT2 || 
+      D3D8_SURFACE(This)->resource.format == D3DFMT_DXT3 || 
+      D3D8_SURFACE(This)->resource.format == D3DFMT_DXT4 || 
+      D3D8_SURFACE(This)->resource.format == D3DFMT_DXT5) {
+    if (GL_SUPPORT_DEV(EXT_TEXTURE_COMPRESSION_S3TC, D3D8_SURFACE_GET_DEVICE(This))) {
       TRACE("Calling glCompressedTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, sz=%d, Mem=%p\n",
 	    gl_target, 
 	    gl_level, 
-	    D3DFmt2GLIntFmt(This->Device, This->myDesc.Format), 
-	    This->myDesc.Width, 
-	    This->myDesc.Height, 
+	    D3DFmt2GLIntFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format), 
+	    D3D8_SURFACE(This)->currentDesc.Width, 
+	    D3D8_SURFACE(This)->currentDesc.Height, 
 	    0, 
-	    This->myDesc.Size,
-	    This->allocatedMemory);
+	    D3D8_SURFACE(This)->resource.size,
+	    D3D8_SURFACE(This)->resource.allocatedMemory);
       
       ENTER_GL();
 
-      GL_EXTCALL_DEV(glCompressedTexImage2DARB, This->Device)(gl_target, 
+      GL_EXTCALL_DEV(glCompressedTexImage2DARB, D3D8_SURFACE_GET_DEVICE(This))(gl_target, 
 							      gl_level, 
-							      D3DFmt2GLIntFmt(This->Device, This->myDesc.Format),
-							      This->myDesc.Width,
-							      This->myDesc.Height,
+							      D3DFmt2GLIntFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format),
+							      D3D8_SURFACE(This)->currentDesc.Width,
+							      D3D8_SURFACE(This)->currentDesc.Height,
 							      0,
-							      This->myDesc.Size,
-							      This->allocatedMemory);
+							      D3D8_SURFACE(This)->resource.size,
+							      D3D8_SURFACE(This)->resource.allocatedMemory);
       checkGLcall("glCommpressedTexTexImage2D");
 
       LEAVE_GL();
@@ -606,26 +600,26 @@
     TRACE("Calling glTexImage2D %x i=%d, d3dfmt=%s, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n",
 	  gl_target, 
 	  gl_level, 
-	  debug_d3dformat(This->myDesc.Format),
-	  D3DFmt2GLIntFmt(This->Device, This->myDesc.Format), 
-	  This->myDesc.Width, 
-	  This->myDesc.Height, 
+	  debug_d3dformat(D3D8_SURFACE(This)->resource.format),
+	  D3DFmt2GLIntFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format), 
+	  D3D8_SURFACE(This)->currentDesc.Width, 
+	  D3D8_SURFACE(This)->currentDesc.Height, 
 	  0, 
-	  D3DFmt2GLFmt(This->Device, This->myDesc.Format), 
-	  D3DFmt2GLType(This->Device, This->myDesc.Format),
-	  This->allocatedMemory);
+	  D3DFmt2GLFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format), 
+	  D3DFmt2GLType(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format),
+	  D3D8_SURFACE(This)->resource.allocatedMemory);
 
     ENTER_GL();
 
     glTexImage2D(gl_target, 
 		 gl_level,
-		 D3DFmt2GLIntFmt(This->Device, This->myDesc.Format),
-		 This->myDesc.Width,
-		 This->myDesc.Height,
+		 D3DFmt2GLIntFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format),
+		 D3D8_SURFACE(This)->currentDesc.Width,
+		 D3D8_SURFACE(This)->currentDesc.Height,
 		 0,
-		 D3DFmt2GLFmt(This->Device, This->myDesc.Format),
-		 D3DFmt2GLType(This->Device, This->myDesc.Format),
-		 This->allocatedMemory);
+		 D3DFmt2GLFmt(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format),
+		 D3DFmt2GLType(D3D8_SURFACE_GET_DEVICE(This), D3D8_SURFACE(This)->resource.format),
+		 D3D8_SURFACE(This)->resource.allocatedMemory);
     checkGLcall("glTexImage2D");
 
     LEAVE_GL();
@@ -652,114 +646,3 @@
 
   return D3D_OK;
 }
-
-#include <errno.h>
-HRESULT WINAPI IDirect3DSurface8Impl_SaveSnapshot(LPDIRECT3DSURFACE8 iface, const char* filename) {
-  FILE* f = NULL;
-  ULONG i;
-  IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-
-  f = fopen(filename, "w+");
-  if (NULL == f) {
-    ERR("opening of %s failed with: %s\n", filename, strerror(errno));
-    return D3DERR_INVALIDCALL;
-  }
-
-  TRACE("opened %s with format %s\n", filename, debug_d3dformat(This->myDesc.Format));
-
-  fprintf(f, "P6\n%u %u\n255\n", This->myDesc.Width, This->myDesc.Height);
-  switch (This->myDesc.Format) {
-  case D3DFMT_X8R8G8B8:
-  case D3DFMT_A8R8G8B8:
-    {
-      DWORD color;
-      for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) {
-	color = ((DWORD*) This->allocatedMemory)[i];
-	fputc((color >> 16) & 0xFF, f);
-	fputc((color >>  8) & 0xFF, f);
-	fputc((color >>  0) & 0xFF, f);
-      }
-    }
-    break;
-  case D3DFMT_R8G8B8:
-    {
-      BYTE* color;
-      for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) {
-	color = ((BYTE*) This->allocatedMemory) + (3 * i);
-	fputc((color[0]) & 0xFF, f);
-	fputc((color[1]) & 0xFF, f);
-	fputc((color[2]) & 0xFF, f);
-      }
-    }
-    break;
-  case D3DFMT_A1R5G5B5: 
-    {
-      WORD color;
-      for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) {
-	color = ((WORD*) This->allocatedMemory)[i];
-	fputc(((color >> 10) & 0x1F) * 255 / 31, f);
-	fputc(((color >>  5) & 0x1F) * 255 / 31, f);
-	fputc(((color >>  0) & 0x1F) * 255 / 31, f);
-      }
-    }
-    break;
-  case D3DFMT_A4R4G4B4:
-    {
-      WORD color;
-      for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) {
-	color = ((WORD*) This->allocatedMemory)[i];
-	fputc(((color >>  8) & 0x0F) * 255 / 15, f);
-	fputc(((color >>  4) & 0x0F) * 255 / 15, f);
-	fputc(((color >>  0) & 0x0F) * 255 / 15, f);
-      }
-    }
-    break;
-
-  case D3DFMT_R5G6B5: 
-    {
-      WORD color;
-      for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) {
-	color = ((WORD*) This->allocatedMemory)[i];
-	fputc(((color >> 11) & 0x1F) * 255 / 31, f);
-	fputc(((color >>  5) & 0x3F) * 255 / 63, f);
-	fputc(((color >>  0) & 0x1F) * 255 / 31, f);
-      }
-    }
-    break;
-  default: 
-    FIXME("Unimplemented dump mode format(%u,%s)\n", This->myDesc.Format, debug_d3dformat(This->myDesc.Format));
-  }
-  fclose(f);
-  return D3D_OK;
-}
-
-HRESULT WINAPI IDirect3DSurface8Impl_CleanDirtyRect(LPDIRECT3DSURFACE8 iface) {
-  IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-  This->Dirty = FALSE;
-  This->dirtyRect.left   = This->myDesc.Width;
-  This->dirtyRect.top    = This->myDesc.Height;
-  This->dirtyRect.right  = 0;
-  This->dirtyRect.bottom = 0;
-  return D3D_OK;
-}
-
-/**
- * Raphael:
- *   very stupid way to handle multiple dirty rects but it works :)
- */
-extern HRESULT WINAPI IDirect3DSurface8Impl_AddDirtyRect(LPDIRECT3DSURFACE8 iface, CONST RECT* pDirtyRect) {
-  IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface;
-  This->Dirty = TRUE;
-  if (NULL != pDirtyRect) {
-    This->dirtyRect.left   = min(This->dirtyRect.left,   pDirtyRect->left);
-    This->dirtyRect.top    = min(This->dirtyRect.top,    pDirtyRect->top);
-    This->dirtyRect.right  = max(This->dirtyRect.right,  pDirtyRect->right);
-    This->dirtyRect.bottom = max(This->dirtyRect.bottom, pDirtyRect->bottom);
-  } else {
-    This->dirtyRect.left   = 0;
-    This->dirtyRect.top    = 0;
-    This->dirtyRect.right  = This->myDesc.Width;
-    This->dirtyRect.bottom = This->myDesc.Height;
-  }
-  return D3D_OK;
-}
Index: dlls/d3d8/texture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/texture.c,v
retrieving revision 1.22
diff -u -r1.22 texture.c
--- dlls/d3d8/texture.c	10 Nov 2005 12:14:59 -0000	1.22
+++ dlls/d3d8/texture.c	14 Feb 2006 10:20:31 -0000
@@ -120,22 +120,22 @@
     ENTER_GL();
 
     for (i = 0; i < This->levels; i++) {
-      if (i == 0 && This->surfaces[i]->textureName != 0 && This->Dirty == FALSE) {
-	glBindTexture(GL_TEXTURE_2D, This->surfaces[i]->textureName);
+      if (i == 0 && D3D8_SURFACE(This->surfaces[i])->textureName != 0 && This->Dirty == FALSE) {
+	glBindTexture(GL_TEXTURE_2D, D3D8_SURFACE(This->surfaces[i])->textureName);
 	checkGLcall("glBindTexture");
-	TRACE("Texture %p (level %d) given name %d\n", This->surfaces[i], i, This->surfaces[i]->textureName);
+	TRACE("Texture %p (level %d) given name %d\n", This->surfaces[i], i, D3D8_SURFACE(This->surfaces[i])->textureName);
 	/* No need to walk through all mip-map levels, since already all assigned */
         i = This->levels;
 
       } else {
 	if (i == 0) {
-	  if (This->surfaces[i]->textureName == 0) {
-	    glGenTextures(1, &This->surfaces[i]->textureName);
+	  if (D3D8_SURFACE(This->surfaces[i])->textureName == 0) {
+	    glGenTextures(1, &(D3D8_SURFACE(This->surfaces[i]))->textureName);
 	    checkGLcall("glGenTextures");
-	    TRACE("Texture %p (level %d) given name %d\n", This->surfaces[i], i, This->surfaces[i]->textureName);
+	    TRACE("Texture %p (level %d) given name %d\n", This->surfaces[i], i, D3D8_SURFACE(This->surfaces[i])->textureName);
 	  }
 	  
-	  glBindTexture(GL_TEXTURE_2D, This->surfaces[i]->textureName);
+	  glBindTexture(GL_TEXTURE_2D, D3D8_SURFACE(This->surfaces[i])->textureName);
 	  checkGLcall("glBindTexture");
 	}
 	IDirect3DSurface8Impl_LoadTexture((LPDIRECT3DSURFACE8) This->surfaces[i], GL_TEXTURE_2D, i); 
@@ -231,7 +231,7 @@
     IDirect3DTexture8Impl *This = (IDirect3DTexture8Impl *)iface;
     This->Dirty = TRUE;
     TRACE("(%p) : dirtyfication of surface Level (0)\n", This);    
-    return IDirect3DSurface8Impl_AddDirtyRect((LPDIRECT3DSURFACE8) This->surfaces[0], pDirtyRect);
+    return IWineD3DSurface_AddDirtyRect( (IWineD3DSurface*)(This->surfaces[0])->wineD3DSurface, pDirtyRect);
 }
 
 
cvs diff: Diffing dlls/d3d9
Index: dlls/d3d9/vertexshader.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d9/vertexshader.c,v
retrieving revision 1.16
diff -u -r1.16 vertexshader.c
--- dlls/d3d9/vertexshader.c	14 Dec 2005 11:26:01 -0000	1.16
+++ dlls/d3d9/vertexshader.c	14 Feb 2006 10:20:32 -0000
@@ -114,7 +114,7 @@
 
     object->ref = 1;
     object->lpVtbl = &Direct3DVertexShader9_Vtbl;
-    hrc= IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, NULL /* declaration */, pFunction, &object->wineD3DVertexShader, (IUnknown *)object);
+    hrc= IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, NULL /* declaration */, pFunction, &object->wineD3DVertexShader, (IUnknown *)object, 0);
 
     if (FAILED(hrc)) {
 
Index: include/wine/wined3d_interface.h
===================================================================
RCS file: /home/wine/wine/include/wine/wined3d_interface.h,v
retrieving revision 1.51
diff -u -r1.51 wined3d_interface.h
--- include/wine/wined3d_interface.h	6 Feb 2006 11:13:00 -0000	1.51
+++ include/wine/wined3d_interface.h	14 Feb 2006 10:20:33 -0000
@@ -421,6 +421,7 @@
     STDMETHOD(ColorFill)(THIS_ struct IWineD3DSurface* pSurface, CONST D3DRECT* pRect, D3DCOLOR color) PURE;
     STDMETHOD(UpdateTexture)(THIS_ struct IWineD3DBaseTexture *pSourceTexture, struct IWineD3DBaseTexture *pDestinationTexture) PURE;
     STDMETHOD(UpdateSurface)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRect, struct IWineD3DSurface* pDestinationSurface, CONST POINT* pDestPoint) PURE;
+    STDMETHOD(CopyRects)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects, struct IWineD3DSurface* pDestinationSurface, CONST POINT* pDestPointsArray);
     STDMETHOD(StretchRect)(THIS_ struct IWineD3DSurface* pSourceSurface, CONST RECT* pSourceRect, struct IWineD3DSurface* pDestinationSurface, CONST RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter) PURE;
     STDMETHOD(GetRenderTargetData)(THIS_ struct IWineD3DSurface* pRenderTarget, struct IWineD3DSurface* pSurface) PURE;
     STDMETHOD(GetFrontBufferData)(THIS_ UINT iSwapChain,struct IWineD3DSurface* pSurface) PURE;
@@ -558,6 +559,7 @@
 #define IWineD3DDevice_ColorFill(p,a,b,c)                       (p)->lpVtbl->ColorFill(p,a,b,c)
 #define IWineD3DDevice_UpdateTexture(p,a,b)                     (p)->lpVtbl->UpdateTexture(p,a,b)
 #define IWineD3DDevice_UpdateSurface(p,a,b,c,d)                 (p)->lpVtbl->UpdateSurface(p,a,b,c,d)
+#define IWineD3DDevice_CopyRects(p,a,b,c,d,e)                   (p)->lpVtbl->CopyRects(p,a,b,c,d,e)
 #define IWineD3DDevice_StretchRect(p,a,b,c,d,e)                 (p)->lpVtbl->StretchRect(p,a,b,c,d,e)
 #define IWineD3DDevice_GetRenderTargetData(p,a,b)               (p)->lpVtbl->GetRenderTargetData(p,a,b)
 #define IWineD3DDevice_GetFrontBufferData(p,a,b)                (p)->lpVtbl->GetFrontBufferData(p,a,b)


More information about the wine-patches mailing list