// Copyright 2023 The Dawn & Tint Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <cstdint> #include <string> #include <vector> #include "dawn/common/GPUInfo.h" #include "dawn/common/Math.h" #include "dawn/tests/DawnTest.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { template <class Params> class SubgroupsTestsBase : public DawnTestWithParams<Params> { … }; UseChromiumExperimentalSubgroups; DAWN_TEST_PARAM_STRUCT(…); class SubgroupsShaderTests : public SubgroupsTestsBase<SubgroupsShaderTestsParams> { … }; // Test that subgroup_size builtin attribute read by each invocation is valid and identical for any // workgroup size between 1 and 256. TEST_P(SubgroupsShaderTests, ReadSubgroupSize) { … } // DawnTestBase::CreateDeviceImpl always enables allow_unsafe_apis toggle. DAWN_INSTANTIATE_TEST_P(…); class SubgroupsShaderTestsFragment : public SubgroupsTestsBase<SubgroupsShaderTestsParams> { … }; // Test that subgroup_size builtin attribute read by each invocation is valid and identical for any // workgroup size between 1 and 256. TEST_P(SubgroupsShaderTestsFragment, ReadSubgroupSize) { … } // DawnTestBase::CreateDeviceImpl always enables allow_unsafe_apis toggle. DAWN_INSTANTIATE_TEST_P(…); enum class BroadcastType { … }; std::ostream& operator<<(std::ostream& o, BroadcastType broadcastType) { … } // Indicate which kind of value is the register of invocation 0 set to in subgroupBroadcast tests, // and it will be broadcast to its subgroup. enum class SubgroupBroadcastValueOfInvocation0 { … }; std::ostream& operator<<(std::ostream& o, SubgroupBroadcastValueOfInvocation0 subgroupBroadcastValueOfInvocation0) { … } UseChromiumExperimentalSubgroups; DAWN_TEST_PARAM_STRUCT(SubgroupsBroadcastTestsParams, UseChromiumExperimentalSubgroups, BroadcastType, SubgroupBroadcastValueOfInvocation0); // These two constants should be different so that the broadcast results from invocation 0 can be // distinguished from other invocations, and both should not be 0 so that the broadcast results can // be distinguished from zero-initialized empty buffer. They should also be exactly-representable in // f16 type so we can expect the exact result values for f16 tests. constexpr int32_t SubgroupBroadcastConstantValueForInvocation0 = …; constexpr int32_t SubgroupRegisterInitializer = …; class SubgroupsBroadcastTests : public SubgroupsTestsBase<SubgroupsBroadcastTestsParams> { … }; // Test that subgroupBroadcast builtin function works as expected for any workgroup size between 1 // and 256. Note that although we assume invocation 0 of the workgroup has a subgroup_id of 0 in its // subgroup, we don't assume any other particular subgroups layout property. TEST_P(SubgroupsBroadcastTests, SubgroupBroadcast) { … } // DawnTestBase::CreateDeviceImpl always enables allow_unsafe_apis toggle. DAWN_INSTANTIATE_TEST_P(…); UseChromiumExperimentalSubgroups; DAWN_TEST_PARAM_STRUCT(…); class SubgroupsFullSubgroupsTests : public SubgroupsTestsBase<SubgroupsFullSubgroupsTestsParams> { … }; // Test that creating compute pipeline with full subgroups required will validate the workgroup size // as expected, when using compute shader with literal workgroup size. TEST_P(SubgroupsFullSubgroupsTests, ComputePipelineRequiringFullSubgroupsWithLiteralWorkgroupSize) { … } // Test that creating compute pipeline with full subgroups required will validate the workgroup size // as expected, when using compute shader with override constants workgroup size. TEST_P(SubgroupsFullSubgroupsTests, ComputePipelineRequiringFullSubgroupsWithOverrideWorkgroupSize) { … } // DawnTestBase::CreateDeviceImpl always enables allow_unsafe_apis toggle. DAWN_INSTANTIATE_TEST_P(…); } // anonymous namespace } // namespace dawn