diff --git a/src/dawn_native/QuerySet.cpp b/src/dawn_native/QuerySet.cpp index e8e3c9083c..598bac24d0 100644 --- a/src/dawn_native/QuerySet.cpp +++ b/src/dawn_native/QuerySet.cpp @@ -94,6 +94,12 @@ namespace dawn_native { return DAWN_VALIDATION_ERROR("The timestamp query feature is not supported"); } + if (device->IsToggleEnabled(Toggle::DisallowUnsafeAPIs)) { + return DAWN_VALIDATION_ERROR( + "The timestamp query is disallowed because it may expose precise timing " + "information"); + } + if (descriptor->pipelineStatisticsCount != 0) { return DAWN_VALIDATION_ERROR( "The pipeline statistics should not be set if query type is Timestamp"); diff --git a/src/tests/unittests/validation/QueryValidationTests.cpp b/src/tests/unittests/validation/QueryValidationTests.cpp index 53a650f56e..f7f8ce6467 100644 --- a/src/tests/unittests/validation/QueryValidationTests.cpp +++ b/src/tests/unittests/validation/QueryValidationTests.cpp @@ -227,6 +227,7 @@ class TimestampQueryValidationTest : public QuerySetValidationTest { WGPUDevice CreateTestDevice() override { dawn_native::DeviceDescriptor descriptor; descriptor.requiredExtensions.push_back("timestamp_query"); + descriptor.forceDisabledToggles.push_back("disallow_unsafe_apis"); return adapter.CreateDevice(&descriptor); } }; diff --git a/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp b/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp index c5cab0fb41..7504bc980e 100644 --- a/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp +++ b/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp @@ -191,6 +191,7 @@ class UnsafeQueryAPIValidationTest : public ValidationTest { WGPUDevice CreateTestDevice() override { dawn_native::DeviceDescriptor descriptor; descriptor.requiredExtensions.push_back("pipeline_statistics_query"); + descriptor.requiredExtensions.push_back("timestamp_query"); descriptor.forceEnabledToggles.push_back("disallow_unsafe_apis"); return adapter.CreateDevice(&descriptor); } @@ -217,3 +218,21 @@ TEST_F(UnsafeQueryAPIValidationTest, PipelineStatisticsDisallowed) { ASSERT_DEVICE_ERROR(device.CreateQuerySet(&descriptor)); } } + +// Check timestamp queries are disallowed. +TEST_F(UnsafeQueryAPIValidationTest, TimestampQueryDisallowed) { + wgpu::QuerySetDescriptor descriptor; + descriptor.count = 1; + + // Control case: occlusion query creation is allowed. + { + descriptor.type = wgpu::QueryType::Occlusion; + device.CreateQuerySet(&descriptor); + } + + // Error case: timestamp query creation is disallowed. + { + descriptor.type = wgpu::QueryType::Timestamp; + ASSERT_DEVICE_ERROR(device.CreateQuerySet(&descriptor)); + } +}