[dx8-25] huge things

Raphaël Junqueira fenix at club-internet.fr
Wed May 14 03:37:27 CDT 2003


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

Hi again,
  
now the real things:

Changelog:
  - declare a new debug chanel for vertex shaders
  - some usefull debug functions for textures format (maybe i'll move this 
utils into an util.c file later)
  - use of this functions ;)
  - correct DrawPrimitive (RHW correctness and vshader RHW)
  - more copyrects fixes (only two unimplemented behavior remains)
  - fix GetFrontBuffer to get screenshots samples working (ugly but i'll try 
better later)
  - add D3DCOLORTOGLFLOAT4 and use it
  - first try of D3DRS_FOGTABLEMODE support

TODO:
 - beautify the code to remove all my stupid emacs tabs
 - bind cube maps in draw
 - more readable and usefull debugging traces
 - d3dcore ?
 - fix sw vshaders and merge hw vshader prototypes
 
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+wgBHp7NA3AmQTU4RApONAJwPJXujh5iQhZYDTMoauzOr9KLrSgCgiFH6
NxffH2DagJT0SJNmNSFY4pw=
=BErd
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.52
diff -u -r1.52 device.c
--- device.c	14 May 2003 00:00:12 -0000	1.52
+++ device.c	14 May 2003 08:26:35 -0000
@@ -38,6 +38,7 @@
 #undef GL_VERSION_1_4
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
 
 /* Some #defines for additional diagnostics */
 
@@ -78,6 +79,79 @@
 #define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w);
 
 
+const char* debug_d3dformat(D3DFORMAT fmt) {
+  switch (fmt) {
+#define FMT_TO_STR(fmt) case fmt: return #fmt
+    FMT_TO_STR(D3DFMT_UNKNOWN);
+
+    FMT_TO_STR(D3DFMT_R8G8B8);
+    FMT_TO_STR(D3DFMT_A8R8G8B8);
+    FMT_TO_STR(D3DFMT_X8R8G8B8);
+    FMT_TO_STR(D3DFMT_R5G6B5);
+    FMT_TO_STR(D3DFMT_X1R5G5B5);
+    FMT_TO_STR(D3DFMT_A1R5G5B5);
+    FMT_TO_STR(D3DFMT_A4R4G4B4);
+    FMT_TO_STR(D3DFMT_R3G3B2);
+    FMT_TO_STR(D3DFMT_A8);
+    FMT_TO_STR(D3DFMT_A8R3G3B2);
+    FMT_TO_STR(D3DFMT_X4R4G4B4);
+
+    FMT_TO_STR(D3DFMT_A8P8);
+    FMT_TO_STR(D3DFMT_P8);
+
+    FMT_TO_STR(D3DFMT_L8);
+    FMT_TO_STR(D3DFMT_A8L8);
+    FMT_TO_STR(D3DFMT_A4L4);
+
+    FMT_TO_STR(D3DFMT_V8U8);
+    FMT_TO_STR(D3DFMT_L6V5U5);
+    FMT_TO_STR(D3DFMT_X8L8V8U8);
+    FMT_TO_STR(D3DFMT_Q8W8V8U8);
+    FMT_TO_STR(D3DFMT_V16U16);
+    FMT_TO_STR(D3DFMT_W11V11U10);
+
+    FMT_TO_STR(D3DFMT_UYVY);
+    FMT_TO_STR(D3DFMT_YUY2);
+    FMT_TO_STR(D3DFMT_DXT1);
+    FMT_TO_STR(D3DFMT_DXT2);
+    FMT_TO_STR(D3DFMT_DXT3);
+    FMT_TO_STR(D3DFMT_DXT4);
+    FMT_TO_STR(D3DFMT_DXT5);
+    
+    FMT_TO_STR(D3DFMT_D16_LOCKABLE);
+    FMT_TO_STR(D3DFMT_D32);
+    FMT_TO_STR(D3DFMT_D15S1);
+    FMT_TO_STR(D3DFMT_D24S8);
+    FMT_TO_STR(D3DFMT_D16);
+    FMT_TO_STR(D3DFMT_D24X8);
+    FMT_TO_STR(D3DFMT_D24X4S4);
+
+    FMT_TO_STR(D3DFMT_VERTEXDATA);
+    FMT_TO_STR(D3DFMT_INDEX16);
+    FMT_TO_STR(D3DFMT_INDEX32);
+#undef FMT_TO_STR
+  default:
+    FIXME("Unrecognized %u D3DFORMAT!\n", fmt);
+    return "unrecognized";
+  }
+}
+
+const char* debug_d3dressourcetype(D3DRESOURCETYPE res) {
+  switch (res) {
+#define RES_TO_STR(res) case res: return #res;
+    RES_TO_STR(D3DRTYPE_SURFACE);
+    RES_TO_STR(D3DRTYPE_VOLUME);
+    RES_TO_STR(D3DRTYPE_TEXTURE);
+    RES_TO_STR(D3DRTYPE_VOLUMETEXTURE);
+    RES_TO_STR(D3DRTYPE_CUBETEXTURE);
+    RES_TO_STR(D3DRTYPE_VERTEXBUFFER);
+    RES_TO_STR(D3DRTYPE_INDEXBUFFER);
+#undef  RES_TO_STR
+  default:
+    FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res);
+    return "unrecognized";
+  }
+}
 
 /* Routine common to the draw primitive and draw indexed primitive routines */
 void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface,
@@ -197,38 +271,51 @@
         }
 
         if (isRHW) {
-            double height, width, minZ, maxZ;
+            double X, Y, height, width, minZ, maxZ;
             /*
              * Already transformed vertex do not need transform
              * matrices. Reset all matrices to identity.
              * Leave the default matrix in world mode.
              */
-            glMatrixMode(GL_PROJECTION);
+            glMatrixMode(GL_MODELVIEW);
             checkGLcall("glMatrixMode");
             glLoadIdentity();
             checkGLcall("glLoadIdentity");
-            glMatrixMode(GL_MODELVIEW);
+	    /**
+	     * As seen in d3d7 code:
+	     *  See the OpenGL Red Book for an explanation of the following translation (in the OpenGL
+	     *  Correctness Tips section).
+	     */
+	    glTranslatef(0.375f, 0.375f, 0.0f);
+	    /**
+	     * 
+	     */
+            glMatrixMode(GL_PROJECTION);
             checkGLcall("glMatrixMode");
             glLoadIdentity();
             checkGLcall("glLoadIdentity");
+	    X = This->StateBlock->viewport.X;
+	    Y = This->StateBlock->viewport.Y;
             height = This->StateBlock->viewport.Height;
             width = This->StateBlock->viewport.Width;
             minZ = This->StateBlock->viewport.MinZ;
             maxZ = This->StateBlock->viewport.MaxZ;
             TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
-            glOrtho(0.0, width, height, 0.0, -minZ, -maxZ);
+            /*glOrtho(0.0, width, height, 0.0, -minZ, -maxZ);*/
+	    glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
             checkGLcall("glOrtho");
         } else {
-            glMatrixMode(GL_PROJECTION);
-            checkGLcall("glMatrixMode");
-            glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_PROJECTION].u.m[0][0]);
-            checkGLcall("glLoadMatrixf");
             glMatrixMode(GL_MODELVIEW);
             checkGLcall("glMatrixMode");
             glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
             checkGLcall("glLoadMatrixf");
             glMultMatrixf((float *) &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]);
             checkGLcall("glMultMatrixf");
+
+            glMatrixMode(GL_PROJECTION);
+            checkGLcall("glMatrixMode");
+            glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_PROJECTION].u.m[0][0]);
+            checkGLcall("glLoadMatrixf");
         }
 
         /* Set OpenGL to the appropriate Primitive Type */
@@ -279,7 +366,7 @@
            vertex arrays, we need to drop down to the slow mechanism for  
            certain functions                                              */
 
-        if (isPtSize || isDiffuse || useVertexShaderFunction==TRUE || (numBlends > 0)) {
+        if (isPtSize || isDiffuse || useVertexShaderFunction == TRUE || (numBlends > 0)) {
             TRACE("Using slow per-vertex code\n");
 
             /* Enable this one to be able to debug what is going on, but it is slower
@@ -524,7 +611,7 @@
 		    }
 		    /*diffuseColor = D3DCOLOR_COLORVALUE(vertex_shader->output.oD[0]);*/
 		    glColor4fv((float*) &vertex_shader->output.oD[0]);
-
+		    
 		    /* Requires secondary color extensions to compile... */
 #if defined(GL_VERSION_1_4)
 		    glSecondaryColor3fv((float*) &vertex_shader->output.oD[1]);
@@ -601,12 +688,15 @@
                     }
 
                     if (1.0f == rhw || rhw < 0.01f) {
-                        VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z));
+                        TRACE_(d3d_shader)("Vertex: glVertex:x,y,z=%f,%f,%f\n", x, y, z);
                         glVertex3f(x, y, z);
                         /*checkGLcall("glVertex3f");*/
                     } else {
-                        VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f / rhw=%f\n", x,y,z,rhw));
-                        glVertex4f(x / rhw, y / rhw, z / rhw, 1.0f / rhw);
+		        GLfloat w = 1.0f / rhw;
+                        TRACE_(d3d_shader)("Vertex: glVertex:x,y,z=%f,%f,%f / rhw=%f\n", x,y,z,rhw);
+			
+                        /*glVertex4f(x / rhw, y / rhw, z / rhw, 1.0f / rhw);*/
+			glVertex4f(x * w, y * w, z * w, 1.0f);
                         /*checkGLcall("glVertex4f");*/
                     }
                 } else { 
@@ -891,7 +981,7 @@
 }
 
 /*
-    Simple utility routines used for dx -> gl mapping of byte formats
+ * Simple utility routines used for dx -> gl mapping of byte formats
  */
 SHORT bytesPerPixel(D3DFORMAT fmt) {
     SHORT retVal;
@@ -914,15 +1004,16 @@
     case D3DFMT_D24X4S4:          retVal = 4; break;
     /* unknown */				  
     case D3DFMT_UNKNOWN:
-        /* Guess at the highest value of the above */
-        TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %d\n", fmt);
-        retVal = 4;
-        break;
+      /* Guess at the highest value of the above */
+      TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %d\n", fmt);
+      retVal = 4;
+      break;
+
     default:
-        FIXME("Unhandled fmt %d\n", fmt);
-        retVal = 4;
+      FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
+      retVal = 4;
     }
-    TRACE("bytes/Pxl for fmt %d = %d\n", fmt, retVal);
+    TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
     return retVal;
 }
 
@@ -937,10 +1028,10 @@
     case D3DFMT_R5G6B5:           retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
     case D3DFMT_A1R5G5B5:         retVal = GL_RGB5_A1; break;
     default:
-        FIXME("Unhandled fmt %d\n", fmt);
+        FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
         retVal = 4;
     }
-    TRACE("fmt2glintFmt for fmt %d = %x\n", fmt, retVal);
+    TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
     return retVal;
 }
 GLenum fmt2glFmt(D3DFORMAT fmt) {
@@ -954,10 +1045,10 @@
     case D3DFMT_R5G6B5:           retVal = GL_RGB; break;
     case D3DFMT_A1R5G5B5:         retVal = GL_BGRA; break;
     default:
-        FIXME("Unhandled fmt %d\n", fmt);
+        FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
         retVal = 4;
     }
-    TRACE("fmt2glFmt for fmt %d = %x\n", fmt, retVal);
+    TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
     return retVal;
 }
 DWORD fmt2glType(D3DFORMAT fmt) {
@@ -967,14 +1058,14 @@
     case D3DFMT_A4R4G4B4:         retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
     case D3DFMT_A8R8G8B8:         retVal = GL_UNSIGNED_BYTE; break;
     case D3DFMT_X8R8G8B8:         retVal = GL_UNSIGNED_BYTE; break;
-    case D3DFMT_R5G6B5:           retVal = GL_UNSIGNED_SHORT_5_6_5_REV; break;
+    case D3DFMT_R5G6B5:           retVal = GL_UNSIGNED_SHORT_5_6_5; break;
     case D3DFMT_R8G8B8:           retVal = GL_UNSIGNED_BYTE; break;
     case D3DFMT_A1R5G5B5:         retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
     default:
-        FIXME("Unhandled fmt %d\n", fmt);
+        FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
         retVal = 4;
     }
-    TRACE("fmt2glType for fmt %d = %x\n", fmt, retVal);
+    TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
     return retVal;
 }
 
@@ -1117,7 +1208,7 @@
 /* Apply the current values to the specified texture stage */
 void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    int i=0;
+    int i = 0;
     float col[4];
 
     /* Make appropriate texture active */
@@ -1133,16 +1224,19 @@
     }
 
     TRACE("-----------------------> Updating the texture at stage %ld to have new texture state information\n", Stage);
-    for (i=1; i<HIGHEST_TEXTURE_STATE; i++) {
+    for (i = 1; i < HIGHEST_TEXTURE_STATE; i++) {
         IDirect3DDevice8Impl_SetTextureStageState(iface, Stage, i, This->StateBlock->texture_state[Stage][i]);
     }
 
     /* Note the D3DRS value applies to all textures, but GL has one
        per texture, so apply it now ready to be used!               */
+#if 0
     col[0] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR]>> 16) & 0xFF) / 255.0;
     col[1] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR] >> 8 ) & 0xFF) / 255.0;
     col[2] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR] >> 0 ) & 0xFF) / 255.0;
     col[3] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR] >> 24 ) & 0xFF) / 255.0;
+#endif
+    D3DCOLORTOGLFLOAT4(This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR], col);
     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
     checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
 
@@ -1487,8 +1581,7 @@
 
     /* 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++) {
            IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
@@ -1496,6 +1589,7 @@
 	   /*IUnknown_AddRef(object->surfaces[j][i]->Container);*/
            object->surfaces[j][i]->myDesc.Usage = Usage;
            object->surfaces[j][i]->myDesc.Pool = Pool;
+	   /*object->surfaces[j][i]->myDesc.Format = Format;*/
 
            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);
@@ -1665,8 +1759,8 @@
     IDirect3DBaseTexture8* texture = NULL;
 
 
-    IDirect3DSurface8Impl *src = (IDirect3DSurface8Impl*) pSourceSurface;
-    IDirect3DSurface8Impl *dst = (IDirect3DSurface8Impl*) pDestinationSurface;
+    IDirect3DSurface8Impl* src = (IDirect3DSurface8Impl*) pSourceSurface;
+    IDirect3DSurface8Impl* dst = (IDirect3DSurface8Impl*) pDestinationSurface;
 
     ICOM_THIS(IDirect3DDevice8Impl,iface);
     TRACE("(%p) srcsur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", This,
@@ -1706,65 +1800,90 @@
     }
 
     /* Quick if complete copy ... */
-    if (rc == D3D_OK && (cRects == 0 && pSourceRectsArray==NULL && pDestPointsArray==NULL &&
-                         src->myDesc.Width == dst->myDesc.Width &&
-                         src->myDesc.Height == dst->myDesc.Height)) {
-        D3DLOCKED_RECT lr;
+    if (rc == D3D_OK && cRects == 0 && pSourceRectsArray == NULL && pDestPointsArray == NULL) {
 
-        IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)src, &lr, NULL, D3DLOCK_READONLY);
-        IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)dst, &lr, NULL, D3DLOCK_DISCARD);
-        TRACE("Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d\n", dst->myDesc.Width, dst->myDesc.Height);
+      if (src->myDesc.Width == dst->myDesc.Width && src->myDesc.Height == dst->myDesc.Height) {
 
-        memcpy(dst->allocatedMemory, src->allocatedMemory, src->myDesc.Size);
+        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);
 
-        IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)src);
-        IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)dst);
+	/*memcpy(dst->allocatedMemory, src->allocatedMemory, src->myDesc.Size);*/
+	memcpy(lrDst.pBits, lrSrc.pBits, src->myDesc.Size);
+ 
+        IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src);
+        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;
+
+      }
+
     } else {
-        int i;
+
+      if (NULL != pSourceRectsArray && NULL != pDestPointsArray) {
+
         int bytesPerPixel = ((IDirect3DSurface8Impl *)pSourceSurface)->bytesPerPixel;
-        int pitchFrom     = ((IDirect3DSurface8Impl *)pSourceSurface)->myDesc.Width * bytesPerPixel;
+#if 0
+	int pitchFrom     = ((IDirect3DSurface8Impl *)pSourceSurface)->myDesc.Width * bytesPerPixel;
         int pitchTo       = ((IDirect3DSurface8Impl *)pDestinationSurface)->myDesc.Width * bytesPerPixel;
-
         char *copyfrom = ((IDirect3DSurface8Impl *)pSourceSurface)->allocatedMemory;
         char *copyto   = ((IDirect3DSurface8Impl *)pDestinationSurface)->allocatedMemory;
-
+        char *from;
+        char *to;
+#endif
+        int i;
         /* Copy rect by rect */
-        for (i=0; i<cRects; i++) {
-            CONST RECT *r = &pSourceRectsArray[i];
-            CONST POINT *p = &pDestPointsArray[i];
-            char *from;
-            char *to;
-            int   copyperline   = (r->right - r->left) * bytesPerPixel;
+        for (i = 0; i < cRects; i++) {
+            CONST RECT*  r = &pSourceRectsArray[i];
+            CONST POINT* p = &pDestPointsArray[i];
+            int copyperline = (r->right - r->left) * bytesPerPixel;
             int j;
-            D3DLOCKED_RECT lr;
-            RECT           dest_rect;
+            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);
+            TRACE("Copying rect %d (%ld,%ld),(%ld,%ld) -> (%ld,%ld)\n", i, r->left, r->top, r->right, r->bottom, p->x, p->y);
 
-            IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)src, &lr, r, D3DLOCK_READONLY);
-            dest_rect.left = p->x;
-            dest_rect.top = p->y;
+            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.left = p->y + (r->bottom - r->top);
-            IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)dst, &lr, &dest_rect, 0L);
+            dest_rect.left  = p->y + (r->bottom - r->top);
+            IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, &dest_rect, 0L);
             TRACE("Locked src and dst\n");
 
             /* Find where to start */
+#if 0
             from = copyfrom + (r->top * pitchFrom) + (r->left * bytesPerPixel);
             to   = copyto   + (p->y * pitchTo) + (p->x * bytesPerPixel);
-
             /* Copy line by line */
-            for (j=0; j<(r->bottom - r->top); j++) {
-               memcpy(to + (j*pitchTo), from + (j*pitchFrom), copyperline);
+            for (j = 0; j < (r->bottom - r->top); j++) {
+               memcpy(to + (j * pitchTo), from + (j * pitchFrom), copyperline);
             }
+#endif
 
-            IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)src);
-            IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)dst);
+	    for (j = 0; j < (r->bottom - r->top); j++) {
+               memcpy((char*) lrDst.pBits + (j * lrDst.Pitch), (char*) lrSrc.pBits + (j * lrSrc.Pitch), copyperline);
+	    }
+
+            IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src);
+            IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst);
             TRACE("Unlocked src and dst\n");
         }
+      
+      } else {
+      
+	FIXME("Wanted to copy partial surfaces not implemented\n");
+        rc = D3DERR_INVALIDCALL;	
+	
+      }
     }
 
     /* Set dirty */
@@ -1810,24 +1929,43 @@
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
     HRESULT hr;
     D3DLOCKED_RECT lockedRect;
+    RECT wantedRect;
     GLint  prev_store;
     GLenum prev_read;
 
     ICOM_THIS(IDirect3DDevice8Impl,iface);
 
-    FIXME("(%p) : stub\n", This);
+    FIXME("(%p) : see if behavior correct\n", This);
 
     if (D3DFMT_A8R8G8B8 != ((IDirect3DSurface8Impl*) pDestSurface)->myDesc.Format) {
+      ERR("(%p) : surface(%p) have a invalid format\n", This, pDestSurface);
       return D3DERR_INVALIDCALL;
     }
-
-    hr = IDirect3DSurface8Impl_LockRect(pDestSurface, &lockedRect, NULL, 0);
+    
+    wantedRect.left = 0;
+    wantedRect.top = 0;
+    wantedRect.right = This->PresentParms.BackBufferWidth;
+    wantedRect.bottom = This->PresentParms.BackBufferHeight;
+    
+    hr = IDirect3DSurface8Impl_LockRect(pDestSurface, &lockedRect, &wantedRect, 0);
     if (FAILED(hr)) {
+      ERR("(%p) : cannot lock surface\n", This);
       return D3DERR_INVALIDCALL;
     }
 
     ENTER_GL();
 
+    /*
+    {
+      IDirect3DSurface8Impl* tmp = ((IDirect3DSurface8Impl*) pDestSurface);
+      FIXME("dest:%u,%u,bpp:%u\n", tmp->myDesc.Width, tmp->myDesc.Height, tmp->bytesPerPixel);
+      FIXME("dest2:pitch%u\n", lockedRect.Pitch);
+      FIXME("src:%u,%u\n", This->PresentParms.BackBufferWidth, This->PresentParms.BackBufferHeight);
+      tmp = This->frontBuffer;
+      FIXME("src2:%u,%u,bpp:%u\n", tmp->myDesc.Width, tmp->myDesc.Height, tmp->bytesPerPixel);
+    }
+    */
+
     glFlush();
     vcheckGLcall("glFlush");
     glGetIntegerv(GL_READ_BUFFER, &prev_read);
@@ -1839,13 +1977,25 @@
     vcheckGLcall("glReadBuffer");
     glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
     vcheckGLcall("glPixelStorei");
+    /* stupid copy */
+    {
+      long j;
+      for (j = 0; j < This->PresentParms.BackBufferHeight; ++j) {
+	/*memcpy(lockedRect.pBits + (j * lockedRect.Pitch), This->frontBuffer->allocatedMemory + (j * i), i);*/
+	glReadPixels(0, This->PresentParms.BackBufferHeight - j - 1, This->PresentParms.BackBufferWidth, 1,
+		     GL_BGRA, GL_UNSIGNED_BYTE, ((char*) lockedRect.pBits) + (j * lockedRect.Pitch));
+	vcheckGLcall("glReadPixels");
+      }
+    }
+    /*
     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);
@@ -1906,7 +2056,7 @@
     LEAVE_GL();
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
 
     /* TODO: From MSDN This method fails if you specify the D3DCLEAR_ZBUFFER or D3DCLEAR_STENCIL flags when the
@@ -1917,9 +2067,8 @@
     GLfloat old_z_clear_value;
     GLint   old_stencil_clear_value;
     GLfloat old_color_clear_value[4];
-
     int i;
-    CONST D3DRECT   *curRect;
+    CONST D3DRECT* curRect;
 
     TRACE("(%p) Count (%ld), pRects (%p), Flags (%lx), Z (%f), Stencil (%ld)\n", This,
           Count, pRects, Flags, Z, Stencil);
@@ -2000,7 +2149,7 @@
 
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE d3dts,CONST D3DMATRIX* lpmatrix) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE d3dts, CONST D3DMATRIX* lpmatrix) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
     D3DMATRIX m;
     int k;
@@ -2045,11 +2194,13 @@
        to the other so that if I ever find out that I need to transpose them, I
        will able to do it quickly, only by changing the macro conv_mat. */
 
-    if (d3dts <= 256) { /* WORLDMATRIX(0) == 256! */
+    if (d3dts < 256) { 
       switch (d3dts) {
-      case D3DTS_WORLDMATRIX(0):
+#if 0
+      case D3DTS_WORLDMATRIX(0): /* WORLDMATRIX(0) == 256! so not here */
         conv_mat(lpmatrix, &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)]);
         break;
+#endif
 
       case D3DTS_VIEW:
         conv_mat(lpmatrix, &This->StateBlock->transforms[D3DTS_VIEW]);
@@ -2156,10 +2307,10 @@
        }
     } else if (d3dts >= D3DTS_TEXTURE0 && d3dts <= D3DTS_TEXTURE7) {
         /* Now apply texture transforms if not applying to the dummy textures */
-        Stage = d3dts-D3DTS_TEXTURE0;
+        Stage = d3dts - D3DTS_TEXTURE0;
 
-        if (memcmp(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0], sizeof(D3DMATRIX))) {
-           memcpy(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0], sizeof(D3DMATRIX));
+        if (memcmp(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0 + Stage].u.m[0][0], sizeof(D3DMATRIX))) {
+	   memcpy(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0 + Stage].u.m[0][0], sizeof(D3DMATRIX));
 
 #if defined(GL_VERSION_1_3)
            glActiveTexture(GL_TEXTURE0 + Stage);
@@ -2196,7 +2347,7 @@
           if (viewChanged == TRUE || 
               (memcmp(&This->lastWorld0, &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0], sizeof(D3DMATRIX)))) {
                memcpy(&This->lastWorld0, &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0], sizeof(D3DMATRIX));
-              if (viewChanged==FALSE) {
+              if (viewChanged == FALSE) {
                  glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
                  checkGLcall("glLoadMatrixf");
               }
@@ -2230,7 +2381,7 @@
           m.u.s._21 = f; m.u.s._22 = f; m.u.s._23 = f; m.u.s._24 = f;
           m.u.s._31 = f; m.u.s._32 = f; m.u.s._33 = f; m.u.s._34 = f;
           m.u.s._41 = f; m.u.s._42 = f; m.u.s._43 = f; m.u.s._44 = f;
-          if (viewChanged==FALSE) {
+          if (viewChanged == FALSE) {
               glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
               checkGLcall("glLoadMatrixf");
           }
@@ -2367,14 +2518,14 @@
     TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, pMaterial->Emissive.b, pMaterial->Emissive.a);
     TRACE("(%p) : Power (%f)\n", This, pMaterial->Power);
 
-    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&This->UpdateStateBlock->material.Ambient);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*) &This->UpdateStateBlock->material.Ambient);
     checkGLcall("glMaterialfv");
-    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&This->UpdateStateBlock->material.Diffuse);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*) &This->UpdateStateBlock->material.Diffuse);
     checkGLcall("glMaterialfv");
 
-    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&This->UpdateStateBlock->material.Specular);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &This->UpdateStateBlock->material.Specular);
     checkGLcall("glMaterialfv");
-    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&This->UpdateStateBlock->material.Emissive);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*) &This->UpdateStateBlock->material.Emissive);
     checkGLcall("glMaterialfv");
     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, This->UpdateStateBlock->material.Power);
     checkGLcall("glMaterialf");
@@ -2393,7 +2544,7 @@
     return D3D_OK;
 }
 
-HRESULT  WINAPI  IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,CONST D3DLIGHT8* pLight) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index, CONST D3DLIGHT8* pLight) {
     float colRGBA[] = {0.0, 0.0, 0.0, 0.0};
     float rho;
     float quad_att;
@@ -2570,10 +2721,10 @@
     }
 
     if (Enable) {
-        glEnable(GL_LIGHT0+Index);
+        glEnable(GL_LIGHT0 + Index);
         checkGLcall("glEnable GL_LIGHT0+Index");
     } else {
-        glDisable(GL_LIGHT0+Index);
+        glDisable(GL_LIGHT0 + Index);
         checkGLcall("glDisable GL_LIGHT0+Index");
     }
     return D3D_OK;
@@ -2622,7 +2773,7 @@
 
     TRACE("Clipplane [%f,%f,%f,%f]\n", This->UpdateStateBlock->clipplane[Index][0], This->UpdateStateBlock->clipplane[Index][1],
           This->UpdateStateBlock->clipplane[Index][2], This->UpdateStateBlock->clipplane[Index][3]);
-    glClipPlane(GL_CLIP_PLANE0+Index, This->UpdateStateBlock->clipplane[Index]);
+    glClipPlane(GL_CLIP_PLANE0 + Index, This->UpdateStateBlock->clipplane[Index]);
 
     glPopMatrix();
     checkGLcall("glClipPlane");
@@ -2789,13 +2940,15 @@
 
     case D3DRS_AMBIENT                   :
         {
-
             float col[4];
+#if 0
             col[0] = ((Value >> 16) & 0xFF) / 255.0;
-            col[1] = ((Value >> 8 ) & 0xFF) / 255.0;
-            col[2] = ((Value >> 0 ) & 0xFF) / 255.0;
-            col[3] = ((Value >> 24 ) & 0xFF) / 255.0;
-            TRACE("Setting ambient to (%f,%f,%f,%f)\n", col[0],col[1],col[2],col[3]);
+            col[1] = ((Value >>  8) & 0xFF) / 255.0;
+            col[2] = ((Value >>  0) & 0xFF) / 255.0;
+            col[3] = ((Value >> 24) & 0xFF) / 255.0;
+#endif
+	    D3DCOLORTOGLFLOAT4(Value, col);
+            TRACE("Setting ambient to (%f,%f,%f,%f)\n", col[0], col[1], col[2], col[3]);
             glLightModelfv(GL_LIGHT_MODEL_AMBIENT, col);
             checkGLcall("glLightModel for MODEL_AMBIENT");
 
@@ -2890,12 +3043,12 @@
     case D3DRS_ALPHAREF                  :
         {
             int glParm = GL_LESS;
-            float ref = 1.0;
+            float ref = 1.0f;
 
             glGetIntegerv(GL_ALPHA_TEST_FUNC, &glParm);
             checkGLcall("glGetFloatv(GL_ALPHA_TEST_FUNC, &glParm);");
 
-            ref = ((float) Value) / 255.0;
+            ref = ((float) Value) / 255.0f;
             TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref);
             glAlphaFunc(glParm, ref);
             checkGLcall("glAlphaFunc");
@@ -2965,11 +3118,13 @@
             /* Note the texture color applies to all textures whereas 
                GL_TEXTURE_ENV_COLOR applies to active only */
             float col[4];
-            col[0] = ((Value >> 16) & 0xFF) / 255.0;
-            col[1] = ((Value >> 8 ) & 0xFF) / 255.0;
-            col[2] = ((Value >> 0 ) & 0xFF) / 255.0;
-            col[3] = ((Value >> 24 ) & 0xFF) / 255.0;
-
+#if 0
+            col[0] = ((Value >> 16) & 0xFF) / 255.0f;
+            col[1] = ((Value >>  8) & 0xFF) / 255.0f;
+            col[2] = ((Value >>  0) & 0xFF) / 255.0f;
+            col[3] = ((Value >> 24) & 0xFF) / 255.0f;
+#endif
+	    D3DCOLORTOGLFLOAT4(Value, col);
             /* Set the default alpha blend color */
             glBlendColor(col[0], col[1], col[2], col[3]);
             checkGLcall("glBlendColor");
@@ -3157,20 +3312,35 @@
     case D3DRS_FOGCOLOR                  :
         {
             float col[4];
-            col[0] = ((Value >> 16) & 0xFF) / 255.0;
-            col[1] = ((Value >> 8 ) & 0xFF) / 255.0;
-            col[2] = ((Value >> 0 ) & 0xFF) / 255.0;
-            col[3] = ((Value >> 24 ) & 0xFF) / 255.0;
-
+#if 0
+            col[0] = ((Value >> 16) & 0xFF) / 255.0f;
+            col[1] = ((Value >>  8) & 0xFF) / 255.0f;
+            col[2] = ((Value >>  0) & 0xFF) / 255.0f;
+            col[3] = ((Value >> 24) & 0xFF) / 255.0f;
+#endif
+	    D3DCOLORTOGLFLOAT4(Value, col);
             /* Set the default alpha blend color */
             glFogfv(GL_FOG_COLOR, &col[0]);
             checkGLcall("glFog GL_FOG_COLOR");
         }
         break;
 
+    case D3DRS_FOGTABLEMODE              :
+        {
+	  switch (Value) {
+	  case D3DFOG_NONE:    /* I don't know what to do here */ break;
+	  case D3DFOG_EXP:     glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break; 
+	  case D3DFOG_EXP2:    glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); break; 
+	  case D3DFOG_LINEAR:  glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); break; 
+	  default:
+	    FIXME("Unsupported Value(%lu) for D3DRS_FOGTABLEMODE!\n", Value);
+	  }
+        }
+	break;
+
     case D3DRS_FOGSTART                  :
         {
-            float *f = (float *)&Value;
+            float *f = (float*) &Value;
             glFogfv(GL_FOG_START, f);
             checkGLcall("glFogf(GL_FOG_START, (float) Value)");
             TRACE("Fog Start == %f\n", *f);
@@ -3179,7 +3349,7 @@
 
     case D3DRS_FOGEND                    :
         {
-            float *f = (float *)&Value;
+            float *f = (float*) &Value;
             glFogfv(GL_FOG_END, f);
             checkGLcall("glFogf(GL_FOG_END, (float) Value)");
             TRACE("Fog End == %f\n", *f);
@@ -3268,7 +3438,6 @@
     case D3DRS_LINEPATTERN               :
     case D3DRS_LASTPIXEL                 :
     case D3DRS_ZVISIBLE                  :
-    case D3DRS_FOGTABLEMODE              :
     case D3DRS_EDGEANTIALIAS             :
     case D3DRS_ZBIAS                     :
     case D3DRS_RANGEFOGENABLE            :
@@ -3383,7 +3552,7 @@
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
     TRACE("(%p) : returning %p for stage %ld\n", This, This->UpdateStateBlock->textures[Stage], Stage);
-    *ppTexture = (LPDIRECT3DBASETEXTURE8)This->UpdateStateBlock->textures[Stage];
+    *ppTexture = (LPDIRECT3DBASETEXTURE8) This->UpdateStateBlock->textures[Stage];
     IDirect3DBaseTexture8Impl_AddRef(*ppTexture);
     return D3D_OK;
 }
@@ -3438,9 +3607,9 @@
         textureType = IDirect3DBaseTexture8Impl_GetType(pTexture);
 
         if (textureType == D3DRTYPE_TEXTURE) {
-          IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl *) pTexture;
+          IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl*) pTexture;
 
-          if ((void *)oldTxt == (void *)pTexture2 && pTexture2->Dirty == FALSE) {
+          if ((void*) oldTxt == (void*) pTexture2 && pTexture2->Dirty == FALSE) {
               TRACE("Skipping setting texture as old == new\n");
               reapplyStates = FALSE;
           } else {
@@ -3450,16 +3619,22 @@
             This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_2D;
 
             /* Load up the texture now */
-            IDirect3DTexture8Impl_PreLoad((LPDIRECT3DTEXTURE8)pTexture);
+            IDirect3DTexture8Impl_PreLoad((LPDIRECT3DTEXTURE8) pTexture);
           }
         } else if (textureType == D3DRTYPE_VOLUMETEXTURE) {
+#if 0
             IDirect3DVolumeTexture8Impl *pTexture2 = (IDirect3DVolumeTexture8Impl *) pTexture;
             int i;
+#endif
 
             /* Standard 3D (volume) texture */
             TRACE("Standard 3d texture\n");
             This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_3D;
 
+            /* Load up the texture now */
+	    IDirect3DVolumeTexture8Impl_PreLoad((LPDIRECT3DVOLUMETEXTURE8) pTexture);
+
+#if 0
             for (i=0; i<pTexture2->levels; i++) 
             {
 
@@ -3507,9 +3682,17 @@
                     pTexture2->Dirty = FALSE;
                 }
             }
+#endif
 
-        } else {
-            FIXME("(%p) : Incorrect type for a texture : %d\n", This, textureType);
+        } else if (textureType == D3DRTYPE_CUBETEXTURE) {
+	  /* Standard Cube texture */
+	  FIXME("Standard Cube texture\n");
+	  /*This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_4D;*/
+
+	  /* Load up the texture now */
+	  IDirect3DCubeTexture8Impl_PreLoad((LPDIRECT3DCUBETEXTURE8) pTexture);
+	} else {
+            FIXME("(%p) : Incorrect type for a texture : (%d,%s)\n", This, textureType, debug_d3dressourcetype(textureType));
         }
     } else {
         TRACE("Setting to no texture (ie default texture)\n");
@@ -3535,12 +3718,12 @@
     return D3D_OK;
 }
 
-HRESULT  WINAPI  IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
 
     /* FIXME: Handle 3d textures? What if TSS value set before set texture? Need to reapply all values? */
    
-    TRACE("(%p) : stub, Stage=%ld, Type=%d, Value =%ld\n", This, Stage, Type, Value);
+    TRACE("(%p) : stub, Stage=%ld, Type=%d, Value=%ld\n", This, Stage, Type, Value);
 
     /* Reject invalid texture units */
     if (Stage >= This->TextureUnits) {
@@ -3724,44 +3907,48 @@
 
                 case D3DTOP_SELECTARG1                :
 		    {
+                        /*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 */			
-		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
-		        DWORD dwValue = 0;
-			GLenum source;
-			GLenum 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_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')");
+#if 0 /* don't seem to do anything */
+			{
+			  BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
+			  DWORD dwValue = 0;
+			  GLenum source;
+			  GLenum 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_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			
+#endif
 		    }
                     break;
 
@@ -3771,6 +3958,7 @@
 		        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? */
@@ -3926,11 +4114,13 @@
     case D3DTSS_BORDERCOLOR           :
         {
             float col[4];
+#if 0
             col[0] = ((Value >> 16) & 0xFF) / 255.0;
             col[1] = ((Value >>  8) & 0xFF) / 255.0;
             col[2] = ((Value >>  0) & 0xFF) / 255.0;
             col[3] = ((Value >> 24) & 0xFF) / 255.0;
-
+#endif
+	    D3DCOLORTOGLFLOAT4(Value, col);
             TRACE("Setting border color for %x to %lx\n", This->StateBlock->textureDimensions[Stage], Value); 
             glTexParameterfv(This->StateBlock->textureDimensions[Stage], GL_TEXTURE_BORDER_COLOR, &col[0]);
             checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)");
@@ -4137,7 +4327,7 @@
     HRESULT res;
     UINT i;
 
-    TRACE("(%p) : VertexShader not fully supported yet : Decl=%p, Func=%p\n", This, pDeclaration, pFunction);    
+    TRACE_(d3d_shader)("(%p) : VertexShader not fully supported yet : Decl=%p, Func=%p\n", This, pDeclaration, pFunction);    
     if (NULL == pDeclaration || NULL == pHandle) { /* pFunction can be NULL see MSDN */
       return D3DERR_INVALIDCALL;
     }
@@ -4168,7 +4358,7 @@
     This->UpdateStateBlock->Set.vertexShader = TRUE;
     
     if (Handle > VS_HIGHESTFIXEDFXF) { /* only valid with non FVF shaders */
-      FIXME("(%p) : Created shader, Handle=%lx\n", This, Handle);
+      TRACE_(d3d_shader)("(%p) : Created shader, Handle=%lx\n", This, Handle);
       This->UpdateStateBlock->vertexShaderDecl = VERTEX_SHADER_DECL(Handle);
       This->UpdateStateBlock->Changed.vertexShaderDecl = TRUE;
       This->UpdateStateBlock->Set.vertexShaderDecl = TRUE;
@@ -4190,7 +4380,7 @@
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD* pHandle) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    TRACE("(%p) : GetVertexShader returning %ld\n", This, This->StateBlock->VertexShader);
+    TRACE_(d3d_shader)("(%p) : GetVertexShader returning %ld\n", This, This->StateBlock->VertexShader);
     *pHandle = This->StateBlock->VertexShader;
     return D3D_OK;
 }
@@ -4211,7 +4401,7 @@
     if (NULL == object) {
       return D3DERR_INVALIDCALL;
     }
-    FIXME("(%p) : freing VertexShader %p\n", This, object);
+    TRACE_(d3d_shader)("(%p) : freing VertexShader %p\n", This, object);
     /* TODO: check validity of object */
     if (NULL != object->function) HeapFree(GetProcessHeap(), 0, (void *)object->function);
     HeapFree(GetProcessHeap(), 0, (void *)object->data);
@@ -4225,7 +4415,7 @@
     if (NULL == attached_decl) {
       return D3DERR_INVALIDCALL;
     } 
-    FIXME("(%p) : freing VertexShaderDeclaration %p\n", This, attached_decl);
+    TRACE_(d3d_shader)("(%p) : freing VertexShaderDeclaration %p\n", This, attached_decl);
     /* TODO: check validity of object */
     HeapFree(GetProcessHeap(), 0, (void *)attached_decl->pDeclaration8);
     HeapFree(GetProcessHeap(), 0, (void *)attached_decl);
@@ -4238,7 +4428,7 @@
   ICOM_THIS(IDirect3DDevice8Impl,iface);
 
   if (Register + ConstantCount > D3D8_VSHADER_MAX_CONSTANTS) {
-    ERR("(%p) : SetVertexShaderConstant C[%lu] invalid\n", This, Register);
+    ERR_(d3d_shader)("(%p) : SetVertexShaderConstant C[%lu] invalid\n", This, Register);
     return D3DERR_INVALIDCALL;
   }
   if (NULL == pConstantData) {
@@ -4247,14 +4437,14 @@
   if (ConstantCount > 1) {
     FLOAT* f = (FLOAT*)pConstantData;
     UINT i;
-    TRACE("(%p) : SetVertexShaderConstant C[%lu..%lu]=\n", This, Register, Register + ConstantCount - 1);
+    TRACE_(d3d_shader)("(%p) : SetVertexShaderConstant C[%lu..%lu]=\n", This, Register, Register + ConstantCount - 1);
     for (i = 0; i < ConstantCount; ++i) {
-      TRACE("{%f, %f, %f, %f}\n", f[0], f[1], f[2], f[3]);
+      TRACE_(d3d_shader)("{%f, %f, %f, %f}\n", f[0], f[1], f[2], f[3]);
       f += 4;
     }
   } else { 
-    FLOAT* f = (FLOAT*)pConstantData;
-    TRACE("(%p) : SetVertexShaderConstant, C[%lu]={%f, %f, %f, %f}\n", This, Register, f[0], f[1], f[2], f[3]);
+    FLOAT* f = (FLOAT*) pConstantData;
+    TRACE_(d3d_shader)("(%p) : SetVertexShaderConstant, C[%lu]={%f, %f, %f, %f}\n", This, Register, f[0], f[1], f[2], f[3]);
   }
   This->UpdateStateBlock->Changed.vertexShaderConstant = TRUE;
   memcpy(&This->UpdateStateBlock->vertexShaderConstant[Register], pConstantData, ConstantCount * 4 * sizeof(FLOAT));
@@ -4263,7 +4453,7 @@
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetVertexShaderConstant(LPDIRECT3DDEVICE8 iface, DWORD Register, void* pConstantData, DWORD ConstantCount) {
   ICOM_THIS(IDirect3DDevice8Impl,iface);
 
-  TRACE("(%p) : C[%lu] count=%ld\n", This, Register, ConstantCount);
+  TRACE_(d3d_shader)("(%p) : C[%lu] count=%ld\n", This, Register, ConstantCount);
   if (Register + ConstantCount > D3D8_VSHADER_MAX_CONSTANTS) {
     return D3DERR_INVALIDCALL;
   }
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.25
diff -u -r1.25 d3d8_private.h
--- d3d8_private.h	12 May 2003 03:10:27 -0000	1.25
+++ d3d8_private.h	14 May 2003 08:26:38 -0000
@@ -173,7 +173,11 @@
   (vec).z = D3DCOLOR_B(dw); \
   (vec).w = D3DCOLOR_A(dw);
 
-
+#define D3DCOLORTOGLFLOAT4(dw, vec) \
+  (vec)[0] = D3DCOLOR_R(dw); \
+  (vec)[1] = D3DCOLOR_G(dw); \
+  (vec)[2] = D3DCOLOR_B(dw); \
+  (vec)[3] = D3DCOLOR_A(dw);
 
 /* ===========================================================================
     The interfactes themselves
@@ -1124,5 +1128,11 @@
 GLint fmt2glintFmt(D3DFORMAT fmt);
 GLenum fmt2glFmt(D3DFORMAT fmt);
 DWORD fmt2glType(D3DFORMAT fmt);
+
+/**
+ * Internals debug functions
+ */
+const char* debug_d3dformat(D3DFORMAT fmt);
+const char* debug_d3dressourcetype(D3DRESOURCETYPE res);
 
 #endif /* __WINE_D3DX8_PRIVATE_H */


More information about the wine-patches mailing list