On 13.10.20 03:50, Joshua Ashton wrote:
Needed for VK_EXT_full_screen_exclusive
Signed-off-by: Joshua Ashton joshua@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;