From: Roderick Colenbrander thunderbird2k@gmail.com
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
Version 3: * Simplify wine_vk_device_convert_create_info() a bit. * Remove outdated comment.
--- dlls/winevulkan/vulkan.c | 62 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 8 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index a5b8a96e9115..d294b0a03189 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -98,6 +98,52 @@ static struct VkQueue_T *wine_vk_device_alloc_queues(struct VkDevice_T *device, return queues; }
+/* Helper function to convert win32 VkDeviceCreateInfo to host compatible. */ +static void wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src, + VkDeviceCreateInfo *dst) +{ + unsigned int i; + + *dst = *src; + + /* Application and loader can pass in a chain of extensions through pNext. + * We can't blindly pass these through as often these contain callbacks or + * they can even be pass structures for loader / ICD internal use. For now + * we ignore everything in pNext chain, but we print FIXMEs. + */ + if (src->pNext) + { + const struct wine_vk_structure_header *header; + + for (header = src->pNext; header; header = header->pNext) + { + switch (header->sType) + { + case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO: + /* Used for loader to ICD communication. Ignore to not confuse + * host loader. + */ + break; + + default: + FIXME("Application requested a linked structure of type %#x.\n", header->sType); + } + } + } + /* For now don't support anything. */ + dst->pNext = NULL; + + /* Should be filtered out by loader as ICDs don't support layers. */ + dst->enabledLayerCount = 0; + dst->ppEnabledLayerNames = NULL; + + TRACE("Enabled extensions: %u\n", dst->enabledExtensionCount); + for (i = 0; i < dst->enabledExtensionCount; i++) + { + TRACE("Extension %u: %s\n", i, debugstr_a(dst->ppEnabledExtensionNames[i])); + } +} + /* Helper function used for freeing a device structure. This function supports full * and partial object cleanups and can thus be used for vkCreateDevice failures. */ @@ -469,8 +515,9 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev, const VkDeviceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkDevice *device) { - struct VkDevice_T *object = NULL; + VkDeviceCreateInfo create_info_host; uint32_t max_queue_families; + struct VkDevice_T *object; VkResult res; unsigned int i;
@@ -485,11 +532,10 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
object->base.loader_magic = VULKAN_ICD_MAGIC_VALUE;
- /* At least for now we can directly pass create_info through. All extensions we report - * should be compatible. In addition the loader is supposed to sanitize values e.g. layers. - */ + wine_vk_device_convert_create_info(create_info, &create_info_host); + res = phys_dev->instance->funcs.p_vkCreateDevice(phys_dev->phys_dev, - create_info, NULL /* allocator */, &object->device); + &create_info_host, NULL /* allocator */, &object->device); if (res != VK_SUCCESS) { ERR("Failed to create device\n"); @@ -524,10 +570,10 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev, goto err; }
- for (i = 0; i < create_info->queueCreateInfoCount; i++) + for (i = 0; i < create_info_host.queueCreateInfoCount; i++) { - uint32_t family_index = create_info->pQueueCreateInfos[i].queueFamilyIndex; - uint32_t queue_count = create_info->pQueueCreateInfos[i].queueCount; + uint32_t family_index = create_info_host.pQueueCreateInfos[i].queueFamilyIndex; + uint32_t queue_count = create_info_host.pQueueCreateInfos[i].queueCount;
TRACE("queueFamilyIndex %u, queueCount %u\n", family_index, queue_count);
From: Roderick Colenbrander thunderbird2k@gmail.com
Signed-off-by: Roderick Colenbrander thunderbird2k@gmail.com Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/winevulkan/vulkan.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index d294b0a03189..8cc5a510f6f4 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -194,10 +194,22 @@ static BOOL wine_vk_init(void) static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, VkInstanceCreateInfo *dst) { + unsigned int i; + dst->sType = src->sType; dst->flags = src->flags; dst->pApplicationInfo = src->pApplicationInfo;
+ if (dst->pApplicationInfo) + { + const VkApplicationInfo *app_info = dst->pApplicationInfo; + TRACE("Application name %s, application version %#x\n", + debugstr_a(app_info->pApplicationName), app_info->applicationVersion); + TRACE("Engine name %s, engine version %#x\n", debugstr_a(app_info->pEngineName), + app_info->engineVersion); + TRACE("API version %#x\n", app_info->apiVersion); + } + /* Application and loader can pass in a chain of extensions through pNext. * We can't blindly pass these through as often these contain callbacks or * they can even be pass structures for loader / ICD internal use. For now @@ -236,6 +248,12 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo dst->ppEnabledExtensionNames = src->ppEnabledExtensionNames; dst->enabledExtensionCount = src->enabledExtensionCount;
+ TRACE("Enabled extensions: %u\n", dst->enabledExtensionCount); + for (i = 0; i < dst->enabledExtensionCount; i++) + { + TRACE("Extension %u: %s\n", i, debugstr_a(dst->ppEnabledExtensionNames[i])); + } + return VK_SUCCESS; }
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/winevulkan/vulkan.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 8cc5a510f6f4..7e800ccd503b 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -191,14 +191,12 @@ static BOOL wine_vk_init(void) * This function takes care of extensions handled at winevulkan layer, a Wine graphics * driver is responsible for handling e.g. surface extensions. */ -static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, +static void wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src, VkInstanceCreateInfo *dst) { unsigned int i;
- dst->sType = src->sType; - dst->flags = src->flags; - dst->pApplicationInfo = src->pApplicationInfo; + *dst = *src;
if (dst->pApplicationInfo) { @@ -231,7 +229,7 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo break;
default: - FIXME("Application requested a linked structure of type %d\n", header->sType); + FIXME("Application requested a linked structure of type %#x.\n", header->sType); } } } @@ -244,17 +242,11 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo dst->enabledLayerCount = 0; dst->ppEnabledLayerNames = NULL;
- /* TODO: convert non-WSI win32 extensions here to host specific ones. */ - dst->ppEnabledExtensionNames = src->ppEnabledExtensionNames; - dst->enabledExtensionCount = src->enabledExtensionCount; - TRACE("Enabled extensions: %u\n", dst->enabledExtensionCount); for (i = 0; i < dst->enabledExtensionCount; i++) { TRACE("Extension %u: %s\n", i, debugstr_a(dst->ppEnabledExtensionNames[i])); } - - return VK_SUCCESS; }
/* Helper function which stores wrapped physical devices in the instance object. */ @@ -633,12 +625,7 @@ static VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_ } object->base.loader_magic = VULKAN_ICD_MAGIC_VALUE;
- res = wine_vk_instance_convert_create_info(create_info, &create_info_host); - if (res != VK_SUCCESS) - { - ERR("Failed to convert instance create info, res=%d\n", res); - goto err; - } + wine_vk_instance_convert_create_info(create_info, &create_info_host);
res = vk_funcs->p_vkCreateInstance(&create_info_host, NULL /* allocator */, &object->instance); if (res != VK_SUCCESS)
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/winevulkan/make_vulkan | 8 ++++---- dlls/winevulkan/vulkan_thunks.c | 6 +++--- dlls/winevulkan/vulkan_thunks.h | 34 +++++++++++++++++----------------- 3 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 35524f2d9ea6..5303fec7cf84 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -1787,7 +1787,7 @@ class VkGenerator(object): f.write(" {\n") f.write(" if (strcmp(vk_device_dispatch_table[i].name, name) == 0)\n") f.write(" {\n") - f.write(" TRACE("Found name=%s in device table\n", name);\n") + f.write(" TRACE("Found name=%s in device table\n", debugstr_a(name));\n") f.write(" return vk_device_dispatch_table[i].func;\n") f.write(" }\n") f.write(" }\n") @@ -1801,7 +1801,7 @@ class VkGenerator(object): f.write(" {\n") f.write(" if (strcmp(vk_instance_dispatch_table[i].name, name) == 0)\n") f.write(" {\n") - f.write(" TRACE("Found name=%s in instance table\n", name);\n") + f.write(" TRACE("Found name=%s in instance table\n", debugstr_a(name));\n") f.write(" return vk_instance_dispatch_table[i].func;\n") f.write(" }\n") f.write(" }\n") @@ -1818,7 +1818,7 @@ class VkGenerator(object): f.write("};\n\n")
# Create array of instance extensions. - f.write("static const char *vk_instance_extensions[] =\n{\n") + f.write("static const char * const vk_instance_extensions[] =\n{\n") for ext in self.registry.extensions: if ext["type"] != "instance": continue @@ -1950,7 +1950,7 @@ class VkGenerator(object): f.write(" USE_VK_FUNC({0})".format(vk_func.name)) first = False else: - f.write("\\n USE_VK_FUNC({0})".format(vk_func.name)) + f.write(" \\n USE_VK_FUNC({0})".format(vk_func.name)) f.write("\n\n")
f.write("#endif /* __WINE_VULKAN_THUNKS_H */\n") diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index f7aa09bd49ae..bf8e78c5fb03 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -2315,7 +2315,7 @@ void *wine_vk_get_device_proc_addr(const char *name) { if (strcmp(vk_device_dispatch_table[i].name, name) == 0) { - TRACE("Found name=%s in device table\n", name); + TRACE("Found name=%s in device table\n", debugstr_a(name)); return vk_device_dispatch_table[i].func; } } @@ -2329,7 +2329,7 @@ void *wine_vk_get_instance_proc_addr(const char *name) { if (strcmp(vk_instance_dispatch_table[i].name, name) == 0) { - TRACE("Found name=%s in instance table\n", name); + TRACE("Found name=%s in instance table\n", debugstr_a(name)); return vk_instance_dispatch_table[i].func; } } @@ -2369,7 +2369,7 @@ static const char * const vk_device_extensions[] = "VK_NV_viewport_swizzle", };
-static const char *vk_instance_extensions[] = +static const char * const vk_instance_extensions[] = { "VK_KHR_get_physical_device_properties2", "VK_KHR_surface", diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 803d6210196d..cca1026037b2 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -975,23 +975,23 @@ struct vulkan_instance_funcs USE_VK_FUNC(vkWaitForFences)
#define ALL_VK_INSTANCE_FUNCS() \ - USE_VK_FUNC(vkCreateDevice)\ - USE_VK_FUNC(vkEnumerateDeviceExtensionProperties)\ - USE_VK_FUNC(vkEnumerateDeviceLayerProperties)\ - USE_VK_FUNC(vkEnumeratePhysicalDevices)\ - USE_VK_FUNC(vkGetPhysicalDeviceFeatures)\ - USE_VK_FUNC(vkGetPhysicalDeviceFeatures2KHR)\ - USE_VK_FUNC(vkGetPhysicalDeviceFormatProperties)\ - USE_VK_FUNC(vkGetPhysicalDeviceFormatProperties2KHR)\ - USE_VK_FUNC(vkGetPhysicalDeviceImageFormatProperties)\ - USE_VK_FUNC(vkGetPhysicalDeviceImageFormatProperties2KHR)\ - USE_VK_FUNC(vkGetPhysicalDeviceMemoryProperties)\ - USE_VK_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR)\ - USE_VK_FUNC(vkGetPhysicalDeviceProperties)\ - USE_VK_FUNC(vkGetPhysicalDeviceProperties2KHR)\ - USE_VK_FUNC(vkGetPhysicalDeviceQueueFamilyProperties)\ - USE_VK_FUNC(vkGetPhysicalDeviceQueueFamilyProperties2KHR)\ - USE_VK_FUNC(vkGetPhysicalDeviceSparseImageFormatProperties)\ + USE_VK_FUNC(vkCreateDevice) \ + USE_VK_FUNC(vkEnumerateDeviceExtensionProperties) \ + USE_VK_FUNC(vkEnumerateDeviceLayerProperties) \ + USE_VK_FUNC(vkEnumeratePhysicalDevices) \ + USE_VK_FUNC(vkGetPhysicalDeviceFeatures) \ + USE_VK_FUNC(vkGetPhysicalDeviceFeatures2KHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceFormatProperties) \ + USE_VK_FUNC(vkGetPhysicalDeviceFormatProperties2KHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceImageFormatProperties) \ + USE_VK_FUNC(vkGetPhysicalDeviceImageFormatProperties2KHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceMemoryProperties) \ + USE_VK_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceProperties) \ + USE_VK_FUNC(vkGetPhysicalDeviceProperties2KHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceQueueFamilyProperties) \ + USE_VK_FUNC(vkGetPhysicalDeviceQueueFamilyProperties2KHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceSparseImageFormatProperties) \ USE_VK_FUNC(vkGetPhysicalDeviceSparseImageFormatProperties2KHR)
#endif /* __WINE_VULKAN_THUNKS_H */
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
Also, remove outdated comment.
--- dlls/winex11.drv/vulkan.c | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-)
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index f96ef6413761..68fb339adcc5 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -368,8 +368,7 @@ static void X11DRV_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapcha static VkResult X11DRV_vkEnumerateInstanceExtensionProperties(const char *layer_name, uint32_t *count, VkExtensionProperties* properties) { - VkResult res; - unsigned int i, num_copies; + unsigned int i;
TRACE("layer_name %p, count %p, properties %p\n", debugstr_a(layer_name), count, properties);
@@ -382,37 +381,18 @@ static VkResult X11DRV_vkEnumerateInstanceExtensionProperties(const char *layer_
if (!properties) { - /* When properties is NULL, we need to return the number of extensions - * supported. For now report 0 until we add some e.g. - * VK_KHR_win32_surface. Long-term this needs to be an intersection - * between what the native library supports and what thunks we have. - */ *count = winex11_vk_instance_extensions_count; return VK_SUCCESS; }
- if (*count < winex11_vk_instance_extensions_count) - { - /* Incomplete is a type of success used to signal the application - * that not all devices got copied. - */ - num_copies = *count; - res = VK_INCOMPLETE; - } - else - { - num_copies = winex11_vk_instance_extensions_count; - res = VK_SUCCESS; - } - - for (i = 0; i < num_copies; i++) + *count = min(*count, winex11_vk_instance_extensions_count); + for (i = 0; i < *count; i++) { - memcpy(&properties[i], &winex11_vk_instance_extensions[i], sizeof(*properties)); + properties[i] = winex11_vk_instance_extensions[i]; } - *count = num_copies;
- TRACE("Result %d, extensions copied %u\n", res, num_copies); - return res; + TRACE("Returning %u extensions.\n", *count); + return *count < winex11_vk_instance_extensions_count ? VK_INCOMPLETE : VK_SUCCESS; }
static void * X11DRV_vkGetDeviceProcAddr(VkDevice device, const char *name)
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/winex11.drv/vulkan.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 68fb339adcc5..8db61f14931e 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -133,24 +133,24 @@ static BOOL wine_vk_init(void)
if (!(vulkan_handle = wine_dlopen(SONAME_LIBVULKAN, RTLD_NOW, NULL, 0))) return FALSE;
-#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(vulkan_handle, #f, NULL, 0)) == NULL) return FALSE; -LOAD_FUNCPTR(vkAcquireNextImageKHR) -LOAD_FUNCPTR(vkCreateInstance) -LOAD_FUNCPTR(vkCreateSwapchainKHR) -LOAD_FUNCPTR(vkCreateXlibSurfaceKHR) -LOAD_FUNCPTR(vkDestroyInstance) -LOAD_FUNCPTR(vkDestroySurfaceKHR) -LOAD_FUNCPTR(vkDestroySwapchainKHR) -LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) -LOAD_FUNCPTR(vkGetDeviceProcAddr) -LOAD_FUNCPTR(vkGetInstanceProcAddr) -LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) -LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR) -LOAD_FUNCPTR(vkGetPhysicalDeviceSurfacePresentModesKHR) -LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceSupportKHR) -LOAD_FUNCPTR(vkGetPhysicalDeviceXlibPresentationSupportKHR) -LOAD_FUNCPTR(vkGetSwapchainImagesKHR) -LOAD_FUNCPTR(vkQueuePresentKHR) +#define LOAD_FUNCPTR(f) if ((p##f = wine_dlsym(vulkan_handle, #f, NULL, 0)) == NULL) return FALSE; + LOAD_FUNCPTR(vkAcquireNextImageKHR) + LOAD_FUNCPTR(vkCreateInstance) + LOAD_FUNCPTR(vkCreateSwapchainKHR) + LOAD_FUNCPTR(vkCreateXlibSurfaceKHR) + LOAD_FUNCPTR(vkDestroyInstance) + LOAD_FUNCPTR(vkDestroySurfaceKHR) + LOAD_FUNCPTR(vkDestroySwapchainKHR) + LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) + LOAD_FUNCPTR(vkGetDeviceProcAddr) + LOAD_FUNCPTR(vkGetInstanceProcAddr) + LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) + LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceFormatsKHR) + LOAD_FUNCPTR(vkGetPhysicalDeviceSurfacePresentModesKHR) + LOAD_FUNCPTR(vkGetPhysicalDeviceSurfaceSupportKHR) + LOAD_FUNCPTR(vkGetPhysicalDeviceXlibPresentationSupportKHR) + LOAD_FUNCPTR(vkGetSwapchainImagesKHR) + LOAD_FUNCPTR(vkQueuePresentKHR) #undef LOAD_FUNCPTR
wine_vk_load_instance_extensions();