Support enabling/disabling toggles in unittests

Refactors support for toggle control flags, --enable-toggles= &
--disable-toggles, from the end2end tests into a utility class to make
them available elsewhere. The unittests now uses this utility class to
parse toggle control flags.

For some toggles, like 'use_tint_generator', the unittests are known to
be broken with them turned on. They will be fixed in subsequent CLs.

BUG=dawn:756

Change-Id: Ic283e8a82bedcbf255258cca3e62f58c79d3857b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/47740
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
This commit is contained in:
Ryan Harrison 2021-04-14 14:55:07 +00:00 committed by Commit Bot service account
parent f7d01e07cd
commit acdc35dc39
13 changed files with 218 additions and 22 deletions

View File

@ -151,6 +151,8 @@ test("dawn_unittests") {
"${dawn_root}/src/dawn_wire/server/ServerMemoryTransferService_mock.cpp",
"${dawn_root}/src/dawn_wire/server/ServerMemoryTransferService_mock.h",
"MockCallback.h",
"ToggleParser.cpp",
"ToggleParser.h",
"unittests/BitSetIteratorTests.cpp",
"unittests/BuddyAllocatorTests.cpp",
"unittests/BuddyMemoryAllocatorTests.cpp",
@ -280,6 +282,8 @@ source_set("dawn_end2end_tests_sources") {
sources = [
"DawnTest.h",
"MockCallback.h",
"ToggleParser.cpp",
"ToggleParser.h",
"end2end/BasicTests.cpp",
"end2end/BindGroupTests.cpp",
"end2end/BufferTests.cpp",
@ -404,7 +408,10 @@ source_set("dawn_white_box_tests_sources") {
"${dawn_root}/src/utils:dawn_utils",
]
sources = [ "DawnTest.h" ]
sources = [
"DawnTest.h",
"ToggleParser.h",
]
if (dawn_enable_vulkan) {
deps += [ "${dawn_root}/third_party/khronos:vulkan_headers" ]
@ -505,6 +512,8 @@ test("dawn_perf_tests") {
"DawnTest.cpp",
"DawnTest.h",
"ParamGenerator.h",
"ToggleParser.cpp",
"ToggleParser.h",
"perf_tests/BufferUploadPerf.cpp",
"perf_tests/DawnPerfTest.cpp",
"perf_tests/DawnPerfTest.h",

View File

@ -265,25 +265,11 @@ void DawnTestEnvironment::ParseArgs(int argc, char** argv) {
continue;
}
constexpr const char kEnableTogglesSwitch[] = "--enable-toggles=";
argLen = sizeof(kEnableTogglesSwitch) - 1;
if (strncmp(argv[i], kEnableTogglesSwitch, argLen) == 0) {
std::string toggle;
std::stringstream toggles(argv[i] + argLen);
while (getline(toggles, toggle, ',')) {
mEnabledToggles.push_back(toggle);
}
if (mToggleParser.ParseEnabledToggles(argv[i])) {
continue;
}
constexpr const char kDisableTogglesSwitch[] = "--disable-toggles=";
argLen = sizeof(kDisableTogglesSwitch) - 1;
if (strncmp(argv[i], kDisableTogglesSwitch, argLen) == 0) {
std::string toggle;
std::stringstream toggles(argv[i] + argLen);
while (getline(toggles, toggle, ',')) {
mDisabledToggles.push_back(toggle);
}
if (mToggleParser.ParseDisabledToggles(argv[i])) {
continue;
}
@ -667,11 +653,11 @@ const char* DawnTestEnvironment::GetWireTraceDir() const {
}
const std::vector<std::string>& DawnTestEnvironment::GetEnabledToggles() const {
return mEnabledToggles;
return mToggleParser.GetEnabledToggles();
}
const std::vector<std::string>& DawnTestEnvironment::GetDisabledToggles() const {
return mDisabledToggles;
return mToggleParser.GetDisabledToggles();
}
// Implementation of DawnTest

View File

@ -19,6 +19,7 @@
#include "dawn/dawn_proc_table.h"
#include "dawn/webgpu_cpp.h"
#include "dawn_native/DawnNative.h"
#include "tests/ToggleParser.h"
#include <dawn_platform/DawnPlatform.h>
#include <gtest/gtest.h>
@ -232,8 +233,8 @@ class DawnTestEnvironment : public testing::Environment {
wgpu::BackendType mBackendTypeFilter;
std::string mWireTraceDir;
std::vector<std::string> mEnabledToggles;
std::vector<std::string> mDisabledToggles;
ToggleParser mToggleParser;
std::vector<dawn_native::DeviceType> mDevicePreferences;
std::vector<TestAdapterProperties> mAdapterProperties;

View File

@ -0,0 +1,57 @@
// Copyright 2021 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "tests/ToggleParser.h"
#include <cstring>
#include <sstream>
ToggleParser::ToggleParser() = default;
ToggleParser::~ToggleParser() = default;
bool ToggleParser::ParseEnabledToggles(char* arg) {
constexpr const char kEnableTogglesSwitch[] = "--enable-toggles=";
size_t argLen = sizeof(kEnableTogglesSwitch) - 1;
if (strncmp(arg, kEnableTogglesSwitch, argLen) == 0) {
std::string toggle;
std::stringstream toggles(arg + argLen);
while (getline(toggles, toggle, ',')) {
mEnabledToggles.push_back(toggle);
}
return true;
}
return false;
}
bool ToggleParser::ParseDisabledToggles(char* arg) {
constexpr const char kDisableTogglesSwitch[] = "--disable-toggles=";
size_t argLDis = sizeof(kDisableTogglesSwitch) - 1;
if (strncmp(arg, kDisableTogglesSwitch, argLDis) == 0) {
std::string toggle;
std::stringstream toggles(arg + argLDis);
while (getline(toggles, toggle, ',')) {
mDisabledToggles.push_back(toggle);
}
return true;
}
return false;
}
const std::vector<std::string>& ToggleParser::GetEnabledToggles() const {
return mEnabledToggles;
}
const std::vector<std::string>& ToggleParser::GetDisabledToggles() const {
return mDisabledToggles;
}

37
src/tests/ToggleParser.h Normal file
View File

@ -0,0 +1,37 @@
// Copyright 2021 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef TESTS_TOGGLEPARSER_H_
#define TESTS_TOGGLEPARSER_H_
#include <string>
#include <vector>
class ToggleParser {
public:
ToggleParser();
~ToggleParser();
bool ParseEnabledToggles(char* arg);
bool ParseDisabledToggles(char* arg);
const std::vector<std::string>& GetEnabledToggles() const;
const std::vector<std::string>& GetDisabledToggles() const;
private:
std::vector<std::string> mEnabledToggles;
std::vector<std::string> mDisabledToggles;
};
#endif // TESTS_TOGGLEPARSER_H_

View File

@ -1772,6 +1772,8 @@ TEST_F(BindGroupLayoutCompatibilityTest, RWStorageInBGLWithROStorageInShader) {
// Test that it is invalid to pass a readonly storage buffer in the pipeline layout when the shader
// uses the binding as a writable storage buffer.
TEST_F(BindGroupLayoutCompatibilityTest, ROStorageInBGLWithRWStorageInShader) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// Set up the bind group layout.
wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,
@ -1786,6 +1788,8 @@ TEST_F(BindGroupLayoutCompatibilityTest, ROStorageInBGLWithRWStorageInShader) {
}
TEST_F(BindGroupLayoutCompatibilityTest, TextureViewDimension) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
constexpr char kTexture2DShaderFS[] = R"(
[[group(0), binding(0)]] var myTexture : texture_2d<f32>;
[[stage(fragment)]] fn main() {
@ -1929,6 +1933,8 @@ TEST_F(BindingsValidationTest, PipelineLayoutWithMoreBindingsThanPipeline) {
// Test that it is invalid to set a pipeline layout that doesn't have all necessary bindings
// required by the pipeline.
TEST_F(BindingsValidationTest, PipelineLayoutWithLessBindingsThanPipeline) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// Set up bind group layout.
wgpu::BindGroupLayout bgl0 = utils::MakeBindGroupLayout(
device, {{0, wgpu::ShaderStage::Compute | wgpu::ShaderStage::Fragment,

View File

@ -38,6 +38,8 @@ class GetBindGroupLayoutTests : public ValidationTest {
// Test that GetBindGroupLayout returns the same object for the same index
// and for matching layouts.
TEST_F(GetBindGroupLayoutTests, SameObject) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -91,6 +93,8 @@ TEST_F(GetBindGroupLayoutTests, SameObject) {
// - shader stage visibility is the stage that adds the binding.
// - dynamic offsets is false
TEST_F(GetBindGroupLayoutTests, DefaultShaderStageAndDynamicOffsets) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -134,6 +138,8 @@ TEST_F(GetBindGroupLayoutTests, DefaultShaderStageAndDynamicOffsets) {
// Test GetBindGroupLayout works with a compute pipeline
TEST_F(GetBindGroupLayoutTests, ComputePipeline) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -171,6 +177,8 @@ TEST_F(GetBindGroupLayoutTests, ComputePipeline) {
// Test that the binding type matches the shader.
TEST_F(GetBindGroupLayoutTests, BindingType) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -262,6 +270,8 @@ TEST_F(GetBindGroupLayoutTests, BindingType) {
// Test that texture view dimension matches the shader.
TEST_F(GetBindGroupLayoutTests, ViewDimension) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -339,6 +349,8 @@ TEST_F(GetBindGroupLayoutTests, ViewDimension) {
// Test that texture component type matches the shader.
TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -385,6 +397,8 @@ TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
// Test that binding= indices match.
TEST_F(GetBindGroupLayoutTests, BindingIndices) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -471,6 +485,8 @@ TEST_F(GetBindGroupLayoutTests, DuplicateBinding) {
// Test that minBufferSize is set on the BGL and that the max of the min buffer sizes is used.
TEST_F(GetBindGroupLayoutTests, MinBufferSize) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -557,6 +573,8 @@ TEST_F(GetBindGroupLayoutTests, MinBufferSize) {
// Test that the visibility is correctly aggregated if two stages have the exact same binding.
TEST_F(GetBindGroupLayoutTests, StageAggregation) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.
@ -625,6 +643,8 @@ TEST_F(GetBindGroupLayoutTests, StageAggregation) {
// Test it is invalid to have conflicting binding types in the shaders.
TEST_F(GetBindGroupLayoutTests, ConflictingBindingType) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
wgpu::ShaderModule vsModule = utils::CreateShaderModule(device, R"(
[[block]] struct S {
pos : vec4<f32>;
@ -653,6 +673,8 @@ TEST_F(GetBindGroupLayoutTests, ConflictingBindingType) {
// Test it is invalid to have conflicting binding texture multisampling in the shaders.
TEST_F(GetBindGroupLayoutTests, ConflictingBindingTextureMultisampling) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
wgpu::ShaderModule vsModule = utils::CreateShaderModule(device, R"(
[[group(0), binding(0)]] var myTexture : texture_2d<f32>;
@ -675,6 +697,8 @@ TEST_F(GetBindGroupLayoutTests, ConflictingBindingTextureMultisampling) {
// Test it is invalid to have conflicting binding texture dimension in the shaders.
TEST_F(GetBindGroupLayoutTests, ConflictingBindingViewDimension) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
wgpu::ShaderModule vsModule = utils::CreateShaderModule(device, R"(
[[group(0), binding(0)]] var myTexture : texture_2d<f32>;
@ -697,6 +721,8 @@ TEST_F(GetBindGroupLayoutTests, ConflictingBindingViewDimension) {
// Test it is invalid to have conflicting binding texture component type in the shaders.
TEST_F(GetBindGroupLayoutTests, ConflictingBindingTextureComponentType) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
wgpu::ShaderModule vsModule = utils::CreateShaderModule(device, R"(
[[group(0), binding(0)]] var myTexture : texture_2d<f32>;
@ -732,6 +758,8 @@ TEST_F(GetBindGroupLayoutTests, OutOfRangeIndex) {
// Test that unused indices return the empty bind group layout.
TEST_F(GetBindGroupLayoutTests, UnusedIndex) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// This test works assuming Dawn Native's object deduplication.
// Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
// Native.

View File

@ -315,6 +315,8 @@ TEST_F(MinBufferSizePipelineCreationTests, ZeroMinBufferSize) {
// Fail if layout given has non-zero minimum sizes smaller than shader requirements
TEST_F(MinBufferSizePipelineCreationTests, LayoutSizesTooSmall) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
std::vector<BindingDescriptor> bindings = {{0, 0, "a : f32; b : f32;", 8},
{0, 1, "c : f32;", 4}};
@ -336,6 +338,8 @@ TEST_F(MinBufferSizePipelineCreationTests, LayoutSizesTooSmall) {
// Fail if layout given has non-zero minimum sizes smaller than shader requirements
TEST_F(MinBufferSizePipelineCreationTests, LayoutSizesTooSmallMultipleGroups) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
std::vector<BindingDescriptor> bg0Bindings = {{0, 0, "a : f32; b : f32;", 8},
{0, 1, "c : f32;", 4}};
std::vector<BindingDescriptor> bg1Bindings = {{1, 0, "d : f32; e : f32; f : f32;", 12},
@ -398,6 +402,8 @@ class MinBufferSizeDrawTimeValidationTests : public MinBufferSizeTestsBase {};
// Fail if binding sizes are too small at draw time
TEST_F(MinBufferSizeDrawTimeValidationTests, ZeroMinSizeAndTooSmallBinding) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
std::vector<BindingDescriptor> bindings = {{0, 0, "a : f32; b : f32;", 8},
{0, 1, "c : f32;", 4}};
@ -419,6 +425,8 @@ TEST_F(MinBufferSizeDrawTimeValidationTests, ZeroMinSizeAndTooSmallBinding) {
// Draw time validation works for non-contiguous bindings
TEST_F(MinBufferSizeDrawTimeValidationTests, UnorderedBindings) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
std::vector<BindingDescriptor> bindings = {{0, 2, "a : f32; b : f32;", 8},
{0, 0, "c : f32;", 4},
{0, 4, "d : f32; e : f32; f : f32;", 12}};
@ -441,6 +449,8 @@ TEST_F(MinBufferSizeDrawTimeValidationTests, UnorderedBindings) {
// Draw time validation works for multiple bind groups
TEST_F(MinBufferSizeDrawTimeValidationTests, MultipleGroups) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
std::vector<BindingDescriptor> bg0Bindings = {{0, 0, "a : f32; b : f32;", 8},
{0, 1, "c : f32;", 4}};
std::vector<BindingDescriptor> bg1Bindings = {{1, 0, "d : f32; e : f32; f : f32;", 12},
@ -512,6 +522,8 @@ class MinBufferSizeDefaultLayoutTests : public MinBufferSizeTestsBase {
// Test the minimum size computations for various WGSL types.
TEST_F(MinBufferSizeDefaultLayoutTests, DefaultLayoutVariousWGSLTypes) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
CheckShaderBindingSizeReflection(
{{{0, 0, "a : f32;", 4}, {0, 1, "b : array<f32>;", 4}, {0, 2, "c : mat2x2<f32>;", 16}}});
CheckShaderBindingSizeReflection({{{0, 3, "d : u32; e : array<f32>;", 8},
@ -521,6 +533,8 @@ TEST_F(MinBufferSizeDefaultLayoutTests, DefaultLayoutVariousWGSLTypes) {
// Test the minimum size computations for various buffer binding types.
TEST_F(MinBufferSizeDefaultLayoutTests, DefaultLayoutVariousBindingTypes) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
CheckShaderBindingSizeReflection(
{{{0, 0, "a : f32;", 4, wgpu::BufferBindingType::Uniform},
{0, 1, "a : f32; b : f32;", 8, wgpu::BufferBindingType::Storage},
@ -529,6 +543,8 @@ TEST_F(MinBufferSizeDefaultLayoutTests, DefaultLayoutVariousBindingTypes) {
// Test the minimum size computations works with multiple bind groups.
TEST_F(MinBufferSizeDefaultLayoutTests, MultipleBindGroups) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
CheckShaderBindingSizeReflection(
{{{0, 0, "a : f32;", 4, wgpu::BufferBindingType::Uniform}},
{{1, 0, "a : f32; b : f32;", 8, wgpu::BufferBindingType::Storage}},
@ -537,6 +553,8 @@ TEST_F(MinBufferSizeDefaultLayoutTests, MultipleBindGroups) {
// Test the minimum size computations with manual size/align/stride decorations.
TEST_F(MinBufferSizeDefaultLayoutTests, NonDefaultLayout) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
CheckShaderBindingSizeReflection({{{0, 0, "[[size(256)]] a : u32; b : u32;", 260},
{0, 1, "c : u32; [[align(16)]] d : u32;", 20},
{0, 2, "d : [[stride(40)]] array<u32, 3>;", 120},
@ -545,6 +563,8 @@ TEST_F(MinBufferSizeDefaultLayoutTests, NonDefaultLayout) {
// Minimum size should be the max requirement of both vertex and fragment stages.
TEST_F(MinBufferSizeDefaultLayoutTests, RenderPassConsidersBothStages) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
std::string vertexShader = CreateVertexShaderWithBindings(
{{0, 0, "a : f32;", 4, wgpu::BufferBindingType::Uniform},
{0, 1, "b : vec4<f32>;", 16, wgpu::BufferBindingType::Uniform}});

View File

@ -393,6 +393,8 @@ TEST_F(RenderPipelineValidationTest, AlphaToCoverageAndSampleCount) {
// Tests that the texture component type in shader must match the bind group layout.
TEST_F(RenderPipelineValidationTest, TextureComponentTypeCompatibility) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
constexpr uint32_t kNumTextureComponentType = 3u;
std::array<const char*, kNumTextureComponentType> kScalarTypes = {{"f32", "i32", "u32"}};
std::array<wgpu::TextureSampleType, kNumTextureComponentType> kTextureComponentTypes = {{
@ -430,6 +432,8 @@ TEST_F(RenderPipelineValidationTest, TextureComponentTypeCompatibility) {
// Tests that the texture view dimension in shader must match the bind group layout.
TEST_F(RenderPipelineValidationTest, TextureViewDimensionCompatibility) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
constexpr uint32_t kNumTextureViewDimensions = 6u;
std::array<const char*, kNumTextureViewDimensions> kTextureKeywords = {{
"texture_1d",

View File

@ -118,6 +118,8 @@ TEST_F(ShaderModuleValidationTest, CombinedTextureAndSampler) {
// Test that it is not allowed to declare a multisampled-array interface texture.
// TODO(enga): Also test multisampled cube, cube array, and 3D. These have no GLSL keywords.
TEST_F(ShaderModuleValidationTest, MultisampledArrayTexture) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// SPIR-V ASM produced by glslang for the following fragment shader:
//
// #version 450

View File

@ -226,6 +226,8 @@ TEST_F(StorageTextureValidationTests, ComputePipeline) {
// Validate read-write storage textures are not currently supported.
TEST_F(StorageTextureValidationTests, ReadWriteStorageTexture) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// Read-write storage textures cannot be declared in a vertex shader by default.
{
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
@ -286,6 +288,8 @@ TEST_F(StorageTextureValidationTests, BindGroupLayoutWithStorageTextureBindingTy
// Validate it is an error to declare a read-only or write-only storage texture in shaders with any
// format that doesn't support TextureUsage::Storage texture usages.
TEST_F(StorageTextureValidationTests, StorageTextureFormatInShaders) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
// Not include RGBA8UnormSrgb, BGRA8Unorm, BGRA8UnormSrgb because they are not related to any
// SPIR-V Image Formats.
constexpr std::array<wgpu::TextureFormat, 32> kWGPUTextureFormatSupportedAsSPIRVImageFormats = {
@ -322,6 +326,8 @@ TEST_F(StorageTextureValidationTests, StorageTextureFormatInShaders) {
// Verify that declaring a storage texture format that is not supported in WebGPU causes validation
// error.
TEST_F(StorageTextureValidationTests, UnsupportedWGSLStorageTextureFormat) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
constexpr std::array<wgpu::TextureFormat, 16> kUnsupportedTextureFormats = {
wgpu::TextureFormat::R8Unorm, wgpu::TextureFormat::R8Snorm,
wgpu::TextureFormat::R8Uint, wgpu::TextureFormat::R8Sint,
@ -378,6 +384,8 @@ TEST_F(StorageTextureValidationTests, UnsupportedTextureViewDimensionInBindGroup
// render and compute pipeline, the binding type in the bind group layout must match the
// declaration in the shader.
TEST_F(StorageTextureValidationTests, BindGroupLayoutEntryTypeMatchesShaderDeclaration) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
constexpr wgpu::TextureFormat kStorageTextureFormat = wgpu::TextureFormat::R32Float;
std::initializer_list<utils::BindingLayoutEntryInitializationHelper> kSupportedBindingTypes = {
@ -461,6 +469,8 @@ TEST_F(StorageTextureValidationTests, StorageTextureFormatInBindGroupLayout) {
// Verify the storage texture format in the bind group layout must match the declaration in shader.
TEST_F(StorageTextureValidationTests, BindGroupLayoutStorageTextureFormatMatchesShaderDeclaration) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
for (wgpu::StorageTextureAccess bindingType : kSupportedStorageTextureAccess) {
for (wgpu::TextureFormat storageTextureFormatInShader : utils::kAllTextureFormats) {
if (!utils::TextureFormatSupportsStorageTexture(storageTextureFormatInShader)) {
@ -517,6 +527,8 @@ TEST_F(StorageTextureValidationTests, BindGroupLayoutStorageTextureFormatMatches
// Verify the dimension of the bind group layout with storage textures must match the one declared
// in shader.
TEST_F(StorageTextureValidationTests, BindGroupLayoutViewDimensionMatchesShaderDeclaration) {
DAWN_SKIP_TEST_IF(HasToggleEnabled("use_tint_generator"));
constexpr std::array<wgpu::TextureViewDimension, 4> kSupportedDimensions = {
wgpu::TextureViewDimension::e1D, wgpu::TextureViewDimension::e2D,
wgpu::TextureViewDimension::e2DArray, wgpu::TextureViewDimension::e3D};

View File

@ -19,6 +19,7 @@
#include "dawn/dawn_proc.h"
#include "dawn/webgpu.h"
#include "dawn_native/NullBackend.h"
#include "tests/ToggleParser.h"
#include "utils/WireHelper.h"
#include <algorithm>
@ -27,10 +28,13 @@ namespace {
bool gUseWire = false;
std::string gWireTraceDir = "";
std::unique_ptr<ToggleParser> gToggleParser = nullptr;
} // namespace
void InitDawnValidationTestEnvironment(int argc, char** argv) {
gToggleParser = std::make_unique<ToggleParser>();
for (int i = 1; i < argc; ++i) {
if (strcmp("-w", argv[i]) == 0 || strcmp("--use-wire", argv[i]) == 0) {
gUseWire = true;
@ -44,6 +48,26 @@ void InitDawnValidationTestEnvironment(int argc, char** argv) {
continue;
}
if (gToggleParser->ParseEnabledToggles(argv[i])) {
continue;
}
if (gToggleParser->ParseDisabledToggles(argv[i])) {
continue;
}
if (strcmp("-h", argv[i]) == 0 || strcmp("--help", argv[i]) == 0) {
dawn::InfoLog()
<< "\n\nUsage: " << argv[0]
<< " [GTEST_FLAGS...] [-w]\n"
" [--enable-toggles=toggles] [--disable-toggles=toggles]\n"
" -w, --use-wire: Run the tests through the wire (defaults to no wire)\n"
" --enable-toggles: Comma-delimited list of Dawn toggles to enable.\n"
" ex.) skip_validation,use_tint_generator,disable_robustness,turn_off_vsync\n"
" --disable-toggles: Comma-delimited list of Dawn toggles to disable\n";
continue;
}
// Skip over args that look like they're for Googletest.
constexpr const char kGtestArgPrefix[] = "--gtest_";
if (strncmp(kGtestArgPrefix, argv[i], sizeof(kGtestArgPrefix) - 1) == 0) {
@ -159,6 +183,15 @@ WGPUDevice ValidationTest::CreateTestDevice() {
// Disabled disallowing unsafe APIs so we can test them.
dawn_native::DeviceDescriptor deviceDescriptor;
deviceDescriptor.forceDisabledToggles.push_back("disallow_unsafe_apis");
for (const std::string& toggle : gToggleParser->GetEnabledToggles()) {
deviceDescriptor.forceEnabledToggles.push_back(toggle.c_str());
}
for (const std::string& toggle : gToggleParser->GetDisabledToggles()) {
deviceDescriptor.forceDisabledToggles.push_back(toggle.c_str());
}
return adapter.CreateDevice(&deviceDescriptor);
}

View File

@ -18,7 +18,8 @@
#include "common/Log.h"
#include "dawn/webgpu_cpp.h"
#include "dawn_native/DawnNative.h"
#include "gtest/gtest.h"
#include <gtest/gtest.h>
#define ASSERT_DEVICE_ERROR(statement) \
FlushWire(); \