http://bugs.winehq.org/show_bug.cgi?id=7881
------- Additional Comments From focht@gmx.net 2007-28-03 15:11 ------- Hello,
from what i've seen looking at java jni code it basically boils down to following (took the code directly from java impl. into a small C test program):
Java_sun_awt_Win32GraphicsDevice_getDefaultPixIDImpl calls ---> Java_sun_awt_Win32GraphicsDevice_isPixFmtSupported calls ---> int max = ::DescribePixelFormat(hDC, (int)pixFmtID, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
params:
hDC = ::GetDC( ::GetDesktopWindow()) (desktop hdc) pixFmtId = 1
output:
--- native windows --- DescribePixelFormat(): max=100, pfd.cColorBits=32, pfd.iPixelType=0, pfd.dwFlags=0x34 Java_sun_awt_Win32GraphicsDevice_getDefaultPixIDImpl() returns 1 --- native windows ---
--- wine linux --- DescribePixelFormat(): max=1, pfd.cColorBits=32, pfd.iPixelType=0, pfd.dwFlags=0x25 Java_sun_awt_Win32GraphicsDevice_getDefaultPixIDImpl() returns 0 --- wine linux ---
return "0" means no suitable Pixel Format id found -> exception thrown.
The problem is the "flags" field in pixel format descriptor. Windows returns 0x34: PFD_SUPPORT_OPENGL | PFD_SUPPORT_GDI | PFD_DRAW_TO_WINDOW Wine returns 0x25: PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER
The "required" flags field in that JRE implementation is: PFD_SUPPORT_GDI | PFD_DRAW_TO_WINDOW
Basically: ((pfd.dwFlags & REQUIRED_FLAGS) == REQUIRED_FLAGS) to satisfy function call (valid pixel id) For windows this condition is satisfied - for the wine case not (PFD_SUPPORT_GDI bits missing). The wine X11 driver doesnt honour this value in wine/dlls/winex11.drv/opengl.c:X11DRV_DescribePixelFormat() and X11DRV_ChoosePixelFormat().
Regards