[dx8-22] cube texture support begin

Raphaël Junqueira fenix at club-internet.fr
Tue May 13 17:30:23 CDT 2003


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

Hi,

 i have splitted my patches to avoid conflicts with jason (some waiting for 
jason commits)

 Changelog:
  - cubetexture loading/preloading
  - some stubs must return 0 (and non D3D_OK)
  - fix IDirect3DCubeTexture8Impl::Get* (potentials CD)

Regards,
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+wXH/p7NA3AmQTU4RAnv7AJ49fFyRk4qYLHNrBAWAM8vOwV98ygCeJo+H
qh3KaHcawF/vcNXpB6IE7Ko=
=KtB8
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: cubetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/cubetexture.c,v
retrieving revision 1.5
diff -u -r1.5 cubetexture.c
--- cubetexture.c	12 May 2003 03:10:27 -0000	1.5
+++ cubetexture.c	13 May 2003 22:23:29 -0000
@@ -58,14 +58,17 @@
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     ULONG ref = --This->ref;
     int i;
+    int j;
 
     TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
     if (ref == 0) {
-        for (i=0; i<This->levels; i++) {
-            if (This->surfaces[i] != NULL) {
-                TRACE("(%p) : Releasing surface %p\n", This, This->surfaces[i]);
-                IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8) This->surfaces[i]);
+        for (i = 0; i < This->levels; i++) {
+	  for (j = 0; j < 6; j++) { 
+	    if (This->surfaces[j][i] != NULL) {
+	      TRACE("(%p) : Releasing surface %p\n", This, This->surfaces[j][i]);
+	      IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8) This->surfaces[j][i]);
             }
+	  }
         }
         HeapFree(GetProcessHeap(), 0, This);
     }
@@ -102,16 +105,73 @@
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_SetPriority(LPDIRECT3DCUBETEXTURE8 iface, DWORD PriorityNew) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    return 0;
 }
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_GetPriority(LPDIRECT3DCUBETEXTURE8 iface) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    return 0;
 }
+
+static const GLenum cube_targets[6] = {
+  GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
+  GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
+  GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
+  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
+  GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
+  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
+};
+
 void     WINAPI        IDirect3DCubeTexture8Impl_PreLoad(LPDIRECT3DCUBETEXTURE8 iface) {
+    int i;
+    int j;
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);
+    TRACE("(%p) : About to load texture\n", This);
+    for (i = 0; i < This->levels; i++) {
+      if (i == 0 && This->surfaces[0][i]->textureName != 0 && This->Dirty == FALSE) {
+	glBindTexture(GL_TEXTURE_CUBE_MAP, This->surfaces[0][i]->textureName);
+	checkGLcall("glBindTexture");
+	TRACE("Texture %p (level %d) given name %d\n", This->surfaces[0][i], i, This->surfaces[0][i]->textureName);
+	/* No need to walk through all mip-map levels, since already all assigned */
+	i = This->levels;
+      } else {
+	if (i == 0) {
+	  if (This->surfaces[0][i]->textureName == 0) {
+	    glGenTextures(1, &This->surfaces[0][i]->textureName);
+	    checkGLcall("glGenTextures");
+	    TRACE("Texture %p (level %d) given name %d\n", This->surfaces[0][i], i, This->surfaces[0][i]->textureName);
+	  }
+	  
+	  glBindTexture(GL_TEXTURE_CUBE_MAP, This->surfaces[0][i]->textureName);
+	  checkGLcall("glBindTexture");
+	  
+	  TRACE("Setting GL_TEXTURE_MAX_LEVEL to %d\n", This->levels - 1);
+	  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, This->levels - 1); 
+	  checkGLcall("glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, This->levels - 1)");
+	}
+	
+	for (j = 0; j < 6; j++) {
+	  TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, glFmt=%x, glType=%lx, Mem=%p\n",
+		cube_targets[j], i, fmt2glintFmt(This->format), 
+		This->surfaces[j][i]->myDesc.Width, This->surfaces[j][i]->myDesc.Height, 
+		0, fmt2glFmt(This->format), fmt2glType(This->format),
+		This->surfaces[j][i]->allocatedMemory);
+	  glTexImage2D(cube_targets[j],
+		       i,
+		       fmt2glintFmt(This->format),
+		       This->surfaces[j][i]->myDesc.Width,
+		       This->surfaces[j][i]->myDesc.Height,
+		       0,
+		       fmt2glFmt(This->format),
+		       fmt2glType(This->format),
+		       This->surfaces[j][i]->allocatedMemory);
+	  checkGLcall("glTexImage2D");
+	}
+	/* Removed glTexParameterf now TextureStageStates are initialized at startup */
+	This->Dirty = FALSE;
+      }
+    }
+    return ;
 }
 
 D3DRESOURCETYPE WINAPI IDirect3DCubeTexture8Impl_GetType(LPDIRECT3DCUBETEXTURE8 iface) {
@@ -124,12 +184,12 @@
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_SetLOD(LPDIRECT3DCUBETEXTURE8 iface, DWORD LODNew) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    return 0;
 }
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_GetLOD(LPDIRECT3DCUBETEXTURE8 iface) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     FIXME("(%p) : stub\n", This);    
-    return D3D_OK;
+    return 0;
 }
 
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_GetLevelCount(LPDIRECT3DCUBETEXTURE8 iface) {
@@ -143,7 +203,7 @@
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     if (Level < This->levels) {
         TRACE("(%p) level (%d)\n", This, Level);
-        return IDirect3DSurface8Impl_GetDesc((LPDIRECT3DSURFACE8) This->surfaces[Level], pDesc);
+        return IDirect3DSurface8Impl_GetDesc((LPDIRECT3DSURFACE8) This->surfaces[0][Level], pDesc);
     } else {
         FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
         return D3DERR_INVALIDCALL;


More information about the wine-patches mailing list