Fix samples on null backend (add swapchain impl)

BUG=
Change-Id: I96e6c58b4ec46af58f7c0a97c88308075efe68dd
Reviewed-on: https://dawn-review.googlesource.com/c/3700
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/null/NullBackend.cpp b/src/dawn_native/null/NullBackend.cpp
index 196f8de..3cd5a41 100644
--- a/src/dawn_native/null/NullBackend.cpp
+++ b/src/dawn_native/null/NullBackend.cpp
@@ -14,6 +14,7 @@
 
 #include "dawn_native/null/NullBackend.h"
 
+#include "common/SwapChainUtils.h"
 #include "dawn_native/BackendConnection.h"
 #include "dawn_native/Commands.h"
 #include "dawn_native/NullBackend.h"
@@ -261,4 +262,35 @@
     void SwapChain::OnBeforePresent(TextureBase*) {
     }
 
+    // CreateNativeSwapChainImpl
+
+    class NativeSwapChainImpl {
+      public:
+        using WSIContext = struct {};
+        void Init(WSIContext* context) {
+        }
+        dawnSwapChainError Configure(dawnTextureFormat format,
+                                     dawnTextureUsageBit,
+                                     uint32_t width,
+                                     uint32_t height) {
+            return DAWN_SWAP_CHAIN_NO_ERROR;
+        }
+        dawnSwapChainError GetNextTexture(dawnSwapChainNextTexture* nextTexture) {
+            return DAWN_SWAP_CHAIN_NO_ERROR;
+        }
+        dawnSwapChainError Present() {
+            return DAWN_SWAP_CHAIN_NO_ERROR;
+        }
+        dawn::TextureFormat GetPreferredFormat() const {
+            return dawn::TextureFormat::R8G8B8A8Unorm;
+        }
+    };
+
+    DAWN_NATIVE_EXPORT dawnSwapChainImplementation CreateNativeSwapChainImpl() {
+        dawnSwapChainImplementation impl;
+        impl = CreateSwapChainImplementation(new NativeSwapChainImpl());
+        impl.textureUsage = DAWN_TEXTURE_USAGE_BIT_PRESENT;
+        return impl;
+    }
+
 }}  // namespace dawn_native::null
diff --git a/src/include/dawn_native/NullBackend.h b/src/include/dawn_native/NullBackend.h
index be7c3e7..21fe1d0 100644
--- a/src/include/dawn_native/NullBackend.h
+++ b/src/include/dawn_native/NullBackend.h
@@ -16,10 +16,12 @@
 #define DAWNNATIVE_NULLBACKEND_H_
 
 #include <dawn/dawn.h>
+#include <dawn/dawn_wsi.h>
 #include <dawn_native/dawn_native_export.h>
 
 namespace dawn_native { namespace null {
     DAWN_NATIVE_EXPORT dawnDevice CreateDevice();
+    DAWN_NATIVE_EXPORT dawnSwapChainImplementation CreateNativeSwapChainImpl();
 }}  // namespace dawn_native::null
 
 #endif  // DAWNNATIVE_NULLBACKEND_H_
diff --git a/src/utils/NullBinding.cpp b/src/utils/NullBinding.cpp
index 558531e..1620dd2 100644
--- a/src/utils/NullBinding.cpp
+++ b/src/utils/NullBinding.cpp
@@ -26,11 +26,17 @@
             return dawn_native::null::CreateDevice();
         }
         uint64_t GetSwapChainImplementation() override {
-            return 0;
+            if (mSwapchainImpl.userData == nullptr) {
+                mSwapchainImpl = dawn_native::null::CreateNativeSwapChainImpl();
+            }
+            return reinterpret_cast<uint64_t>(&mSwapchainImpl);
         }
         dawnTextureFormat GetPreferredSwapChainTextureFormat() override {
             return DAWN_TEXTURE_FORMAT_R8_G8_B8_A8_UNORM;
         }
+
+      private:
+        dawnSwapChainImplementation mSwapchainImpl = {};
     };
 
     BackendBinding* CreateNullBinding() {