[dx8-17] Warcraft3 begining ...

Raphaël Junqueira fenix at club-internet.fr
Sat May 10 11:34:38 CDT 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Stupid email client (don't like ctr+enter) ;(

> Hi all,
>
>  with this patch Warcraft3 menu + loading look better than never ;)
>
> Changelog:
>  - minor COM fixes (fixes some crashes on stupid games)
>  - minor indent
>  - fix SELECTARG2 behavior (with help of lionel same patch)
>  - surface locking/unlocking (only rendering and textures surfaces
> supported now) be carefull, its very very very slow
>
> Regards,
> Raphael
>
> PS: Jason have you an idea why glDrawPixels is really slow (is know it slow
> but launching warcraft3 on call on my geforce card take 0.1-0.2s!!!)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+vSoep7NA3AmQTU4RAt42AJ9j7AiRK/3JfKAdY8vOy+qfvJE+EACdGbSj
O9Y1SBNcwuRQbcJattFeL+w=
=nCb6
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.23
diff -u -r1.23 d3d8_private.h
--- d3d8_private.h	8 May 2003 17:36:00 -0000	1.23
+++ d3d8_private.h	10 May 2003 16:23:55 -0000
@@ -247,6 +247,7 @@
 
     /* IDirect3DDevice8 fields */
     IDirect3D8Impl               *direct3d8;
+    IDirect3DSurface8Impl        *frontBuffer;
     IDirect3DSurface8Impl        *backBuffer;
     IDirect3DSurface8Impl        *depthStencilBuffer;
     D3DPRESENT_PARAMETERS         PresentParms;
@@ -413,7 +414,7 @@
     IDirect3DDevice8Impl   *Device;
     D3DRESOURCETYPE         ResourceType;
 
-    void                   *Container;
+    IUnknown               *Container;
     D3DVOLUME_DESC          myDesc;
     BYTE                   *allocatedMemory;
     UINT                    textureName;
@@ -493,6 +494,9 @@
     BYTE                   *allocatedMemory;
     UINT                    textureName;
     UINT                    bytesPerPixel;
+    BOOL                    lockable;
+    BOOL                    locked;
+    RECT                    lockedRect;
 };
 
 /* IUnknown: */
@@ -721,7 +725,6 @@
     UINT                    levels;
     D3DFORMAT               format;
 
-    IDirect3DDevice8Impl   *device;
     IDirect3DSurface8Impl  *surfaces[6][MAX_LEVELS];
     BOOL                    Dirty;
 };
@@ -848,7 +851,6 @@
     DWORD                   usage;
     D3DFORMAT               format;
 
-    IDirect3DDevice8Impl   *device;
     IDirect3DVolume8Impl   *volumes[MAX_LEVELS];
     BOOL                    Dirty;
 };
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.47
diff -u -r1.47 device.c
--- device.c	8 May 2003 17:36:00 -0000	1.47
+++ device.c	10 May 2003 16:23:57 -0000
@@ -994,9 +994,9 @@
     case D3DSTENCILOP_INCRSAT : return GL_INCR;
     case D3DSTENCILOP_DECRSAT : return GL_DECR;
     case D3DSTENCILOP_INVERT  : return GL_INVERT;
-    case D3DSTENCILOP_INCR    : FIXME("Unsupported stencil op %ld\n", op);
+    case D3DSTENCILOP_INCR    : FIXME("Unsupported stencil op D3DSTENCILOP_INCR\n");
                                 return GL_INCR; /* Fixme - needs to support wrap */
-    case D3DSTENCILOP_DECR    : FIXME("Unsupported stencil op %ld\n", op);
+    case D3DSTENCILOP_DECR    : FIXME("Unsupported stencil op D3DSTENCILOP_DECR\n");
                                 return GL_DECR; /* Fixme - needs to support wrap */
     default:
         FIXME("Invalid stencil op %ld\n", op);
@@ -1004,6 +1004,72 @@
     }
 }
 
+/**
+ * @nodoc: todo
+ */
+void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand) 
+{
+  BOOL isAlphaReplicate = FALSE;
+  BOOL isComplement     = FALSE;
+  
+  *operand = GL_SRC_COLOR;
+  *source = GL_TEXTURE;
+  
+  /* Catch alpha replicate */
+  if (iValue & D3DTA_ALPHAREPLICATE) {
+    iValue = iValue & ~D3DTA_ALPHAREPLICATE;
+    isAlphaReplicate = TRUE;
+  }
+  
+  /* Catch Complement */
+  if (iValue & D3DTA_COMPLEMENT) {
+    iValue = iValue & ~D3DTA_COMPLEMENT;
+    isComplement = TRUE;
+  }
+  
+  /* Calculate the operand */
+  if (isAlphaReplicate && !isComplement) {
+    *operand = GL_SRC_ALPHA;
+  } else if (isAlphaReplicate && isComplement) {
+    *operand = GL_ONE_MINUS_SRC_ALPHA;
+  } else if (isComplement) {
+    if (isAlphaArg) {
+      *operand = GL_ONE_MINUS_SRC_ALPHA;
+    } else {
+      *operand = GL_ONE_MINUS_SRC_COLOR;
+    }
+  } else {
+    if (isAlphaArg) {
+      *operand = GL_SRC_ALPHA;
+    } else {
+      *operand = GL_SRC_COLOR;
+    }
+  }
+  
+  /* Calculate the source */
+  switch (iValue & D3DTA_SELECTMASK) {
+  case D3DTA_CURRENT:   *source  = GL_PREVIOUS_EXT;
+    break;
+  case D3DTA_DIFFUSE:   *source  = GL_PRIMARY_COLOR_EXT;
+    break;
+  case D3DTA_TEXTURE:   *source  = GL_TEXTURE;
+    break;
+  case D3DTA_TFACTOR:   *source  = GL_CONSTANT_EXT;
+    break;
+  case D3DTA_SPECULAR:
+    /**
+     * According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
+     * isnt supported until base GL supports it
+     * There is no concept of temp registers as far as I can tell
+     */
+
+  default:
+    FIXME("Unrecognized or unhandled texture arg %ld\n", iValue);
+    *source = GL_TEXTURE;
+  }
+}
+
+
 /* Apply the current values to the specified texture stage */
 void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1154,7 +1220,9 @@
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain8** pSwapChain) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    *pSwapChain = NULL;
+    return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1173,11 +1241,16 @@
 
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
     *ppBackBuffer = (LPDIRECT3DSURFACE8) This->backBuffer;
     TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, BackBuffer, Type, *ppBackBuffer);
 
+    if (BackBuffer > This->PresentParms.BackBufferCount - 1) {
+      FIXME("Only one backBuffer currently supported\n");
+      return D3DERR_INVALIDCALL;
+    }
+
     /* Note inc ref on returned surface */
     IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppBackBuffer);
 
@@ -1185,7 +1258,8 @@
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetRasterStatus(LPDIRECT3DDEVICE8 iface, D3DRASTER_STATUS* pRasterStatus) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 void     WINAPI  IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags,CONST D3DGAMMARAMP* pRamp) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1217,6 +1291,7 @@
     object->usage = Usage;
     object->format = Format;
     object->device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/
 
     /* Calculate levels for mip mapping */
     if (Levels == 0) {
@@ -1237,7 +1312,8 @@
     for (i=0; i<object->levels; i++) 
     {
         IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]);
-        object->surfaces[i]->Container = (IUnknown*) object; /* FIXME: AddRef(object) */
+        object->surfaces[i]->Container = (IUnknown*) object;
+	/*IUnknown_AddRef(object->surfaces[i]->Container);*/
         object->surfaces[i]->myDesc.Usage = Usage;
         object->surfaces[i]->myDesc.Pool = Pool ;
 
@@ -1264,16 +1340,16 @@
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture8Impl));
     object->lpVtbl = &Direct3DVolumeTexture8_Vtbl;
     object->ResourceType = D3DRTYPE_VOLUMETEXTURE;
+    object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
     object->ref = 1;
 
-
     object->width = Width;
     object->height = Height;
     object->depth = Depth;
     object->levels = Levels;
     object->usage = Usage;
     object->format = Format;
-    object->device = This;
 
     /* Calculate levels for mip mapping */
     if (Levels == 0) {
@@ -1282,7 +1358,7 @@
         tmpH = Height;
         tmpD = Depth;
         while (tmpW > 1 && tmpH > 1 && tmpD > 1) {
-            tmpW = max(1,tmpW / 2);
+            tmpW = max(1, tmpW / 2);
             tmpH = max(1, tmpH / 2);
             tmpD = max(1, tmpD / 2);
             object->levels++;
@@ -1295,7 +1371,7 @@
     tmpH = Height;
     tmpD = Depth;
 
-    for (i=0; i<object->levels; i++) 
+    for (i = 0; i< object->levels; i++) 
     {
         IDirect3DVolume8Impl *volume;
 
@@ -1304,9 +1380,11 @@
         object->volumes[i] = (IDirect3DVolume8Impl *) volume;
 
         volume->lpVtbl = &Direct3DVolume8_Vtbl;
-        volume->Device = This; /* FIXME: AddRef(This) */
+        volume->Device = This;
+	/*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) volume->Device);*/
         volume->ResourceType = D3DRTYPE_VOLUME;
-        volume->Container = object;
+        volume->Container = (IUnknown*) object;
+	/*IUnknown_AddRef(volume->Container);*/	
         volume->ref = 1;
 
         volume->myDesc.Width = Width;
@@ -1343,14 +1421,14 @@
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DCubeTexture8Impl));
     object->lpVtbl = &Direct3DCubeTexture8_Vtbl;
     object->ref = 1;
-    object->Device = This; /* FIXME: AddRef(This) */
+    object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
     object->ResourceType = D3DRTYPE_CUBETEXTURE;
 
     object->edgeLength = EdgeLength;
     object->levels = Levels;
     object->usage = Usage;
     object->format = Format;
-    object->device = This;
 
     /* Calculate levels for mip mapping */
     if (Levels == 0) {
@@ -1365,17 +1443,18 @@
 
     /* Generate all the surfaces */
     tmpW = EdgeLength;
-    for (i=0; i<object->levels; i++) 
+    for (i = 0; i < object->levels; i++) 
     {
         /* Create the 6 faces */
-        for (j=0;j<6;j++) {
+        for (j = 0;j < 6; j++) {
            IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
            object->surfaces[j][i]->Container = (IUnknown*) object;
+	   /*IUnknown_AddRef(object->surfaces[j][i]->Container);*/
            object->surfaces[j][i]->myDesc.Usage = Usage;
            object->surfaces[j][i]->myDesc.Pool = Pool ;
 
            TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[j][i], object->surfaces[j][i]->allocatedMemory);
-           tmpW = max(1,tmpW / 2);
+           tmpW = max(1, tmpW / 2);
         }
     }
 
@@ -1383,8 +1462,7 @@
     *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8)object;
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage,
-                                                         DWORD FVF,D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) {
     IDirect3DVertexBuffer8Impl *object;
 
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1393,6 +1471,7 @@
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer8Impl));
     object->lpVtbl = &Direct3DVertexBuffer8_Vtbl;
     object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
     object->ResourceType = D3DRTYPE_VERTEXBUFFER;
     object->ref = 1;
     object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
@@ -1407,8 +1486,7 @@
 
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer8** ppIndexBuffer) {
-
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer8** ppIndexBuffer) {
     IDirect3DIndexBuffer8Impl *object;
 
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1417,8 +1495,9 @@
     /* Allocate the storage for the device */
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DIndexBuffer8Impl));
     object->lpVtbl = &Direct3DIndexBuffer8_Vtbl;
-    object->ref = 1;
     object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
+    object->ref = 1;
     object->ResourceType = D3DRTYPE_INDEXBUFFER;
 
     object->currentDesc.Type = D3DRTYPE_INDEXBUFFER;
@@ -1435,17 +1514,69 @@
 
     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_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) {
+    IDirect3DSurface8Impl *object;
+
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    /* up ref count on surface, surface->container = This */
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+
+    object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+    *ppSurface = (LPDIRECT3DSURFACE8) object;
+    object->lpVtbl = &Direct3DSurface8_Vtbl;
+    object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
+    object->ResourceType = D3DRTYPE_SURFACE;
+    object->Container = (IUnknown*) This;
+    /*IUnknown_AddRef(object->Container);*/
+
+    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_MANAGED;
+    object->myDesc.MultiSampleType = MultiSample;
+    object->bytesPerPixel = bytesPerPixel(Format);
+    object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
+    object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
+    object->lockable = Lockable;
+    object->locked = FALSE;
+
+    TRACE("(%p) : w(%d) h(%d) fmt(%d) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, 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) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) {
+    IDirect3DSurface8Impl *object;
+
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    /* surface->container = This */
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+
+    object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+    *ppSurface = (LPDIRECT3DSURFACE8) object;
+    object->lpVtbl = &Direct3DSurface8_Vtbl;
+    object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
+    object->ResourceType = D3DRTYPE_SURFACE;
+    object->Container = (IUnknown*) This;
+    /*IUnknown_AddRef(object->Container);*/
+
+    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_MANAGED;
+    object->myDesc.MultiSampleType = MultiSample;
+    object->bytesPerPixel = bytesPerPixel(Format);
+    object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
+    object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
+    object->lockable = TRUE;
+    object->locked = FALSE;
+
+    TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, *ppSurface, object->allocatedMemory, object->myDesc.Size);
+    return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,IDirect3DSurface8** ppSurface) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) {
     IDirect3DSurface8Impl *object;
 
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1454,19 +1585,23 @@
     *ppSurface = (LPDIRECT3DSURFACE8) object;
     object->lpVtbl = &Direct3DSurface8_Vtbl;
     object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
     object->ResourceType = D3DRTYPE_SURFACE;
     object->Container = (IUnknown*) This;
+    /*IUnknown_AddRef(object->Container);*/
 
     object->ref = 1;
-    object->myDesc.Width = Width;
-    object->myDesc.Height= Height;
-    object->myDesc.Format= Format;
+    object->myDesc.Width  = Width;
+    object->myDesc.Height = Height;
+    object->myDesc.Format = Format;
     object->myDesc.Type = D3DRTYPE_SURFACE;
-    /*object->myDesc.Usage */
-    object->myDesc.Pool = D3DPOOL_SYSTEMMEM ;
+    object->myDesc.Usage = 0;
+    object->myDesc.Pool = D3DPOOL_SYSTEMMEM;
     object->bytesPerPixel = bytesPerPixel(Format);
     object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
     object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
+    object->lockable = TRUE;
+    object->locked = FALSE;
 
     TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, *ppSurface, object->allocatedMemory, object->myDesc.Size);
     return D3D_OK;
@@ -1597,29 +1732,66 @@
     FIXME("(%p) : stub\n", This);    return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+
+    FIXME("(%p) : stub\n", This);
+
+    if (D3DFMT_A8R8G8B8 != ((IDirect3DSurface8Impl*) pDestSurface)->myDesc.Format) {
+      return D3DERR_INVALIDCALL;
+    }
+
+    D3DLOCKED_RECT lockedRect;
+    hr = IDirect3DSurface8Impl_LockRect(pDestSurface, &lockedRect, NULL, 0);
+    if (FAILED(hr)) {
+      return D3DERR_INVALIDCALL;
+    }
+
+    GLint  prev_store;
+    GLenum prev_read;
+    
+    ENTER_GL();
+
+    glFlush();
+    vcheckGLcall("glFlush");
+    glGetIntegerv(GL_READ_BUFFER, &prev_read);
+    vcheckGLcall("glIntegerv");
+    glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
+    vcheckGLcall("glIntegerv");
+ 
+    glReadBuffer(GL_FRONT);
+    vcheckGLcall("glReadBuffer");
+    glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+    vcheckGLcall("glPixelStorei");
+    glReadPixels(0, 0, This->PresentParms.BackBufferWidth, This->PresentParms.BackBufferHeight,
+		 GL_BGRA, GL_UNSIGNED_BYTE, lockedRect.pBits);
+    vcheckGLcall("glReadPixels");
+    glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
+    vcheckGLcall("glPixelStorei");
+    glReadBuffer(prev_read);
+    vcheckGLcall("glReadBuffer");
+    LEAVE_GL();
+
+    hr = IDirect3DSurface8Impl_UnlockRect(pDestSurface);
+    return hr;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget,IDirect3DSurface8* pNewZStencil) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    FIXME("(%p) : stub\n", This);
+    FIXME("(%p) : invalid stub expect crash\n", This);
 
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    /*TRACE("(%p) : returning %p\n", This, This->renderTarget); */
-    FIXME("(%p) : stub\n", This);
-
-    /*
-     **ppRenderTarget = (LPDIRECT3DSURFACE8) This->renderTarget;
-     *IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppRenderTarget);
-     */
 
+    TRACE("(%p)->(%p)\n", This, This->frontBuffer);
+    
+    *ppRenderTarget = (LPDIRECT3DSURFACE8) This->frontBuffer;
+    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppRenderTarget);
+    
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppZStencilSurface) {
-
     ICOM_THIS(IDirect3DDevice8Impl,iface);
 
     TRACE("(%p)->(%p)\n", This, ppZStencilSurface);
@@ -1674,7 +1846,7 @@
         curRect = NULL;
     }
 
-    for (i=0;i<Count || i==0; i++) {
+    for (i = 0; i < Count || i == 0; i++) {
 
         if (curRect) {
             /* Note gl uses lower left, width/height */
@@ -1852,14 +2024,14 @@
            }
 
            /* Reapply texture transforms as based off modelview when applied */
-           for (Stage=0; Stage<This->TextureUnits; Stage++) {
+           for (Stage = 0; Stage < This->TextureUnits; Stage++) {
 
                /* Now apply texture transforms if not applying to the dummy textures */
-   #if defined(GL_VERSION_1_3)
+#if defined(GL_VERSION_1_3)
                glActiveTexture(GL_TEXTURE0 + Stage);
-   #else 
+#else 
                glActiveTextureARB(GL_TEXTURE0_ARB + Stage);
-   #endif
+#endif
                checkGLcall("glActiveTexture(GL_TEXTURE0 + Stage);");
 
                glMatrixMode(GL_TEXTURE);
@@ -1966,7 +2138,7 @@
           m.u.s._21 = 1.0f; m.u.s._22 = 1.0f; m.u.s._23 = 1.0f; m.u.s._24 = 1.0f;
           m.u.s._31 = 1.0f; m.u.s._32 = 1.0f; m.u.s._33 = 1.0f; m.u.s._34 = 1.0f;
           m.u.s._41 = 1.0f; m.u.s._42 = 1.0f; m.u.s._43 = 1.0f; m.u.s._44 = 1.0f;
-          if (viewChanged==FALSE) {
+          if (viewChanged == FALSE) {
               glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
               checkGLcall("glLoadMatrixf");
           }
@@ -3039,7 +3211,7 @@
   
   TRACE("(%p)\n", This);
   
-  return  IDirect3DDeviceImpl_BeginStateBlock(This);
+  return IDirect3DDeviceImpl_BeginStateBlock(This);
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface, DWORD* pToken) {
   IDirect3DStateBlockImpl* pSB;
@@ -3357,69 +3529,19 @@
     case D3DTSS_COLORARG0             :
     case D3DTSS_ALPHAARG0             :
         /* FIXME: Mesa seems to struggle setting these at the moment */
-        break;
+        /*FIXME("COLORARG0/ALPHAARG0 support still a stub, Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value);*/
+        /*break;*/
 
     case D3DTSS_COLORARG1             :
     case D3DTSS_COLORARG2             :
     case D3DTSS_ALPHAARG1             :
     case D3DTSS_ALPHAARG2             :
         {
-            BOOL isAlphaReplicate = FALSE;
-            BOOL isComplement     = FALSE;
-            BOOL isAlphaArg       = (Type == D3DTSS_ALPHAARG1 || Type == D3DTSS_ALPHAARG2 || Type == D3DTSS_ALPHAARG0);
-            int  operand= GL_SRC_COLOR;
+            BOOL isAlphaArg = (Type == D3DTSS_ALPHAARG1 || Type == D3DTSS_ALPHAARG2 || Type == D3DTSS_ALPHAARG0);
+            int  operand = GL_SRC_COLOR;
             int  source = GL_TEXTURE;
 
-            /* Catch alpha replicate */
-            if (Value & D3DTA_ALPHAREPLICATE) {
-                Value = Value & ~D3DTA_ALPHAREPLICATE;
-                isAlphaReplicate = TRUE;
-            }
-
-            /* Catch Complement */
-            if (Value & D3DTA_COMPLEMENT) {
-                Value = Value & ~D3DTA_COMPLEMENT;
-                isComplement = TRUE;
-            }
-
-            /* Calculate the operand */
-            if (isAlphaReplicate && !isComplement) {
-                operand = GL_SRC_ALPHA;
-            } else if (isAlphaReplicate && isComplement) {
-                operand = GL_ONE_MINUS_SRC_ALPHA;
-            } else if (isComplement) {
-                if (isAlphaArg) {
-                    operand = GL_ONE_MINUS_SRC_ALPHA;
-                } else {
-                    operand = GL_ONE_MINUS_SRC_COLOR;
-                }
-            } else {
-                if (isAlphaArg) {
-                    operand = GL_SRC_ALPHA;
-                } else {
-                    operand = GL_SRC_COLOR;
-                }
-            }
-
-            /* Calculate the source */
-            switch (Value) {
-            case D3DTA_CURRENT:   source  = GL_PREVIOUS_EXT;
-                                  break;
-            case D3DTA_DIFFUSE:   source  = GL_PRIMARY_COLOR_EXT;
-                                  break;
-            case D3DTA_TEXTURE:   source  = GL_TEXTURE;
-                                  break;
-            case D3DTA_TFACTOR:   source  = GL_CONSTANT_EXT;
-                                  break;
-
-            /* According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
-               isnt supported until base GL supports it
-               There is no concept of temp registers as far as I can tell                          */
-
-            default:
-                FIXME("Unrecognized or unhandled texture arg %ld\n", Value);
-            }
-
+	    GetSrcAndOpFromValue(Value, isAlphaArg, &source, &operand);
             if (isAlphaArg) {
                 TRACE("Source %x = %x, Operand %x = %x\n", SOURCEx_ALPHA_EXT(Type), source, OPERANDx_ALPHA_EXT(Type), operand);
                 glTexEnvi(GL_TEXTURE_ENV, SOURCEx_ALPHA_EXT(Type), source);
@@ -3492,10 +3614,92 @@
                     break;
 
                 case D3DTOP_SELECTARG1                :
-                    glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
-                    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+		    {
+		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
+		        DWORD dwValue = 0;
+			GLenum source;
+			GLenum operand;			
+                        FIXME("see if D3DTOP_SELECTARG1 behavior is correct now!\n");
+                        glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+#if 0 /* don't seem to do anything */			
+			dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
+			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+			if (isAlphaOp) {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_ALPHA_EXT, source, GL_OPERAND0_ALPHA_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, 'operand')");
+			} else {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_RGB_EXT, source, GL_OPERAND0_RGB_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, 'operand')");
+			}
+			dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
+			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+			if (isAlphaOp) {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_ALPHA_EXT, source, GL_OPERAND1_ALPHA_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, 'operand')");
+			} else {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_RGB_EXT, source, GL_OPERAND1_RGB_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, 'operand')");
+			}
+#endif			
+		    }
                     break;
 
+                case D3DTOP_SELECTARG2                :
+		    { 
+		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
+		        DWORD dwValue = 0;
+			GLenum source;
+			GLenum operand;
+		        FIXME("see if D3DTOP_SELECTARG2 behavior is correct now!\n");
+                        glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
+			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+			/* GL_REPLACE, swap args 0 and 1? */
+			dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
+			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+			if (isAlphaOp) {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_ALPHA_EXT, source, GL_OPERAND0_ALPHA_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, 'operand')");
+			} else {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_RGB_EXT, source, GL_OPERAND0_RGB_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, 'operand')");
+			}
+		        dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
+			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+			if (isAlphaOp) {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_ALPHA_EXT, source, GL_OPERAND1_ALPHA_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, 'operand')");
+			} else {
+			  TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_RGB_EXT, source, GL_OPERAND1_RGB_EXT, operand);
+			  glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, source);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, 'source')");
+			  glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, operand);
+			  checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, 'operand')");
+			}
+		    }
+		    break;
+
                 case D3DTOP_MODULATE4X                : Scale = Scale * 2;  /* Drop through */
                 case D3DTOP_MODULATE2X                : Scale = Scale * 2;  /* Drop through */
                 case D3DTOP_MODULATE                  :
@@ -3535,9 +3739,17 @@
                     break;
 
                 case D3DTOP_SUBTRACT                  :
-                    /* glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT); Missing? */
-                case D3DTOP_SELECTARG2                :
-                    /* GL_REPLACE, swap args 0 and 1? */
+#if defined(GL_VERSION_1_3)
+                    glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT);
+		    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT)");
+		    break;
+#else
+		    /**
+		     * @TODO: to check:
+		     *  if ARB_texture_env_combine is supported
+		     *   we can use GL_SUBTRACT_ARB here
+		     */
+#endif
                 case D3DTOP_ADDSMOOTH                 :
                 case D3DTOP_BLENDDIFFUSEALPHA         :
                 case D3DTOP_BLENDTEXTUREALPHA         :
@@ -3619,52 +3831,77 @@
         break;
 
     case D3DTSS_TEXCOORDINDEX         :
-        /* CameraSpacePosition means use the vertex position, transformed to camera space, 
-           as the input texture coordinates for this stage's texture transformation. This 
-           equates roughly to EYE_LINEAR                                                  */
-        if (Value & D3DTSS_TCI_CAMERASPACEPOSITION) {
-            float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
-            float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
-            float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
-            float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
-            TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n");
-
-            glMatrixMode(GL_MODELVIEW);
-            glPushMatrix();
-            glLoadIdentity();
-            glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
-            glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
-            glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
-            glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
-            glPopMatrix();
-
-            TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n");
-            glEnable(GL_TEXTURE_GEN_S);
-            checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
-            glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
-            checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
-            glEnable(GL_TEXTURE_GEN_T);
-            checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
-            glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
-            checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
-            glEnable(GL_TEXTURE_GEN_R);
-            checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
-            glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
-            checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
-        }
-
-        /* Todo: */
-        if (Value && Value != D3DTSS_TCI_CAMERASPACEPOSITION) {
-            /* ? disable GL_TEXTURE_GEN_n ? */
-            FIXME("Unhandled D3DTSS_TEXCOORDINDEX %lx\n", Value);
+        {
+            /* CameraSpacePosition means use the vertex position, transformed to camera space, 
+	       as the input texture coordinates for this stage's texture transformation. This 
+	       equates roughly to EYE_LINEAR                                                  */
+	  
+	    /**
+	     * To Jason: i don't understand what to do with the (Value & 0x00FF) index
+	     * it seems a texture coordinate index (0 <= x <= 7) seeing msdn and logs 
+	     * have you any idea ?
+	     */
+
+	    /** 
+	     * Be carefull the value of the mask 0xF0000 come from d3d8types.h infos 
+	     */
+	    switch (Value & 0xFFFFFF00) {
+	    case D3DTSS_TCI_PASSTHRU:
+	      /*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/
+	      break;
+
+            case D3DTSS_TCI_CAMERASPACEPOSITION:
+	      {
+                float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
+                float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
+                float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
+                float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
+                TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n");
+
+		glMatrixMode(GL_MODELVIEW);
+		glPushMatrix();
+		glLoadIdentity();
+		glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
+		glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
+		glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
+		glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
+		glPopMatrix();
+		
+		TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n");
+		glEnable(GL_TEXTURE_GEN_S);
+		checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
+		glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+		checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
+		glEnable(GL_TEXTURE_GEN_T);
+		checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
+		glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+		checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
+		glEnable(GL_TEXTURE_GEN_R);
+		checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
+		glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+		checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
+	      }
+	      break;
+
+	    default:
+	        /* Todo: */
+	        /* ? disable GL_TEXTURE_GEN_n ? */
+	        FIXME("Unhandled D3DTSS_TEXCOORDINDEX %lx\n", Value);
+	        break;
+	    }
         }
         break;
 
         /* Unhandled */
     case D3DTSS_BUMPENVMAT00          :
     case D3DTSS_BUMPENVMAT01          :
+      TRACE("BUMPENVMAT0%u Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT00, Stage, Type, Value);
+      break;
     case D3DTSS_BUMPENVMAT10          :
     case D3DTSS_BUMPENVMAT11          :
+      TRACE("BUMPENVMAT1%u Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT10, Stage, Type, Value);
+      break;
+
     case D3DTSS_MIPMAPLODBIAS         :
     case D3DTSS_MAXMIPLEVEL           :
     case D3DTSS_MAXANISOTROPY         :
Index: directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.28
diff -u -r1.28 directx.c
--- directx.c	8 May 2003 17:36:00 -0000	1.28
+++ directx.c	10 May 2003 16:23:58 -0000
@@ -378,15 +378,14 @@
 
     {
         GLint gl_max;
-
 #if defined(GL_VERSION_1_3)
         glGetIntegerv(GL_MAX_TEXTURE_UNITS, &gl_max);
 #else
         glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
 #endif
+        TRACE("GLCaps: GL_MAX_TEXTURE_UNITS_ARB=%d\n", gl_max);
         pCaps->MaxTextureBlendStages = min(8, gl_max);
         pCaps->MaxSimultaneousTextures = min(8, gl_max);
-        TRACE("GLCaps: GL_MAX_TEXTURE_UNITS_ARB=%ld\n", pCaps->MaxTextureBlendStages);
 
         glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
         pCaps->MaxUserClipPlanes = min(MAX_CLIPPLANES, gl_max);
@@ -563,18 +562,27 @@
         }
     }
 
-    IDirect3DDevice8Impl_CreateImageSurface((LPDIRECT3DDEVICE8) object,
+    IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object,
+                                            pPresentationParameters->BackBufferWidth,
+                                            pPresentationParameters->BackBufferHeight,
+                                            pPresentationParameters->BackBufferFormat,
+					    D3DMULTISAMPLE_NONE, TRUE,
+                                            (LPDIRECT3DSURFACE8*) &object->frontBuffer);
+
+    IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object,
                                             pPresentationParameters->BackBufferWidth,
                                             pPresentationParameters->BackBufferHeight,
                                             pPresentationParameters->BackBufferFormat,
+					    D3DMULTISAMPLE_NONE, TRUE,
                                             (LPDIRECT3DSURFACE8*) &object->backBuffer);
 
     if (pPresentationParameters->EnableAutoDepthStencil)
-        IDirect3DDevice8Impl_CreateImageSurface((LPDIRECT3DDEVICE8) object,
-                                                pPresentationParameters->BackBufferWidth,
-                                                pPresentationParameters->BackBufferHeight,
-                                                pPresentationParameters->AutoDepthStencilFormat,
-                                                (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer);
+        IDirect3DDevice8Impl_CreateDepthStencilSurface((LPDIRECT3DDEVICE8) object,
+						       pPresentationParameters->BackBufferWidth,
+						       pPresentationParameters->BackBufferHeight,
+						       pPresentationParameters->AutoDepthStencilFormat,
+						       D3DMULTISAMPLE_NONE,
+						       (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer);
     
     /* Now override the surface's Flip method (if in double buffering) ?COPIED from DDRAW!?
     ((x11_ds_private *) surface->private)->opengl_flip = TRUE;
Index: indexbuffer.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/indexbuffer.c,v
retrieving revision 1.5
diff -u -r1.5 indexbuffer.c
--- indexbuffer.c	21 Apr 2003 22:38:14 -0000	1.5
+++ indexbuffer.c	10 May 2003 16:23:58 -0000
@@ -69,6 +69,7 @@
     ICOM_THIS(IDirect3DIndexBuffer8Impl,iface);
     TRACE("(%p) : returning %p\n", This, This->Device);
     *ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+    IDirect3DDevice8Impl_AddRef(*ppDevice);
     return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DIndexBuffer8Impl_SetPrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
Index: resource.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/resource.c,v
retrieving revision 1.3
diff -u -r1.3 resource.c
--- resource.c	12 Apr 2003 00:06:43 -0000	1.3
+++ resource.c	10 May 2003 16:23:59 -0000
@@ -66,6 +66,7 @@
     ICOM_THIS(IDirect3DResource8Impl,iface);
     TRACE("(%p) : returning %p\n", This, This->Device);
     *ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+    IDirect3DDevice8Impl_AddRef(*ppDevice);
     return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DResource8Impl_SetPrivateData(LPDIRECT3DRESOURCE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
Index: stateblock.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/stateblock.c,v
retrieving revision 1.2
diff -u -r1.2 stateblock.c
--- stateblock.c	12 Apr 2003 00:06:43 -0000	1.2
+++ stateblock.c	10 May 2003 16:23:59 -0000
@@ -200,9 +200,13 @@
 
         /* Make appropriate texture active */
         if (This->isMultiTexture) {
+#if defined(GL_VERSION_1_3)
+            glActiveTexture(GL_TEXTURE0 + i);
+#else
             glActiveTextureARB(GL_TEXTURE0_ARB + i);
+#endif
             checkGLcall("glActiveTextureARB");
-        } else if (i>0) {
+        } else if (i > 0) {
             FIXME("Program using multiple concurrent textures which this opengl implementation doesnt support\n");
         }
 
@@ -241,7 +245,7 @@
   if (object) {
     if (NULL == This->StateBlock) { /** if it the main stateblock only do init and returns */
       /*object->lpVtbl = &Direct3DStateBlock9_Vtbl;*/
-      object->device = This; /* FIXME: AddRef(This) */
+      object->device = This;
       object->ref = 1;
       object->blockType = Type;
       This->StateBlock = object;
@@ -254,7 +258,7 @@
     return E_OUTOFMEMORY;
   }
   /*object->lpVtbl = &Direct3DStateBlock9_Vtbl;*/
-  object->device = This; /* FIXME: AddRef(This) */
+  object->device = This;
   object->ref = 1;
   object->blockType = Type;
 
@@ -331,7 +335,7 @@
     return E_OUTOFMEMORY;
   }
   /*object->lpVtbl = &Direct3DVextexShaderDeclaration8_Vtbl;*/
-  object->device = This; /* FIXME: AddRef(This) */
+  object->device = This;
   object->ref = 1;
   
   This->isRecordingState = TRUE;
@@ -350,7 +354,7 @@
   }
 
   This->UpdateStateBlock->blockType = D3DSBT_RECORDED;
-  *ppStateBlock = This->UpdateStateBlock;
+  *ppStateBlock = This->UpdateStateBlock;  /* FIXME: AddRef() */
   This->isRecordingState = FALSE;
   This->UpdateStateBlock = This->StateBlock;
   
@@ -369,7 +373,7 @@
 
     if (pSB->blockType == D3DSBT_RECORDED || pSB->blockType == D3DSBT_ALL || pSB->blockType == D3DSBT_VERTEXSTATE) {
 
-        for (i=0; i<This->maxLights; i++) {
+        for (i = 0; i < This->maxLights; i++) {
 
             if (pSB->Set.lightEnable[i] && pSB->Changed.lightEnable[i])
                 IDirect3DDevice8Impl_LightEnable(iface, i, pSB->lightEnable[i]);
@@ -393,7 +397,7 @@
 
     /* Others + Render & Texture */
     if (pSB->blockType == D3DSBT_RECORDED || pSB->blockType == D3DSBT_ALL) {
-        for (i=0; i<HIGHEST_TRANSFORMSTATE; i++) {
+        for (i = 0; i < HIGHEST_TRANSFORMSTATE; i++) {
             if (pSB->Set.transform[i] && pSB->Changed.transform[i])
                 IDirect3DDevice8Impl_SetTransform(iface, i, &pSB->transforms[i]);
         }
@@ -412,7 +416,7 @@
                 IDirect3DDevice8Impl_SetStreamSource(iface, i, pSB->stream_source[i], pSB->stream_stride[i]);
         }
 
-        for (i=0; i<This->clipPlanes; i++) {
+        for (i = 0; i < This->clipPlanes; i++) {
             if (pSB->Set.clipplane[i] && pSB->Changed.clipplane[i]) {
                 float clip[4];
 
@@ -425,11 +429,9 @@
         }
 
         /* Render */
-        for (i=0; i<HIGHEST_RENDER_STATE; i++) {
-
+        for (i = 0; i < HIGHEST_RENDER_STATE; i++) {
             if (pSB->Set.renderstate[i] && pSB->Changed.renderstate[i])
                 IDirect3DDevice8Impl_SetRenderState(iface, i, pSB->renderstate[i]);
-
         }
 
         /* Texture */
@@ -447,15 +449,14 @@
 
     } else if (pSB->blockType == D3DSBT_PIXELSTATE) {
 
-        for (i=0; i<NUM_SAVEDPIXELSTATES_R; i++) {
+        for (i = 0; i < NUM_SAVEDPIXELSTATES_R; i++) {
             if (pSB->Set.renderstate[SavedPixelStates_R[i]] && pSB->Changed.renderstate[SavedPixelStates_R[i]])
                 IDirect3DDevice8Impl_SetRenderState(iface, SavedPixelStates_R[i], pSB->renderstate[SavedPixelStates_R[i]]);
 
         }
 
-        for (j=0; j<This->TextureUnits; i++) {
-            for (i=0; i<NUM_SAVEDPIXELSTATES_T; i++) {
-
+        for (j = 0; j < This->TextureUnits; i++) {
+            for (i = 0; i < NUM_SAVEDPIXELSTATES_T; i++) {
                 if (pSB->Set.texture_state[j][SavedPixelStates_T[i]] &&
                     pSB->Changed.texture_state[j][SavedPixelStates_T[i]])
                     IDirect3DDevice8Impl_SetTextureStageState(iface, j, SavedPixelStates_T[i], pSB->texture_state[j][SavedPixelStates_T[i]]);
@@ -464,15 +465,13 @@
 
     } else if (pSB->blockType == D3DSBT_VERTEXSTATE) {
 
-        for (i=0; i<NUM_SAVEDVERTEXSTATES_R; i++) {
+        for (i = 0; i < NUM_SAVEDVERTEXSTATES_R; i++) {
             if (pSB->Set.renderstate[SavedVertexStates_R[i]] && pSB->Changed.renderstate[SavedVertexStates_R[i]])
                 IDirect3DDevice8Impl_SetRenderState(iface, SavedVertexStates_R[i], pSB->renderstate[SavedVertexStates_R[i]]);
-
         }
 
-        for (j=0; j<This->TextureUnits; i++) {
-            for (i=0; i<NUM_SAVEDVERTEXSTATES_T; i++) {
-
+        for (j = 0; j < This->TextureUnits; i++) {
+            for (i = 0; i < NUM_SAVEDVERTEXSTATES_T; i++) {
                 if (pSB->Set.texture_state[j][SavedVertexStates_T[i]] &&
                     pSB->Changed.texture_state[j][SavedVertexStates_T[i]])
                     IDirect3DDevice8Impl_SetTextureStageState(iface, j, SavedVertexStates_T[i], pSB->texture_state[j][SavedVertexStates_T[i]]);
@@ -505,7 +504,7 @@
            across this action */
 
     } else {
-        int i,j;
+        int i, j;
 
         /* Recorded => Only update 'changed' values */
         if (updateBlock->Set.vertexShader && updateBlock->VertexShader != This->StateBlock->VertexShader) {
@@ -515,7 +514,7 @@
 
         /* TODO: Vertex Shader Constants */
 
-        for (i=0; i<This->maxLights; i++) {
+        for (i = 0; i < This->maxLights; i++) {
           if (updateBlock->Set.lightEnable[i] && This->StateBlock->lightEnable[i] != updateBlock->lightEnable[i]) {
               TRACE("Updating light enable for light %d to %d\n", i, This->StateBlock->lightEnable[i]);
               updateBlock->lightEnable[i] = This->StateBlock->lightEnable[i];
@@ -538,7 +537,7 @@
         /* TODO: Pixel Shader Constants */
 
         /* Others + Render & Texture */
-	for (i=0; i<HIGHEST_TRANSFORMSTATE; i++) {
+	for (i = 0; i < HIGHEST_TRANSFORMSTATE; i++) {
 	  if (updateBlock->Set.transform[i] && memcmp(&This->StateBlock->transforms[i], 
 						      &updateBlock->transforms[i], 
 						      sizeof(D3DMATRIX)) != 0) {
@@ -569,7 +568,7 @@
                 memcpy(&updateBlock->viewport, &This->StateBlock->viewport, sizeof(D3DVIEWPORT8));
        }
 
-       for (i=0; i<MAX_STREAMS; i++) {
+       for (i = 0; i < MAX_STREAMS; i++) {
            if (updateBlock->Set.stream_source[i] && 
                            ((updateBlock->stream_stride[i] != This->StateBlock->stream_stride[i]) ||
                            (updateBlock->stream_source[i] != This->StateBlock->stream_source[i]))) {
@@ -580,7 +579,7 @@
            }
        }
 
-       for (i=0; i<This->clipPlanes; i++) {
+       for (i = 0; i < This->clipPlanes; i++) {
            if (updateBlock->Set.clipplane[i] && memcmp(&This->StateBlock->clipplane[i], 
                                                        &updateBlock->clipplane[i], 
                                                        sizeof(updateBlock->clipplane)) != 0) {
@@ -592,7 +591,7 @@
        }
 
        /* Render */
-       for (i=0; i<HIGHEST_RENDER_STATE; i++) {
+       for (i = 0; i < HIGHEST_RENDER_STATE; i++) {
 
            if (updateBlock->Set.renderstate[i] && (updateBlock->renderstate[i] != 
                                                        This->StateBlock->renderstate[i])) {
@@ -602,8 +601,8 @@
        }
 
        /* Texture */
-       for (j=0; j<This->TextureUnits; j++) {
-           for (i=0; i<HIGHEST_TEXTURE_STATE; i++) {
+       for (j = 0; j < This->TextureUnits; j++) {
+           for (i = 0; i < HIGHEST_TEXTURE_STATE; i++) {
 
                if (updateBlock->Set.texture_state[j][i] && (updateBlock->texture_state[j][i] != 
                                                                 This->StateBlock->texture_state[j][i])) {
Index: surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.6
diff -u -r1.6 surface.c
--- surface.c	12 Apr 2003 00:06:43 -0000	1.6
+++ surface.c	10 May 2003 16:23:59 -0000
@@ -30,6 +30,14 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
+/* trace: */
+#if 1
+# define VTRACE(A) FIXME A
+#else 
+# define VTRACE(A) 
+#endif
+
+
 /* IDirect3DVolume IUnknown parts follow: */
 HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 iface,REFIID riid,LPVOID *ppobj)
 {
@@ -57,8 +65,8 @@
     ULONG ref = --This->ref;
     TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
     if (ref == 0) {
-        HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
-        HeapFree(GetProcessHeap(), 0, This);
+      HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
+      HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
 }
@@ -90,11 +98,6 @@
 HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void** ppContainer) {
     ICOM_THIS(IDirect3DSurface8Impl,iface);
     HRESULT res;
-    /*
-    TRACE("(%p) : returning %p\n", This, This->Container);
-    *ppContainer = This->Container;
-    return D3D_OK;
-    */
     res = IUnknown_QueryInterface(This->Container, riid, ppContainer);
     if (E_NOINTERFACE == res) { 
       /**
@@ -114,40 +117,226 @@
     memcpy(pDesc, &This->myDesc, sizeof(D3DSURFACE_DESC));
     return D3D_OK;
 }
-HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect,DWORD Flags) {
+HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
     ICOM_THIS(IDirect3DSurface8Impl,iface);
     /* fixme: should we really lock as such? */
+
+    if (FALSE == This->lockable) {
+      ERR("trying to lock unlockable surf@%p\n", This);  
+      return D3DERR_INVALIDCALL;
+    }
+
     TRACE("(%p) : rect=%p, output prect=%p, allMem=%p\n", This, pRect, pLockedRect, This->allocatedMemory);
 
-    pLockedRect->Pitch = This->bytesPerPixel * This->myDesc.Width;  /* Bytes / row */
+    pLockedRect->Pitch = This->bytesPerPixel * This->myDesc.Width;  /* Bytes / row */    
+    
     if (!pRect) {
-        pLockedRect->pBits = This->allocatedMemory;
+      pLockedRect->pBits = This->allocatedMemory;
+      This->lockedRect.left = 0;
+      This->lockedRect.top = 0;
+      This->lockedRect.right = This->myDesc.Width;
+      This->lockedRect.bottom = This->myDesc.Height;
+    } else {
+      TRACE("Lock Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
+      pLockedRect->pBits = This->allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * This->bytesPerPixel);
+      This->lockedRect.left = pRect->left;
+      This->lockedRect.top = pRect->top;
+      This->lockedRect.right = pRect->right;
+      This->lockedRect.bottom = pRect->bottom;
+    }
+
+
+
+    if (0 == This->myDesc.Usage) { /* classic surface */
+
+      /* Nothing to do ;) */
+
+    } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
+      
+      if (This == This->Device->backBuffer || This == This->Device->frontBuffer) {
+	GLint  prev_store;
+	GLenum prev_read;
+	
+	ENTER_GL();
+
+	/**
+	 * for render->surface copy begin to begin of allocatedMemory
+	 * unlock can be more easy
+	 */
+	pLockedRect->pBits = This->allocatedMemory;
+	
+	glFlush();
+	vcheckGLcall("glFlush");
+	glGetIntegerv(GL_READ_BUFFER, &prev_read);
+	vcheckGLcall("glIntegerv");
+	glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
+	vcheckGLcall("glIntegerv");
+
+	if (This == This->Device->backBuffer) {
+	  glReadBuffer(GL_BACK);
+	} else if (This == This->Device->frontBuffer) {
+	  glReadBuffer(GL_FRONT);
+	}
+	vcheckGLcall("glReadBuffer");
+
+	switch (This->myDesc.Format) { 
+	case D3DFMT_R5G6B5:
+	  {
+	    glReadPixels(This->lockedRect.left, This->lockedRect.top, 
+			 This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+			 GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pLockedRect->pBits);
+	    vcheckGLcall("glReadPixels");
+	  }
+	  break;
+	case D3DFMT_R8G8B8:
+	  {
+	    glReadPixels(This->lockedRect.left, This->lockedRect.top, 
+			 This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+			 GL_RGB, GL_UNSIGNED_BYTE, pLockedRect->pBits);
+	    vcheckGLcall("glReadPixels");
+	  }
+	  break;
+	case D3DFMT_A8R8G8B8:
+	  {
+	    glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+	    vcheckGLcall("glPixelStorei");
+	    glReadPixels(This->lockedRect.left, This->lockedRect.top, 
+			 This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+			 GL_BGRA, GL_UNSIGNED_BYTE, pLockedRect->pBits);
+	    vcheckGLcall("glReadPixels");
+	    glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
+	    vcheckGLcall("glPixelStorei");
+	  }
+	  break;
+	default:
+	  FIXME("Unsupported Format %u in locking func\n", This->myDesc.Format);
+	}
+
+	glReadBuffer(prev_read);
+	vcheckGLcall("glReadBuffer");
+	LEAVE_GL();
+      } else {
+	FIXME("unsupported locking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      }
+
+    } else if (D3DUSAGE_DEPTHSTENCIL & This->myDesc.Usage) { /* stencil surfaces */
+
+      FIXME("TODO stencil depth surface locking surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+
     } else {
-        TRACE("Lock Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
-        pLockedRect->pBits = This->allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * This->bytesPerPixel);
+      FIXME("unsupported locking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
     }
+
     TRACE("returning pBits=%p, pitch=%d\n", pLockedRect->pBits, pLockedRect->Pitch);
+
+    This->locked = TRUE;
     return D3D_OK;
 }
 HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DSurface8Impl,iface);
+    
+    if (FALSE == This->locked) {
+      ERR("trying to lock unlocked surf@%p\n", This);  
+      return D3DERR_INVALIDCALL;
+    }
+
     TRACE("(%p) : stub\n", This);
-    if (This->Container) {
-        IDirect3DBaseTexture8 *cont = (IDirect3DBaseTexture8*) This->Container;
 
-        /* Now setup the texture appropraitly */
-        int containerType = IDirect3DBaseTexture8Impl_GetType(cont);
-        if (containerType == D3DRTYPE_TEXTURE) {
+    if (0 == This->myDesc.Usage) { /* classic surface */
+      if (This->Container) {
+	IDirect3DBaseTexture8* cont = NULL;
+	hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont);
+	
+	if (SUCCEEDED(hr) && NULL != cont) {
+	  /* Now setup the texture appropraitly */
+	  int containerType = IDirect3DBaseTexture8Impl_GetType(cont);
+	  if (containerType == D3DRTYPE_TEXTURE) {
             IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont;
             pTexture->Dirty = TRUE;
-        } else if (containerType == D3DRTYPE_CUBETEXTURE) {
+	  } else if (containerType == D3DRTYPE_CUBETEXTURE) {
             IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont;
             pTexture->Dirty = TRUE;
-
-        } else {
+	  } else {
             FIXME("Set dirty on container type %d\n", containerType);
-        }
+	  }
+	  IDirect3DBaseTexture8_Release(cont);
+	  cont = NULL;
+	}
+      }
+    } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
+
+      if (This == This->Device->backBuffer || This == This->Device->frontBuffer) {
+	GLint  prev_store;
+	GLenum prev_draw;
+	
+	ENTER_GL();
+	
+	glFlush();
+	vcheckGLcall("glFlush");
+	glGetIntegerv(GL_DRAW_BUFFER, &prev_draw);
+	vcheckGLcall("glIntegerv");
+	glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
+	vcheckGLcall("glIntegerv");
+
+	if (This == This->Device->backBuffer) {
+	  glDrawBuffer(GL_BACK);
+	} else if (This == This->Device->frontBuffer) {
+	  glDrawBuffer(GL_FRONT);
+	}
+	vcheckGLcall("glDrawBuffer");
+
+	glRasterPos2i(This->lockedRect.left, This->lockedRect.top);
+	vcheckGLcall("glRasterPos2f");
+	switch (This->myDesc.Format) {
+	case D3DFMT_R5G6B5:
+	  {
+	    glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+			 GL_RGB, GL_UNSIGNED_SHORT_5_6_5, This->allocatedMemory);
+	    vcheckGLcall("glDrawPixels");
+	  }
+	  break;
+	case D3DFMT_R8G8B8:
+	  {
+	    glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+			 GL_RGB, GL_UNSIGNED_BYTE, This->allocatedMemory);
+	    vcheckGLcall("glDrawPixels");
+	  }
+	  break;
+	case D3DFMT_A8R8G8B8:
+	  {
+	    glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+	    vcheckGLcall("glPixelStorei");
+	    glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+			 GL_BGRA, GL_UNSIGNED_BYTE, This->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);
+	}
+
+	glDrawBuffer(prev_draw);
+	vcheckGLcall("glDrawBuffer");
+	LEAVE_GL();
+      } else {
+	FIXME("unsupported unlocking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      }
+
+    } else if (D3DUSAGE_DEPTHSTENCIL & This->myDesc.Usage) { /* stencil surfaces */
+    
+      if (This == This->Device->depthStencilBuffer) {
+	FIXME("TODO stencil depth surface unlocking surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      } else {
+	FIXME("unsupported unlocking to StencilDepth surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+      }
+
+    } else {
+      FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
     }
+    This->locked = FALSE;
     return D3D_OK;
 }
 
Index: swapchain.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/swapchain.c,v
retrieving revision 1.3
diff -u -r1.3 swapchain.c
--- swapchain.c	12 Apr 2003 00:06:43 -0000	1.3
+++ swapchain.c	10 May 2003 16:23:59 -0000
@@ -64,11 +64,14 @@
 /* IDirect3DSwapChain parts follow: */
 HRESULT WINAPI IDirect3DSwapChain8Impl_Present(LPDIRECT3DSWAPCHAIN8 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) {
     ICOM_THIS(IDirect3DSwapChain8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);
+    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) {
     ICOM_THIS(IDirect3DSwapChain8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    *ppBackBuffer = NULL;
+    return D3D_OK;
 }
 
 
Index: vertexbuffer.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/vertexbuffer.c,v
retrieving revision 1.3
diff -u -r1.3 vertexbuffer.c
--- vertexbuffer.c	12 Apr 2003 00:06:43 -0000	1.3
+++ vertexbuffer.c	10 May 2003 16:23:59 -0000
@@ -69,6 +69,7 @@
     ICOM_THIS(IDirect3DVertexBuffer8Impl,iface);
     TRACE("(%p) : returning %p\n", This, This->Device);
     *ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+    IDirect3DDevice8Impl_AddRef(*ppDevice);
     return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DVertexBuffer8Impl_SetPrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
@@ -118,12 +119,12 @@
     ICOM_THIS(IDirect3DVertexBuffer8Impl,iface);
 
     TRACE("(%p)\n", This);
-    pDesc->Format= This->currentDesc.Format;
-    pDesc->Type=   This->currentDesc.Type;
-    pDesc->Usage=  This->currentDesc.Usage;
-    pDesc->Pool=   This->currentDesc.Pool;
-    pDesc->Size=   This->currentDesc.Size;
-    pDesc->FVF=    This->currentDesc.FVF;
+    pDesc->Format = This->currentDesc.Format;
+    pDesc->Type   = This->currentDesc.Type;
+    pDesc->Usage  = This->currentDesc.Usage;
+    pDesc->Pool   = This->currentDesc.Pool;
+    pDesc->Size   = This->currentDesc.Size;
+    pDesc->FVF    = This->currentDesc.FVF;
     return D3D_OK;
 }
 
Index: volume.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volume.c,v
retrieving revision 1.4
diff -u -r1.4 volume.c
--- volume.c	12 Apr 2003 00:06:43 -0000	1.4
+++ volume.c	10 May 2003 16:23:59 -0000
@@ -92,6 +92,7 @@
     ICOM_THIS(IDirect3DVolume8Impl,iface);
     TRACE("(%p) : returning %p\n", This, This->Container);
     *ppContainer = This->Container;
+    IUnknown_AddRef(This->Container);
     return D3D_OK;
 }
 HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DVOLUME_DESC* pDesc) {
@@ -113,8 +114,7 @@
         TRACE("No box supplied - all is ok\n");
         pLockedVolume->pBits = This->allocatedMemory;
     } else {
-        TRACE("Lock Box (%p) = l %d, t %d, r %d, b %d, fr %d, ba %d\n", pBox, pBox->Left, pBox->Top, 
-                  pBox->Right, pBox->Bottom, pBox->Front, pBox->Back);
+        TRACE("Lock Box (%p) = l %d, t %d, r %d, b %d, fr %d, ba %d\n", pBox, pBox->Left, pBox->Top, pBox->Right, pBox->Bottom, pBox->Front, pBox->Back);
         pLockedVolume->pBits = This->allocatedMemory + 
             (pLockedVolume->SlicePitch * pBox->Front) + /* FIXME: is front < back or vica versa? */
             (pLockedVolume->RowPitch * pBox->Top) + 
@@ -122,16 +122,12 @@
     }
     TRACE("returning pBits=%p, rpitch=%d, spitch=%d\n", pLockedVolume->pBits, pLockedVolume->RowPitch, pLockedVolume->SlicePitch);
     return D3D_OK;
-
-
-
-    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) {
     ICOM_THIS(IDirect3DVolume8Impl,iface);
     TRACE("(%p) : stub\n", This);
     if (This->Container) {
-        IDirect3DVolumeTexture8 *cont = This->Container;
+        IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container;
 
         int containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
         if (containerType == D3DRTYPE_VOLUMETEXTURE) {
Index: volumetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volumetexture.c,v
retrieving revision 1.5
diff -u -r1.5 volumetexture.c
--- volumetexture.c	12 Apr 2003 00:06:43 -0000	1.5
+++ volumetexture.c	10 May 2003 16:23:59 -0000
@@ -62,7 +62,7 @@
 
     TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
     if (ref == 0) {
-        for (i=0; i<This->levels; i++) {
+        for (i = 0; i < This->levels; i++) {
             if (This->volumes[i] != NULL) {
                 TRACE("(%p) : Releasing volume %p\n", This, This->volumes[i]);
                 IDirect3DVolume8Impl_Release((LPDIRECT3DVOLUME8) This->volumes[i]);


More information about the wine-patches mailing list