Remove pipeline statistics query feature

Bug: chromium:1177506
Change-Id: Iefbd7d3a6208ccffb3c251d3d945a3b43fd82ea5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/157220
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Fr <beaufort.francois@gmail.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/dawn.json b/dawn.json
index 081488a..cfe2851 100644
--- a/dawn.json
+++ b/dawn.json
@@ -905,14 +905,6 @@
                 ]
             },
             {
-                "name": "begin pipeline statistics query",
-                "tags": ["upstream", "emscripten"],
-                "args": [
-                    {"name": "query set", "type": "query set"},
-                    {"name": "query index", "type": "uint32_t"}
-                ]
-            },
-            {
                 "name": "dispatch workgroups",
                 "args": [
                     {"name": "workgroupCountX", "type": "uint32_t"},
@@ -931,10 +923,6 @@
                 "name": "end"
             },
             {
-                "name": "end pipeline statistics query",
-                "tags": ["upstream", "emscripten"]
-            },
-            {
                 "name": "set label",
                 "returns": "void",
                 "args": [
@@ -1878,15 +1866,14 @@
             {"value": 1, "name": "depth clip control"},
             {"value": 2, "name": "depth32 float stencil8"},
             {"value": 3, "name": "timestamp query"},
-            {"value": 4, "name": "chromium experimental pipeline statistics query"},
-            {"value": 5, "name": "texture compression BC"},
-            {"value": 6, "name": "texture compression ETC2"},
-            {"value": 7, "name": "texture compression ASTC"},
-            {"value": 8, "name": "indirect first instance"},
-            {"value": 9, "name": "shader f16"},
-            {"value": 10, "name": "RG11B10 ufloat renderable"},
-            {"value": 11, "name": "BGRA8 unorm storage"},
-            {"value": 12, "name": "float32 filterable"},
+            {"value": 4, "name": "texture compression BC"},
+            {"value": 5, "name": "texture compression ETC2"},
+            {"value": 6, "name": "texture compression ASTC"},
+            {"value": 7, "name": "indirect first instance"},
+            {"value": 8, "name": "shader f16"},
+            {"value": 9, "name": "RG11B10 ufloat renderable"},
+            {"value": 10, "name": "BGRA8 unorm storage"},
+            {"value": 11, "name": "float32 filterable"},
 
             {"value": 1002, "name": "dawn internal usages", "tags": ["dawn"]},
             {"value": 1003, "name": "dawn multi planar formats", "tags": ["dawn"]},
@@ -2185,16 +2172,6 @@
             {"name": "format", "type": "texture format"}
         ]
     },
-    "pipeline statistic name": {
-        "category": "enum",
-        "values": [
-            {"value": 0, "name": "vertex shader invocations"},
-            {"value": 1, "name": "clipper invocations"},
-            {"value": 2, "name": "clipper primitives out"},
-            {"value": 3, "name": "fragment shader invocations"},
-            {"value": 4, "name": "compute shader invocations"}
-        ]
-    },
     "power preference": {
         "category": "enum",
         "values": [
@@ -2262,17 +2239,14 @@
         "members": [
             {"name": "label", "type": "char", "annotation": "const*", "length": "strlen", "optional": true},
             {"name": "type", "type": "query type"},
-            {"name": "count", "type": "uint32_t"},
-            {"name": "pipeline statistics", "type": "pipeline statistic name", "annotation": "const*", "length": "pipeline statistic count"},
-            {"name": "pipeline statistic count", "type": "size_t", "default": "0"}
+            {"name": "count", "type": "uint32_t"}
         ]
     },
     "query type": {
         "category": "enum",
         "values": [
             {"value": 0, "name": "occlusion"},
-            {"value": 1, "name": "pipeline statistics"},
-            {"value": 2, "name": "timestamp"}
+            {"value": 1, "name": "timestamp"}
         ]
     },
     "queue": {
@@ -2744,14 +2718,6 @@
                 ]
             },
             {
-                "name": "begin pipeline statistics query",
-                "tags": ["upstream", "emscripten"],
-                "args": [
-                    {"name": "query set", "type": "query set"},
-                    {"name": "query index", "type": "uint32_t"}
-                ]
-            },
-            {
                 "name": "end occlusion query"
             },
             {
@@ -2770,10 +2736,6 @@
                 "name": "end"
             },
             {
-                "name": "end pipeline statistics query",
-                "tags": ["upstream", "emscripten"]
-            },
-            {
                 "name": "set label",
                 "returns": "void",
                 "args": [
diff --git a/src/dawn/native/Features.cpp b/src/dawn/native/Features.cpp
index f0b855f..c098b5e 100644
--- a/src/dawn/native/Features.cpp
+++ b/src/dawn/native/Features.cpp
@@ -59,10 +59,6 @@
      {"Support Adaptable Scalable Texture Compressed (ASTC) "
       "texture formats",
       "https://bugs.chromium.org/p/dawn/issues/detail?id=955", FeatureInfo::FeatureState::Stable}},
-    {Feature::ChromiumExperimentalPipelineStatisticsQuery,
-     {"Support experimental Pipeline Statistics Query",
-      "https://bugs.chromium.org/p/dawn/issues/detail?id=434",
-      FeatureInfo::FeatureState::Experimental}},
     {Feature::TimestampQuery,
      {"Support Timestamp Query", "https://bugs.chromium.org/p/dawn/issues/detail?id=434",
       FeatureInfo::FeatureState::Experimental}},
diff --git a/src/dawn/native/QuerySet.cpp b/src/dawn/native/QuerySet.cpp
index 9287a2f..d5d6b03 100644
--- a/src/dawn/native/QuerySet.cpp
+++ b/src/dawn/native/QuerySet.cpp
@@ -60,36 +60,8 @@
 
     switch (descriptor->type) {
         case wgpu::QueryType::Occlusion:
-            DAWN_INVALID_IF(descriptor->pipelineStatisticCount != 0,
-                            "Pipeline statistics specified for a query of type %s.",
-                            descriptor->type);
             break;
 
-        case wgpu::QueryType::PipelineStatistics: {
-            // TODO(crbug.com/1177506): Pipeline statistics query is not fully implemented.
-            // Allow it only as unsafe until the implementaion is completed.
-            DAWN_INVALID_IF(!device->IsToggleEnabled(Toggle::AllowUnsafeAPIs),
-                            "Pipeline statistics queries are disallowed because they are not "
-                            "fully implemented");
-
-            DAWN_INVALID_IF(
-                !device->HasFeature(Feature::ChromiumExperimentalPipelineStatisticsQuery),
-                "Pipeline statistics query set created without the feature being enabled.");
-
-            DAWN_INVALID_IF(descriptor->pipelineStatisticCount == 0,
-                            "Pipeline statistics query set created with 0 statistics.");
-
-            std::set<wgpu::PipelineStatisticName> pipelineStatisticsSet;
-            for (uint32_t i = 0; i < descriptor->pipelineStatisticCount; i++) {
-                DAWN_TRY(ValidatePipelineStatisticName(descriptor->pipelineStatistics[i]));
-
-                auto [_, inserted] =
-                    pipelineStatisticsSet.insert((descriptor->pipelineStatistics[i]));
-                DAWN_INVALID_IF(!inserted, "Statistic %s is specified more than once.",
-                                descriptor->pipelineStatistics[i]);
-            }
-        } break;
-
         case wgpu::QueryType::Timestamp:
             DAWN_INVALID_IF(!device->IsToggleEnabled(Toggle::AllowUnsafeAPIs),
                             "Timestamp queries are disallowed because they may expose precise "
@@ -99,10 +71,6 @@
                 !device->HasFeature(Feature::TimestampQuery) &&
                     !device->HasFeature(Feature::ChromiumExperimentalTimestampQueryInsidePasses),
                 "Timestamp query set created without the feature being enabled.");
-
-            DAWN_INVALID_IF(descriptor->pipelineStatisticCount != 0,
-                            "Pipeline statistics specified for a query of type %s.",
-                            descriptor->type);
             break;
 
         default:
@@ -117,10 +85,6 @@
       mQueryType(descriptor->type),
       mQueryCount(descriptor->count),
       mState(QuerySetState::Available) {
-    for (uint32_t i = 0; i < descriptor->pipelineStatisticCount; i++) {
-        mPipelineStatistics.push_back(descriptor->pipelineStatistics[i]);
-    }
-
     mQueryAvailability.resize(descriptor->count);
     GetObjectTrackingList()->Track(this);
 }
@@ -165,10 +129,6 @@
     return mQueryCount;
 }
 
-const std::vector<wgpu::PipelineStatisticName>& QuerySetBase::GetPipelineStatistics() const {
-    return mPipelineStatistics;
-}
-
 const std::vector<bool>& QuerySetBase::GetQueryAvailability() const {
     return mQueryAvailability;
 }
diff --git a/src/dawn/native/QuerySet.h b/src/dawn/native/QuerySet.h
index 6382d2d..7019c3a 100644
--- a/src/dawn/native/QuerySet.h
+++ b/src/dawn/native/QuerySet.h
@@ -48,7 +48,6 @@
 
     wgpu::QueryType GetQueryType() const;
     uint32_t GetQueryCount() const;
-    const std::vector<wgpu::PipelineStatisticName>& GetPipelineStatistics() const;
 
     const std::vector<bool>& GetQueryAvailability() const;
     void SetQueryAvailability(uint32_t index, bool available);
@@ -72,7 +71,6 @@
   private:
     wgpu::QueryType mQueryType;
     uint32_t mQueryCount;
-    std::vector<wgpu::PipelineStatisticName> mPipelineStatistics;
 
     enum class QuerySetState { Unavailable, Available, Destroyed };
     QuerySetState mState = QuerySetState::Unavailable;
diff --git a/src/dawn/native/d3d12/CommandBufferD3D12.cpp b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
index e8bf9f5..4e989e2 100644
--- a/src/dawn/native/d3d12/CommandBufferD3D12.cpp
+++ b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
@@ -69,8 +69,6 @@
     switch (type) {
         case wgpu::QueryType::Occlusion:
             return D3D12_QUERY_TYPE_BINARY_OCCLUSION;
-        case wgpu::QueryType::PipelineStatistics:
-            return D3D12_QUERY_TYPE_PIPELINE_STATISTICS;
         case wgpu::QueryType::Timestamp:
             return D3D12_QUERY_TYPE_TIMESTAMP;
     }
diff --git a/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp b/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp
index 821e207..70d67c6 100644
--- a/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp
+++ b/src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp
@@ -146,7 +146,6 @@
         EnableFeature(Feature::TimestampQuery);
         EnableFeature(Feature::ChromiumExperimentalTimestampQueryInsidePasses);
     }
-    EnableFeature(Feature::ChromiumExperimentalPipelineStatisticsQuery);
 
     // Both Dp4a and ShaderF16 features require DXC version being 1.4 or higher
     if (GetBackend()->IsDXCAvailableAndVersionAtLeast(1, 4, 1, 4)) {
diff --git a/src/dawn/native/d3d12/QuerySetD3D12.cpp b/src/dawn/native/d3d12/QuerySetD3D12.cpp
index 543c2fc..5f44de8 100644
--- a/src/dawn/native/d3d12/QuerySetD3D12.cpp
+++ b/src/dawn/native/d3d12/QuerySetD3D12.cpp
@@ -40,8 +40,6 @@
     switch (type) {
         case wgpu::QueryType::Occlusion:
             return D3D12_QUERY_HEAP_TYPE_OCCLUSION;
-        case wgpu::QueryType::PipelineStatistics:
-            return D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS;
         case wgpu::QueryType::Timestamp:
             return D3D12_QUERY_HEAP_TYPE_TIMESTAMP;
     }
diff --git a/src/dawn/native/metal/BackendMTL.mm b/src/dawn/native/metal/BackendMTL.mm
index 1e8d3f5..aef3ebb 100644
--- a/src/dawn/native/metal/BackendMTL.mm
+++ b/src/dawn/native/metal/BackendMTL.mm
@@ -508,13 +508,6 @@
             if (ShouldLeakCounterSets()) {
                 [[*mDevice counterSets] retain];
             }
-            if (IsGPUCounterSupported(
-                    *mDevice, MTLCommonCounterSetStatistic,
-                    {MTLCommonCounterVertexInvocations, MTLCommonCounterClipperInvocations,
-                     MTLCommonCounterClipperPrimitivesOut, MTLCommonCounterFragmentInvocations,
-                     MTLCommonCounterComputeKernelInvocations})) {
-                EnableFeature(Feature::ChromiumExperimentalPipelineStatisticsQuery);
-            }
 
             if (IsGPUCounterSupported(*mDevice, MTLCommonCounterSetTimestamp,
                                       {MTLCommonCounterTimestamp})) {
diff --git a/src/dawn/native/metal/QuerySetMTL.mm b/src/dawn/native/metal/QuerySetMTL.mm
index 2784dc1..f0b81a8 100644
--- a/src/dawn/native/metal/QuerySetMTL.mm
+++ b/src/dawn/native/metal/QuerySetMTL.mm
@@ -105,18 +105,6 @@
             }
             break;
         }
-        case wgpu::QueryType::PipelineStatistics:
-            if (@available(macOS 10.15, iOS 14.0, *)) {
-                NSRef<NSString> label = MakeDebugName(
-                    GetDevice(), "Dawn_QuerySet_PipelineStatisticCounterSampleBuffer", GetLabel());
-                DAWN_TRY_ASSIGN(
-                    mCounterSampleBuffer,
-                    CreateCounterSampleBuffer(device, label.Get(), MTLCommonCounterSetStatistic,
-                                              GetQueryCount()));
-            } else {
-                DAWN_UNREACHABLE();
-            }
-            break;
         case wgpu::QueryType::Timestamp:
             if (@available(macOS 10.15, iOS 14.0, *)) {
                 NSRef<NSString> label = MakeDebugName(
diff --git a/src/dawn/native/vulkan/DeviceVk.cpp b/src/dawn/native/vulkan/DeviceVk.cpp
index f31fb19..a96417d 100644
--- a/src/dawn/native/vulkan/DeviceVk.cpp
+++ b/src/dawn/native/vulkan/DeviceVk.cpp
@@ -340,13 +340,6 @@
         usedKnobs.features.textureCompressionASTC_LDR = VK_TRUE;
     }
 
-    if (HasFeature(Feature::ChromiumExperimentalPipelineStatisticsQuery)) {
-        DAWN_ASSERT(
-            ToBackend(GetPhysicalDevice())->GetDeviceInfo().features.pipelineStatisticsQuery ==
-            VK_TRUE);
-        usedKnobs.features.pipelineStatisticsQuery = VK_TRUE;
-    }
-
     if (HasFeature(Feature::DepthClipControl)) {
         usedKnobs.features.depthClamp = VK_TRUE;
     }
diff --git a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
index a3f9ee2..0b97048 100644
--- a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
+++ b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
@@ -211,10 +211,6 @@
         EnableFeature(Feature::TextureCompressionASTC);
     }
 
-    if (mDeviceInfo.features.pipelineStatisticsQuery == VK_TRUE) {
-        EnableFeature(Feature::ChromiumExperimentalPipelineStatisticsQuery);
-    }
-
     // TODO(dawn:1559) Resolving timestamp queries after a render pass is failing on Qualcomm-based
     // Android devices.
     if (mDeviceInfo.properties.limits.timestampComputeAndGraphics == VK_TRUE &&
diff --git a/src/dawn/native/vulkan/QuerySetVk.cpp b/src/dawn/native/vulkan/QuerySetVk.cpp
index c565e17..05db1db 100644
--- a/src/dawn/native/vulkan/QuerySetVk.cpp
+++ b/src/dawn/native/vulkan/QuerySetVk.cpp
@@ -43,39 +43,11 @@
     switch (type) {
         case wgpu::QueryType::Occlusion:
             return VK_QUERY_TYPE_OCCLUSION;
-        case wgpu::QueryType::PipelineStatistics:
-            return VK_QUERY_TYPE_PIPELINE_STATISTICS;
         case wgpu::QueryType::Timestamp:
             return VK_QUERY_TYPE_TIMESTAMP;
     }
     DAWN_UNREACHABLE();
 }
-
-VkQueryPipelineStatisticFlags VulkanQueryPipelineStatisticFlags(
-    std::vector<wgpu::PipelineStatisticName> pipelineStatisticsSet) {
-    VkQueryPipelineStatisticFlags pipelineStatistics = 0;
-    for (size_t i = 0; i < pipelineStatisticsSet.size(); ++i) {
-        switch (pipelineStatisticsSet[i]) {
-            case wgpu::PipelineStatisticName::ClipperInvocations:
-                pipelineStatistics |= VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT;
-                break;
-            case wgpu::PipelineStatisticName::ClipperPrimitivesOut:
-                pipelineStatistics |= VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT;
-                break;
-            case wgpu::PipelineStatisticName::ComputeShaderInvocations:
-                pipelineStatistics |= VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT;
-                break;
-            case wgpu::PipelineStatisticName::FragmentShaderInvocations:
-                pipelineStatistics |= VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT;
-                break;
-            case wgpu::PipelineStatisticName::VertexShaderInvocations:
-                pipelineStatistics |= VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT;
-                break;
-        }
-    }
-
-    return pipelineStatistics;
-}
 }  // anonymous namespace
 
 // static
@@ -93,9 +65,6 @@
     createInfo.flags = 0;
     createInfo.queryType = VulkanQueryType(GetQueryType());
     createInfo.queryCount = std::max(GetQueryCount(), uint32_t(1u));
-    if (GetQueryType() == wgpu::QueryType::PipelineStatistics) {
-        createInfo.pipelineStatistics = VulkanQueryPipelineStatisticFlags(GetPipelineStatistics());
-    }
 
     Device* device = ToBackend(GetDevice());
     DAWN_TRY(CheckVkOOMThenSuccess(
diff --git a/src/dawn/node/binding/Converter.cpp b/src/dawn/node/binding/Converter.cpp
index 66a419a..6db077a 100644
--- a/src/dawn/node/binding/Converter.cpp
+++ b/src/dawn/node/binding/Converter.cpp
@@ -1517,7 +1517,6 @@
         case wgpu::FeatureName::MultiPlanarFormatExtendedUsages:
         case wgpu::FeatureName::MultiPlanarFormatP010:
         case wgpu::FeatureName::Norm16TextureFormats:
-        case wgpu::FeatureName::ChromiumExperimentalPipelineStatisticsQuery:
         case wgpu::FeatureName::PixelLocalStorageCoherent:
         case wgpu::FeatureName::PixelLocalStorageNonCoherent:
         case wgpu::FeatureName::SharedFenceDXGISharedHandle:
@@ -1553,9 +1552,6 @@
         case wgpu::QueryType::Timestamp:
             out = interop::GPUQueryType::kTimestamp;
             return true;
-        case wgpu::QueryType::PipelineStatistics:
-            // TODO(dawn:1123): Add support for pipeline statistics if they are in WebGPU one day.
-            return false;
     }
     return false;
 }
diff --git a/src/dawn/tests/end2end/QueryTests.cpp b/src/dawn/tests/end2end/QueryTests.cpp
index 04b6cd0..fed9bcc 100644
--- a/src/dawn/tests/end2end/QueryTests.cpp
+++ b/src/dawn/tests/end2end/QueryTests.cpp
@@ -594,51 +594,6 @@
     }
 }
 
-class PipelineStatisticsQueryTests : public QueryTests {
-  protected:
-    void SetUp() override {
-        DawnTest::SetUp();
-
-        // Skip all tests if pipeline statistics feature is not supported
-        DAWN_TEST_UNSUPPORTED_IF(
-            !SupportsFeatures({wgpu::FeatureName::ChromiumExperimentalPipelineStatisticsQuery}));
-    }
-
-    std::vector<wgpu::FeatureName> GetRequiredFeatures() override {
-        std::vector<wgpu::FeatureName> requiredFeatures = {};
-        if (SupportsFeatures({wgpu::FeatureName::ChromiumExperimentalPipelineStatisticsQuery})) {
-            requiredFeatures.push_back(
-                wgpu::FeatureName::ChromiumExperimentalPipelineStatisticsQuery);
-        }
-
-        return requiredFeatures;
-    }
-
-    wgpu::QuerySet CreateQuerySetForPipelineStatistics(
-        uint32_t queryCount,
-        std::vector<wgpu::PipelineStatisticName> pipelineStatistics = {}) {
-        wgpu::QuerySetDescriptor descriptor;
-        descriptor.count = queryCount;
-        descriptor.type = wgpu::QueryType::PipelineStatistics;
-
-        if (pipelineStatistics.size() > 0) {
-            descriptor.pipelineStatistics = pipelineStatistics.data();
-            descriptor.pipelineStatisticCount = pipelineStatistics.size();
-        }
-        return device.CreateQuerySet(&descriptor);
-    }
-};
-
-// Test creating query set with the type of PipelineStatistics
-TEST_P(PipelineStatisticsQueryTests, QuerySetCreation) {
-    // Zero-sized query set is allowed.
-    CreateQuerySetForPipelineStatistics(0, {wgpu::PipelineStatisticName::ClipperInvocations,
-                                            wgpu::PipelineStatisticName::VertexShaderInvocations});
-
-    CreateQuerySetForPipelineStatistics(1, {wgpu::PipelineStatisticName::ClipperInvocations,
-                                            wgpu::PipelineStatisticName::VertexShaderInvocations});
-}
-
 class TimestampExpectation : public detail::Expectation {
   public:
     ~TimestampExpectation() override = default;
@@ -1337,13 +1292,6 @@
                       MetalBackend(),
                       MetalBackend({"metal_fill_empty_occlusion_queries_with_zero"}),
                       VulkanBackend());
-DAWN_INSTANTIATE_TEST(PipelineStatisticsQueryTests,
-                      D3D11Backend(),
-                      D3D12Backend(),
-                      MetalBackend(),
-                      OpenGLBackend(),
-                      OpenGLESBackend(),
-                      VulkanBackend());
 DAWN_INSTANTIATE_TEST(TimestampQueryTests,
                       D3D11Backend(),
                       D3D12Backend(),
diff --git a/src/dawn/tests/unittests/validation/QueryValidationTests.cpp b/src/dawn/tests/unittests/validation/QueryValidationTests.cpp
index eb095a3..d40decc 100644
--- a/src/dawn/tests/unittests/validation/QueryValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/QueryValidationTests.cpp
@@ -35,20 +35,13 @@
 
 class QuerySetValidationTest : public ValidationTest {
   protected:
-    wgpu::QuerySet CreateQuerySet(
-        wgpu::Device cDevice,
-        wgpu::QueryType queryType,
-        uint32_t queryCount,
-        std::vector<wgpu::PipelineStatisticName> pipelineStatistics = {}) {
+    wgpu::QuerySet CreateQuerySet(wgpu::Device cDevice,
+                                  wgpu::QueryType queryType,
+                                  uint32_t queryCount) {
         wgpu::QuerySetDescriptor descriptor;
         descriptor.type = queryType;
         descriptor.count = queryCount;
 
-        if (pipelineStatistics.size() > 0) {
-            descriptor.pipelineStatistics = pipelineStatistics.data();
-            descriptor.pipelineStatisticCount = pipelineStatistics.size();
-        }
-
         return cDevice.CreateQuerySet(&descriptor);
     }
 };
@@ -57,19 +50,6 @@
 TEST_F(QuerySetValidationTest, CreationWithoutFeatures) {
     // Creating a query set for occlusion queries succeeds without any features enabled.
     CreateQuerySet(device, wgpu::QueryType::Occlusion, 1);
-
-    // Creating a query set for other types of queries fails without features enabled.
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                       {wgpu::PipelineStatisticName::VertexShaderInvocations}));
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                       {wgpu::PipelineStatisticName::ClipperPrimitivesOut}));
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                       {wgpu::PipelineStatisticName::ComputeShaderInvocations}));
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                       {wgpu::PipelineStatisticName::FragmentShaderInvocations}));
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                       {wgpu::PipelineStatisticName::VertexShaderInvocations}));
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::Timestamp, 1));
 }
 
 // Test creating query set with invalid count
@@ -86,12 +66,6 @@
     ASSERT_DEVICE_ERROR(CreateQuerySet(device, static_cast<wgpu::QueryType>(0xFFFFFFFF), 1));
 }
 
-// Test creating query set with unnecessary pipeline statistics for occlusion queries
-TEST_F(QuerySetValidationTest, UnnecessaryPipelineStatistics) {
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::Occlusion, 1,
-                                       {wgpu::PipelineStatisticName::VertexShaderInvocations}));
-}
-
 // Test destroying a destroyed query set
 TEST_F(QuerySetValidationTest, DestroyDestroyedQuerySet) {
     wgpu::QuerySetDescriptor descriptor;
@@ -324,23 +298,8 @@
     // Creating a query set for occlusion queries succeeds.
     CreateQuerySet(device, wgpu::QueryType::Occlusion, 1);
 
-    // Creating a query set for pipeline statistics queries fails.
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                       {wgpu::PipelineStatisticName::VertexShaderInvocations}));
-
     // Creating a query set for timestamp queries succeeds.
     CreateQuerySet(device, wgpu::QueryType::Timestamp, 1);
-
-    // Fail to create with pipeline statistics for Timestamp query
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::Timestamp, 1,
-                                       {wgpu::PipelineStatisticName::VertexShaderInvocations}));
-}
-
-// Test creating query set with unnecessary pipeline statistics for timestamp queries
-TEST_F(TimestampQueryValidationTest, UnnecessaryPipelineStatistics) {
-    // Fail to create with pipeline statistics for Occlusion query
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::Timestamp, 1,
-                                       {wgpu::PipelineStatisticName::VertexShaderInvocations}));
 }
 
 // Test query set with type of timestamp is set to the occlusionQuerySet of RenderPassDescriptor.
@@ -708,80 +667,6 @@
     }
 }
 
-class PipelineStatisticsQueryValidationTest : public QuerySetValidationTest {
-  protected:
-    WGPUDevice CreateTestDevice(native::Adapter dawnAdapter,
-                                wgpu::DeviceDescriptor descriptor) override {
-        // Create a device with pipeline statistic query feature required. Note that Pipeline
-        // statistic query is an unsafe API, while AllowUnsafeApis instance toggle is enabled
-        // when ValidationTest creating testing instance, so we can test it.
-        wgpu::FeatureName requiredFeatures[1] = {
-            wgpu::FeatureName::ChromiumExperimentalPipelineStatisticsQuery};
-        descriptor.requiredFeatures = requiredFeatures;
-        descriptor.requiredFeatureCount = 1;
-
-        return dawnAdapter.CreateDevice(&descriptor);
-    }
-};
-
-// Test creating query set with only the pipeline statistics feature enabled.
-TEST_F(PipelineStatisticsQueryValidationTest, Creation) {
-    // Creating a query set for occlusion queries succeeds.
-    CreateQuerySet(device, wgpu::QueryType::Occlusion, 1);
-
-    // Creating a query set for timestamp queries fails.
-    ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::Timestamp, 1));
-
-    // Creating a query set for pipeline statistics queries succeeds.
-    CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                   {wgpu::PipelineStatisticName::VertexShaderInvocations});
-}
-
-// Test creating query set with invalid pipeline statistics
-TEST_F(PipelineStatisticsQueryValidationTest, InvalidPipelineStatistics) {
-    // Success to create with all pipeline statistics names which are not in the same order as
-    // defined in webgpu header file
-    {
-        CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                       {wgpu::PipelineStatisticName::ClipperInvocations,
-                        wgpu::PipelineStatisticName::ClipperPrimitivesOut,
-                        wgpu::PipelineStatisticName::ComputeShaderInvocations,
-                        wgpu::PipelineStatisticName::FragmentShaderInvocations,
-                        wgpu::PipelineStatisticName::VertexShaderInvocations});
-    }
-
-    // Fail to create with empty pipeline statistics
-    { ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1, {})); }
-
-    // Fail to create with invalid pipeline statistics
-    {
-        ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                           {static_cast<wgpu::PipelineStatisticName>(0xFFFFFFFF)}));
-    }
-
-    // Fail to create with duplicate pipeline statistics
-    {
-        ASSERT_DEVICE_ERROR(CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                                           {wgpu::PipelineStatisticName::VertexShaderInvocations,
-                                            wgpu::PipelineStatisticName::VertexShaderInvocations}));
-    }
-}
-
-// Test query set with type of pipeline statistics is set to the occlusionQuerySet of
-// RenderPassDescriptor.
-TEST_F(PipelineStatisticsQueryValidationTest, BeginRenderPassWithPipelineStatisticsQuerySet) {
-    // Fail to begin render pass if the type of occlusionQuerySet is not Occlusion
-    wgpu::QuerySet querySet =
-        CreateQuerySet(device, wgpu::QueryType::PipelineStatistics, 1,
-                       {wgpu::PipelineStatisticName::VertexShaderInvocations});
-    PlaceholderRenderPass renderPass(device);
-    renderPass.occlusionQuerySet = querySet;
-
-    wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
-    encoder.BeginRenderPass(&renderPass);
-    ASSERT_DEVICE_ERROR(encoder.Finish());
-}
-
 class ResolveQuerySetValidationTest : public QuerySetValidationTest {
   protected:
     wgpu::Buffer CreateBuffer(wgpu::Device cDevice, uint64_t size, wgpu::BufferUsage usage) {
diff --git a/src/dawn/wire/SupportedFeatures.cpp b/src/dawn/wire/SupportedFeatures.cpp
index d155242..0ac7afb 100644
--- a/src/dawn/wire/SupportedFeatures.cpp
+++ b/src/dawn/wire/SupportedFeatures.cpp
@@ -58,7 +58,6 @@
         case WGPUFeatureName_Depth32FloatStencil8:
         case WGPUFeatureName_TimestampQuery:
         case WGPUFeatureName_ChromiumExperimentalTimestampQueryInsidePasses:
-        case WGPUFeatureName_ChromiumExperimentalPipelineStatisticsQuery:
         case WGPUFeatureName_TextureCompressionBC:
         case WGPUFeatureName_TextureCompressionETC2:
         case WGPUFeatureName_TextureCompressionASTC: