Removes unnecessary UnpackedBase in favor of just Unpacked.

- This change also allows moving the massive header include into the cpp
  files on a need-to basis since we can add Unpacked<T> to Forward.h.

Bug: dawn:1955
Change-Id: I392326bafaa23e7acad7fc12aac5a7d6a68362b7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/165101
Commit-Queue: Loko Kung <lokokung@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/Adapter.cpp b/src/dawn/native/Adapter.cpp
index 6bbed1a..da6f63f 100644
--- a/src/dawn/native/Adapter.cpp
+++ b/src/dawn/native/Adapter.cpp
@@ -35,7 +35,6 @@
 
 #include "dawn/native/ChainUtils.h"
 #include "dawn/native/Device.h"
-#include "dawn/native/Error.h"
 #include "dawn/native/Instance.h"
 #include "dawn/native/PhysicalDevice.h"
 
diff --git a/src/dawn/native/ChainUtils.h b/src/dawn/native/ChainUtils.h
index e896167..00a0052 100644
--- a/src/dawn/native/ChainUtils.h
+++ b/src/dawn/native/ChainUtils.h
@@ -49,10 +49,8 @@
 };
 }  // namespace detail
 
-template <typename T, typename ChainType>
-class UnpackedBase;
 template <typename T>
-using Unpacked = UnpackedBase<T, typename detail::ChainTypeFor<T>::Type>;
+class Unpacked;
 
 namespace detail {
 // Converts to the expected pointer types depending on the extensibility of the structure.
@@ -88,15 +86,18 @@
 // Wrapper class for unpacked pointers. The classes essentially acts like a const T* or T* with
 // the additional capabilities to validate and retrieve chained structures.
 //
-template <typename T, typename ChainT>
-class UnpackedBase {
+template <typename T>
+class Unpacked {
   public:
-    using ChainType = ChainT;
-    using PtrType = typename detail::PtrTypeFor<UnpackedBase<T, ChainType>, T>::Type;
+    using ChainType =
+        typename std::conditional_t<detail::ExtensibilityFor<T> == detail::Extensibility::In,
+                                    const wgpu::ChainedStruct*,
+                                    wgpu::ChainedStructOut*>;
+    using PtrType = typename detail::PtrTypeFor<Unpacked<T>, T>::Type;
     using TupleType = typename detail::UnpackedTypeFor<T>::Type;
     using BitsetType = typename std::bitset<std::tuple_size_v<TupleType>>;
 
-    UnpackedBase() : mStruct(nullptr) {}
+    Unpacked() : mStruct(nullptr) {}
 
     operator bool() const { return mStruct != nullptr; }
     PtrType operator->() const { return mStruct; }
@@ -117,10 +118,10 @@
     MaybeError ValidateSubset() const;
 
   private:
-    friend UnpackedBase<T, ChainType> Unpack<T>(PtrType chain);
-    friend ResultOrError<UnpackedBase<T, ChainType>> ValidateAndUnpack<T>(PtrType chain);
+    friend Unpacked<T> Unpack<T>(PtrType chain);
+    friend ResultOrError<Unpacked<T>> ValidateAndUnpack<T>(PtrType chain);
 
-    explicit UnpackedBase(PtrType packed) : mStruct(packed) {}
+    explicit Unpacked(PtrType packed) : mStruct(packed) {}
 
     PtrType mStruct = nullptr;
     TupleType mUnpacked;
@@ -234,19 +235,19 @@
 
 }  // namespace detail
 
-template <typename T, typename ChainType>
+template <typename T>
 template <typename In>
-auto UnpackedBase<T, ChainType>::Get() const {
-    return std::get<typename detail::PtrTypeFor<UnpackedBase<T, ChainType>, In>::Type>(mUnpacked);
+auto Unpacked<T>::Get() const {
+    return std::get<typename detail::PtrTypeFor<Unpacked<T>, In>::Type>(mUnpacked);
 }
 
-template <typename T, typename ChainType>
-bool UnpackedBase<T, ChainType>::Empty() const {
+template <typename T>
+bool Unpacked<T>::Empty() const {
     return mBitset.none();
 }
 
-template <typename T, typename ChainType>
-std::string UnpackedBase<T, ChainType>::ToString() const {
+template <typename T>
+std::string Unpacked<T>::ToString() const {
     std::string result = "( ";
     std::apply(
         [&](auto*... args) {
@@ -297,10 +298,10 @@
 //     - only a Root1 extension
 //     - or a Root2 extension with an optional R2Ext1 extension
 // Any other configuration is deemed invalid.
-template <typename T, typename ChainType>
+template <typename T>
 template <typename... Branches>
-ResultOrError<wgpu::SType> UnpackedBase<T, ChainType>::ValidateBranches() const {
-    using Validator = detail::BranchesValidator<UnpackedBase<T, ChainType>, Branches...>;
+ResultOrError<wgpu::SType> Unpacked<T>::ValidateBranches() const {
+    using Validator = detail::BranchesValidator<Unpacked<T>, Branches...>;
 
     wgpu::SType match = wgpu::SType::Invalid;
     if (Validator::Validate(*this, mBitset, match)) {
@@ -322,11 +323,10 @@
 //
 // Even though "valid" extensions on descriptor may include both Ext1 and Ext2, ValidateSubset
 // will further enforce that Ext2 is not on the chain in the example above.
-template <typename T, typename ChainType>
+template <typename T>
 template <typename... Allowed>
-MaybeError UnpackedBase<T, ChainType>::ValidateSubset() const {
-    return detail::SubsetValidator<UnpackedBase<T, ChainType>, Allowed...>::Validate(*this,
-                                                                                     mBitset);
+MaybeError Unpacked<T>::ValidateSubset() const {
+    return detail::SubsetValidator<Unpacked<T>, Allowed...>::Validate(*this, mBitset);
 }
 
 }  // namespace dawn::native
diff --git a/src/dawn/native/Device.h b/src/dawn/native/Device.h
index d2f383bd..5f2d4735 100644
--- a/src/dawn/native/Device.h
+++ b/src/dawn/native/Device.h
@@ -37,7 +37,6 @@
 #include "dawn/common/ContentLessObjectCache.h"
 #include "dawn/common/Mutex.h"
 #include "dawn/native/CacheKey.h"
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Commands.h"
 #include "dawn/native/ComputePipeline.h"
 #include "dawn/native/Error.h"
diff --git a/src/dawn/native/EventManager.cpp b/src/dawn/native/EventManager.cpp
index aa322e5..3996ca0 100644
--- a/src/dawn/native/EventManager.cpp
+++ b/src/dawn/native/EventManager.cpp
@@ -34,6 +34,7 @@
 
 #include "dawn/common/Assert.h"
 #include "dawn/common/FutureUtils.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Device.h"
 #include "dawn/native/IntegerTypes.h"
 #include "dawn/native/Queue.h"
diff --git a/src/dawn/native/EventManager.h b/src/dawn/native/EventManager.h
index aeac7f2..f743e15 100644
--- a/src/dawn/native/EventManager.h
+++ b/src/dawn/native/EventManager.h
@@ -39,8 +39,8 @@
 #include "dawn/common/MutexProtected.h"
 #include "dawn/common/NonCopyable.h"
 #include "dawn/common/Ref.h"
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Error.h"
+#include "dawn/native/Forward.h"
 #include "dawn/native/IntegerTypes.h"
 #include "dawn/native/SystemEvent.h"
 
diff --git a/src/dawn/native/Forward.h b/src/dawn/native/Forward.h
index 81a8c7d..832ed55 100644
--- a/src/dawn/native/Forward.h
+++ b/src/dawn/native/Forward.h
@@ -77,6 +77,9 @@
 
 struct Format;
 
+template <typename T>
+class Unpacked;
+
 // Aliases for frontend-only types.
 using CommandEncoderBase = CommandEncoder;
 using ComputePassEncoderBase = ComputePassEncoder;
diff --git a/src/dawn/native/Instance.cpp b/src/dawn/native/Instance.cpp
index 5237268..3ff2ab4 100644
--- a/src/dawn/native/Instance.cpp
+++ b/src/dawn/native/Instance.cpp
@@ -214,7 +214,7 @@
 }
 
 // TODO(crbug.com/dawn/832): make the platform an initialization parameter of the instance.
-MaybeError InstanceBase::Initialize(const Unpacked<InstanceDescriptor> descriptor) {
+MaybeError InstanceBase::Initialize(const Unpacked<InstanceDescriptor>& descriptor) {
     // Initialize the platform to the default for now.
     mDefaultPlatform = std::make_unique<dawn::platform::Platform>();
     SetPlatform(mDefaultPlatform.get());
diff --git a/src/dawn/native/Instance.h b/src/dawn/native/Instance.h
index a3a1a87..0f7347c 100644
--- a/src/dawn/native/Instance.h
+++ b/src/dawn/native/Instance.h
@@ -43,9 +43,9 @@
 #include "dawn/native/Adapter.h"
 #include "dawn/native/BackendConnection.h"
 #include "dawn/native/BlobCache.h"
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/EventManager.h"
 #include "dawn/native/Features.h"
+#include "dawn/native/Forward.h"
 #include "dawn/native/RefCountedWithExternalCount.h"
 #include "dawn/native/Toggles.h"
 #include "dawn/native/dawn_platform.h"
@@ -182,7 +182,7 @@
     InstanceBase(const InstanceBase& other) = delete;
     InstanceBase& operator=(const InstanceBase& other) = delete;
 
-    MaybeError Initialize(const Unpacked<InstanceDescriptor> descriptor);
+    MaybeError Initialize(const Unpacked<InstanceDescriptor>& descriptor);
     void SetPlatform(dawn::platform::Platform* platform);
 
     // Lazily creates connections to all backends that have been compiled, may return null even for
diff --git a/src/dawn/native/RenderPassEncoder.h b/src/dawn/native/RenderPassEncoder.h
index 0d64d11..edc8064 100644
--- a/src/dawn/native/RenderPassEncoder.h
+++ b/src/dawn/native/RenderPassEncoder.h
@@ -30,7 +30,6 @@
 
 #include <vector>
 
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Error.h"
 #include "dawn/native/Forward.h"
 #include "dawn/native/RenderEncoderBase.h"
diff --git a/src/dawn/native/SharedTextureMemory.h b/src/dawn/native/SharedTextureMemory.h
index 3de94bc..9d37659 100644
--- a/src/dawn/native/SharedTextureMemory.h
+++ b/src/dawn/native/SharedTextureMemory.h
@@ -34,8 +34,8 @@
 #include "dawn/common/StackContainer.h"
 #include "dawn/common/WeakRef.h"
 #include "dawn/common/WeakRefSupport.h"
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Error.h"
+#include "dawn/native/Forward.h"
 #include "dawn/native/IntegerTypes.h"
 #include "dawn/native/ObjectBase.h"
 #include "dawn/native/SharedFence.h"
diff --git a/src/dawn/native/Texture.h b/src/dawn/native/Texture.h
index 5d28e63..febfc29 100644
--- a/src/dawn/native/Texture.h
+++ b/src/dawn/native/Texture.h
@@ -33,7 +33,6 @@
 #include "dawn/common/WeakRef.h"
 #include "dawn/common/ityp_array.h"
 #include "dawn/common/ityp_bitset.h"
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Error.h"
 #include "dawn/native/Format.h"
 #include "dawn/native/Forward.h"
diff --git a/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp b/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp
index 2762faa..72d0f8d 100644
--- a/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp
+++ b/src/dawn/native/d3d/ExternalImageDXGIImpl.cpp
@@ -31,6 +31,7 @@
 #include <vector>
 
 #include "dawn/common/Log.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/D3D12Backend.h"
 #include "dawn/native/DawnNative.h"
 #include "dawn/native/d3d/DeviceD3D.h"
diff --git a/src/dawn/native/d3d/ExternalImageDXGIImpl.h b/src/dawn/native/d3d/ExternalImageDXGIImpl.h
index a50f2d1..b8a4258 100644
--- a/src/dawn/native/d3d/ExternalImageDXGIImpl.h
+++ b/src/dawn/native/d3d/ExternalImageDXGIImpl.h
@@ -38,7 +38,6 @@
 #include "dawn/common/LinkedList.h"
 #include "dawn/common/Mutex.h"
 #include "dawn/common/NonCopyable.h"
-#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Error.h"
 #include "dawn/native/Forward.h"
 #include "dawn/native/IntegerTypes.h"
diff --git a/src/dawn/native/d3d11/SwapChainD3D11.cpp b/src/dawn/native/d3d11/SwapChainD3D11.cpp
index f8055b7..8100240 100644
--- a/src/dawn/native/d3d11/SwapChainD3D11.cpp
+++ b/src/dawn/native/d3d11/SwapChainD3D11.cpp
@@ -33,6 +33,7 @@
 
 #include <utility>
 
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Surface.h"
 #include "dawn/native/d3d/D3DError.h"
 #include "dawn/native/d3d/UtilsD3D.h"
diff --git a/src/dawn/native/d3d11/TextureD3D11.cpp b/src/dawn/native/d3d11/TextureD3D11.cpp
index 7b3dfac..438d833 100644
--- a/src/dawn/native/d3d11/TextureD3D11.cpp
+++ b/src/dawn/native/d3d11/TextureD3D11.cpp
@@ -33,6 +33,7 @@
 
 #include "dawn/common/Constants.h"
 #include "dawn/common/Math.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/CommandBuffer.h"
 #include "dawn/native/CommandValidation.h"
 #include "dawn/native/DynamicUploader.h"
diff --git a/src/dawn/native/d3d12/SwapChainD3D12.cpp b/src/dawn/native/d3d12/SwapChainD3D12.cpp
index 169d579..e5ae0f8 100644
--- a/src/dawn/native/d3d12/SwapChainD3D12.cpp
+++ b/src/dawn/native/d3d12/SwapChainD3D12.cpp
@@ -33,6 +33,7 @@
 
 #include <utility>
 
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Surface.h"
 #include "dawn/native/d3d/D3DError.h"
 #include "dawn/native/d3d/UtilsD3D.h"
diff --git a/src/dawn/native/d3d12/TextureD3D12.cpp b/src/dawn/native/d3d12/TextureD3D12.cpp
index e09ec4c..e7e7006 100644
--- a/src/dawn/native/d3d12/TextureD3D12.cpp
+++ b/src/dawn/native/d3d12/TextureD3D12.cpp
@@ -33,6 +33,7 @@
 #include "absl/numeric/bits.h"
 #include "dawn/common/Constants.h"
 #include "dawn/common/Math.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/DynamicUploader.h"
 #include "dawn/native/EnumMaskIterator.h"
 #include "dawn/native/Error.h"
diff --git a/src/dawn/native/metal/DeviceMTL.mm b/src/dawn/native/metal/DeviceMTL.mm
index 62e8daa4..112ecf8 100644
--- a/src/dawn/native/metal/DeviceMTL.mm
+++ b/src/dawn/native/metal/DeviceMTL.mm
@@ -31,7 +31,7 @@
 #include "dawn/common/Platform.h"
 #include "dawn/native/Adapter.h"
 #include "dawn/native/BackendConnection.h"
-#include "dawn/native/ChainUtils_autogen.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Commands.h"
 #include "dawn/native/ErrorData.h"
 #include "dawn/native/EventManager.h"
diff --git a/src/dawn/native/metal/SwapChainMTL.mm b/src/dawn/native/metal/SwapChainMTL.mm
index 753ed9c..981d415 100644
--- a/src/dawn/native/metal/SwapChainMTL.mm
+++ b/src/dawn/native/metal/SwapChainMTL.mm
@@ -27,6 +27,7 @@
 
 #include "dawn/native/metal/SwapChainMTL.h"
 
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Surface.h"
 #include "dawn/native/metal/DeviceMTL.h"
 #include "dawn/native/metal/TextureMTL.h"
diff --git a/src/dawn/native/metal/TextureMTL.mm b/src/dawn/native/metal/TextureMTL.mm
index f3c339d..d2b34bf 100644
--- a/src/dawn/native/metal/TextureMTL.mm
+++ b/src/dawn/native/metal/TextureMTL.mm
@@ -32,6 +32,7 @@
 #include "dawn/common/IOSurfaceUtils.h"
 #include "dawn/common/Math.h"
 #include "dawn/common/Platform.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/DynamicUploader.h"
 #include "dawn/native/EnumMaskIterator.h"
 #include "dawn/native/metal/BufferMTL.h"
diff --git a/src/dawn/native/null/DeviceNull.cpp b/src/dawn/native/null/DeviceNull.cpp
index dafc8e7d6..7e7198c 100644
--- a/src/dawn/native/null/DeviceNull.cpp
+++ b/src/dawn/native/null/DeviceNull.cpp
@@ -31,6 +31,7 @@
 #include <utility>
 
 #include "dawn/native/BackendConnection.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Commands.h"
 #include "dawn/native/ErrorData.h"
 #include "dawn/native/Instance.h"
diff --git a/src/dawn/native/opengl/DeviceGL.cpp b/src/dawn/native/opengl/DeviceGL.cpp
index e5fa779..765e73f 100644
--- a/src/dawn/native/opengl/DeviceGL.cpp
+++ b/src/dawn/native/opengl/DeviceGL.cpp
@@ -31,6 +31,7 @@
 
 #include "dawn/common/Log.h"
 #include "dawn/native/BackendConnection.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/ErrorData.h"
 #include "dawn/native/Instance.h"
 #include "dawn/native/opengl/BindGroupGL.h"
diff --git a/src/dawn/native/opengl/TextureGL.cpp b/src/dawn/native/opengl/TextureGL.cpp
index 462c653..3afaa4e 100644
--- a/src/dawn/native/opengl/TextureGL.cpp
+++ b/src/dawn/native/opengl/TextureGL.cpp
@@ -33,6 +33,7 @@
 #include "dawn/common/Assert.h"
 #include "dawn/common/Constants.h"
 #include "dawn/common/Math.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/EnumMaskIterator.h"
 #include "dawn/native/opengl/BufferGL.h"
 #include "dawn/native/opengl/CommandBufferGL.h"
diff --git a/src/dawn/native/vulkan/SwapChainVk.cpp b/src/dawn/native/vulkan/SwapChainVk.cpp
index 6b7e4ca..37def95 100644
--- a/src/dawn/native/vulkan/SwapChainVk.cpp
+++ b/src/dawn/native/vulkan/SwapChainVk.cpp
@@ -32,6 +32,7 @@
 #include <utility>
 
 #include "dawn/common/Compiler.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Instance.h"
 #include "dawn/native/Surface.h"
 #include "dawn/native/vulkan/BackendVk.h"
diff --git a/src/dawn/native/vulkan/TextureVk.cpp b/src/dawn/native/vulkan/TextureVk.cpp
index 214e778..651af6d 100644
--- a/src/dawn/native/vulkan/TextureVk.cpp
+++ b/src/dawn/native/vulkan/TextureVk.cpp
@@ -31,6 +31,7 @@
 
 #include "dawn/common/Assert.h"
 #include "dawn/common/Math.h"
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/DynamicUploader.h"
 #include "dawn/native/EnumMaskIterator.h"
 #include "dawn/native/Error.h"
diff --git a/src/dawn/tests/unittests/native/AllowedErrorTests.cpp b/src/dawn/tests/unittests/native/AllowedErrorTests.cpp
index b6e5a8c..08bdcacb 100644
--- a/src/dawn/tests/unittests/native/AllowedErrorTests.cpp
+++ b/src/dawn/tests/unittests/native/AllowedErrorTests.cpp
@@ -30,6 +30,7 @@
 #include <string_view>
 #include <utility>
 
+#include "dawn/native/ChainUtils.h"
 #include "dawn/tests/MockCallback.h"
 #include "dawn/webgpu_cpp.h"
 #include "mocks/BufferMock.h"
diff --git a/src/dawn/tests/unittests/native/DestroyObjectTests.cpp b/src/dawn/tests/unittests/native/DestroyObjectTests.cpp
index 93e0d8f..003122c 100644
--- a/src/dawn/tests/unittests/native/DestroyObjectTests.cpp
+++ b/src/dawn/tests/unittests/native/DestroyObjectTests.cpp
@@ -30,6 +30,7 @@
 #include <utility>
 #include <vector>
 
+#include "dawn/native/ChainUtils.h"
 #include "dawn/native/Toggles.h"
 #include "dawn/native/utils/WGPUHelpers.h"
 #include "dawn/tests/DawnNativeTest.h"