[PATCH 2/2] winemac.drv: Support VK_EXT_metal_surface.
Ken Thomases
ken at codeweavers.com
Mon Dec 16 19:01:27 CST 2019
On Dec 13, 2019, at 10:57 AM, Chip Davis <cdavis at codeweavers.com> wrote:
>
> Prefer it to VK_MVK_macos_surface when present.
>
> MoltenVK has deprecated VK_MVK_macos_surface in favor of
> VK_EXT_metal_surface. It's likely that this extension will vanish at
> some point.
>
> Signed-off-by: Chip Davis <cdavis at codeweavers.com>
> ---
> dlls/winemac.drv/vulkan.c | 66 +++++++++++++++++++++++++++++++++------
> 1 file changed, 57 insertions(+), 9 deletions(-)
>
> diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c
> index 21e93827c15..60f3dcda6af 100644
> --- a/dlls/winemac.drv/vulkan.c
> +++ b/dlls/winemac.drv/vulkan.c
> […]
> @@ -341,7 +367,7 @@ static void macdrv_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapcha
> static VkResult macdrv_vkEnumerateInstanceExtensionProperties(const char *layer_name,
> uint32_t *count, VkExtensionProperties* properties)
> {
> - unsigned int i;
> + unsigned int i, mvk_surface = -1, ext_surface = -1;
> VkResult res;
>
> TRACE("layer_name %s, count %p, properties %p\n", debugstr_a(layer_name), count, properties);
> @@ -364,14 +390,36 @@ static VkResult macdrv_vkEnumerateInstanceExtensionProperties(const char *layer_
>
> for (i = 0; i < *count; i++)
> {
> - /* For now the only MoltenVK extension we need to fixup. Long-term we may need an array. */
> + /* For now the only MoltenVK extensions we need to fixup. Long-term we may need an array. */
> if (!strcmp(properties[i].extensionName, "VK_MVK_macos_surface"))
> {
> + if (ext_surface != -1)
> + {
> + /* If we've already seen EXT_metal_surface, just hide this one. */
> + memcpy(properties + i, properties + i + 1, (--(*count) - i) * sizeof(VkExtensionProperties));
This and the memcpy() below should be memmove(), strictly speaking.
Use sizeof(*properties) instead of sizeof(VkExtensionProperties).
Also, please decrement *count in a separate statement. And you need to decrement i, too, or you skip the extension that was moved to properties[i].
> + continue;
> + }
> TRACE("Substituting VK_MVK_macos_surface for VK_KHR_win32_surface\n");
>
> snprintf(properties[i].extensionName, sizeof(properties[i].extensionName),
> VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
> properties[i].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION;
> + mvk_surface = i;
> + }
> + if (!strcmp(properties[i].extensionName, "VK_EXT_metal_surface"))
> + {
> + if (mvk_surface != -1)
> + {
> + /* If we've already seen MVK_macos_surface, just hide this one. */
> + memcpy(properties + i, properties + i + 1, (--(*count) - i) * sizeof(VkExtensionProperties));
> + continue;
> + }
> + TRACE("Substituting VK_EXT_metal_surface for VK_KHR_win32_surface\n");
> +
> + snprintf(properties[i].extensionName, sizeof(properties[i].extensionName),
> + VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
> + properties[i].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION;
> + ext_surface = i;
> }
These two "if" statements are so similar they can and should be combined. There can be a single flag for "seen either surface extension". (No need to track the index.)
Finally, there's a comment above the call to the host vkEnumerateInstanceExtensionProperties() that asserts this function will return the same count. That's no longer true.
-Ken
More information about the wine-devel
mailing list