// 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 <vector> #include "dawn/common/Math.h" #include "dawn/tests/DawnTest.h" #include "dawn/utils/TestUtils.h" #include "dawn/utils/TextureUtils.h" #include "dawn/utils/WGPUHelpers.h" namespace dawn { namespace { class QueueTests : public DawnTest { … }; // Test that GetQueue always returns the same object. TEST_P(QueueTests, GetQueueSameObject) { … } DAWN_INSTANTIATE_TEST(QueueTests, D3D11Backend(), D3D12Backend(), MetalBackend(), NullBackend(), OpenGLBackend(), OpenGLESBackend(), VulkanBackend()); class QueueWriteBufferTests : public DawnTest { … }; // Test the simplest WriteBuffer setting one u32 at offset 0. TEST_P(QueueWriteBufferTests, SmallDataAtZero) { … } // Test an empty WriteBuffer TEST_P(QueueWriteBufferTests, ZeroSized) { … } // Call WriteBuffer at offset 0 via a u32 twice. Test that data is updated accoordingly. TEST_P(QueueWriteBufferTests, SetTwice) { … } // Test that WriteBuffer offset works. TEST_P(QueueWriteBufferTests, SmallDataAtOffset) { … } // Stress test for many calls to WriteBuffer TEST_P(QueueWriteBufferTests, ManyWriteBuffer) { … } // Test using WriteBuffer for lots of data TEST_P(QueueWriteBufferTests, LargeWriteBuffer) { … } // Test using WriteBuffer for super large data block TEST_P(QueueWriteBufferTests, SuperLargeWriteBuffer) { … } // Test using the max buffer size. Regression test for dawn:1985. We don't bother validating the // results for this case since that would take a lot longer, just that there are no errors. TEST_P(QueueWriteBufferTests, MaxBufferSizeWriteBuffer) { … } // Test a special code path: writing when dynamic uploader already contatins some unaligned // data, it might be necessary to use a ring buffer with properly aligned offset. TEST_P(QueueWriteBufferTests, UnalignedDynamicUploader) { … } // Test using various offset and size alignments to write a uniform buffer. TEST_P(QueueWriteBufferTests, WriteUniformBufferWithVariousOffsetAndSizeAlignments) { … } DAWN_INSTANTIATE_TEST(QueueWriteBufferTests, D3D11Backend(), D3D12Backend(), MetalBackend(), OpenGLBackend(), OpenGLESBackend(), VulkanBackend()); // For MinimumDataSpec bytesPerRow and rowsPerImage, compute a default from the copy extent. constexpr uint32_t kStrideComputeDefault = …; namespace { TextureFormat; DAWN_TEST_PARAM_STRUCT(…); struct TextureSpec { … }; struct DataSpec { … }; void PackTextureData(const uint8_t* srcData, uint32_t width, uint32_t height, uint32_t srcBytesPerRow, uint8_t* dstData, uint32_t dstBytesPerRow, uint32_t bytesPerTexel) { … } void FillData(uint8_t* data, size_t count) { … } } // namespace class QueueWriteTextureTests : public DawnTestWithParams<WriteTextureFormatParams> { … }; // Test writing the whole texture for varying texture sizes. TEST_P(QueueWriteTextureTests, VaryingTextureSize) { … } // Test uploading a large amount of data with writeTexture. TEST_P(QueueWriteTextureTests, LargeWriteTexture) { … } // Test writing a pixel with an offset. TEST_P(QueueWriteTextureTests, VaryingTextureOffset) { … } // Test writing a pixel with an offset to a texture array TEST_P(QueueWriteTextureTests, VaryingTextureArrayOffset) { … } // Test writing with varying write sizes. TEST_P(QueueWriteTextureTests, VaryingWriteSize) { … } // Test writing with varying write sizes to texture arrays. TEST_P(QueueWriteTextureTests, VaryingArrayWriteSize) { … } // Test writing to varying mips TEST_P(QueueWriteTextureTests, TextureWriteToMip) { … } // Test writing with different multiples of texel block size as data offset TEST_P(QueueWriteTextureTests, VaryingDataOffset) { … } // Test writing with rowsPerImage greater than needed. TEST_P(QueueWriteTextureTests, VaryingRowsPerImage) { … } // Test with bytesPerRow greater than needed TEST_P(QueueWriteTextureTests, VaryingBytesPerRow) { … } // Test with bytesPerRow greater than needed for cube textures. // Made for testing compat behavior. TEST_P(QueueWriteTextureTests, VaryingBytesPerRowCube) { … } // Test that writing with bytesPerRow = 0 and bytesPerRow < bytesInACompleteRow works // when we're copying one row only TEST_P(QueueWriteTextureTests, BytesPerRowWithOneRowCopy) { … } // Test with bytesPerRow greater than needed in a write to a texture array. TEST_P(QueueWriteTextureTests, VaryingArrayBytesPerRow) { … } // Test valid special cases of bytesPerRow and rowsPerImage (0 or undefined). TEST_P(QueueWriteTextureTests, StrideSpecialCases) { … } // Testing a special code path: writing when dynamic uploader already contatins some unaligned // data, it might be necessary to use a ring buffer with properly aligned offset. TEST_P(QueueWriteTextureTests, UnalignedDynamicUploader) { … } DAWN_INSTANTIATE_TEST_P(…); class QueueWriteTextureSimpleTests : public DawnTest { … }; // This tests for a bug that occurred within the D3D12 CopyTextureSplitter, which incorrectly copied // data when the internal offset was larger than 256, but less than 512 and the copy size was 64 // width or less with a height of 1. TEST_P(QueueWriteTextureSimpleTests, WriteTo64x1TextureFromUnalignedDynamicUploader) { … } // This tests for a bug in the allocation of internal staging buffer, which incorrectly copied depth // stencil data to the internal offset that is not a multiple of 4. TEST_P(QueueWriteTextureSimpleTests, WriteStencilAspectWithSourceOffsetUnalignedTo4) { … } // Tests calling queue.writeTexture() to a depth texture after calling queue.writeTexture() on // another texture always works. On some D3D12 backends the buffer offset of buffer-to-texture // copies must be a multiple of 512 when the destination texture is a depth stencil texture. TEST_P(QueueWriteTextureSimpleTests, WriteDepthAspectAfterOtherQueueWriteTextureCalls) { … } // Tests calling queue.writeTexture() to the stencil aspect after calling queue.writeTexture() on // another texture always works. On some D3D12 backends the buffer offset of buffer-to-texture // copies must be a multiple of 512 when the destination texture is a depth stencil texture. TEST_P(QueueWriteTextureSimpleTests, WriteStencilAspectAfterOtherQueueWriteTextureCalls) { … } DAWN_INSTANTIATE_TEST(QueueWriteTextureSimpleTests, D3D11Backend(), D3D11Backend({ … }; } // anonymous namespace } // namespace dawn