Add AdapterBase::APIGetInstance

This method is useful for Chrome to query the Instance from Device
by calling device.GetAdapter().GetInstance(). Then
instance.ProcessEvents() can be used to poll for events instead of
device.Tick().

Bug: dawn:1726
Change-Id: I45b5760bc07869a191ae3fd02ec25b99d78b068b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/125360
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/dawn.json b/dawn.json
index 1df0d7c..8913c2c 100644
--- a/dawn.json
+++ b/dawn.json
@@ -79,6 +79,11 @@
         "category": "object",
         "methods": [
             {
+                "name": "get instance",
+                "tags": ["dawn"],
+                "returns": "instance"
+            },
+            {
                 "name": "get limits",
                 "returns": "bool",
                 "args": [
diff --git a/dawn_wire.json b/dawn_wire.json
index 46cba66..d8c57e9 100644
--- a/dawn_wire.json
+++ b/dawn_wire.json
@@ -219,6 +219,7 @@
             "TextureGetUsage"
         ],
         "client_handwritten_commands": [
+            "AdapterGetInstance",
             "BufferDestroy",
             "BufferUnmap",
             "DeviceCreateErrorBuffer",
diff --git a/src/dawn/native/Adapter.cpp b/src/dawn/native/Adapter.cpp
index a60e900..376956c 100644
--- a/src/dawn/native/Adapter.cpp
+++ b/src/dawn/native/Adapter.cpp
@@ -83,6 +83,13 @@
     return {};
 }
 
+InstanceBase* AdapterBase::APIGetInstance() const {
+    auto instance = GetInstance();
+    ASSERT(instance != nullptr);
+    instance->Reference();
+    return instance;
+}
+
 bool AdapterBase::APIGetLimits(SupportedLimits* limits) const {
     return GetLimits(limits);
 }
diff --git a/src/dawn/native/Adapter.h b/src/dawn/native/Adapter.h
index 9d0eb7c..2e88975 100644
--- a/src/dawn/native/Adapter.h
+++ b/src/dawn/native/Adapter.h
@@ -43,6 +43,7 @@
     MaybeError Initialize();
 
     // WebGPU API
+    InstanceBase* APIGetInstance() const;
     bool APIGetLimits(SupportedLimits* limits) const;
     void APIGetProperties(AdapterProperties* properties) const;
     bool APIHasFeature(wgpu::FeatureName feature) const;
@@ -56,6 +57,9 @@
     uint32_t GetDeviceId() const;
     const gpu_info::DriverVersion& GetDriverVersion() const;
     wgpu::BackendType GetBackendType() const;
+
+    // This method differs from APIGetInstance() in that it won't increase the ref count of the
+    // instance.
     InstanceBase* GetInstance() const;
 
     void ResetInternalDeviceForTesting();
diff --git a/src/dawn/wire/client/Adapter.cpp b/src/dawn/wire/client/Adapter.cpp
index 6edf63c..becca1c 100644
--- a/src/dawn/wire/client/Adapter.cpp
+++ b/src/dawn/wire/client/Adapter.cpp
@@ -127,6 +127,11 @@
     return true;
 }
 
+WGPUInstance Adapter::GetInstance() const {
+    dawn::ErrorLog() << "adapter.GetInstance not supported with dawn_wire.";
+    return nullptr;
+}
+
 WGPUDevice Adapter::CreateDevice(const WGPUDeviceDescriptor*) {
     dawn::ErrorLog() << "adapter.CreateDevice not supported with dawn_wire.";
     return nullptr;
diff --git a/src/dawn/wire/client/Adapter.h b/src/dawn/wire/client/Adapter.h
index 9c4b36f..69e8fff 100644
--- a/src/dawn/wire/client/Adapter.h
+++ b/src/dawn/wire/client/Adapter.h
@@ -51,6 +51,7 @@
                                  const WGPUFeatureName* features);
 
     // Unimplementable. Only availale in dawn_native.
+    WGPUInstance GetInstance() const;
     WGPUDevice CreateDevice(const WGPUDeviceDescriptor*);
 
   private: