[PATCH 2/3] winevulkan: Implement extension faking mechanism

Georg Lehmann dadschoorse at gmail.com
Tue Oct 13 16:27:41 CDT 2020


On 13.10.20 03:50, Joshua Ashton wrote:
> Needed for VK_EXT_full_screen_exclusive
>
> Signed-off-by: Joshua Ashton <joshua at froggi.es>
> ---
>  dlls/winevulkan/make_vulkan      | 21 +++++++++++++++++++
>  dlls/winevulkan/vulkan.c         | 36 ++++++++++++++++++++++++++++++++
>  dlls/winevulkan/vulkan_private.h |  3 +++
>  3 files changed, 60 insertions(+)
>
> diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
> index db1d8edcf3..70d8fa5516 100755
> --- a/dlls/winevulkan/make_vulkan
> +++ b/dlls/winevulkan/make_vulkan
> @@ -232,6 +232,10 @@ STRUCT_CHAIN_CONVERSIONS = [
>      "VkInstanceCreateInfo",
>  ]
>
> +# List of device extensions to ensure that we support regardless of 
> whether
> +# the actual driver supports them or not.
> +FAKED_EXTENSIONS = [


I think the name should reflect that these are only device extensions.

e.g. FAKED_DEVICE_EXTENSIONS


> +]
>
>  class Direction(Enum):
>      """ Parameter direction: input, output, input_output. """
> @@ -2247,6 +2251,13 @@ class VkGenerator(object):
>              f.write("    \"{0}\",\n".format(ext["name"]))
>          f.write("};\n\n")
>
> +        # Create array of faked device extensions.
> +        f.write("static const VkExtensionProperties 
> vk_device_extension_faked[] =\n{\n")
> +        for ext in FAKED_EXTENSIONS:
> +            f.write("    {{\"{0}\", {1}}},\n".format(ext["name"], 
> ext["version"]))
> +        f.write("    {\"\", 0}\n")
> +        f.write("};\n\n")
> +
>          # Create array of instance extensions.
>          f.write("static const char * const vk_instance_extensions[] 
> =\n{\n")
>          for ext in self.registry.extensions:
> @@ -2276,6 +2287,16 @@ class VkGenerator(object):
>          f.write("            return TRUE;\n")
>          f.write("    }\n")
>          f.write("    return FALSE;\n")
> +        f.write("}\n\n")
> +
> +        f.write("unsigned int 
> wine_vk_device_extension_faked_count(void)\n")
> +        f.write("{\n")
> +        f.write("    return ARRAY_SIZE(vk_device_extension_faked) - 
> 1;\n")
> +        f.write("}\n\n")
> +
> +        f.write("const VkExtensionProperties* 
> wine_vk_device_extension_faked_idx(unsigned int idx)\n")
> +        f.write("{\n")
> +        f.write("    return &vk_device_extension_faked[idx];\n")
>          f.write("}\n")
>
>      def generate_thunks_h(self, f, prefix):
> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
> index 4352c5536e..177aa3a8bf 100644
> --- a/dlls/winevulkan/vulkan.c
> +++ b/dlls/winevulkan/vulkan.c
> @@ -129,6 +129,8 @@ static struct VkPhysicalDevice_T 
> *wine_vk_physical_device_alloc(struct VkInstanc
>              TRACE("Skipping extension '%s', no implementation found 
> in winevulkan.\n", host_properties[i].extensionName);
>          }
>      }
> +


white space error


Thanks,


Georg Lehmann


> +    num_properties += wine_vk_device_extension_faked_count();
>
>      TRACE("Host supported extensions %u, Wine supported extensions 
> %u\n", num_host_properties, num_properties);
>
> @@ -146,6 +148,11 @@ static struct VkPhysicalDevice_T 
> *wine_vk_physical_device_alloc(struct VkInstanc
>              j++;
>          }
>      }
> +    for (i = 0; i < wine_vk_device_extension_faked_count(); i++)
> +    {
> +        object->extensions[j] = *wine_vk_device_extension_faked_idx(i);
> +        j++;
> +    }
>      object->extension_count = num_properties;
>
>      heap_free(host_properties);
> @@ -226,13 +233,27 @@ static void 
> wine_vk_device_free_create_info(VkDeviceCreateInfo *create_info)
>          heap_free((void *)group_info->pPhysicalDevices);
>      }
>
> +    heap_free((void *)create_info->ppEnabledExtensionNames);
> +
>      free_VkDeviceCreateInfo_struct_chain(create_info);
>  }
>
> +static BOOL wine_vk_device_extension_faked(const char *name)
> +{
> +    unsigned int i;
> +    for (i = 0; i < wine_vk_device_extension_faked_count(); i++)
> +    {
> +        if 
> (strcmp(wine_vk_device_extension_faked_idx(i)->extensionName, name) == 0)
> +            return TRUE;
> +    }
> +    return FALSE;
> +}
> +
>  static VkResult wine_vk_device_convert_create_info(const 
> VkDeviceCreateInfo *src,
>          VkDeviceCreateInfo *dst)
>  {
>      VkDeviceGroupDeviceCreateInfo *group_info;
> +    const char** extensions;
>      unsigned int i;
>      VkResult res;
>
> @@ -261,6 +282,21 @@ static VkResult 
> wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src
>          group_info->pPhysicalDevices = physical_devices;
>      }
>
> +
> +    /* Allocate our own extension list, and remove any faked extensions
> +     * so they don't get passed through to the driver. */
> +    extensions = heap_alloc(sizeof(const char*) * 
> src->enabledExtensionCount);
> +    dst->ppEnabledExtensionNames = extensions;
> +    dst->enabledExtensionCount = 0;
> +    for (i = 0; i < src->enabledExtensionCount; i++) {
> +        const char *extension_name = src->ppEnabledExtensionNames[i];
> +
> +        if (!wine_vk_device_extension_faked(extension_name)) {
> +            extensions[dst->enabledExtensionCount] = extension_name;
> +            dst->enabledExtensionCount++;
> +        }
> +    }
> +
>      /* Should be filtered out by loader as ICDs don't support layers. */
>      dst->enabledLayerCount = 0;
>      dst->ppEnabledLayerNames = NULL;
> diff --git a/dlls/winevulkan/vulkan_private.h 
> b/dlls/winevulkan/vulkan_private.h
> index 4bcc4de440..bb4a3e7ded 100644
> --- a/dlls/winevulkan/vulkan_private.h
> +++ b/dlls/winevulkan/vulkan_private.h
> @@ -135,6 +135,9 @@ static inline VkCommandPool 
> wine_cmd_pool_to_handle(struct wine_cmd_pool *cmd_po
>  void *wine_vk_get_device_proc_addr(const char *name) DECLSPEC_HIDDEN;
>  void *wine_vk_get_instance_proc_addr(const char *name) DECLSPEC_HIDDEN;
>
> +unsigned int wine_vk_device_extension_faked_count(void) DECLSPEC_HIDDEN;
> +const VkExtensionProperties* 
> wine_vk_device_extension_faked_idx(unsigned int idx) DECLSPEC_HIDDEN;
> +
>  BOOL wine_vk_device_extension_supported(const char *name) 
> DECLSPEC_HIDDEN;
>  BOOL wine_vk_instance_extension_supported(const char *name) 
> DECLSPEC_HIDDEN;




More information about the wine-devel mailing list