D3D12: Cache DXGI keyed mutexes on the external image.

Maintains a 11on12 resource cache on the external image
to prevent re-creating the wrapped resource then
flushing it per produced texture. To prevent
unbounded growth, a basic cap is used which gets
cleared.

This change fixes signficant CPU time spent in the WebGPU command
decoder for video import workloads and excessive memory overhead
from swap chain buffers.

Fixed: dawn:625

Change-Id: I72c07b02f6ab6877a9f21758650962c895933bf9
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/51421
Commit-Queue: Bryan Bernhart <bryan.bernhart@intel.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/include/dawn_native/D3D12Backend.h b/src/include/dawn_native/D3D12Backend.h
index e21d2d6..f9588e4 100644
--- a/src/include/dawn_native/D3D12Backend.h
+++ b/src/include/dawn_native/D3D12Backend.h
@@ -29,6 +29,9 @@
 struct ID3D12Resource;
 
 namespace dawn_native { namespace d3d12 {
+
+    class D3D11on12ResourceCache;
+
     DAWN_NATIVE_EXPORT Microsoft::WRL::ComPtr<ID3D12Device> GetD3D12Device(WGPUDevice device);
     DAWN_NATIVE_EXPORT DawnSwapChainImplementation CreateNativeSwapChainImpl(WGPUDevice device,
                                                                              HWND window);
@@ -62,6 +65,8 @@
 
     class DAWN_NATIVE_EXPORT ExternalImageDXGI {
       public:
+        ~ExternalImageDXGI();
+
         // Note: SharedHandle must be a handle to a texture object.
         static std::unique_ptr<ExternalImageDXGI> Create(
             WGPUDevice device,
@@ -85,6 +90,8 @@
         WGPUTextureFormat mFormat;
         uint32_t mMipLevelCount;
         uint32_t mSampleCount;
+
+        std::unique_ptr<D3D11on12ResourceCache> mD3D11on12ResourceCache;
     };
 
     struct DAWN_NATIVE_EXPORT AdapterDiscoveryOptions : public AdapterDiscoveryOptionsBase {