// Copyright 2017 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 <tuple> #include <utility> #include <vector> #include "dawn/common/Assert.h" #include "dawn/common/Constants.h" #include "dawn/tests/unittests/validation/ValidationTest.h" #include "dawn/utils/ComboRenderBundleEncoderDescriptor.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { class BindGroupValidationTest : public ValidationTest { … }; // Test the validation of BindGroupDescriptor::nextInChain TEST_F(BindGroupValidationTest, NextInChainNullptr) { … } // Check constraints on entryCount TEST_F(BindGroupValidationTest, EntryCountMismatch) { … } // Check constraints on BindGroupEntry::binding TEST_F(BindGroupValidationTest, WrongBindings) { … } // Check that the same binding cannot be set twice TEST_F(BindGroupValidationTest, BindingSetTwice) { … } // Check that a sampler binding must contain exactly one sampler TEST_F(BindGroupValidationTest, SamplerBindingType) { … } // Check that a texture binding must contain exactly a texture view TEST_F(BindGroupValidationTest, TextureBindingType) { … } // Check that a buffer binding must contain exactly a buffer TEST_F(BindGroupValidationTest, BufferBindingType) { … } // Check that an external texture binding must contain exactly an external texture TEST_F(BindGroupValidationTest, ExternalTextureBindingType) { … } // Check that a texture binding must have the correct usage TEST_F(BindGroupValidationTest, TextureUsage) { … } // Check that a storage texture binding must have the correct usage TEST_F(BindGroupValidationTest, StorageTextureUsage) { … } // Check that a texture must have the correct sample type TEST_F(BindGroupValidationTest, TextureSampleType) { … } class BindGroupValidationTest_Float32Filterable : public BindGroupValidationTest { … }; // Checks that float32 texture formats have the correct sample type when float32-filterable feature // enabled. TEST_F(BindGroupValidationTest_Float32Filterable, TextureSampleType) { … } // Test which depth-stencil formats are allowed to be sampled (all). TEST_F(BindGroupValidationTest, SamplingDepthStencilTexture) { … } // Check that a texture must have the correct dimension TEST_F(BindGroupValidationTest, TextureDimension) { … } // Check that a storage texture binding must have a texture view with a mipLevelCount of 1 TEST_F(BindGroupValidationTest, StorageTextureViewLayerCount) { … } // Check that a UBO must have the correct usage TEST_F(BindGroupValidationTest, BufferUsageUBO) { … } // Check that a SSBO must have the correct usage TEST_F(BindGroupValidationTest, BufferUsageSSBO) { … } // Check that a readonly SSBO must have the correct usage TEST_F(BindGroupValidationTest, BufferUsageReadonlySSBO) { … } // Check that a resolve buffer with internal storge usage cannot be used as SSBO TEST_F(BindGroupValidationTest, BufferUsageQueryResolve) { … } // Tests constraints on the buffer offset for bind groups. TEST_F(BindGroupValidationTest, BufferOffsetAlignment) { … } // Tests constraints on the texture for MultisampledTexture bindings TEST_F(BindGroupValidationTest, MultisampledTexture) { … } // Tests dafault offset and size of bind group entry work as expected TEST_F(BindGroupValidationTest, BufferBindingDefaultOffsetAndSize) { … } // Tests constraints to be sure the buffer binding fits in the buffer TEST_F(BindGroupValidationTest, BufferBindingOOB) { … } // Tests constraints to be sure the uniform buffer binding isn't too large TEST_F(BindGroupValidationTest, MaxUniformBufferBindingSize) { … } // Tests constraints to be sure the storage buffer binding isn't too large TEST_F(BindGroupValidationTest, MaxStorageBufferBindingSize) { … } // Test constraints to be sure the effective storage and read-only storage buffer binding size must // be a multiple of 4. TEST_F(BindGroupValidationTest, EffectiveStorageBufferBindingSize) { … } // Test what happens when the layout is an error. TEST_F(BindGroupValidationTest, ErrorLayout) { … } class BindGroupLayoutValidationTest : public ValidationTest { … }; // Tests setting storage buffer and readonly storage buffer bindings in vertex and fragment shader. TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutStorageBindingsInVertexShader) { … } // Tests setting that bind group layout bindings numbers may be very large. TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutEntryMax) { … } // This test verifies that the BindGroupLayout bindings are correctly validated, even if the // binding ids are out-of-order. TEST_F(BindGroupLayoutValidationTest, BindGroupEntry) { … } // Check that dynamic = true is only allowed buffer bindings. TEST_F(BindGroupLayoutValidationTest, DynamicAndTypeCompatibility) { … } // Test that it is invalid to create a BGL with more than one binding type set. TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutEntryTooManySet) { … } // Test that it is invalid to create a BGL with none one of buffer, // sampler, texture, storageTexture, or externalTexture set. TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutEntryNoneSet) { … } // This test verifies that visibility of bindings in BindGroupLayout can be none TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutVisibilityNone) { … } // This test verifies that binding with none visibility in bind group layout can be supported in // bind group TEST_F(BindGroupLayoutValidationTest, BindGroupLayoutVisibilityNoneExpectsBindGroupEntry) { … } #define BGLEntryType(...) … TEST_F(BindGroupLayoutValidationTest, PerStageLimits) { … } // External textures require multiple binding slots (3 sampled texture, 1 uniform buffer, 1 // sampler), so ensure that these count towards the limit when combined non-external texture // bindings. TEST_F(BindGroupLayoutValidationTest, PerStageLimitsWithExternalTexture) { … } // Check that dynamic buffer numbers exceed maximum value in one bind group layout. TEST_F(BindGroupLayoutValidationTest, DynamicBufferNumberLimit) { … } // Test that multisampled textures must be 2D sampled textures TEST_F(BindGroupLayoutValidationTest, MultisampledTextureViewDimension) { … } // Test that multisampled texture bindings are valid TEST_F(BindGroupLayoutValidationTest, MultisampledTextureSampleType) { … } // Tests that creating a bind group layout with a valid static sampler raises an error // if the required feature is not enabled. TEST_F(BindGroupLayoutValidationTest, StaticSamplerNotSupportedWithoutFeatureEnabled) { … } class BindGroupLayoutWithStaticSamplersValidationTest : public BindGroupLayoutValidationTest { … }; // Tests that creating a bind group layout with a valid static sampler succeeds if the // required feature is enabled. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, StaticSamplerSupportedWhenFeatureEnabled) { … } // Tests that creating a bind group layout with a static sampler that has an // invalid sampler object fails. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, StaticSamplerWithInvalidSamplerObject) { … } // Verifies that creation of a bind group with no entry for a static sampler // succeeds. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, CreateBindGroupWithStaticSamplerSupported) { … } // Verifies that creation of a correctly-specified bind group for a layout that // has a static sampler and a sampler succeeds. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, CreateBindGroupWithStaticSamplerAndSamplerSupported) { … } // Verifies that creation of a correctly-specified bind group for a layout that // has a sampler and a static sampler succeeds. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, CreateBindGroupWithSamplerAndStaticSamplerSupported) { … } // Verifies that creating a bind group with an entry for a static sampler causes // an error. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, EntryForStaticSamplerInBindGroupCausesError) { … } // Verifies that creation of a bind group with the correct number of entries for a layout that has a // sampler and a static sampler raises an error if the entry is specified at the // index of the static sampler rather than that of the sampler. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, CorrectNumberOfEntriesButEntryForStaticSamplerAtSecondIndexInBindGroupCausesError) { … } // Verifies that creation of a bind group with the correct number of entries for a layout that has a // static sampler and a sampler raises an error if the entry is specified at the // index of the static sampler rather than that of the sampler. TEST_F(BindGroupLayoutWithStaticSamplersValidationTest, CorrectNumberOfEntriesButEntryForStaticSamplerInBindGroupCausesError) { … } constexpr uint32_t kBindingSize = …; class SetBindGroupValidationTest : public ValidationTest { … }; // This is the test case that should work. TEST_F(SetBindGroupValidationTest, Basic) { … } // Draw/dispatch with a bind group missing is invalid TEST_F(SetBindGroupValidationTest, MissingBindGroup) { … } // Unset the bind group required by current pipeline is invalid. TEST_F(SetBindGroupValidationTest, UnsetBindGroupWhenNeeded) { … } // Regression test for the validation aspect caching not being invalidated when unsetting a // bind group. TEST_F(SetBindGroupValidationTest, UnsetInvalidatesBindGroupValidationCache) { … } // Setting bind group after a draw / dispatch should re-verify the layout is compatible TEST_F(SetBindGroupValidationTest, VerifyGroupIfChangedAfterAction) { … } // Test cases that test dynamic offsets count mismatch with bind group layout. TEST_F(SetBindGroupValidationTest, DynamicOffsetsMismatch) { … } // Test cases that test dynamic offsets not aligned TEST_F(SetBindGroupValidationTest, DynamicOffsetsNotAligned) { … } // Test cases that test dynamic uniform buffer out of bound situation. TEST_F(SetBindGroupValidationTest, OffsetOutOfBoundDynamicUniformBuffer) { … } // Test cases that test dynamic storage buffer out of bound situation. TEST_F(SetBindGroupValidationTest, OffsetOutOfBoundDynamicStorageBuffer) { … } // Test cases that test dynamic uniform buffer out of bound situation because of binding size. TEST_F(SetBindGroupValidationTest, BindingSizeOutOfBoundDynamicUniformBuffer) { … } // Test cases that test dynamic storage buffer out of bound situation because of binding size. TEST_F(SetBindGroupValidationTest, BindingSizeOutOfBoundDynamicStorageBuffer) { … } // Regression test for crbug.com/dawn/408 where dynamic offsets were applied in the wrong order. // Dynamic offsets should be applied in increasing order of binding number. TEST_F(SetBindGroupValidationTest, DynamicOffsetOrder) { … } // Test that an error is produced (and no ASSERTs fired) when using an error bindgroup in // SetBindGroup TEST_F(SetBindGroupValidationTest, ErrorBindGroup) { … } // Test validation of the bindgroup slot for OOB. TEST_F(SetBindGroupValidationTest, BindGroupSlotBoundary) { … } // Test that dynamic offset count must be zero when unsetting a bindgroup. TEST_F(SetBindGroupValidationTest, UnsetWithDynamicOffsetIsInvalid) { … } // Test that a pipeline with empty bindgroups layouts requires empty bindgroups to be set. TEST_F(SetBindGroupValidationTest, EmptyBindGroupsAreRequired) { … } // Test that a static sampler is valid to access from a shader module. TEST_F(SetBindGroupValidationTest, StaticSamplerAccessedFromShader) { … } // Test that a static sampler cannot be accessed from a shader module as a // non-sampler variable type. TEST_F(SetBindGroupValidationTest, StaticSamplerAccessedFromShaderAsNonSamplerTypeCausesError) { … } class SetBindGroupPersistenceValidationTest : public ValidationTest { … }; // Test it is valid to set bind groups before setting the pipeline. TEST_F(SetBindGroupPersistenceValidationTest, BindGroupBeforePipeline) { … } // Dawn does not have a concept of bind group inheritance though the backing APIs may. // Test that it is valid to draw with bind groups that are not "inherited". They persist // after a pipeline change. TEST_F(SetBindGroupPersistenceValidationTest, NotVulkanInheritance) { … } class BindGroupLayoutCompatibilityTest : public ValidationTest { … }; // Test that it is invalid to pass a writable storage buffer in the pipeline layout when the shader // uses the binding as a readonly storage buffer. 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) { … } TEST_F(BindGroupLayoutCompatibilityTest, TextureViewDimension) { … } // Test that a bgl with an external texture is compatible with texture_external in a shader and that // an error is returned when the binding in the shader does not match. TEST_F(BindGroupLayoutCompatibilityTest, ExternalTextureBindGroupLayoutCompatibility) { … } class BindingsValidationTest : public BindGroupLayoutCompatibilityTest { … }; // Test that it is valid to set a pipeline layout with bindings unused by the pipeline. 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, PipelineLayoutWithFewerBindingsThanPipeline) { … } // Test that it is valid to set bind groups whose layout is not set in the pipeline layout. // But it's invalid to set extra entry for a given bind group's layout if that layout is set in // the pipeline layout. TEST_F(BindingsValidationTest, BindGroupsWithMoreBindingsThanPipelineLayout) { … } // Test that it is invalid to set bind groups that don't have all necessary bindings required // by the pipeline layout. Note that both pipeline layout and bind group have enough bindings for // pipeline in the following test. TEST_F(BindingsValidationTest, BindGroupsWithFewerBindingsThanPipelineLayout) { … } class SamplerTypeBindingTest : public ValidationTest { … }; // Test that the use of sampler and comparison_sampler in the shader must match the bind group // layout. TEST_F(SamplerTypeBindingTest, ShaderAndBGLMatches) { … } TEST_F(SamplerTypeBindingTest, SamplerAndBindGroupMatches) { … } } // anonymous namespace } // namespace dawn