// Copyright 2018 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 <string> #include <vector> #include "dawn/common/Assert.h" #include "dawn/common/Constants.h" #include "dawn/common/Math.h" #include "dawn/tests/DawnTest.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { constexpr static uint32_t kRTSize = …; class BindGroupTests : public DawnTest { … }; // Test a bindgroup reused in two command buffers in the same call to queue.Submit(). // This test passes by not asserting or crashing. TEST_P(BindGroupTests, ReusedBindGroupSingleSubmit) { … } // Test a bindgroup containing a UBO which is used in both the vertex and fragment shader. // It contains a transformation matrix for the VS and the fragment color for the FS. // These must result in different register offsets in the native APIs. TEST_P(BindGroupTests, ReusedUBO) { … } // Test a bindgroup containing a UBO in the vertex shader and a sampler and texture in the fragment // shader. In D3D12 for example, these different types of bindings end up in different namespaces, // but the register offsets used must match between the shader module and descriptor range. TEST_P(BindGroupTests, UBOSamplerAndTexture) { … } TEST_P(BindGroupTests, MultipleBindLayouts) { … } // This is a regression test for crbug.com/dawn/1170 that tests a module that contains multiple // entry points, using non-zero binding groups. This has the potential to cause problems when we // only remap bindings for one entry point, as the remaining unmapped binding numbers may be invalid // for certain backends. // This test passes by not asserting or crashing. TEST_P(BindGroupTests, MultipleEntryPointsWithMultipleNonZeroGroups) { … } // This test reproduces an out-of-bound bug on D3D12 backends when calling draw command twice with // one pipeline that has 4 bind group sets in one render pass. TEST_P(BindGroupTests, DrawTwiceInSamePipelineWithFourBindGroupSets) { … } // Test that bind groups can be set before the pipeline. TEST_P(BindGroupTests, SetBindGroupBeforePipeline) { … } // Test that dynamic bind groups can be set before the pipeline. TEST_P(BindGroupTests, SetDynamicBindGroupBeforePipeline) { … } // Test that the same renderpass can use 3 more pipelines TEST_P(BindGroupTests, ThreePipelinesInSameRenderpass) { … } // Test that bind groups set for one pipeline are still set when the pipeline changes. TEST_P(BindGroupTests, BindGroupsPersistAfterPipelineChange) { … } // Do a successful draw. Then, change the pipeline and one bind group. // Draw to check that the all bind groups are set. TEST_P(BindGroupTests, DrawThenChangePipelineAndBindGroup) { … } // Test for crbug.com/dawn/1049, where setting a pipeline without drawing can prevent // bind groups from being applied later TEST_P(BindGroupTests, DrawThenChangePipelineTwiceAndBindGroup) { … } // 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_P(BindGroupTests, DynamicOffsetOrder) { … } // Test that ensures that backends do not remap bindings such that dynamic and non-dynamic bindings // conflict. This can happen if the backend treats dynamic bindings separately from non-dynamic // bindings. TEST_P(BindGroupTests, DynamicAndNonDynamicBindingsDoNotConflictAfterRemapping) { … } // Test that visibility of bindings in BindGroupLayout can be none // This test passes by not asserting or crashing. TEST_P(BindGroupTests, BindGroupLayoutVisibilityCanBeNone) { … } // Regression test for crbug.com/dawn/448 that dynamic buffer bindings can have None visibility. TEST_P(BindGroupTests, DynamicBindingNoneVisibility) { … } // Test that bind group bindings may have unbounded and arbitrary binding numbers TEST_P(BindGroupTests, ArbitraryBindingNumbers) { … } // This is a regression test for crbug.com/dawn/355 which tests that destruction of a bind group // that holds the last reference to its bind group layout does not result in a use-after-free. In // the bug, the destructor of BindGroupBase, when destroying member mLayout, // Ref<BindGroupLayoutBase> assigns to Ref::mPointee, AFTER calling Release(). After the BGL // is destroyed, the storage for |mPointee| has been freed. TEST_P(BindGroupTests, LastReferenceToBindGroupLayout) { … } // Test that bind groups with an empty bind group layout may be created and used. TEST_P(BindGroupTests, EmptyLayout) { … } // Test creating a BGL with a storage buffer binding but declared readonly in the shader works. // This is a regression test for crbug.com/dawn/410 which tests that it can successfully compile and // execute the shader. TEST_P(BindGroupTests, ReadonlyStorage) { … } // This is a regression test for crbug.com/dawn/319 where creating a bind group with a // destroyed resource would crash the backend. TEST_P(BindGroupTests, CreateWithDestroyedResource) { … } DAWN_INSTANTIATE_TEST(BindGroupTests, D3D11Backend(), D3D12Backend(), D3D12Backend({ … }; } // namespace } // namespace dawn