// Copyright 2020 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/tests/unittests/validation/ValidationTest.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/TextureUtils.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { class StorageTextureValidationTests : public ValidationTest { … }; // Validate read-only storage textures can be declared in vertex and fragment shaders, while // writeonly storage textures cannot be used in vertex shaders. TEST_F(StorageTextureValidationTests, RenderPipeline) { … } // Validate both read-only and write-only storage textures can be declared in compute shaders. TEST_F(StorageTextureValidationTests, ComputePipeline) { … } // Validate read-only, write-only and read-write storage textures are supported in shader modules, // excepting that only read-only storage textures are supported in vertex shaders. TEST_F(StorageTextureValidationTests, ReadWriteStorageTexture) { … } // Validate it is an error to declare a read-only or write-only storage texture in shaders with any // format that doesn't support TextureUsage::StorageBinding texture usages. TEST_F(StorageTextureValidationTests, StorageTextureFormatInShaders) { … } class BGRA8UnormStorageTextureValidationTests : public StorageTextureValidationTests, // Bool param indicates whether requires the BGRA8UnormStorage feature or not. public ::testing::WithParamInterface<bool> { … }; // Test that bgra8unorm storage texture at create bind group layout. TEST_P(BGRA8UnormStorageTextureValidationTests, CreateBindGroupLayout) { … } // Test that bgra8unorm storage texture at create pipeline with implicit pipeline layout. TEST_P(BGRA8UnormStorageTextureValidationTests, CreatePipelineWithImplicitLayout) { … } // Test that bgra8unorm storage texture at create pipeline with explicit pipeline layout. TEST_P(BGRA8UnormStorageTextureValidationTests, CreatePipelineWithExplicitLayout) { … } INSTANTIATE_TEST_SUITE_P(…); // Verify that declaring a storage texture dimension that isn't supported by // WebGPU causes a compile failure. WebGPU doesn't support using cube map // texture views and cube map array texture views as storage textures. TEST_F(StorageTextureValidationTests, UnsupportedTextureViewDimensionInShader) { … } // Verify that declaring a texture view dimension that is not supported to be used as storage // textures in WebGPU in bind group layout causes validation error. WebGPU doesn't support using // cube map texture views and cube map array texture views as storage textures. TEST_F(StorageTextureValidationTests, UnsupportedTextureViewDimensionInBindGroupLayout) { … } // Verify when we create and use a bind group layout with storage textures in the creation of // render and compute pipeline, the binding type in the bind group layout must match the // declaration in the shader. TEST_F(StorageTextureValidationTests, BindGroupLayoutEntryTypeMatchesShaderDeclaration) { … } // Verify it is invalid not to set a valid texture format in a bind group layout when the binding // type is read-only or write-only storage texture. TEST_F(StorageTextureValidationTests, UndefinedStorageTextureFormatInBindGroupLayout) { … } // Verify it is invalid to create a bind group layout with storage textures and an unsupported // storage texture format. TEST_F(StorageTextureValidationTests, StorageTextureFormatInBindGroupLayout) { … } class BGRA8UnormStorageBindGroupLayoutTest : public StorageTextureValidationTests { … }; // Test that creating a bind group layout with BGRA8Unorm as storage texture format is valid when // The optional feature bgra8unorm-storage is supported. TEST_F(BGRA8UnormStorageBindGroupLayoutTest, BGRA8UnormAsStorage) { … } // Verify the storage texture format in the bind group layout must match the declaration in shader. TEST_F(StorageTextureValidationTests, BindGroupLayoutStorageTextureFormatMatchesShaderDeclaration) { … } // Verify the dimension of the bind group layout with storage textures must match the one declared // in shader. TEST_F(StorageTextureValidationTests, BindGroupLayoutViewDimensionMatchesShaderDeclaration) { … } // Verify that only a texture view can be used as a read-only or write-only storage texture in a // bind group. TEST_F(StorageTextureValidationTests, StorageTextureBindingTypeInBindGroup) { … } // Verify that a texture used as read-only or write-only storage texture in a bind group must be // created with the texture usage wgpu::TextureUsage::StorageBinding. TEST_F(StorageTextureValidationTests, StorageTextureUsageInBindGroup) { … } // Verify that the format of a texture used as read-only or write-only storage texture in a bind // group must match the corresponding bind group binding. TEST_F(StorageTextureValidationTests, StorageTextureFormatInBindGroup) { … } // Verify that the dimension of a texture view used as read-only or write-only storage texture in a // bind group must match the corresponding bind group binding. TEST_F(StorageTextureValidationTests, StorageTextureViewDimensionInBindGroup) { … } // Verify multisampled storage textures cannot be supported now. TEST_F(StorageTextureValidationTests, MultisampledStorageTexture) { … } // Verify it is valid to use a texture as either read-only storage texture or write-only storage // texture in a render pass. TEST_F(StorageTextureValidationTests, StorageTextureInRenderPass) { … } // Verify it is valid to use a a texture as both read-only storage texture and sampled texture in // one render pass, while it is invalid to use a texture as both write-only storage texture and // sampled texture in one render pass. TEST_F(StorageTextureValidationTests, StorageTextureAndSampledTextureInOneRenderPass) { … } // Verify it is invalid to use a a texture as both storage texture (either read-only or write-only) // and render attachment in one render pass. TEST_F(StorageTextureValidationTests, StorageTextureAndRenderAttachmentInOneRenderPass) { … } // Verify it is valid to use a texture as both storage texture (read-only or write-only) and // sampled texture in one compute pass. TEST_F(StorageTextureValidationTests, StorageTextureAndSampledTextureInOneComputePass) { … } class ReadWriteStorageTextureValidationTests : public StorageTextureValidationTests { … }; // Test that using read-only storage texture is valid for all shader stages in BindGroupLayout, // while write-only and read-write storage textures are only valid for fragment and compute shader // stages. TEST_F(StorageTextureValidationTests, BindGroupLayoutWithStorageTextureBindingType) { … } // Test that using read-only storage texture in BindGroupLayout is valid with all formats that // can be used as storage texture, while read-write storage texture access is only available on the // formats that support read-write storage texture access. TEST_F(ReadWriteStorageTextureValidationTests, ReadWriteStorageTextureFormatInBindGroupLayout) { … } // Test that read-write storage texture access is only available on the storage texture formats that // support read-write storage texture access in shader, while read-only storage texture access is // available for all storage texture formats. TEST_F(ReadWriteStorageTextureValidationTests, ReadWriteStorageTextureFormatInShader) { … } // Test that storage texture access in shader must be compatible with the one in pipeline layout // when we create a pipeline with storage texture. Note that read-write storage texture access in // pipeline layout is compatible with write-only storage texture access in shader. TEST_F(ReadWriteStorageTextureValidationTests, StorageTextureAccessInPipeline) { … } class ReadWriteStorageTextureResourceUsageTrackingTests : public ReadWriteStorageTextureValidationTests { … }; // Test the usage scope rule and writable storage texture aliasing rule of read-only and read-write // storage textures in a render pass. TEST_F(ReadWriteStorageTextureResourceUsageTrackingTests, StorageTextureInRenderPass) { … } // Test the usage scope rule and writable storage texture aliasing rule of read-only and read-write // storage textures in a compute pass. TEST_F(ReadWriteStorageTextureResourceUsageTrackingTests, StorageTextureInComputePass) { … } class R8UnormStorageValidationTests : public StorageTextureValidationTests { … }; // Check that it is allowed to create an R8Unorm texture with the storage usage. TEST_F(R8UnormStorageValidationTests, TextureCreation) { … } // Check that it is allowed to create a BGL with a read-only or write-only R8unorm storage texture // entry. TEST_F(R8UnormStorageValidationTests, BGLEntry) { … } // Check that using the `r8unorm` to create a WGSL compute shader is allowed. TEST_F(R8UnormStorageValidationTests, ShaderModule) { … } // Check that using an r8unorm storage texture read-only or write-only with implicit layout is // valid. TEST_F(R8UnormStorageValidationTests, End2endUsage) { … } } // anonymous namespace } // namespace dawn