// 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 <string> #include <vector> #include "dawn/common/NonMovable.h" #include "dawn/tests/unittests/validation/ValidationTest.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { class PixelLocalStorageDisabledTest : public ValidationTest { … }; // Check that creating a StorageAttachment texture is disallowed without the extension. TEST_F(PixelLocalStorageDisabledTest, StorageAttachmentTextureNotAllowed) { … } // Check that creating a pipeline layout with a PipelineLayoutPixelLocalStorage is disallowed // without the extension. TEST_F(PixelLocalStorageDisabledTest, PipelineLayoutPixelLocalStorageDisallowed) { … } // Check that a render pass with a RenderPassPixelLocalStorage is disallowed without the extension. TEST_F(PixelLocalStorageDisabledTest, RenderPassPixelLocalStorageDisallowed) { … } // Check that it is not possible to use the WGSL extension without the device extension enabled. TEST_F(PixelLocalStorageDisabledTest, WGSLExtensionDisallowed) { … } // Check that PixelLocalStorageBarrier() is disallowed without the extension. TEST_F(PixelLocalStorageDisabledTest, PixelLocalStorageBarrierDisallowed) { … } class PixelLocalStorageOtherExtensionTest : public ValidationTest { … }; // Simple test checking all the various things that are normally validated out without PLS are // available if the coherent PLS extension is enabled. TEST_F(PixelLocalStorageOtherExtensionTest, SmokeTest) { … } struct OffsetAndFormat { … }; struct PLSSpec { … }; constexpr std::array<wgpu::TextureFormat, 3> kStorageAttachmentFormats = …; bool IsStorageAttachmentFormat(wgpu::TextureFormat format) { … } struct ComboTestPLSRenderPassDescriptor : NonMovable { … }; class PixelLocalStorageTest : public ValidationTest { … }; // Check that it is possible to use the WGSL extension when the device extension is enabled. TEST_F(PixelLocalStorageTest, WGSLExtensionAllowed) { … } // Check that StorageAttachment textures must be one of the supported formats. TEST_F(PixelLocalStorageTest, TextureFormatMustSupportStorageAttachment) { … } // Check that StorageAttachment textures must have a sample count of 1. TEST_F(PixelLocalStorageTest, TextureMustBeSingleSampled) { … } // Check that the format in PLS must be one of the enabled ones. TEST_F(PixelLocalStorageTest, PLSStateFormatMustSupportStorageAttachment) { … } // Check that the total size must be a multiple of 4. TEST_F(PixelLocalStorageTest, PLSStateTotalSizeMultipleOf4) { … } // Check that the total size must be less than 16. // TODO(dawn:1704): Have a proper limit for totalSize. TEST_F(PixelLocalStorageTest, PLSStateTotalLessThan16) { … } // Check that the offset of a storage attachment must be a multiple of 4. TEST_F(PixelLocalStorageTest, PLSStateOffsetMultipleOf4) { … } // Check that the storage attachment is in bounds of the total size. TEST_F(PixelLocalStorageTest, PLSStateAttachmentInBoundsOfTotalSize) { … } // Check that collisions between storage attachments are not allowed. TEST_F(PixelLocalStorageTest, PLSStateCollisionsDisallowed) { … } // Check that using an error view as storage attachment is an error. TEST_F(PixelLocalStorageTest, RenderPassStorageAttachmentErrorView) { … } // Check that using a multi-subresource view as a storage attachment is an error (layers and levels // cases). TEST_F(PixelLocalStorageTest, RenderPassStorageAttachmentSingleSubresource) { … } // Check that the size of storage attachments must match the size of other attachments. TEST_F(PixelLocalStorageTest, RenderPassStorageAttachmentSizeMustMatch) { … } // Check that the textures used as storage attachment must have the StorageAttachment TextureUsage. TEST_F(PixelLocalStorageTest, RenderPassStorageAttachmentUsage) { … } // Check that the same texture subresource cannot be used twice as a storage attachment. TEST_F(PixelLocalStorageTest, RenderPassSubresourceUsedTwiceAsStorage) { … } // Check that the same texture subresource cannot be used twice as a storage and render attachment. TEST_F(PixelLocalStorageTest, RenderPassSubresourceUsedAsStorageAndRender) { … } // Check that using a subresource as storage attachment prevents other usages in the render pass. TEST_F(PixelLocalStorageTest, RenderPassSubresourceUsedInsidePass) { … } // Check that the load and store op must not be undefined. TEST_F(PixelLocalStorageTest, RenderPassLoadAndStoreOpNotUndefined) { … } // Check that the clear value, if used, must not have NaNs. TEST_F(PixelLocalStorageTest, RenderPassClearValueNaNs) { … } // Check that using a subresource as storage attachment prevents other usages in the render pass. TEST_F(PixelLocalStorageTest, PixelLocalStorageBarrierRequiresPLS) { … } // Check that PLS state differs between no PLS and empty PLS TEST_F(PixelLocalStorageTest, PLSStateMatching_EmptyPLSVsNoPLS) { … } // Check that PLS state differs between empty PLS and non-empty PLS with no storage attachments TEST_F(PixelLocalStorageTest, PLSStateMatching_EmptyPLSVsNotEmpty) { … } // Check that PLS state differs between implicit PLS vs storage attachment TEST_F(PixelLocalStorageTest, PLSStateMatching_AttachmentVsImplicit) { … } // Check that PLS state differs between storage attachment formats TEST_F(PixelLocalStorageTest, PLSStateMatching_Format) { … } // Check that PLS state are equal even if attachments are specified in different orders TEST_F(PixelLocalStorageTest, PLSStateMatching_StorageAttachmentOrder) { … } // Check that a shader using pixel_local cannot be used for an implicit layout. TEST_F(PixelLocalStorageTest, ImplicitLayoutDisallowed) { … } // Check that the FS can have PLS iff the layout has it. TEST_F(PixelLocalStorageTest, Reflection_PLSPresenceMatches) { … } // Check that layout's total PLS size must match the shader's pixel_local block size. TEST_F(PixelLocalStorageTest, Reflection_PLSSize) { … } // Check the validation of the layout's PLS format with the shader types. TEST_F(PixelLocalStorageTest, Reflection_FormatMatching) { … } // Check that it is allowed to create render passes with only a storage attachment. TEST_F(PixelLocalStorageTest, RenderPassOnlyStorageAttachment) { … } // Check that it is allowed to create render pipelines with only a storage attachment. TEST_F(PixelLocalStorageTest, RenderPipelineOnlyStorageAttachment) { … } // Check that the size of the render pass is correctly deduced when there is only a storage // attachment. Use the SetViewport validation to check this. TEST_F(PixelLocalStorageTest, RenderPassSizeDetectionWithOnlyStorageAttachment) { … } class PixelLocalStorageAndRenderToSingleSampledTest : public PixelLocalStorageTest { … }; // Check that PLS + MSAA render to single sampled is not allowed TEST_F(PixelLocalStorageAndRenderToSingleSampledTest, CombinationIsNotAllowed) { … } class PixelLocalStorageAndTransientAttachmentTest : public PixelLocalStorageTest { … }; // Check that a transient + storage attachment is allowed. TEST_F(PixelLocalStorageAndTransientAttachmentTest, TransientStorageAttachment) { … } // TODO(dawn:1704): Add tests for limits // TODO(dawn:1704): Add tests for load/store op validation with transient. // TODO(dawn:1704): Allow multisampled storage attachments } // anonymous namespace } // namespace dawn