Query API: Extensions

Add extensions of pipeline statistics and timestamp queries.

Bug: dawn:434
Change-Id: I1a472ee4819bd36ce629034cf5175430bab1febc
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22100
Commit-Queue: Hao Li <hao.x.li@intel.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/dawn.json b/dawn.json
index dc39bb5..739eb13 100644
--- a/dawn.json
+++ b/dawn.json
@@ -651,7 +651,9 @@
         "extensible": false,
         "members": [
             {"name": "texture compression BC", "type": "bool", "default": "false"},
-            {"name": "shader float16", "type": "bool", "default": "false"}
+            {"name": "shader float16", "type": "bool", "default": "false"},
+            {"name": "pipeline statistics query", "type": "bool", "default": "false"},
+            {"name": "timestamp query", "type": "bool", "default": "false"}
         ]
     },
     "depth stencil state descriptor": {
diff --git a/src/dawn_native/Extensions.cpp b/src/dawn_native/Extensions.cpp
index de6214f..d356616 100644
--- a/src/dawn_native/Extensions.cpp
+++ b/src/dawn_native/Extensions.cpp
@@ -39,7 +39,15 @@
               {"shader_float16",
                "Support 16bit float arithmetic and declarations in uniform and storage buffers",
                "https://bugs.chromium.org/p/dawn/issues/detail?id=426"},
-              &WGPUDeviceProperties::shaderFloat16}}};
+              &WGPUDeviceProperties::shaderFloat16},
+             {Extension::PipelineStatisticsQuery,
+              {"pipeline_statistics_query", "Support Pipeline Statistics Query",
+               "https://bugs.chromium.org/p/dawn/issues/detail?id=434"},
+              &WGPUDeviceProperties::pipelineStatisticsQuery},
+             {Extension::TimestampQuery,
+              {"timestamp_query", "Support Timestamp Query",
+               "https://bugs.chromium.org/p/dawn/issues/detail?id=434"},
+              &WGPUDeviceProperties::timestampQuery}}};
 
     }  // anonymous namespace
 
diff --git a/src/dawn_native/Extensions.h b/src/dawn_native/Extensions.h
index 9dbdf77..fbc1d8b 100644
--- a/src/dawn_native/Extensions.h
+++ b/src/dawn_native/Extensions.h
@@ -26,6 +26,8 @@
     enum class Extension {
         TextureCompressionBC,
         ShaderFloat16,
+        PipelineStatisticsQuery,
+        TimestampQuery,
 
         EnumCount,
         InvalidEnum = EnumCount,
diff --git a/src/dawn_native/d3d12/AdapterD3D12.cpp b/src/dawn_native/d3d12/AdapterD3D12.cpp
index 8e665d0..4124a76 100644
--- a/src/dawn_native/d3d12/AdapterD3D12.cpp
+++ b/src/dawn_native/d3d12/AdapterD3D12.cpp
@@ -92,6 +92,8 @@
 
     void Adapter::InitializeSupportedExtensions() {
         mSupportedExtensions.EnableExtension(Extension::TextureCompressionBC);
+        mSupportedExtensions.EnableExtension(Extension::PipelineStatisticsQuery);
+        mSupportedExtensions.EnableExtension(Extension::TimestampQuery);
     }
 
     ResultOrError<DeviceBase*> Adapter::CreateDeviceImpl(const DeviceDescriptor* descriptor) {
diff --git a/src/dawn_native/metal/BackendMTL.mm b/src/dawn_native/metal/BackendMTL.mm
index 63567a2..093cceb 100644
--- a/src/dawn_native/metal/BackendMTL.mm
+++ b/src/dawn_native/metal/BackendMTL.mm
@@ -214,6 +214,11 @@
             if ([mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v1]) {
                 mSupportedExtensions.EnableExtension(Extension::TextureCompressionBC);
             }
+
+            if (@available(macOS 10.15, *)) {
+                mSupportedExtensions.EnableExtension(Extension::PipelineStatisticsQuery);
+                mSupportedExtensions.EnableExtension(Extension::TimestampQuery);
+            }
 #endif
         }
 
diff --git a/src/dawn_native/vulkan/AdapterVk.cpp b/src/dawn_native/vulkan/AdapterVk.cpp
index 86041df..c220a8e 100644
--- a/src/dawn_native/vulkan/AdapterVk.cpp
+++ b/src/dawn_native/vulkan/AdapterVk.cpp
@@ -80,6 +80,14 @@
             mDeviceInfo._16BitStorageFeatures.uniformAndStorageBuffer16BitAccess == VK_TRUE) {
             mSupportedExtensions.EnableExtension(Extension::ShaderFloat16);
         }
+
+        if (mDeviceInfo.features.pipelineStatisticsQuery == VK_TRUE) {
+            mSupportedExtensions.EnableExtension(Extension::PipelineStatisticsQuery);
+        }
+
+        if (mDeviceInfo.properties.limits.timestampComputeAndGraphics == VK_TRUE) {
+            mSupportedExtensions.EnableExtension(Extension::TimestampQuery);
+        }
     }
 
     ResultOrError<DeviceBase*> Adapter::CreateDeviceImpl(const DeviceDescriptor* descriptor) {
diff --git a/src/tests/unittests/wire/WireWGPUDevicePropertiesTests.cpp b/src/tests/unittests/wire/WireWGPUDevicePropertiesTests.cpp
index 70abc2c..120e4a9 100644
--- a/src/tests/unittests/wire/WireWGPUDevicePropertiesTests.cpp
+++ b/src/tests/unittests/wire/WireWGPUDevicePropertiesTests.cpp
@@ -23,6 +23,9 @@
 TEST_F(WireWGPUDevicePropertiesTests, SerializeWGPUDeviceProperties) {
     WGPUDeviceProperties sentWGPUDeviceProperties;
     sentWGPUDeviceProperties.textureCompressionBC = true;
+    // Set false to test that the serialization can handle both true and false correctly.
+    sentWGPUDeviceProperties.pipelineStatisticsQuery = false;
+    sentWGPUDeviceProperties.timestampQuery = true;
 
     size_t sentWGPUDevicePropertiesSize =
         dawn_wire::SerializedWGPUDevicePropertiesSize(&sentWGPUDeviceProperties);
@@ -33,4 +36,6 @@
     WGPUDeviceProperties receivedWGPUDeviceProperties;
     dawn_wire::DeserializeWGPUDeviceProperties(&receivedWGPUDeviceProperties, buffer.data());
     ASSERT_TRUE(receivedWGPUDeviceProperties.textureCompressionBC);
+    ASSERT_FALSE(receivedWGPUDeviceProperties.pipelineStatisticsQuery);
+    ASSERT_TRUE(receivedWGPUDeviceProperties.timestampQuery);
 }