[PATCH 4/5] win32u: Move null user driver implementation from user32.
Rémi Bernon
rbernon at codeweavers.com
Wed Nov 10 10:56:07 CST 2021
On 11/10/21 17:33, Jacek Caban wrote:
> 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.
>
I prefer a flat array for its simplicity, as we don't really need any
custom struct, as it also allows some initial values to be set
conveniently through its initialized, and because I expect the number of
display devices / monitors to be bounded, but it probably doesn't matter
much. And it can very well be changed later.
--
Rémi Bernon <rbernon at codeweavers.com>
More information about the wine-devel
mailing list