MetalBackend: Enable multithread support.

Bug: dawn:1662
Change-Id: If2f74b4bbce9d108fcd5906c2105f9ebd95845fe
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/124400
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
diff --git a/src/dawn/native/metal/MetalBackend.mm b/src/dawn/native/metal/MetalBackend.mm
index 9bdf138..0bbc265 100644
--- a/src/dawn/native/metal/MetalBackend.mm
+++ b/src/dawn/native/metal/MetalBackend.mm
@@ -38,6 +38,7 @@
         waitEvents.push_back(
             {static_cast<id<MTLSharedEvent>>(waitEvent.sharedEvent), waitEvent.signaledValue});
     }
+    auto deviceLock(backendDevice->GetScopedLock());
     Ref<TextureBase> texture = backendDevice->CreateTextureWrappingIOSurface(
         cDescriptor, cDescriptor->ioSurface, std::move(waitEvents));
     return ToAPI(texture.Detach());
@@ -46,11 +47,15 @@
 void IOSurfaceEndAccess(WGPUTexture cTexture,
                         ExternalImageIOSurfaceEndAccessDescriptor* descriptor) {
     Texture* texture = ToBackend(FromAPI(cTexture));
+    auto device = texture->GetDevice();
+    auto deviceLock(device->GetScopedLock());
     texture->IOSurfaceEndAccess(descriptor);
 }
 
 void WaitForCommandsToBeScheduled(WGPUDevice device) {
-    ToBackend(FromAPI(device))->WaitForCommandsToBeScheduled();
+    Device* backendDevice = ToBackend(FromAPI(device));
+    auto deviceLock(backendDevice->GetScopedLock());
+    backendDevice->WaitForCommandsToBeScheduled();
 }
 
 }  // namespace dawn::native::metal