[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