D3D7 -> WineD3D, 2nd attempt

Stefan Dösinger stefandoesinger at gmx.at
Sat Oct 15 09:58:00 CDT 2005


Hello,
Just one question about thread safety: The openGL crash I am struggling with 
seems related to threading:

<~30000 lines of debug output from thread 0xb >
000b:trace:ddraw:Main_DirectDrawSurface_Unlock (0x7c8a3910)->Unlock((nil))
000b:trace:d3d_surface:IWineD3DSurfaceImpl_UnlockRect (0x7c8a3cb8 ) : 
dirtyfied(1)
000b:fixme:d3d_surface:IWineD3DSurfaceImpl_UnlockRect unsupported unlocking to 
surface surf at 0x7c8a3cb8 usage(512)
000b:trace:ddraw:Main_DirectDrawSurface_Unlock (0x7c8a2e60)->Unlock((nil))
000b:trace:d3d_surface:IWineD3DSurfaceImpl_UnlockRect (0x7c8a3208 ) : 
dirtyfied(1)
000b:fixme:d3d_surface:IWineD3DSurfaceImpl_UnlockRect unsupported unlocking to 
surface surf at 0x7c8a3208 usage(512)
001c:trace:ddraw:Main_IDirect3DDeviceImpl_7_Clear 
(0x7c7e0cd8/0x7c7e0cd8)->(00000001,0x5c59f4e4,00000002,00000000,0.000000,00000000)
001c:trace:ddraw:d3ddevice_clear  (0x7c7e0cd8) Relay
001c:trace:d3d:IWineD3DDeviceImpl_Clear (0x7c833250) Count (1), pRects 
(0x5c59f4e4), Flags (2), Z (0.000000), Stencil (0)
001c:trace:d3d:IWineD3DDeviceImpl_Clear glEnable GL_SCISSOR_TEST call ok 
device.c / 4666
001c:trace:d3d:IWineD3DDeviceImpl_Clear glClearDepth call ok device.c / 4688
001c:trace:d3d:IWineD3DDeviceImpl_Clear (0x7c833250) 0x5c59f4e4 
Rect=(662,430)->(0,0) glRect=(662,768), len=-662, hei=-430
001c:fixme:d3d:IWineD3DDeviceImpl_Clear >>>>>>>>>>>>>>>>> 501 from glScissor @ 
device.c / 4717
001c:trace:d3d:IWineD3DDeviceImpl_Clear glClear call ok device.c / 4729
001c:trace:d3d:IWineD3DDeviceImpl_Clear glDisable call ok device.c / 4756
001c:trace:ddraw:WineD3D_IDirect3DDeviceImpl_7_3T_2T_1T_BeginScene 
(0x7c7e0cd8/0x7c7e0cd8)->(): Relay!
001c:trace:d3d:IWineD3DDeviceImpl_BeginScene (0x7c833250) : stub
001c:trace:ddraw:WineD3D_IDirect3DDeviceImpl_7_3T_2T_SetRenderState 
(0x7c7e0cd8/0x7c7e0cd8)->(00000089,00000000): Relay!
001c:err:ddraw:WineD3D_IDirect3DDeviceImpl_7_3T_2T_SetRenderState Calling 
glBegin
001c:err:ddraw:WineD3D_IDirect3DDeviceImpl_7_3T_2T_SetRenderState Calling 
glEnd
001c:err:ddraw:WineD3D_IDirect3DDeviceImpl_7_3T_2T_SetRenderState Done!
001c:trace:d3d:IWineD3DDeviceImpl_SetRenderState (0x7c833250)->state = 
WINED3DRS_LIGHTING(137), value = 0
001c:trace:d3d:IWineD3DDeviceImpl_SetRenderState glDisable GL_LIGHTING call ok 
device.c / 2817
001c:err:ddraw:WineD3D_IDirect3DDeviceImpl_7_3T_2T_SetRenderState Calling 
glBegin
---Crash in fglrx---

The nvidia OpenGL implementation crashes in IWineD3DDeviceImpl_Clear, the 
fglrx implementation on the first glBegin or glReadPixels call after the 
thread switch - Here an injected glBegin()-glEnd call after SetRenderState.

Is WineD3D threading safe yet? Or might be the underlying OpenGL layer have 
problems with threading?

On the fglrx side glDisable(GL_LIGHTNING) comes into play somewhere. Without 
this call there's no crash, but a completely blocked X server. However, I 
don't think it's related to the cause, but it only changes the symptom.

Without Hardware accellerated OpenGL there's no crash in OpenGL, but there's a 
DIB crash later on. With the old D3D7 Implementation I've also seen  texture 
problems after the thread switch.

Thanks,
Stefan



More information about the wine-devel mailing list