DDLOCK_NOSYSLOCK prevents DirectDraw from locking "system lock", which is a global 16-bit lock on Windows 9x systems. I don't think this is the right way to fix this.
Check out this page here:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndxgen/htm...
This flag has no effect on Windows 2000 or Wine, since they don't have global Win16 locks (AFAIK).
Matt.
Tony Lambregts wrote:
Matthew Mastracci wrote:
(removing Paul from CC)
I think the problem is that we lock both the src and dest surfaces, without checking to see if they are the same. I think we then try to lock both surfaces and one of the locks fails.
Perhaps this might be a better solution:
if (src == iface) { DD_STRUCT_INIT(&ddesc); DD_STRUCT_INIT(&sdesc);
IDirectDrawSurface7_Lock(iface,NULL,&ddesc,0,0); DD_STRUCT_COPY_BYSIZE(&ddesc,&sdesc);
} else { DD_STRUCT_INIT(&ddesc); DD_STRUCT_INIT(&sdesc);
sdesc.dwSize = sizeof(sdesc); if (src) IDirectDrawSurface7_Lock(src, NULL, &sdesc,
DDLOCK_READONLY, 0); ddesc.dwSize = sizeof(ddesc); IDirectDrawSurface7_Lock(iface,NULL,&ddesc,DDLOCK_WRITEONLY,0); }
I don't have access to my box with my Wine tree right now so I don't know if this will compile. Note that the fix will need to be done for both _Blt() and _BltFast(). Paul Vriens wrote:
I have fixed it on my machine with the following patch. The reasoning for it is that I get the following waring in my trace's
warn:ddraw:Main_DirectDrawSurface_Lock - unsupported locking flag : DDLOCK_NOSYSLOCK
That would indicate that we do not want to actually "Lock" it to prevent others from using it. I think that it can be improved on but I would like you to try this and see if it works for you. If it does then can work on getting it acceptable for cvs.
Index: dlls/ddraw/dsurface/main.c
RCS file: /home/wine/wine/dlls/ddraw/dsurface/main.c,v retrieving revision 1.64 diff -u -r1.64 main.c --- dlls/ddraw/dsurface/main.c 7 Mar 2005 12:23:34 -0000 1.64 +++ dlls/ddraw/dsurface/main.c 15 Mar 2005 19:15:04 -0000 @@ -1147,9 +1147,9 @@ } else { This->lock_update(This, NULL, flags); }
- This->locked = TRUE;
- if (flags & ~(DDLOCK_WAIT|DDLOCK_READONLY|DDLOCK_WRITEONLY)) {
This->locked = TRUE;
- } TRACE("locked surface returning description : \n"); if (TRACE_ON(ddraw)) DDRAW_dump_surface_desc(pDDSD);
@@ -1421,13 +1421,13 @@ HRESULT WINAPI Main_DirectDrawSurface_Unlock(LPDIRECTDRAWSURFACE7 iface, LPRECT pRect) {
IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
TRACE("(%p)->Unlock(%p)\n",This,pRect);
if (!This->locked) {
WARN("Surface not locked - returing DDERR_NOTLOCKED\n");
return DDERR_NOTLOCKED;
WARN("Surface not locked\n");
}
This->locked = FALSE;