From d827791bd6c5847e1ef3344a8c2f158ce3f821b8 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Feb 2017 14:59:59 +1300 Subject: vulkan: Tolerate missing GetSwapchainGrallocUsageANDROID function Some drivers implementing ANDROID_native_buffer V6 have /removed/ the old function. We shouldn't really mind if they do that -- we're never going to call it anyway if they do expose the new GetSwapchainGrallocUsage2ANDROID function. V2: Fail at CreateDevice-time if neither function is exposed. Change-Id: Id1e3dd5e2e71a9291dd610e908f9906acaaf0ad0 Related bugs: b/34177594 Test: build --- vulkan/libvulkan/driver.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'vulkan/libvulkan/driver.cpp') diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index 991c3edef4..16d2ebc49a 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -899,6 +899,23 @@ VkResult CreateDevice(VkPhysicalDevice physicalDevice, return VK_ERROR_INCOMPATIBLE_DRIVER; } + + // sanity check ANDROID_native_buffer implementation, whose set of + // entrypoints varies according to the spec version. + if ((wrapper.GetHalExtensions()[ProcHook::ANDROID_native_buffer]) && + !data->driver.GetSwapchainGrallocUsageANDROID && + !data->driver.GetSwapchainGrallocUsage2ANDROID) { + ALOGE("Driver's implementation of ANDROID_native_buffer is broken;" + " must expose at least one of " + "vkGetSwapchainGrallocUsageANDROID or " + "vkGetSwapchainGrallocUsage2ANDROID"); + + data->driver.DestroyDevice(dev, pAllocator); + FreeDeviceData(data, data_allocator); + + return VK_ERROR_INCOMPATIBLE_DRIVER; + } + data->driver_device = dev; *pDevice = dev; -- cgit v1.2.3-59-g8ed1b From 85bb0c5a57be2b456079c14448127fa9bb8cff66 Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Thu, 9 Feb 2017 22:13:02 -0800 Subject: vulkan: Temporarily hack around loader/driver mismatch A driver was built with an older declaration of vkGetSwapchainGrallocUsage2KHR, and doesn't match what libvulkan expects. This is a temporary workaround until the driver can be rebuilt against the current header. When a new driver is available, this change should be reverted. Test: vulkanGears on affected device Change-Id: I5a8bb16f0f9563e32314cff2a2a7a45760cfc356 --- vulkan/libvulkan/code-generator.tmpl | 2 ++ vulkan/libvulkan/driver.cpp | 5 +++++ vulkan/libvulkan/driver.h | 1 + vulkan/libvulkan/driver_gen.cpp | 1 + vulkan/libvulkan/driver_gen.h | 1 + vulkan/libvulkan/swapchain.cpp | 22 +++++++++++++++++++--- 6 files changed, 29 insertions(+), 3 deletions(-) (limited to 'vulkan/libvulkan/driver.cpp') diff --git a/vulkan/libvulkan/code-generator.tmpl b/vulkan/libvulkan/code-generator.tmpl index cc690c1ed0..e3c44d28c6 100644 --- a/vulkan/libvulkan/code-generator.tmpl +++ b/vulkan/libvulkan/code-generator.tmpl @@ -963,6 +963,8 @@ VK_KHR_shared_presentable_image {{else if eq $.Name "vkCreateImage"}}true {{else if eq $.Name "vkDestroyImage"}}true + {{else if eq $.Name "vkGetPhysicalDeviceProperties"}}true + {{end}} {{$ext := GetAnnotation $ "extension"}} diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index 16d2ebc49a..32f777dc87 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -916,7 +916,12 @@ VkResult CreateDevice(VkPhysicalDevice physicalDevice, return VK_ERROR_INCOMPATIBLE_DRIVER; } + VkPhysicalDeviceProperties properties; + instance_data.driver.GetPhysicalDeviceProperties(physicalDevice, + &properties); + data->driver_device = dev; + data->driver_version = properties.driverVersion; *pDevice = dev; diff --git a/vulkan/libvulkan/driver.h b/vulkan/libvulkan/driver.h index e05843997c..5383f59b58 100644 --- a/vulkan/libvulkan/driver.h +++ b/vulkan/libvulkan/driver.h @@ -102,6 +102,7 @@ struct DeviceData { VkDevice driver_device; DeviceDriverTable driver; + uint32_t driver_version; }; bool Debuggable(); diff --git a/vulkan/libvulkan/driver_gen.cpp b/vulkan/libvulkan/driver_gen.cpp index 6689623465..951ea6e571 100644 --- a/vulkan/libvulkan/driver_gen.cpp +++ b/vulkan/libvulkan/driver_gen.cpp @@ -387,6 +387,7 @@ bool InitDriverTable(VkInstance instance, INIT_PROC(true, instance, DestroyInstance); INIT_PROC(true, instance, EnumeratePhysicalDevices); INIT_PROC(true, instance, GetInstanceProcAddr); + INIT_PROC(true, instance, GetPhysicalDeviceProperties); INIT_PROC(true, instance, CreateDevice); INIT_PROC(true, instance, EnumerateDeviceExtensionProperties); INIT_PROC_EXT(EXT_debug_report, true, instance, CreateDebugReportCallbackEXT); diff --git a/vulkan/libvulkan/driver_gen.h b/vulkan/libvulkan/driver_gen.h index 9f3b7054a1..95c70f8fce 100644 --- a/vulkan/libvulkan/driver_gen.h +++ b/vulkan/libvulkan/driver_gen.h @@ -60,6 +60,7 @@ struct InstanceDriverTable { PFN_vkDestroyInstance DestroyInstance; PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices; PFN_vkGetInstanceProcAddr GetInstanceProcAddr; + PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties; PFN_vkCreateDevice CreateDevice; PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties; PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallbackEXT; diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp index e18968c511..c11d20f6e7 100644 --- a/vulkan/libvulkan/swapchain.cpp +++ b/vulkan/libvulkan/swapchain.cpp @@ -813,9 +813,25 @@ VkResult CreateSwapchainKHR(VkDevice device, int gralloc_usage = 0; if (dispatch.GetSwapchainGrallocUsage2ANDROID) { uint64_t consumer_usage, producer_usage; - result = dispatch.GetSwapchainGrallocUsage2ANDROID( - device, create_info->imageFormat, create_info->imageUsage, - swapchain_image_usage, &consumer_usage, &producer_usage); + if (GetData(device).driver_version == 256587285) { + // HACK workaround for loader/driver mismatch during transition to + // vkGetSwapchainGrallocUsage2ANDROID. + typedef VkResult(VKAPI_PTR * + PFN_vkGetSwapchainGrallocUsage2ANDROID_HACK)( + VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, + uint64_t * grallocConsumerUsage, + uint64_t * grallocProducerUsage); + auto get_swapchain_gralloc_usage = + reinterpret_cast( + dispatch.GetSwapchainGrallocUsage2ANDROID); + result = get_swapchain_gralloc_usage( + device, create_info->imageFormat, create_info->imageUsage, + &consumer_usage, &producer_usage); + } else { + result = dispatch.GetSwapchainGrallocUsage2ANDROID( + device, create_info->imageFormat, create_info->imageUsage, + swapchain_image_usage, &consumer_usage, &producer_usage); + } if (result != VK_SUCCESS) { ALOGE("vkGetSwapchainGrallocUsage2ANDROID failed: %d", result); return VK_ERROR_INITIALIZATION_FAILED; -- cgit v1.2.3-59-g8ed1b