[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