[PATCH v2 2/2] winevulkan: Add registry key for manipulating quirks

Liam Middlebrook lmiddlebrook at nvidia.com
Sat Sep 12 06:07:39 CDT 2020



On 9/9/20 6:47 PM, Brendan Shanks wrote:
> 
> 
>> On Sep 8, 2020, at 6:44 PM, Liam Middlebrook <lmiddlebrook at nvidia.com 
>> <mailto:lmiddlebrook at nvidia.com>> wrote:
>>
>> Hi Brendan,
>>
>> On 9/8/20 1:22 PM, Brendan Shanks wrote:
>>> Hi Liam,
>>>> On Sep 8, 2020, at 12:46 PM, Liam Middlebrook 
>>>> <lmiddlebrook at nvidia.com <mailto:lmiddlebrook at nvidia.com>> wrote:
>>>>
>>>> Tested with Vulkan CTS and WINEVULKAN_QUIRK_IGNORE_EXPLICIT_LAYERS.
>>>>
>>>> Signed-off-by: Liam Middlebrook <lmiddlebrook at nvidia.com 
>>>> <mailto:lmiddlebrook at nvidia.com>>
>>>> Signed-off-by: Daniel Koch <dkoch at nvidia.com <mailto:dkoch at nvidia.com>>
>>>> ---
>>>> v2: fixup comment style
>>>>
>>>> dlls/winevulkan/vulkan.c | 17 +++++++++++++++++
>>>> 1 file changed, 17 insertions(+)
>>>>
>>>> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
>>>> index a8beef126bd..19093d47390 100644
>>>> --- a/dlls/winevulkan/vulkan.c
>>>> +++ b/dlls/winevulkan/vulkan.c
>>>> @@ -662,6 +662,7 @@ VkResult WINAPI wine_vkCreateInstance(const 
>>>> VkInstanceCreateInfo *create_info,
>>>>     const VkApplicationInfo *app_info;
>>>>     struct VkInstance_T *object;
>>>>     VkResult res;
>>>> +    HKEY key;
>>>>
>>>>     TRACE("create_info %p, allocator %p, instance %p\n", 
>>>> create_info, allocator, instance);
>>>>
>>>> @@ -679,6 +680,22 @@ VkResult WINAPI wine_vkCreateInstance(const 
>>>> VkInstanceCreateInfo *create_info,
>>>>     }
>>>>     object->base.loader_magic = VULKAN_ICD_MAGIC_VALUE;
>>>>
>>>> +    /* Load optional WineVulkan quirks bits from registry, see 
>>>> vulkan_private.h
>>>> +     * for a list of quirks.
>>>> +     */
>>> There’s a specially-formatted comment that is used to highlight Wine 
>>> registry keys, like:
>>> /* @@ Wine registry key: HKCU\Software\Wine\Vulkan */
>>
>> Ah cool, I was looking through examples in other places and must have 
>> missed that. I'll add that in later on, but I figure we may want to 
>> hash out the below a bit more first, before I send any follow-up patches.
>>
>>> Also, this seems like a good fit to support AppDefaults in the registry.
>>
>> Yeah, I think that makes sense to do. Rather than using the process 
>> name like is done elsewhere, how would you feel about making use of 
>> pApplicationName and pEngineName from VkApplicationInfo?
>>
>> The regkey structure could be something like:
>>    HKCU\Software\Wine\Vulkan\ApplicationName\%pApplicationName%\Quirks
>>    HKCU\Software\Wine\Vulkan\EngineName\%pEngineName%\Quirks
>>
> 
> Yeah I like this idea. Some day we’ll need to apply a quirk for 
> “Game.exe” or “Launcher.exe”, and this will come in handy.
> 
> I guess in this case you would check them from most to least specific, 
> so application name->engine name->executable name. And then each level 
> would be checked and the first quirks value found gets used?

Yeah, I was planning on doing four levels:

1. pApplicationName
2. pEngineName
3. exe name
4. global

> 
>> Although it'd also be nice to try to account for versions there, but 
>> maybe doing that from the registry isn't the right spot. Ideally we 
>> shouldn't really need to be adding any more of these 
>> application-specific workarounds anyways, but for older 
>> poorly-behaving applications they'll always be needed.
> 
> Maybe version could be done with another level of keys, like 
> 'Vulkan\ApplicationName\%pApplicationName%\%applicationVersion%\Quirks’. 
> This starts to get complicated though, maybe it should wait until a 
> clear need arises. Plus, a version number check would often need to be 
> ‘less-than some version number’, which is even more complicated.

Sounds good. Generally speaking as long as pApplicationNames are 
provided and somewhat unique, I think that'll take us fairly far.

> 
>> Another though I had on this (+CC Georg) was that we should probably 
>> invert WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT so that the default is 
>> zero, possibly rename to add a _DONT_.
>>
>> Thinking further on quirk defaults, I wonder if they should be handled 
>> as binary, or if trinary is a better fit (unset, forced on, forced 
>> off). Right now the quirks bits have us choosing some reasonable 
>> default for all applications, and then either using the prospective 
>> regkey to enable a quirk, or having winevulkan pick up on some 
>> runtime-specific state to determine if a quirk needs to be enabled or 
>> not. Although if we're thinking down that route, maybe it would be 
>> easiest to have each quirk split to a separate regkey-value, and then 
>> track those settings in a structure.
> 
> Yeah I think you would want all quirks to default to zero, so if you add 
> new quirks the existing per-app registry values won’t need to change.

Agreed, I'm also thinking that any quirks by default shouldn't reduce 
how conformant a WineVulkan implementation is (not to say that we are 
currently passing CTS, but it shouldn't make matters any worse).

> 
> Trinary or separate values are tempting, but it adds a lot of complexity 
> vs just a bit mask. To me, I think it’s worth sticking with a single bit 
> mask unless you can really see the use for something more complicated.
> 
> Lately I’ve been working on a similar system for per-app overriding the 
> vendor/device ID returned in VkPhysicalDeviceProperties, and hitting 
> some similar issues. These would both be living in vulkan.c, maybe some 
> functions can be shared for all the registry code.

Thanks, I'll try to keep that in mind when I write out the next series 
with all of this then.


Thanks,

Liam Middlebrook

> 
> 
> Brendan
> 



More information about the wine-devel mailing list