Hi,
I have been working on refining a d3d9 test patch I recently submitted <http://source.winehq.org/patches/data/102263> and noticed a strange behavior when running on a real Windows machine. �I'm wondering if anybody is familiar with it or can check my reasoning.
The strange behavior is that a failed call to wglCreateContext() must be done before SetPixelFormat() will work properly. �The call to wglCreateContext() has to fail because it can't succeed until SetPixelFormat() has been done. �And yet it still seems to be necessary.
My test does the following sequence:
CreateWindowA()
GetDC()
ChoosePixelFormat()
SetPixelFormat()
GetPixelFormat()
This seems fairly simple, straightforward, and commonplace. �Although everything through the SetPixelFormat() indicates success, the GetPixelFormat() call still returns 0. �This causes the test to be skipped. �This happened on the testbot, but I assumed that was caused by the VM's display driver. �However, when I got the chance to try on a real Windows machine, it happened there, too.
I looked around to see if the same sort of thing is done elsewhere in Wine. �It's done in the opengl32 tests in test_setpixelformat() <http://source.winehq.org/source/dlls/opengl32/tests/opengl.c#L254> and it works there, both on the testbot and the Windows machine.
So, then I figured it must be working in those tests because of stuff that is done beforehand. �I disabled most of the opengl32 tests other than test_setpixelformat(). �That was testbot job <https://newtestbot.winehq.org/JobDetails.pl?Key=4751> and it still passed on the testbot and real Windows.
I then disabled the expected-to-fail call to wglCreateContext() that is done in the test main entry function (START_TEST(opengl)). �Once that is disabled, test_setpixelformat() starts failing in the same way as my d3d9 test. �That is testbot job <https://newtestbot.winehq.org/JobDetails.pl?Key=4752>.
So, can it really be that a failed call to wglCreateContext() is necessary before SetPixelFormat() will work properly?
One thing that I haven't had the chance to test yet is whether a wglCreateContext() call _after_ SetPixelFormat() will cause a subsequent GetPixelFormat() to return the right format. �That is, perhaps SetPixelFormat() has worked and the pixel format is remembered, but it's only "realized" once wglCreateContext() is called. �And GetPixelFormat() only returns realized pixel formats.
Also, it's possible that it's sufficient to call any opengl32 function and not wglCreateContext() specifically. �(ChoosePixelFormat(), SetPixelFormat(), and GetPixelFormat() are gdi32 functions.)
In any case, that would mean that my d3d9 test will have to link with opengl32 and call one of its functions.
-Ken