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@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@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