[PATCH 4/5] win32u: Move null user driver implementation from user32.
Jacek Caban
jacek at codeweavers.com
Wed Nov 10 10:33:01 CST 2021
On 11/10/21 3:19 PM, Rémi Bernon wrote:
> On 11/10/21 15:01, Jacek Caban wrote:
>> On 11/10/21 12:47 AM, Rémi Bernon wrote:
>>> On 11/10/21 00:41, Rémi Bernon wrote:
>>>> On 11/9/21 13:55, Jacek Caban wrote:
>>>>> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
>>>>> ---
>>>>> dlls/user32/driver.c | 209 +----------------------------
>>>>> dlls/win32u/driver.c | 310
>>>>> ++++++++++++++++++++++++++++++++++++++++++-
>>>>> 2 files changed, 310 insertions(+), 209 deletions(-)
>>>>>
>>>>>
>>>>
>>>> A little bit related to my previous comment, this patch introduces
>>>> a reset to "null" graphics driver on driver unload.
>>>>
>>>> I think it could also add the same
>>>>
>>>> __wine_set_display_driver( &null_driver, WINE_GDI_DRIVER_VERSION );
>>>>
>>>> call when the "null" driver is explicitly requested and loaded,
>>>> possibly addressing my previous comment too (as the pointer would
>>>> not be lasy_load_driver anymore).
>>>
>>> Also, regarding EnumDisplayMonitors and GetMonitorInfo, for which
>>> you added some FIXME, I have some patches to move the default
>>> implementation back to the corresponding user32 functions.
>>>
>>> I intended to send them after the previous nulldrv display device
>>> cache series I sent a week ago but I don't think they actually
>>> depend on it.
>>>
>>> (Similarly, I used the monitor cache to keep the default and initial
>>> monitor for GetMonitorInfo implementation)
>>>
>>> I rebased and pushed the patches there if you're interested,
>>> although only the commit up to
>>> c998fbadab6aa33e3bd2740b0651a0c0509d4c02 are really relevant for this:
>>
>>
>> I have null driver functions and some other sysparams.c functions
>> moved to win32u in my tree. Those needed to be changed due to to
>> advapi32 and setupapi calls. I used a cache as well, but instead of
>> having two caches, I extended adapters cache to contain missing
>> monitor rects informations. There are a few functions that need to
>> enumerate monitors, they would look like this:
>>
>>
>> update_display_cache();
>>
>> pthread_mutex_lock( &display_lock );
>>
>> LIST_FOR_EACH_ENTRY( adapter, &adapters, struct display_device,
>> entry )
>> {
>> LIST_FOR_EACH_ENTRY( monitor, &adapter->children, struct
>> monitor, dev.entry )
>> {
>>
>> /* .... */
>>
>> }
>> }
>>
>> pthread_mutex_unlock( &display_lock );
>>
>>
>> What do you think about such approach?
>>
>
> Do you actually need to move the display device cache to win32u or is
> it just because of the non-trivial nulldrv functions being moved there
> too?
It all needs to be moved. A number of other win32u functionality depends
on those functions.
>
> In the tree I linked above, in the end after all the changes, the
> nulldrv functions are all mostly no-op and the default implementation
> lives in user32, updating the cache by enumerating setupapi devices.
>
> It also moves several things out of graphics drivers, such as reading
> / writing current display mode, to the user32 EnumDisplaySettingsExW /
> ChangeDisplaySettingsEx generic code.
>
> Overall I think it makes everything much simpler, and reduce the
> amount of entry points graphics driver would need, and reduce the
> amount of changes needed if you need to replace all setupapi /
> advapi32 calls.
Yes, I think that those are mostly the right direction. I could even
imagine setting registry in wineandroid.drv and remove
pEnumDisplayMonitors entry point.
I already replaced problematic setupapi / advapi32 calls from
sysparams.c in my tree. I'd prefer cache layout like I mentioned, but it
should be easy to adopt to a different cache layout as well.
Thanks,
Jacek
More information about the wine-devel
mailing list