[PATCH] winevulkan: Don't hardcode performance frequency.

Paul Gofman pgofman at codeweavers.com
Mon Apr 19 07:43:15 CDT 2021


I realize now this patch doesn't fit the PE conversion which is to be
happen now. Please ignore this one.

On 4/19/21 15:35, Paul Gofman wrote:
> Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
> ---
>     This only real problem that the hardcoded value currently causes is broken
>     convert_monotonic_timestamp in Proton Experimental where performance
>     frequency is currently different. While this is not an upstream issue and we may
>     even want to change that in Proton it doesn't seem right for winevulkan
>     to depend on this implementation detail.
>
>  dlls/winevulkan/vulkan.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
> index 1070ccec115..f793b907dad 100644
> --- a/dlls/winevulkan/vulkan.c
> +++ b/dlls/winevulkan/vulkan.c
> @@ -1355,7 +1355,6 @@ VkResult WINAPI unix_vkGetPhysicalDeviceImageFormatProperties2KHR(VkPhysicalDevi
>  
>  /* From ntdll/unix/sync.c */
>  #define NANOSECONDS_IN_A_SECOND 1000000000
> -#define TICKSPERSEC             10000000
>  
>  static inline VkTimeDomainEXT get_performance_counter_time_domain(void)
>  {
> @@ -1382,7 +1381,17 @@ static VkTimeDomainEXT map_to_host_time_domain(VkTimeDomainEXT domain)
>  
>  static inline uint64_t convert_monotonic_timestamp(uint64_t value)
>  {
> -    return value / (NANOSECONDS_IN_A_SECOND / TICKSPERSEC);
> +    static LARGE_INTEGER freq;
> +
> +    if (!freq.QuadPart)
> +    {
> +        LARGE_INTEGER temp;
> +
> +        RtlQueryPerformanceFrequency(&temp);
> +        InterlockedCompareExchange64(&freq.QuadPart, temp.QuadPart, 0);
> +    }
> +
> +    return value * freq.QuadPart / NANOSECONDS_IN_A_SECOND;
>  }
>  
>  static inline uint64_t convert_timestamp(VkTimeDomainEXT host_domain, VkTimeDomainEXT target_domain, uint64_t value)





More information about the wine-devel mailing list