| From 7918ae84678eb59d067e48fda62288bfbf7e118a Mon Sep 17 00:00:00 2001 |
| From: Chad Versace <chadversary@chromium.org> |
| Date: Fri, 5 Oct 2018 12:44:19 -0700 |
| Subject: [PATCH] CHROMIUM: anv: Reject unsupported instance versions on Nougat |
| |
| The Vulkan loader and Vulkan CTS in Nougat expect vkCreateInstance's |
| behavior regarding VkApplicationInfo::apiVersion to conform to the |
| Vulkan 1.0 spec, not the Vulkan 1.1 spec. We assume that applications |
| that target Nougat have the same expectation. |
| |
| Specifically, the Vulkan loader in Nougat does not have |
| vkEnumerateInstanceVersion. Therefore, the driver must reject |
| unsupported instance versions with VK_ERROR_INCOMPATIBLE_DRIVER. |
| |
| BUG=b:113541746 |
| TEST=On eve, dEQP-VK.api.device_init.create_instance_invalid_api_version |
| |
| Change-Id: I9f0ff0dcbf76b61c99d516319f2f3a92df349e31 |
| Reviewed-on: https://chromium-review.googlesource.com/1265185 |
| Commit-Ready: Chad Versace <chadversary@chromium.org> |
| Tested-by: Chad Versace <chadversary@chromium.org> |
| Reviewed-by: Ilja H. Friedel <ihf@chromium.org> |
| (cherry picked from commit 92185a7456cc3d5add3042e0d2c1b8bcc3bed564) |
| Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org> |
| --- |
| src/intel/vulkan/anv_device.c | 24 ++++++++++++++++++++++++ |
| 1 file changed, 24 insertions(+) |
| |
| diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c |
| index f44b046cf5da..7b63061d84ba 100644 |
| --- a/src/intel/vulkan/anv_device.c |
| +++ b/src/intel/vulkan/anv_device.c |
| @@ -617,6 +617,30 @@ VkResult anv_CreateInstance( |
| if (pCreateInfo->pApplicationInfo) { |
| const VkApplicationInfo *app = pCreateInfo->pApplicationInfo; |
| |
| +#if defined(ANDROID) && ANDROID_API_LEVEL <= 25 |
| + if (app->apiVersion != 0) { |
| + /* Workaround for Android Nougat. |
| + * |
| + * The Vulkan loader and Vulkan CTS in Nougat expect vkCreateInstance's |
| + * behavior regarding VkApplicationInfo::apiVersion to conform to the |
| + * Vulkan 1.0 spec, not the Vulkan 1.1 spec. We assume that applications |
| + * that target Nougat have the same expectation. |
| + * |
| + * Specifically, the Vulkan loader in Nougat does not have |
| + * vkEnumerateInstanceVersion. |
| + */ |
| + uint32_t max_instance_version, app_no_patch, max_no_patch; |
| + |
| + anv_EnumerateInstanceVersion(&max_instance_version); |
| + app_no_patch = app->apiVersion & 0xfffff000; |
| + max_no_patch = max_instance_version & 0xfffff000; |
| + if (app_no_patch < VK_MAKE_VERSION(1, 0, 0) || |
| + app_no_patch > max_no_patch) { |
| + return vk_error(VK_ERROR_INCOMPATIBLE_DRIVER); |
| + } |
| + } |
| +#endif |
| + |
| instance->app_info.app_name = |
| vk_strdup(&instance->alloc, app->pApplicationName, |
| VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); |
| -- |
| 2.20.1 |
| |