[D3D 79] Various refcounting / code factorization

Lionel Ulmer lionel.ulmer at free.fr
Sat Jan 4 03:42:19 CST 2003


Changelog:
 - fix in the GetHandle method
 - factorize some code between D3D1/2/3 and D3D7
 - fix reference counting for palettes
   
   
-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c	2003-01-03 16:02:11.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c	2003-01-03 20:31:04.000000000 +0100
@@ -312,9 +314,11 @@
     
     TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
     if (!--(This->ref)) {
+        int i;
 	/* Release texture associated with the device */ 
-	if (This->current_texture[0] != NULL)
-	    IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[0], IDirect3DTexture2));
+	for (i = 0; i < MAX_TEXTURES; i++) 
+	    if (This->current_texture[i] != NULL)
+	        IDirectDrawSurface7_Release(ICOM_INTERFACE(This->current_texture[i], IDirectDrawSurface7));
 
 	/* And warn the D3D object that this device is no longer active... */
 	This->d3d->removed_device(This->d3d, This);
@@ -1402,12 +1406,13 @@
     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwStage, lpTexture2);
     
     if (This->current_texture[dwStage] != NULL) {
-        /* Seems that this is not right... Need to test in real Windows
-	   IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[dwStage], IDirect3DTexture2)); */
+	IDirectDrawSurface7_Release(ICOM_INTERFACE(This->current_texture[dwStage], IDirectDrawSurface7));
     }
     
     ENTER_GL();
     if (lpTexture2 == NULL) {
+	This->current_texture[dwStage] = NULL;
+
         TRACE(" disabling 2D texturing.\n");
 	glBindTexture(GL_TEXTURE_2D, 0);
         glDisable(GL_TEXTURE_2D);
@@ -2102,9 +2111,6 @@
 	surf->d3ddevice = object;
     }
 
-    /* FIXME: Should handle other versions than just 7 */
-    InitDefaultStateBlock(&object->state_block,7);
-        
     /* FIXME: These 4 statements are kept for compatibility but should be removed as soon
        as they are correctly handled */
     gl_object->render_state.fog_on = FALSE;
@@ -2137,10 +2143,6 @@
     ENTER_GL();
     TRACE(" current context set\n");
 
-    /* Apply default render state values */
-    apply_render_state(gl_object, &object->state_block);
-    /* FIXME: do something similar for ligh_state and texture_stage_state */
-    
     glClearColor(0.0, 0.0, 0.0, 0.0);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
     glDrawBuffer(buffer);
@@ -2161,6 +2163,12 @@
 
     /* And finally warn D3D that this device is now present */
     object->d3d->added_device(object->d3d, object);
-    
+
+    /* FIXME: Should handle other versions than just 7 */
+    InitDefaultStateBlock(&object->state_block,7);
+    /* Apply default render state values */
+    apply_render_state(gl_object, &object->state_block);
+    /* FIXME: do something similar for ligh_state and texture_stage_state */
+
     return DD_OK;
 }
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dtexture.c	2003-01-03 16:02:11.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dtexture.c	2003-01-03 22:23:48.000000000 +0100
@@ -496,8 +496,19 @@
 					 LPD3DTEXTUREHANDLE lpHandle)
 {
     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
-    FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpDirect3DDevice2, lpHandle);
-    return DD_OK;
+    IDirect3DDeviceImpl *lpDeviceImpl = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice2, lpDirect3DDevice2);
+    
+    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpDirect3DDevice2, lpHandle);
+
+    /* The handle is simply the pointer to the implementation structure */
+    *lpHandle = (D3DTEXTUREHANDLE) This;
+
+    TRACE(" returning handle %08lx.\n", *lpHandle);
+    
+    /* Now set the device for this texture */
+    This->d3ddevice = lpDeviceImpl;
+
+    return D3D_OK;
 }
 
 HRESULT WINAPI
@@ -525,9 +536,10 @@
 {
     IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private;
     DWORD mem_used;
+    int i;
 
     TRACE(" deleting texture with GL id %d.\n", glThis->tex_name);
-      
+
     /* And delete texture handle */
     ENTER_GL();
     if (glThis->tex_name != 0)
@@ -536,8 +548,9 @@
 
     /* And if this texture was the current one, remove it at the device level */
     if (This->d3ddevice != NULL)
-        if (This->d3ddevice->current_texture[0] == This)
-	    This->d3ddevice->current_texture[0] = NULL;
+        for (i = 0; i < MAX_TEXTURES; i++)
+	    if (This->d3ddevice->current_texture[i] == This)
+	        This->d3ddevice->current_texture[i] = NULL;
 
     /* All this should be part of main surface management not just a hack for texture.. */
     if (glThis->loaded) {
@@ -570,37 +583,6 @@
 }
 
 HRESULT WINAPI
-GL_IDirect3DTextureImpl_2_1T_GetHandle(LPDIRECT3DTEXTURE2 iface,
-				       LPDIRECT3DDEVICE2 lpDirect3DDevice2,
-				       LPD3DTEXTUREHANDLE lpHandle)
-{
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
-    IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private;
-    IDirect3DDeviceImpl *lpDeviceImpl = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice2, lpDirect3DDevice2);
-    
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, lpDirect3DDevice2, lpHandle);
-
-    /* The handle is simply the pointer to the implementation structure */
-    *lpHandle = (D3DTEXTUREHANDLE) This;
-
-    TRACE(" returning handle %08lx.\n", *lpHandle);
-    
-    /* Now, bind a new texture */
-    This->d3ddevice = lpDeviceImpl;
-
-    /* Associate the texture with the device and perform the appropriate AddRef/Release */
-    /* FIXME: Is there only one or several textures associated with the device ? */
-    if (lpDeviceImpl->current_texture[0] != NULL)
-        IDirectDrawSurface7_Release(ICOM_INTERFACE(lpDeviceImpl->current_texture[0], IDirectDrawSurface7));
-    IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This, IDirectDrawSurface7));
-    lpDeviceImpl->current_texture[0] = This;
-
-    TRACE("OpenGL texture handle is : %d\n", glThis->tex_name);
-
-    return D3D_OK;
-}
-
-HRESULT WINAPI
 GL_IDirect3DTextureImpl_2_1T_Load(LPDIRECT3DTEXTURE2 iface,
 				  LPDIRECT3DTEXTURE2 lpD3DTexture2)
 {
@@ -641,12 +623,11 @@
     if (This->palette == NULL) {
         This->palette = lpD3DTextureImpl->palette;
 	if (lpD3DTextureImpl->palette != NULL) IDirectDrawPalette_AddRef(ICOM_INTERFACE(lpD3DTextureImpl->palette,
-										IDirectDrawPalette));
+											IDirectDrawPalette));
     } else {
         if (lpD3DTextureImpl->palette != NULL) {
 	    PALETTEENTRY palent[256];
 	    IDirectDrawPalette *pal_int = ICOM_INTERFACE(lpD3DTextureImpl->palette, IDirectDrawPalette);
-	    IDirectDrawPalette_AddRef(pal_int);
 	    IDirectDrawPalette_GetEntries(pal_int, 0, 0, 256, palent);
 	    IDirectDrawPalette_SetEntries(ICOM_INTERFACE(This->palette, IDirectDrawPalette),
 					  0, 0, 256, palent);
@@ -667,6 +648,7 @@
 
         /* Copy also the ColorKeying stuff */
         if (src_d->dwFlags & DDSD_CKSRCBLT) {
+	    dst_d->dwFlags |= DDSD_CKSRCBLT;
 	    dst_d->ddckCKSrcBlt.dwColorSpaceLowValue = src_d->ddckCKSrcBlt.dwColorSpaceLowValue;
 	    dst_d->ddckCKSrcBlt.dwColorSpaceHighValue = src_d->ddckCKSrcBlt.dwColorSpaceHighValue;
 	}
@@ -780,7 +762,7 @@
     XCAST(QueryInterface) Thunk_IDirect3DTextureImpl_2_QueryInterface,
     XCAST(AddRef) Thunk_IDirect3DTextureImpl_2_AddRef,
     XCAST(Release) Thunk_IDirect3DTextureImpl_2_Release,
-    XCAST(GetHandle) GL_IDirect3DTextureImpl_2_1T_GetHandle,
+    XCAST(GetHandle) Main_IDirect3DTextureImpl_2_1T_GetHandle,
     XCAST(PaletteChanged) Main_IDirect3DTextureImpl_2_1T_PaletteChanged,
     XCAST(Load) GL_IDirect3DTextureImpl_2_1T_Load,
 };
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c	2003-01-03 16:02:11.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c	2003-01-03 20:32:26.000000000 +0100
@@ -81,23 +81,12 @@
 	    case D3DRENDERSTATE_TEXTUREHANDLE: {    /*  1 */
 	        IDirectDrawSurfaceImpl *tex = (IDirectDrawSurfaceImpl*) dwRenderState;
 		
-		if (tex == NULL) {
-		    glBindTexture(GL_TEXTURE_2D, 0);
-		    glDisable(GL_TEXTURE_2D);
-		    TRACE("disabling texturing\n");
-		} else {
-		    glEnable(GL_TEXTURE_2D);
-		    
-		    /* Default parameters */
-		    gltex_upload_texture(tex);
-		    
-		    /* To prevent state change, we could test here what are the parameters
-		       stored in the texture */
-		    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, rs->mag);
-		    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, rs->min);
-		}
+		LEAVE_GL();
+		IDirect3DDevice7_SetTexture(ICOM_INTERFACE(&(This->parent), IDirect3DDevice7),
+					    0, 
+					    ICOM_INTERFACE(tex, IDirectDrawSurface7));
+		ENTER_GL();
 	    } break;
-
 	      
 	    case D3DRENDERSTATE_TEXTUREADDRESSU:  /* 44 */
 	    case D3DRENDERSTATE_TEXTUREADDRESSV:  /* 45 */


More information about the wine-patches mailing list