[DDRAW] fix 2D in D3D device (resent)

Christian Costa titan.costa at wanadoo.fr
Sun Oct 9 08:17:03 CDT 2005


Hi,

This patch has not been commited yet. Is there any reason for that ?

Christian

Christian Costa wrote:

> Hi,
>
> This patch fixes 2D in some games (Dino Crisis and Lands of Lore 3)
>
> Changelog:
> Disable depth test when there is no Z buffer attached.
> Initialise texture states at creation instead of when tex name is 
> generated.
>
> Christian Costa   titan.costa at wanadoo.fr
>
>------------------------------------------------------------------------
>
>Index: dlls/ddraw/opengl_private.h
>===================================================================
>RCS file: /home/wine/wine/dlls/ddraw/opengl_private.h,v
>retrieving revision 1.2
>diff -u -r1.2 opengl_private.h
>--- dlls/ddraw/opengl_private.h	12 Jun 2005 10:43:11 -0000	1.2
>+++ dlls/ddraw/opengl_private.h	5 Oct 2005 20:51:34 -0000
>@@ -193,21 +193,21 @@
> extern HRESULT d3ddevice_create(IDirect3DDeviceImpl **obj, IDirectDrawImpl *d3d, IDirectDrawSurfaceImpl *surface, int version);
> 
> /* Used for Direct3D to request the device to enumerate itself */
>-extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD version) ;
>-extern HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context) ;
>+extern HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD version);
>+extern HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context);
> extern HRESULT d3ddevice_find(IDirectDrawImpl *d3d, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice);
> 
> /* Used by the DLL init routine to set-up the GL context and stuff properly */
> extern BOOL d3ddevice_init_at_startup(void *gl_handle);
> 
> /* Used to upload the texture */
>-extern HRESULT gltex_upload_texture(IDirectDrawSurfaceImpl *This, IDirect3DDeviceImpl *d3ddev, DWORD stage) ;
>+extern HRESULT gltex_upload_texture(IDirectDrawSurfaceImpl *This, IDirect3DDeviceImpl *d3ddev, DWORD stage);
> 
> /* Used to get the texture name */
>-extern GLuint gltex_get_tex_name(IDirectDrawSurfaceImpl *This) ;
>+extern GLuint gltex_get_tex_name(IDirectDrawSurfaceImpl *This);
> 
> /* Used to set-up our orthographic projection */
>-extern void d3ddevice_set_ortho(IDirect3DDeviceImpl *This) ;
>+extern void d3ddevice_set_ortho(IDirect3DDeviceImpl *This);
> 
> /* Rendering state management functions */
> extern void set_render_state(IDirect3DDeviceImpl* This, D3DRENDERSTATETYPE dwRenderStateType, STATEBLOCK *lpStateBlock);
>@@ -222,7 +222,7 @@
> extern HRESULT upload_surface_to_tex_memory_release(void);
> 
> /* Some utilities functions needed to be shared.. */
>-extern GLenum convert_D3D_compare_to_GL(D3DCMPFUNC dwRenderState) ;
>+extern GLenum convert_D3D_compare_to_GL(D3DCMPFUNC dwRenderState);
> 
> #endif /* HAVE_OPENGL */
> 
>Index: dlls/ddraw/device_opengl.c
>===================================================================
>RCS file: /home/wine/wine/dlls/ddraw/device_opengl.c,v
>retrieving revision 1.9
>diff -u -r1.9 device_opengl.c
>--- dlls/ddraw/device_opengl.c	25 Sep 2005 15:18:18 -0000	1.9
>+++ dlls/ddraw/device_opengl.c	5 Oct 2005 20:51:45 -0000
>@@ -1325,6 +1325,7 @@
>     IDirect3DDeviceGLImpl* glThis = (IDirect3DDeviceGLImpl*) This;
>     int num_active_stages = 0;
>     int num_tex_index = GET_TEXCOUNT_FROM_FVF(d3dvtVertexType);
>+    BOOL reenable_depth_test = FALSE;
>     
>     /* I put the trace before the various locks... So as to better understand where locks occur :-) */
>     if (TRACE_ON(ddraw)) {
>@@ -1349,9 +1350,12 @@
> 	
> 	hr = IDirectDrawSurface7_GetAttachedSurface(ICOM_INTERFACE(This->surface, IDirectDrawSurface7),
> 						    (DDSCAPS2 *) &zbuf_caps, &zbuf);
>-	if (!FAILED(hr)) {
>+	if (SUCCEEDED(hr)) {
> 	    This->current_zbuffer = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, zbuf);
> 	    IDirectDrawSurface7_Release(zbuf);
>+	} else if (glThis->depth_test) {
>+	    glDisable(GL_DEPTH_TEST);
>+	    reenable_depth_test = TRUE;
> 	}
>     }
>     if (This->current_zbuffer != NULL) {
>@@ -1615,6 +1619,9 @@
>     /* Whatever the case, disable the color material stuff */
>     glDisable(GL_COLOR_MATERIAL);
> 
>+    if (reenable_depth_test)
>+	glEnable(GL_DEPTH_TEST);
>+
>     LEAVE_GL();
>     TRACE("End\n");    
> 
>Index: dlls/ddraw/texture.c
>===================================================================
>RCS file: /home/wine/wine/dlls/ddraw/texture.c,v
>retrieving revision 1.4
>diff -u -r1.4 texture.c
>--- dlls/ddraw/texture.c	3 Aug 2005 21:25:11 -0000	1.4
>+++ dlls/ddraw/texture.c	5 Oct 2005 20:51:49 -0000
>@@ -381,7 +381,7 @@
> {
>     if (src != NULL) {
> 	IDirectDrawSurfaceImpl *src_ptr = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, src);
>-	
>+
> 	if ((src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) &&
> 	    ((trans & (DDBLTFAST_SRCCOLORKEY | DDBLTFAST_DESTCOLORKEY)) == 0)) {
> 	    /* This is a blt without color keying... We can use the direct copy. */
>@@ -390,7 +390,7 @@
> 	    GLint cur_tex;
> 	    IDirect3DTextureGLImpl *gl_surf_ptr = surf_ptr->tex_private;
> 	    int y;
>-	    
>+
> 	    if (rsrc == NULL) {
> 		WARN("rsrc is NULL\n");
> 		rsrc = &rsrc2;
>@@ -400,10 +400,10 @@
> 		rsrc->right = src_ptr->surface_desc.dwWidth;
> 		rsrc->bottom = src_ptr->surface_desc.dwHeight;
> 	    }
>-	    
>+
> 	    width = rsrc->right - rsrc->left;
> 	    height = rsrc->bottom - rsrc->top;
>-	    
>+
> 	    if (((dstx + width)  > surf_ptr->surface_desc.dwWidth) ||
> 		((dsty + height) > surf_ptr->surface_desc.dwHeight)) {
> 		FIXME("Does not handle clipping yet in FB => Texture blits !\n");
>@@ -413,16 +413,16 @@
> 	    if ((width == 0) || (height == 0)) {
> 		return DD_OK;
> 	    }
>-	    
>+
> 	    TRACE(" direct frame buffer => texture BltFast override.\n");
>-	    
>+
> 	    ENTER_GL();
>-	    
>+
> 	    glGetIntegerv(GL_TEXTURE_BINDING_2D, &cur_tex);
> 	    /* This call is to create the actual texture name in GL (as we do 'late' ID creation) */
> 	    gltex_get_tex_name(surf_ptr);
> 	    glBindTexture(GL_TEXTURE_2D, gl_surf_ptr->tex_name);
>-	    
>+
> 	    if ((gl_surf_ptr->dirty_flag == SURFACE_MEMORY_DIRTY) &&
> 		!((dstx == 0) && (dsty == 0) &&
> 		  (width == surf_ptr->surface_desc.dwWidth) && (height == surf_ptr->surface_desc.dwHeight))) {
>@@ -456,7 +456,7 @@
> 		    return DDERR_INVALIDPARAMS;
> 		}
> 	    }
>-	    
>+
> 	    if ((src_ptr->surface_desc.ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER|DDSCAPS_PRIMARYSURFACE)) != 0)
> 		glReadBuffer(GL_FRONT);
> 	    else if ((src_ptr->surface_desc.ddsCaps.dwCaps & (DDSCAPS_BACKBUFFER)) == (DDSCAPS_BACKBUFFER))
>@@ -467,7 +467,7 @@
> 		LEAVE_GL();
> 		return DDERR_INVALIDPARAMS;
> 	    }
>-	    
>+
> 	    for (y = (src_ptr->surface_desc.dwHeight - rsrc->top - 1);
> 		 y >= (src_ptr->surface_desc.dwHeight - (rsrc->top + height));
> 		 y--) {
>@@ -477,13 +477,13 @@
> 				    width, 1);
> 		dsty++;
> 	    }
>-	    
>+
> 	    glBindTexture(GL_TEXTURE_2D, cur_tex);
> 	    LEAVE_GL();
>-	    
>+
> 	    /* The SURFACE_GL case is not handled by the 'global' dirty flag */
> 	    gl_surf_ptr->dirty_flag = SURFACE_GL;
>-	    
>+
> 	    return DD_OK;
> 	}
>     }
>@@ -544,9 +544,9 @@
> 
>     if (glThis->dirty_flag == SURFACE_GL) {
> 	GLint cur_tex;
>-	
>+
> 	TRACE(" flushing GL texture back to memory.\n");
>-	
>+
> 	ENTER_GL();
> 	glGetIntegerv(GL_TEXTURE_BINDING_2D, &cur_tex);
> 	glBindTexture(GL_TEXTURE_2D, glThis->tex_name);
>@@ -554,14 +554,14 @@
> 	glBindTexture(GL_TEXTURE_2D, cur_tex);
> 	LEAVE_GL();
>     }
>-    
>+
>     /* First call the previous set_palette function */
>     glThis->set_palette(This, pal);
>-    
>+
>     /* And set the dirty flag */
>     glThis->dirty_flag = SURFACE_MEMORY_DIRTY;
>     *(glThis->global_dirty_flag) = SURFACE_MEMORY_DIRTY;
>-    
>+
>     /* TODO: check palette on mipmapped surfaces...
>        TODO: do we need to re-upload in case of usage of the paletted texture extension ? */
> }
>@@ -603,7 +603,7 @@
> gltex_lock_update(IDirectDrawSurfaceImpl* This, LPCRECT pRect, DWORD dwFlags)
> {
>     IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private;
>-    
>+
>     glThis->lock_update(This, pRect, dwFlags);
> }
> 
>@@ -613,7 +613,7 @@
>     IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private;
> 
>     glThis->unlock_update(This, pRect);
>-    
>+
>     /* Set the dirty flag according to the lock type */
>     if ((This->lastlocktype & DDLOCK_READONLY) == 0) {
>         glThis->dirty_flag = SURFACE_MEMORY_DIRTY;
>@@ -868,7 +868,7 @@
>     /* First, initialize the texture vtables... */
>     ICOM_INIT_INTERFACE(surf, IDirect3DTexture,  VTABLE_IDirect3DTexture);
>     ICOM_INIT_INTERFACE(surf, IDirect3DTexture2, VTABLE_IDirect3DTexture2);
>-	
>+
>     /* Only create all the private stuff if we actually have an OpenGL context.. */
>     if (d3d->current_device != NULL) {
>         IDirect3DTextureGLImpl *private;
>@@ -877,12 +877,12 @@
> 	if (private == NULL) return DDERR_OUTOFMEMORY;
> 
> 	surf->tex_private = private;
>-	
>+
> 	private->final_release = surf->final_release;
> 	private->lock_update = surf->lock_update;
> 	private->unlock_update = surf->unlock_update;
> 	private->set_palette = surf->set_palette;
>-	
>+
> 	/* If at creation, we can optimize stuff and wait the first 'unlock' to upload a valid stuff to OpenGL.
> 	   Otherwise, it will be uploaded here (and may be invalid). */
> 	surf->final_release = gltex_final_release;
>@@ -895,7 +895,7 @@
> 	   to save those... */
> 	surf->aux_blt = gltex_blt;
> 	surf->aux_bltfast = gltex_bltfast;
>-	
>+
> 	TRACE(" GL texture created for surface %p (private data at %p)\n", surf, private);
> 
> 	/* Do not create the OpenGL texture id here as some game generate textures from a different thread which
>@@ -903,12 +903,14 @@
> 	private->tex_name = 0;
> 	if (surf->mipmap_level == 0) {
> 	    private->main = NULL;
>+	    private->__global_dirty_flag = SURFACE_MEMORY_DIRTY;
> 	    private->global_dirty_flag = &(private->__global_dirty_flag);
> 	} else {
> 	    private->main = main;
> 	    private->global_dirty_flag = &(((IDirect3DTextureGLImpl *) (private->main->tex_private))->__global_dirty_flag);
> 	}
> 	private->initial_upload_done = FALSE;
>+	private->dirty_flag = SURFACE_MEMORY_DIRTY;
>     }
> 
>     return D3D_OK;
>@@ -925,15 +927,11 @@
> 	    glGenTextures(1, &(private->tex_name));
> 	    if (private->tex_name == 0) ERR("Error at creation of OpenGL texture ID !\n");
> 	    TRACE(" GL texture id is : %d.\n", private->tex_name);
>-	    private->__global_dirty_flag = SURFACE_MEMORY_DIRTY;
> 	} else {
> 	    private->tex_name = gltex_get_tex_name(private->main);
> 	    TRACE(" GL texture id reusing id %d from surface %p (private at %p)).\n", private->tex_name, private->main, private->main->tex_private);
> 	}
> 	LEAVE_GL();
>-
>-	/* And set the dirty flag accordingly */
>-	private->dirty_flag = SURFACE_MEMORY_DIRTY;
>     }
>     return ((IDirect3DTextureGLImpl *) (surf->tex_private))->tex_name;
> }
>  
>
>------------------------------------------------------------------------
>
>
>  
>






More information about the wine-devel mailing list