Move EnumClassBitmasks from wgpu to dawn namespace

The EnumClassBitmasks is used by dawn/api_cpp.h that needs to be common.
Define a macro to export the operators from dawn to other various namespace.

BUG=dawn:1201
Change-Id: I20badd54e844fead6ecf12546a2c9e0afa2fd83f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/71900
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Junwei Fu <junwei.fu@intel.com>
diff --git a/generator/templates/api_cpp.h b/generator/templates/api_cpp.h
index e351a0a..c70e827 100644
--- a/generator/templates/api_cpp.h
+++ b/generator/templates/api_cpp.h
@@ -46,14 +46,6 @@
 
     {% endfor %}
 
-    {% for type in by_category["bitmask"] %}
-        template<>
-        struct IsDawnBitmask<{{as_cppType(type.name)}}> {
-            static constexpr bool enable = true;
-        };
-
-    {% endfor %}
-
     {% for type in by_category["function pointer"] %}
         using {{as_cppType(type.name)}} = {{as_cType(type.name)}};
     {% endfor %}
@@ -242,6 +234,20 @@
         };
 
     {% endfor %}
+
+    // The operators of EnumClassBitmmasks in the dawn:: namespace need to be imported
+    // in the {{metadata.namespace}} namespace for Argument Dependent Lookup.
+    DAWN_IMPORT_BITMASK_OPERATORS
 }  // namespace {{metadata.namespace}}
 
+namespace dawn {
+    {% for type in by_category["bitmask"] %}
+        template<>
+        struct IsDawnBitmask<{{metadata.namespace}}::{{as_cppType(type.name)}}> {
+            static constexpr bool enable = true;
+        };
+
+    {% endfor %}
+} // namespace dawn
+
 #endif // {{API}}_CPP_H_
diff --git a/src/dawn_native/EnumClassBitmasks.h b/src/dawn_native/EnumClassBitmasks.h
index 3227cd2..addaab9 100644
--- a/src/dawn_native/EnumClassBitmasks.h
+++ b/src/dawn_native/EnumClassBitmasks.h
@@ -19,8 +19,9 @@
 
 namespace dawn_native {
 
-    // EnumClassBitmmasks is a WebGPU helper in the wgpu:: namespace.
+    // EnumClassBitmmasks is a helper in the dawn:: namespace.
     // Re-export it in the dawn_native namespace.
+    DAWN_IMPORT_BITMASK_OPERATORS
 
     // Specify this for usage with EnumMaskIterator
     template <typename T>
@@ -28,16 +29,6 @@
         static constexpr unsigned value = 0;
     };
 
-    using wgpu::operator|;
-    using wgpu::operator&;
-    using wgpu::operator^;
-    using wgpu::operator~;
-    using wgpu::operator&=;
-    using wgpu::operator|=;
-    using wgpu::operator^=;
-
-    using wgpu::HasZeroOrOneBits;
-
     template <typename T>
     constexpr bool HasOneBit(T value) {
         return HasZeroOrOneBits(value) && value != T(0);
diff --git a/src/dawn_native/Format.h b/src/dawn_native/Format.h
index f2e83ff..2f604d3 100644
--- a/src/dawn_native/Format.h
+++ b/src/dawn_native/Format.h
@@ -129,13 +129,13 @@
 
 }  // namespace dawn_native
 
-namespace wgpu {
+namespace dawn {
 
     template <>
     struct IsDawnBitmask<dawn_native::SampleTypeBit> {
         static constexpr bool enable = true;
     };
 
-}  // namespace wgpu
+}  // namespace dawn
 
 #endif  // DAWNNATIVE_FORMAT_H_
diff --git a/src/dawn_native/Subresource.h b/src/dawn_native/Subresource.h
index 643b7bc..454e17c 100644
--- a/src/dawn_native/Subresource.h
+++ b/src/dawn_native/Subresource.h
@@ -100,13 +100,13 @@
 
 }  // namespace dawn_native
 
-namespace wgpu {
+namespace dawn {
 
     template <>
     struct IsDawnBitmask<dawn_native::Aspect> {
         static constexpr bool enable = true;
     };
 
-}  // namespace wgpu
+}  // namespace dawn
 
 #endif  // DAWNNATIVE_SUBRESOURCE_H_
diff --git a/src/include/dawn/EnumClassBitmasks.h b/src/include/dawn/EnumClassBitmasks.h
index 93d2be4..3947f00 100644
--- a/src/include/dawn/EnumClassBitmasks.h
+++ b/src/include/dawn/EnumClassBitmasks.h
@@ -17,7 +17,19 @@
 
 #include <type_traits>
 
-namespace wgpu {
+// The operators in dawn:: namespace need be introduced into other namespaces with
+// using-declarations for C++ Argument Dependent Lookup to work.
+#define DAWN_IMPORT_BITMASK_OPERATORS \
+    using dawn::operator|;            \
+    using dawn::operator&;            \
+    using dawn::operator^;            \
+    using dawn::operator~;            \
+    using dawn::operator&=;           \
+    using dawn::operator|=;           \
+    using dawn::operator^=;           \
+    using dawn::HasZeroOrOneBits;
+
+namespace dawn {
 
     template <typename T>
     struct IsDawnBitmask {
@@ -139,6 +151,6 @@
         return (static_cast<Integral>(value) & (static_cast<Integral>(value) - 1)) == 0;
     }
 
-}  // namespace wgpu
+}  // namespace dawn
 
 #endif  // DAWN_ENUM_CLASS_BITMASKS_H_
diff --git a/src/tests/end2end/FirstIndexOffsetTests.cpp b/src/tests/end2end/FirstIndexOffsetTests.cpp
index 7da6b28..5ab3ca3 100644
--- a/src/tests/end2end/FirstIndexOffsetTests.cpp
+++ b/src/tests/end2end/FirstIndexOffsetTests.cpp
@@ -34,12 +34,12 @@
     Instance = 0x0000002,
 };
 
-namespace wgpu {
+namespace dawn {
     template <>
     struct IsDawnBitmask<CheckIndex> {
         static constexpr bool enable = true;
     };
-}  // namespace wgpu
+}  // namespace dawn
 
 class FirstIndexOffsetTests : public DawnTest {
   public:
diff --git a/src/tests/unittests/EnumClassBitmasksTests.cpp b/src/tests/unittests/EnumClassBitmasksTests.cpp
index c87f09f..26849bd 100644
--- a/src/tests/unittests/EnumClassBitmasksTests.cpp
+++ b/src/tests/unittests/EnumClassBitmasksTests.cpp
@@ -16,7 +16,7 @@
 
 #include "dawn/EnumClassBitmasks.h"
 
-namespace wgpu {
+namespace dawn {
 
     enum class Color : uint32_t {
         R = 1,
@@ -80,14 +80,14 @@
 
     TEST(BitmaskTests, ZeroOrOneBits) {
         Color zero = static_cast<Color>(0);
-        ASSERT_TRUE(wgpu::HasZeroOrOneBits(zero));
-        ASSERT_TRUE(wgpu::HasZeroOrOneBits(Color::R));
-        ASSERT_TRUE(wgpu::HasZeroOrOneBits(Color::G));
-        ASSERT_TRUE(wgpu::HasZeroOrOneBits(Color::B));
-        ASSERT_TRUE(wgpu::HasZeroOrOneBits(Color::A));
-        ASSERT_FALSE(wgpu::HasZeroOrOneBits(static_cast<Color>(Color::R | Color::G)));
-        ASSERT_FALSE(wgpu::HasZeroOrOneBits(static_cast<Color>(Color::G | Color::B)));
-        ASSERT_FALSE(wgpu::HasZeroOrOneBits(static_cast<Color>(Color::B | Color::A)));
+        ASSERT_TRUE(HasZeroOrOneBits(zero));
+        ASSERT_TRUE(HasZeroOrOneBits(Color::R));
+        ASSERT_TRUE(HasZeroOrOneBits(Color::G));
+        ASSERT_TRUE(HasZeroOrOneBits(Color::B));
+        ASSERT_TRUE(HasZeroOrOneBits(Color::A));
+        ASSERT_FALSE(HasZeroOrOneBits(static_cast<Color>(Color::R | Color::G)));
+        ASSERT_FALSE(HasZeroOrOneBits(static_cast<Color>(Color::G | Color::B)));
+        ASSERT_FALSE(HasZeroOrOneBits(static_cast<Color>(Color::B | Color::A)));
     }
 
-}  // namespace wgpu
+}  // namespace dawn
diff --git a/src/tests/unittests/EnumMaskIteratorTests.cpp b/src/tests/unittests/EnumMaskIteratorTests.cpp
index 46c351d..d5e0bb5 100644
--- a/src/tests/unittests/EnumMaskIteratorTests.cpp
+++ b/src/tests/unittests/EnumMaskIteratorTests.cpp
@@ -31,14 +31,14 @@
 
 }  // namespace dawn_native
 
-namespace wgpu {
+namespace dawn {
 
     template <>
     struct IsDawnBitmask<dawn_native::TestAspect> {
         static constexpr bool enable = true;
     };
 
-}  // namespace wgpu
+}  // namespace dawn
 
 namespace dawn_native {
 
diff --git a/src/tests/unittests/MathTests.cpp b/src/tests/unittests/MathTests.cpp
index cd2a50c..031c716 100644
--- a/src/tests/unittests/MathTests.cpp
+++ b/src/tests/unittests/MathTests.cpp
@@ -18,6 +18,7 @@
 #include "dawn/EnumClassBitmasks.h"
 
 #include <cmath>
+#include "dawn/webgpu_cpp.h"
 
 namespace wgpu {
     enum class TestEnum {
@@ -27,10 +28,12 @@
     };
 }  // namespace wgpu
 
-template <>
-struct wgpu::IsDawnBitmask<wgpu::TestEnum> {
-    static constexpr bool enable = true;
-};
+namespace dawn {
+    template <>
+    struct IsDawnBitmask<wgpu::TestEnum> {
+        static constexpr bool enable = true;
+    };
+}  // namespace dawn
 
 // Tests for ScanForward
 TEST(Math, ScanForward) {