[DDRAW] fix 2D in D3D device
Christian Costa
titan.costa at wanadoo.fr
Sun Oct 2 07:25:53 CDT 2005
Hi,
This patch fix 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
-------------- next part --------------
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 2 Oct 2005 11:13:38 -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 2 Oct 2005 11:13:50 -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 2 Oct 2005 11:13:53 -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-patches
mailing list