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
diff --git a/vulkan/libvulkan/code-generator.tmpl b/vulkan/libvulkan/code-generator.tmpl
index cc690c1..e3c44d2 100644
--- a/vulkan/libvulkan/code-generator.tmpl
+++ b/vulkan/libvulkan/code-generator.tmpl
@@ -963,6 +963,8 @@
{{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 16d2ebc..32f777d 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -916,7 +916,12 @@
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 e058439..5383f59 100644
--- a/vulkan/libvulkan/driver.h
+++ b/vulkan/libvulkan/driver.h
@@ -102,6 +102,7 @@
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 6689623..951ea6e 100644
--- a/vulkan/libvulkan/driver_gen.cpp
+++ b/vulkan/libvulkan/driver_gen.cpp
@@ -387,6 +387,7 @@
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 9f3b705..95c70f8 100644
--- a/vulkan/libvulkan/driver_gen.h
+++ b/vulkan/libvulkan/driver_gen.h
@@ -60,6 +60,7 @@
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 e18968c..c11d20f 100644
--- a/vulkan/libvulkan/swapchain.cpp
+++ b/vulkan/libvulkan/swapchain.cpp
@@ -813,9 +813,25 @@
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<PFN_vkGetSwapchainGrallocUsage2ANDROID_HACK>(
+ 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;