// Copyright 2021 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 <numeric> #include <string> #include <vector> #include "dawn/tests/DawnTest.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { class ShaderTests : public DawnTest { … }; // Test that log2 is being properly calculated, base on crbug.com/1046622 TEST_P(ShaderTests, ComputeLog2) { … } TEST_P(ShaderTests, BadWGSL) { … } // Tests that shaders using non-struct function parameters and return values for shader stage I/O // can compile and link successfully. TEST_P(ShaderTests, WGSLParamIO) { … } // Tests that a vertex shader using struct function parameters and return values for shader stage // I/O can compile and link successfully against a fragement shader using compatible non-struct I/O. TEST_P(ShaderTests, WGSLMixedStructParamIO) { … } // Tests that shaders using struct function parameters and return values for shader stage I/O // can compile and link successfully. TEST_P(ShaderTests, WGSLStructIO) { … } // Tests that shaders I/O structs that us compatible locations but are not sorted by hand can link. TEST_P(ShaderTests, WGSLUnsortedStructIO) { … } // Tests that shaders I/O structs can be shared between vertex and fragment shaders. TEST_P(ShaderTests, WGSLSharedStructIO) { … } // Tests that sparse input output locations should work properly. // This test is not in dawn_unittests/RenderPipelineValidationTests because we want to test the // compilation of the pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesSparse) { … } // Tests that interstage built-in inputs and outputs usage mismatch don't mess up with input-output // locations. // This test is not in dawn_unittests/RenderPipelineValidationTests because we want to test the // compilation of the pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesBuiltinsMismatched) { … } // Tests that interstage inputs could be a prefix subset of the outputs. // This test is not in dawn_unittests/RenderPipelineValidationTests because we want to test the // compilation of the pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesPrefixSubset) { … } // Tests that interstage inputs could be a sparse non-prefix subset of the outputs. // This test is not in dawn_unittests/RenderPipelineValidationTests because we want to test the // compilation of the pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesSparseSubset) { … } // Tests that interstage inputs could be a sparse non-prefix subset of the outputs, and that // fragment inputs are unused. This test is not in dawn_unittests/RenderPipelineValidationTests // because we want to test the compilation of the pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesSparseSubsetUnused) { … } // Tests that interstage inputs could be empty when outputs are not. // This test is not in dawn_unittests/RenderPipelineValidationTests because we want to test the // compilation of the pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesEmptySubset) { … } // Regression test for crbug.com/dawn/1733. Even when user defined attribute input is empty, // Builtin input for the next stage could still cause register mismatch issue on D3D12 HLSL // compiler. So the TruncateInterstageVariables transform should still be run. This test is not in // dawn_unittests/RenderPipelineValidationTests because we want to test the compilation of the // pipeline in D3D12 backend. TEST_P(ShaderTests, WGSLInterstageVariablesEmptyUserAttributeSubset) { … } // This is a regression test for an issue caused by the FirstIndexOffset transfrom being done before // the BindingRemapper, causing an intermediate AST to be invalid (and fail the overall // compilation). TEST_P(ShaderTests, FirstIndexOffsetRegisterConflictInHLSLTransforms) { … } // Test that WGSL built-in variable @sample_index can be used in fragment shaders. TEST_P(ShaderTests, SampleIndex) { … } // Test overridable constants without numeric identifiers TEST_P(ShaderTests, OverridableConstants) { … } // Test one shader shared by two pipelines with different constants overridden TEST_P(ShaderTests, OverridableConstantsSharedShader) { … } // Test overridable constants work with workgroup size TEST_P(ShaderTests, OverridableConstantsWorkgroupSize) { … } // Test overridable constants with numeric identifiers TEST_P(ShaderTests, OverridableConstantsNumericIdentifiers) { … } // Test overridable constants precision // D3D12 HLSL shader uses defines so we want float number to have enough precision TEST_P(ShaderTests, OverridableConstantsPrecision) { … } // Test overridable constants for different entry points TEST_P(ShaderTests, OverridableConstantsMultipleEntryPoints) { … } // Test overridable constants with render pipeline // Draw a triangle covering the render target, with vertex position and color values from // overridable constants TEST_P(ShaderTests, OverridableConstantsRenderPipeline) { … } // This is a regression test for crbug.com/dawn:1363 where the BindingRemapper transform was run // before the SingleEntryPoint transform, causing one of the other entry points to have conflicting // bindings. TEST_P(ShaderTests, ConflictingBindingsDueToTransformOrder) { … } // Check that chromium_disable_uniformity_analysis can be used. It is normally disallowed as unsafe // but DawnTests allow all unsafe APIs by default. TEST_P(ShaderTests, CheckUsageOf_chromium_disable_uniformity_analysis) { … } // Test that it is not possible to override the builtins in a way that breaks the robustness // transform. TEST_P(ShaderTests, ShaderOverridingRobustnessBuiltins) { … } // Test that when fragment input is a subset of the vertex output, the render pipeline should be // valid. TEST_P(ShaderTests, FragmentInputIsSubsetOfVertexOutput) { … } // Test that when fragment input is a subset of the vertex output and the order of them is // different, the render pipeline should be valid. TEST_P(ShaderTests, FragmentInputIsSubsetOfVertexOutputWithDifferentOrder) { … } // Test that when fragment input is a subset of the vertex output and that when the builtin // interstage variables may mess up with the order, the render pipeline should be valid. TEST_P(ShaderTests, FragmentInputIsSubsetOfVertexOutputBuiltinOrder) { … } // Test that the derivative_uniformity diagnostic filter is handled correctly through the full // shader compilation flow. TEST_P(ShaderTests, DerivativeUniformityDiagnosticFilter) { … } // Test that identifiers containing double underscores are renamed in the GLSL backend. TEST_P(ShaderTests, DoubleUnderscore) { … } // Test that matrices can be passed by value, which can cause issues on Qualcomm devices. // See crbug.com/tint/2045#c5 TEST_P(ShaderTests, PassMatrixByValue) { … } // Test that matrices in structs can be passed by value, which can cause issues on Qualcomm devices. // See crbug.com/tint/2045#c5 TEST_P(ShaderTests, PassMatrixInStructByValue) { … } // Test that robustness works correctly on uniform buffers that contain mat4x3 types, which can // cause issues on Qualcomm devices. See crbug.com/tint/2074. TEST_P(ShaderTests, Robustness_Uniform_Mat4x3) { … } // SSBOs declared with the same name in multiple shader stages must contain the same members in // GLSL. If not renamed properly, names of binding at (2, 2) in the vertex stage and (0, 3) in the // fragment stage can possibly collide. TEST_P(ShaderTests, StorageAcrossStages) { … } // SSBOs declared with the same name in multiple shader stages must contain the same members in // GLSL. If not renamed properly, names of binding at (2, 2) in the vertex stage and (0, 3) in the // fragment stage can possibly collide. TEST_P(ShaderTests, StorageAcrossStagesStruct) { … } // SSBOs declared with the same name in multiple shader stages must contain the same members in // GLSL. If not renamed properly, names of binding at (2, 2) in the vertex stage and (0, 3) in the // fragment stage can possibly collide. TEST_P(ShaderTests, StorageAcrossStagesSeparateModules) { … } // Deliberately mismatch an SSBO block name at differrent stages. TEST_P(ShaderTests, StorageAcrossStagesSeparateModuleMismatch) { … } // Having different block contents at the same binding point used in different stages is allowed. TEST_P(ShaderTests, StorageAcrossStagesSameBindingPointCollide) { … } // Having different block contents at the same binding point used in different stages is allowed, // with or without struct wrapper. TEST_P(ShaderTests, StorageAcrossStagesSameBindingPointCollideMixedStructDef) { … } // UBOs declared with the same name in multiple shader stages must contain the same members in GLSL. // If not renamed properly, names of binding at (2, 2) in the vertex stage and (0, 3) in the // fragment stage can possibly collide. TEST_P(ShaderTests, UniformAcrossStages) { … } // UBOs declared with the same name in multiple shader stages must contain the same members in GLSL. // If not renamed properly, names of binding at (2, 2) in the vertex stage and (0, 3) in the // fragment stage can possibly collide. TEST_P(ShaderTests, UniformAcrossStagesStruct) { … } // UBOs declared with the same name in multiple shader stages must contain the same members in GLSL. // If not renamed properly, names of binding at (2, 2) in the vertex stage and (0, 3) in the // fragment stage can possibly collide. TEST_P(ShaderTests, UniformAcrossStagesSeparateModule) { … } // Deliberately mismatch a UBO block name at differrent stages. TEST_P(ShaderTests, UniformAcrossStagesSeparateModuleMismatch) { … } // Test that padding is correctly applied to a UBO used in both vert and // frag stages. Insert an additional UBO in the frag stage before the reused UBO. TEST_P(ShaderTests, UniformAcrossStagesSeparateModuleMismatchWithCustomSize) { … } // Test that accessing instance_index in the vert shader and assigning to frag_depth in the frag // shader works. TEST_P(ShaderTests, FragDepthAndInstanceIndex) { … } // Having different block contents at the same binding point used in different stages is allowed. TEST_P(ShaderTests, UniformAcrossStagesSameBindingPointCollide) { … } // Having different block contents at the same binding point used in different stages is allowed, // with or without struct wrapper. TEST_P(ShaderTests, UniformAcrossStagesSameBindingPointCollideMixedStructDef) { … } // Test that the `w` component of fragment builtin position behaves correctly. TEST_P(ShaderTests, FragmentPositionW) { … } // Regression test for crbug.com/dawn/2340. GLSL requires the main enty point to be named "main". // We need to make sure when the entry point is "main" or other GLSL reserved keyword, // the renaming is always properly handled for the GL backend no matter what // "disable_symbol_renaming" is. TEST_P(ShaderTests, EntryPointShaderKeywordsComputePipeline) { … } // Regression test for crbug.com/dawn/2340. GLSL requires the main enty point to be named "main". // We need to make sure when the entry point is "main" or other GLSL reserved keyword, // the renaming is always properly handled for the GL backend no matter what // "disable_symbol_renaming" is. TEST_P(ShaderTests, EntryPointShaderKeywordsRenderPipeline) { … } TEST_P(ShaderTests, PrivateVarInitWithStruct) { … } TEST_P(ShaderTests, UnrestrictedPointerParameters) { … } // A regression test for chromium:341282611. Test that Vulkan shader module cache should take the // primitive type into account because for `PointList` we should generate `PointSize` in the SPIRV // of the vertex shader. TEST_P(ShaderTests, SameShaderModuleToRenderPointAndNonPoint) { … } DAWN_INSTANTIATE_TEST(ShaderTests, D3D11Backend(), D3D12Backend(), D3D12Backend({ … }; } // anonymous namespace } // namespace dawn