[dx56] d3d8/x11 locks fixes

Raphaël Junqueira fenix at club-internet.fr
Mon Jun 16 19:05:27 CDT 2003


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

Hi,

 With that patch, we can now play d3d8 games with sound (tested war3, mafia, 
ut2003)

Changelog:
 - dsound and d3d works better when x11drv locks/unlocks are corrects
 - more traces

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

iD8DBQE+7ltTp7NA3AmQTU4RAjeQAJ4/pJ+yHlWuA1xEbdTLceJPnu6+6QCeLG3z
BrTLTH8j261uGavqi/nQaaA=
=U40o
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: cubetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/cubetexture.c,v
retrieving revision 1.11
diff -u -r1.11 cubetexture.c
--- cubetexture.c	4 Jun 2003 23:05:46 -0000	1.11
+++ cubetexture.c	16 Jun 2003 23:56:48 -0000
@@ -136,6 +136,9 @@
     int j;
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     TRACE("(%p) : About to load texture: dirtified(%d)\n", This, This->Dirty);
+
+    ENTER_GL();
+
     for (i = 0; i < This->levels; i++) {
       if (i == 0 && This->surfaces[0][0]->textureName != 0 && This->Dirty == FALSE) {
 	glEnable(GL_TEXTURE_CUBE_MAP_ARB);
@@ -185,6 +188,9 @@
 	This->Dirty = FALSE;
       }
     }
+
+    LEAVE_GL();
+
     return ;
 }
 
Index: d3d8_main.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_main.c,v
retrieving revision 1.8
diff -u -r1.8 d3d8_main.c
--- d3d8_main.c	4 Jun 2003 22:45:57 -0000	1.8
+++ d3d8_main.c	16 Jun 2003 23:56:48 -0000
@@ -29,6 +29,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
+int num_lock = 0;
 void (*wine_tsx11_lock_ptr)(void) = NULL;
 void (*wine_tsx11_unlock_ptr)(void) = NULL;
 
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.37
diff -u -r1.37 d3d8_private.h
--- d3d8_private.h	13 Jun 2003 19:14:34 -0000	1.37
+++ d3d8_private.h	16 Jun 2003 23:56:55 -0000
@@ -49,8 +49,14 @@
 extern void (*wine_tsx11_unlock_ptr)(void);
 
 /* As GLX relies on X, this is needed */
+extern int num_lock;
+#if 0
+#define ENTER_GL() ++num_lock; TRACE("inc lock to: %d\n", num_lock); wine_tsx11_lock_ptr()
+#define LEAVE_GL() if (num_lock > 2) TRACE("fucking locks: %d\n", num_lock); --num_lock; wine_tsx11_unlock_ptr()
+#else
 #define ENTER_GL() wine_tsx11_lock_ptr()
 #define LEAVE_GL() wine_tsx11_unlock_ptr()
+#endif
 
 #include "d3d8.h"
 
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.72
diff -u -r1.72 device.c
--- device.c	13 Jun 2003 19:14:34 -0000	1.72
+++ device.c	16 Jun 2003 23:57:05 -0000
@@ -1567,6 +1567,8 @@
         return D3D_OK;
     }
 
+    ENTER_GL();
+
     TRACE("(%p) : x=%ld, y=%ld, wid=%ld, hei=%ld, minz=%f, maxz=%f\n", This,
           pViewport->X, pViewport->Y, pViewport->Width, pViewport->Height, pViewport->MinZ, pViewport->MaxZ);
 
@@ -1577,6 +1579,7 @@
                pViewport->Width, pViewport->Height);
     checkGLcall("glViewport");
 
+    LEAVE_GL();
 
     return D3D_OK;
 
@@ -1668,6 +1671,8 @@
         return D3D_OK;
     }
 
+    ENTER_GL();
+
     /* Diffuse: */
     colRGBA[0] = pLight->Diffuse.r;
     colRGBA[1] = pLight->Diffuse.g;
@@ -1780,6 +1785,8 @@
     /* Restore the modelview matrix */
     glPopMatrix();
 
+    LEAVE_GL();
+
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,D3DLIGHT8* pLight) {
@@ -1812,7 +1819,8 @@
         TRACE("Recording... not performing anything\n");
         return D3D_OK;
     }
-
+    
+    ENTER_GL();
     if (Enable) {
         glEnable(GL_LIGHT0 + Index);
         checkGLcall("glEnable GL_LIGHT0+Index");
@@ -1820,6 +1828,8 @@
         glDisable(GL_LIGHT0 + Index);
         checkGLcall("glDisable GL_LIGHT0+Index");
     }
+    LEAVE_GL();
+
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL* pEnable) {
@@ -1859,6 +1869,8 @@
 
     /* Apply it */
 
+    ENTER_GL();
+
     /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */
     glMatrixMode(GL_MODELVIEW);
     glPushMatrix();
@@ -1874,6 +1886,8 @@
     glPopMatrix();
     checkGLcall("glClipPlane");
 
+    LEAVE_GL();
+
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,float* pPlane) {
@@ -1907,6 +1921,8 @@
         return D3D_OK;
     }
 
+    ENTER_GL();
+
     switch (State) {
     case D3DRS_FILLMODE                  :
         switch ((D3DFILLMODE) Value) {
@@ -1987,6 +2003,8 @@
             break;
         case D3DSHADE_PHONG:
             FIXME("D3DSHADE_PHONG isnt supported?\n");
+
+	    LEAVE_GL();
             return D3DERR_INVALIDCALL;
         default:
             FIXME("Unrecognized/Unhandled D3DSHADEMODE value %ld\n", Value);
@@ -2668,6 +2686,8 @@
         FIXME("(%p)->(%d,%ld) unrecognized\n", This, State, Value);
     }
 
+    LEAVE_GL();
+
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD* pValue) {
@@ -2775,6 +2795,8 @@
         return D3D_OK;
     }
 
+    ENTER_GL();
+
     /* Make appropriate texture active */
     if (GL_SUPPORT(ARB_MULTITEXTURE)) {
 #if defined(GL_VERSION_1_3)
@@ -2850,7 +2872,9 @@
     if (reapplyStates) {
        setupTextureStates(iface, Stage);
     }
-       
+
+    LEAVE_GL();   
+
     return D3D_OK;
 }
 
@@ -2884,6 +2908,8 @@
         return D3D_OK;
     }
 
+    ENTER_GL();
+
     /* Make appropriate texture active */
     VTRACE(("Activating appropriate texture state %ld\n", Stage));
     if (GL_SUPPORT(ARB_MULTITEXTURE)) {
@@ -3284,6 +3310,9 @@
         /* Put back later: FIXME("(%p) : stub, Stage=%ld, Type=%d, Value =%ld\n", This, Stage, Type, Value); */
         TRACE("Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value);
     }
+
+    LEAVE_GL();
+
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_ValidateDevice(LPDIRECT3DDEVICE8 iface, DWORD* pNumPasses) {
@@ -3314,8 +3343,12 @@
     ICOM_THIS(IDirect3DDevice8Impl,iface);
     FIXME("(%p) : Setting to (%u)\n", This, PaletteNumber);
     This->currentPalette = PaletteNumber;
+
 #if defined(GL_EXT_paletted_texture)
     if (GL_SUPPORT(EXT_PALETTED_TEXTURE)) {
+
+      ENTER_GL();
+
       GL_EXTCALL(glColorTableEXT)(GL_TEXTURE_2D,    /* target */
 				  GL_RGBA,          /* internal format */
 				  256,              /* table size */
@@ -3323,6 +3356,9 @@
 				  GL_UNSIGNED_BYTE, /* table type */
 				  This->palettes[PaletteNumber]);
       checkGLcall("glColorTableEXT");
+
+      LEAVE_GL();
+
     } else {
       /* Delayed palette handling ... waiting for software emulation into preload code */
     }
@@ -3430,7 +3466,7 @@
     HRESULT res;
     UINT i;
 
-    TRACE_(d3d_shader)("(%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, Usage=%lu\n", This, pDeclaration, pFunction, Usage);
     if (NULL == pDeclaration || NULL == pHandle) { /* pFunction can be NULL see MSDN */
       return D3DERR_INVALIDCALL;
     }
@@ -3891,6 +3927,9 @@
 HRESULT WINAPI IDirect3DDevice8Impl_CleanRender(LPDIRECT3DDEVICE8 iface) {
   ICOM_THIS(IDirect3DDevice8Impl,iface);
 #if defined(GL_VERSION_1_3) /* @see comments on ActiveRender */
+
+  ENTER_GL();
+
 #if 0
   if (This->glCtx != This->render_ctx) {
     glXDestroyContext(This->display, This->render_ctx);
@@ -3901,6 +3940,9 @@
     glXDestroyPbuffer(This->display, This->drawable);
     This->drawable = This->win;
   }
+
+  LEAVE_GL();
+
 #endif
   return D3D_OK;
 }
@@ -3909,6 +3951,7 @@
 						IDirect3DSurface8* RenderSurface, 
 						IDirect3DSurface8* StencilSurface) {
 
+  HRESULT ret =  D3DERR_INVALIDCALL; 
   /**
    * Currently only active for GLX >= 1.3
    * for others versions we'll have to use GLXPixmaps
@@ -3918,7 +3961,6 @@
    * so only check OpenGL version
    */
 #if defined(GL_VERSION_1_3) 
-
   GLXFBConfig* cfgs = NULL;
   int nCfgs = 0;
   int attribs[256];
@@ -4022,6 +4064,8 @@
 
   PUSH1(None);
   
+  ENTER_GL();
+
   cfgs = glXChooseFBConfig(This->display, DefaultScreen(This->display), attribs, &nCfgs);
   if (NULL != cfgs) {
 #if 0
@@ -4096,7 +4140,7 @@
     if (NULL != This->stencilBufferTarget) IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) This->stencilBufferTarget);
     if (NULL != tmp) IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8) tmp);
 
-    return D3D_OK;
+    ret = D3D_OK;
 
   } else {
     ERR("cannot get valides GLXFBConfig for (%u,%s)/(%u,%s)\n", BackBufferFormat, debug_d3dformat(BackBufferFormat), StencilBufferFormat, debug_d3dformat(StencilBufferFormat));
@@ -4105,7 +4149,9 @@
 #undef PUSH1
 #undef PUSH2
 
+  LEAVE_GL();
+
 #endif
 
-  return D3DERR_INVALIDCALL;
+  return ret;
 }
Index: drawprim.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/drawprim.c,v
retrieving revision 1.1
diff -u -r1.1 drawprim.c
--- drawprim.c	13 Jun 2003 18:09:05 -0000	1.1
+++ drawprim.c	16 Jun 2003 23:57:08 -0000
@@ -1295,7 +1295,8 @@
         drawStridedSoftwareVS(iface, &dataLocations, PrimitiveType, NumPrimitives, 
                         idxData, idxSize, minIndex, StartIdx);            
 
-    } else if ((dataLocations.u.s.pSize.lpData        != NULL) || 
+    } else if (/*TRUE ||*/
+	       (dataLocations.u.s.pSize.lpData        != NULL) || 
                (dataLocations.u.s.diffuse.lpData      != NULL) || 
                (dataLocations.u.s.blendWeights.lpData != NULL)) {
 
Index: stateblock.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/stateblock.c,v
retrieving revision 1.7
diff -u -r1.7 stateblock.c
--- stateblock.c	4 Jun 2003 22:02:06 -0000	1.7
+++ stateblock.c	16 Jun 2003 23:57:10 -0000
@@ -198,6 +198,8 @@
        texture stage, but disable all stages by default. Hence if a stage is enabled
        then the default texture will kick in until replaced by a SetTexture call     */
 
+    ENTER_GL();
+
     for (i = 0; i < GL_LIMITS(textures); i++) {
         GLubyte white = 255;
 
@@ -234,6 +236,8 @@
         /* Reapply all the texture state information to this texture */
         setupTextureStates(iface, i);
     }
+
+    LEAVE_GL();
 
     /* defaulting palettes */
     for (i = 0; i < MAX_PALETTES; ++i) {
Index: surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.18
diff -u -r1.18 surface.c
--- surface.c	16 Jun 2003 20:20:25 -0000	1.18
+++ surface.c	16 Jun 2003 23:57:11 -0000
@@ -209,7 +209,9 @@
 
 	glReadBuffer(prev_read);
 	vcheckGLcall("glReadBuffer");
+
 	LEAVE_GL();
+
       } else {
 	FIXME("unsupported locking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
       }
@@ -341,6 +343,7 @@
 	vcheckGLcall("glDrawBuffer");
 	glRasterPos3iv(&prev_rasterpos[0]);
 	vcheckGLcall("glRasterPos3iv");
+
 	LEAVE_GL();
 
 	/** restore clean dirty state */
@@ -412,6 +415,8 @@
       else
 	*dst++ = 0xFF; 
     }
+
+    ENTER_GL();
     
     TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n",
 	  gl_target,
@@ -435,6 +440,8 @@
     checkGLcall("glTexImage2D");
     HeapFree(GetProcessHeap(), 0, surface);
 
+    LEAVE_GL();
+
     return D3D_OK;    
   }
 
@@ -452,6 +459,9 @@
 	    0, 
 	    This->myDesc.Size,
 	    This->allocatedMemory);
+      
+      ENTER_GL();
+
       glCompressedTexImage2DARB(gl_target, 
 				gl_level, 
 				D3DFmt2GLIntFmt(This->Device, This->myDesc.Format),
@@ -461,6 +471,8 @@
 				This->myDesc.Size,
 				This->allocatedMemory);
       checkGLcall("glCommpressedTexTexImage2D");
+
+      LEAVE_GL();
     }
 #endif
   } else {
@@ -474,6 +486,9 @@
 	  D3DFmt2GLFmt(This->Device, This->myDesc.Format), 
 	  D3DFmt2GLType(This->Device, This->myDesc.Format),
 	  This->allocatedMemory);
+
+    ENTER_GL();
+
     glTexImage2D(gl_target, 
 		 gl_level,
 		 D3DFmt2GLIntFmt(This->Device, This->myDesc.Format),
@@ -484,6 +499,8 @@
 		 D3DFmt2GLType(This->Device, This->myDesc.Format),
 		 This->allocatedMemory);
     checkGLcall("glTexImage2D");
+
+    LEAVE_GL();
 
 #if 0
     {
Index: texture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/texture.c,v
retrieving revision 1.11
diff -u -r1.11 texture.c
--- texture.c	4 Jun 2003 23:05:46 -0000	1.11
+++ texture.c	16 Jun 2003 23:57:12 -0000
@@ -110,6 +110,9 @@
     int i;
     ICOM_THIS(IDirect3DTexture8Impl,iface);
     TRACE("(%p) : About to load texture\n", This);
+
+    ENTER_GL();
+
     for (i = 0; i < This->levels; i++) {
       if (i == 0 && This->surfaces[i]->textureName != 0 && This->Dirty == FALSE) {
 	glBindTexture(GL_TEXTURE_2D, This->surfaces[i]->textureName);
@@ -139,6 +142,9 @@
 	This->Dirty = FALSE;
       }
     }
+
+    LEAVE_GL();
+
     return ;
 }
 D3DRESOURCETYPE WINAPI IDirect3DTexture8Impl_GetType(LPDIRECT3DTEXTURE8 iface) {
Index: utils.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/utils.c,v
retrieving revision 1.7
diff -u -r1.7 utils.c
--- utils.c	13 Jun 2003 19:14:34 -0000	1.7
+++ utils.c	16 Jun 2003 23:57:15 -0000
@@ -691,6 +691,8 @@
         TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);
         if (op == D3DTOP_DISABLE) return;
 
+	ENTER_GL();
+
         /* Note: Operations usually involve two ars, src0 and src1 and are operations of
            the form (a1 <operation> a2). However, some of the more complex operations
            take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added  
@@ -1005,6 +1007,8 @@
                default:
                    FIXME("Cant have COMBINE4 and COMBINE in efferct together, thisop=%d, otherop=%ld, isAlpha(%d)\n", 
                               op, op2, isAlpha);
+
+		   LEAVE_GL();
                    return;
                }
            }
@@ -1013,6 +1017,8 @@
            if (combineOK == TRUE) {
 	       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
 	       checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
+
+	       LEAVE_GL();
 	       return;
            }
         }
@@ -1253,9 +1259,13 @@
         if (Handled) {
 	    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
 	    checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
-            return;
+
+	    LEAVE_GL();
+	    return;
         }
 #endif /* GL_NV_texture_env_combine4 */
+
+	LEAVE_GL();
 
         /* After all the extensions, if still unhandled, report fixme */
         FIXME("Unhandled texture operation %d\n", op);
Index: volumetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volumetexture.c,v
retrieving revision 1.11
diff -u -r1.11 volumetexture.c
--- volumetexture.c	4 Jun 2003 23:05:46 -0000	1.11
+++ volumetexture.c	16 Jun 2003 23:57:15 -0000
@@ -114,6 +114,9 @@
     int i;
     ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
     TRACE("(%p) : About to load texture\n", This);
+
+    ENTER_GL();
+
     for (i = 0; i < This->levels; i++) {
       if (i == 0 && This->volumes[i]->textureName != 0 && This->Dirty == FALSE) {
 	glBindTexture(GL_TEXTURE_3D, This->volumes[i]->textureName);
@@ -164,6 +167,9 @@
 	This->Dirty = FALSE;
       }
     }
+
+    LEAVE_GL();
+
     return ;
 }
 D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(LPDIRECT3DVOLUMETEXTURE8 iface) {


More information about the wine-patches mailing list