[vulkan] Manually query vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR

Mali and Intel drivers fail to query this as a device function, so we
need to query as an instance function instead.

Bug: 397448368
Change-Id: Ie1a3d0f31ee68c0558916b2eb201404c7cb6eef3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/226734
Auto-Submit: James Price <jrprice@google.com>
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/dawn/native/vulkan/DeviceVk.cpp b/src/dawn/native/vulkan/DeviceVk.cpp
index 86281f6..b69a9b9 100644
--- a/src/dawn/native/vulkan/DeviceVk.cpp
+++ b/src/dawn/native/vulkan/DeviceVk.cpp
@@ -123,7 +123,7 @@
                         CreateDevice(GetAdapter()->GetFeatureLevel(), vkPhysicalDevice));
         *static_cast<VulkanDeviceKnobs*>(&mDeviceInfo) = usedDeviceKnobs;
 
-        DAWN_TRY(functions->LoadDeviceProcs(mVkDevice, mDeviceInfo));
+        DAWN_TRY(functions->LoadDeviceProcs(GetVkInstance(), mVkDevice, mDeviceInfo));
 
         mDeleter = std::make_unique<MutexProtected<FencedDeleter>>(this);
     }
diff --git a/src/dawn/native/vulkan/VulkanFunctions.cpp b/src/dawn/native/vulkan/VulkanFunctions.cpp
index 2d0d602..d0f81ac 100644
--- a/src/dawn/native/vulkan/VulkanFunctions.cpp
+++ b/src/dawn/native/vulkan/VulkanFunctions.cpp
@@ -242,7 +242,9 @@
         }                                                                            \
     } while (0)
 
-MaybeError VulkanFunctions::LoadDeviceProcs(VkDevice device, const VulkanDeviceInfo& deviceInfo) {
+MaybeError VulkanFunctions::LoadDeviceProcs(VkInstance instance,
+                                            VkDevice device,
+                                            const VulkanDeviceInfo& deviceInfo) {
     GET_DEVICE_PROC(AllocateCommandBuffers);
     GET_DEVICE_PROC(AllocateDescriptorSets);
     GET_DEVICE_PROC(AllocateMemory);
@@ -420,8 +422,10 @@
     }
 #endif  // DAWN_PLATFORM_IS(ANDROID)
 
+    // TODO(crbug.com/397448368): This should be queried with GET_DEVICE_PROC instead, but Mali and
+    // Intel drivers seem to only provide a non-null function pointer via the instance query.
     if (deviceInfo.HasExt(DeviceExt::CooperativeMatrix)) {
-        GET_DEVICE_PROC(GetPhysicalDeviceCooperativeMatrixPropertiesKHR);
+        GET_INSTANCE_PROC(GetPhysicalDeviceCooperativeMatrixPropertiesKHR);
     }
 
     return {};
diff --git a/src/dawn/native/vulkan/VulkanFunctions.h b/src/dawn/native/vulkan/VulkanFunctions.h
index 17bc1d6..40f7aab 100644
--- a/src/dawn/native/vulkan/VulkanFunctions.h
+++ b/src/dawn/native/vulkan/VulkanFunctions.h
@@ -71,7 +71,9 @@
 struct VulkanFunctions {
     MaybeError LoadGlobalProcs(const DynamicLib& vulkanLib);
     MaybeError LoadInstanceProcs(VkInstance instance, const VulkanGlobalInfo& globalInfo);
-    MaybeError LoadDeviceProcs(VkDevice device, const VulkanDeviceInfo& deviceInfo);
+    MaybeError LoadDeviceProcs(VkInstance instance,
+                               VkDevice device,
+                               const VulkanDeviceInfo& deviceInfo);
 
     // ---------- Global procs