[PATCH 1/2] winevulkan: add helper function for VkDeviceCreateInfo conversion.

Józef Kucia joseph.kucia at gmail.com
Mon Mar 19 08:51:54 CDT 2018


On Mon, Mar 19, 2018 at 1:41 AM, Roderick Colenbrander
<thunderbird2k at gmail.com> wrote:
> Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
> ---
>  dlls/winevulkan/vulkan.c | 74 +++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 70 insertions(+), 4 deletions(-)
>
> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
> index 9440000614..87c871d0f4 100644
> --- a/dlls/winevulkan/vulkan.c
> +++ b/dlls/winevulkan/vulkan.c
> @@ -98,6 +98,64 @@ 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 VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src,
> +        VkDeviceCreateInfo *dst)
> +{
> +    unsigned int i;
> +
> +    dst->sType = src->sType;
> +    dst->flags = src->flags;
> +
> +    /* 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 %d\n", header->sType);

We tend to prefer %#x for enums.

> +            }
> +        }
> +    }
> +    /* For now don't support anything. */
> +    dst->pNext = NULL;
> +
> +    dst->queueCreateInfoCount = src->queueCreateInfoCount;
> +    dst->pQueueCreateInfos = src->pQueueCreateInfos;
> +
> +    /* Should be filtered out by loader as ICDs don't support layers. */
> +    dst->enabledLayerCount = 0;
> +    dst->ppEnabledLayerNames = NULL;
> +
> +    /* TODO: convert win32 extensions here to host specific ones. */

All currently supported extensions are compatible. Extensions mapping
will be only needed when we add support for an incompatible extension.
I wonder if the TODO is useful.

> +    dst->ppEnabledExtensionNames = src->ppEnabledExtensionNames;
> +    dst->enabledExtensionCount = src->enabledExtensionCount;
> +
> +    TRACE("Enabled extensions: %d\n", dst->enabledExtensionCount);

Please use %u for unsigned integers.

> +    for (i = 0; i < dst->enabledExtensionCount; i++)
> +    {
> +        TRACE("Extension %d: %s\n", i, dst->ppEnabledExtensionNames[i]);

Please use %u and debugstr_a().

> +    }
> +
> +    dst->pEnabledFeatures = src->pEnabledFeatures;
> +
> +    return VK_SUCCESS;
> +}
> +
>  /* Helper function used for freeing a device structure. This function supports full
>   * and partial object cleanups and can thus be used for vkCreateDevice failures.
>   */
> @@ -470,6 +528,7 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
>          const VkAllocationCallbacks *allocator, VkDevice *device)
>  {
>      struct VkDevice_T *object = NULL;
> +    VkDeviceCreateInfo create_info_host;
>      uint32_t max_queue_families;
>      VkResult res;
>      unsigned int i;
> @@ -485,11 +544,18 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev,
>
>      object->base.loader_magic = VULKAN_ICD_MAGIC_VALUE;
>
> +    res = wine_vk_device_convert_create_info(create_info, &create_info_host);
> +    if (res != VK_SUCCESS)
> +    {
> +        ERR("Failed to convert device create info, res=%d\n", res);
> +        goto err;
> +    }
> +
>      /* 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.
>       */

The comment should be removed.

>      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 +590,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);
>
> --
> 2.14.3
>
>
>



More information about the wine-devel mailing list