// 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 <limits> #include <memory> #include <vector> #include "dawn/common/Platform.h" #include "dawn/tests/MockCallback.h" #include "dawn/tests/unittests/validation/ValidationTest.h" #include "gmock/gmock.h" _; HasSubstr; Invoke; MockCppCallback; TestParamInfo; Values; WithParamInterface; MockMapAsyncCallback; class BufferValidationTest : public ValidationTest { … }; // Test case where creation should succeed TEST_F(BufferValidationTest, CreationSuccess) { … } // Test case where creation should succeed TEST_F(BufferValidationTest, CreationMaxBufferSize) { … } // Test restriction on usages must not be None (0) TEST_F(BufferValidationTest, CreationMapUsageNotZero) { … } // Test restriction on usages allowed with MapRead and MapWrite TEST_F(BufferValidationTest, CreationMapUsageRestrictions) { … } class BufferMappingValidationTest : public BufferValidationTest, public WithParamInterface<wgpu::MapMode> { … }; INSTANTIATE_TEST_SUITE_P(…); // Test the success case for mapping buffer. TEST_P(BufferMappingValidationTest, MapAsync_Success) { … } // Test map async with a buffer that's an error TEST_P(BufferMappingValidationTest, MapAsync_ErrorBuffer) { … } // Test map async with an invalid offset and size alignment. TEST_P(BufferMappingValidationTest, MapAsync_OffsetSizeAlignment) { … } // Test map async with an invalid offset and size OOB checks TEST_P(BufferMappingValidationTest, MapAsync_OffsetSizeOOB) { … } // Test map async with a buffer that has the wrong usage TEST_P(BufferMappingValidationTest, MapAsync_WrongUsage) { … } // Test map async with a wrong mode TEST_P(BufferMappingValidationTest, MapAsync_WrongMode) { … } // Test map async with a buffer that's already mapped TEST_P(BufferMappingValidationTest, MapAsync_AlreadyMapped) { … } // Test MapAsync() immediately causes a pending map error TEST_P(BufferMappingValidationTest, MapAsync_PendingMap) { … } // Test map async with a buffer that's destroyed TEST_P(BufferMappingValidationTest, MapAsync_Destroy) { … } // Test map async but unmapping before the result is ready. TEST_P(BufferMappingValidationTest, MapAsync_UnmapBeforeResult) { … } // When a MapAsync is cancelled with Unmap it might still be in flight, test doing a new request // works as expected and we don't get the cancelled request's data. TEST_P(BufferMappingValidationTest, MapAsync_UnmapBeforeResultAndMapAgain) { … } // Test map async but destroying before the result is ready. TEST_P(BufferMappingValidationTest, MapAsync_DestroyBeforeResult) { … } // Test that the MapCallback isn't fired twice when unmap() is called inside the callback TEST_P(BufferMappingValidationTest, MapAsync_UnmapCalledInCallback) { … } // Test that the MapCallback isn't fired twice when destroy() is called inside the callback TEST_P(BufferMappingValidationTest, MapAsync_DestroyCalledInCallback) { … } // Test MapAsync call in MapAsync success callback TEST_P(BufferMappingValidationTest, MapAsync_RetryInSuccessCallback) { … } // Test MapAsync call in MapAsync validation error callback TEST_P(BufferMappingValidationTest, MapAsync_RetryInErrorCallback) { … } // Test MapAsync call in MapAsync unmapped callback TEST_P(BufferMappingValidationTest, MapAsync_RetryInUnmappedCallback) { … } // Test MapAsync call in MapAsync destroyed callback TEST_P(BufferMappingValidationTest, MapAsync_RetryInDestroyedCallback) { … } // Test the success case for mappedAtCreation TEST_F(BufferValidationTest, MappedAtCreationSuccess) { … } // Test the success case for mappedAtCreation for a non-mappable usage TEST_F(BufferValidationTest, NonMappableMappedAtCreationSuccess) { … } // Test there is an error when mappedAtCreation is set but the size isn't aligned to 4. TEST_F(BufferValidationTest, MappedAtCreationSizeAlignment) { … } // Test that it is valid to destroy an error buffer TEST_F(BufferValidationTest, DestroyErrorBuffer) { … } // Test that it is valid to Destroy an unmapped buffer TEST_P(BufferMappingValidationTest, DestroyUnmappedBuffer) { … } // Test that it is valid to Destroy a destroyed buffer TEST_P(BufferMappingValidationTest, DestroyDestroyedBuffer) { … } // Test that it is valid to Unmap an error buffer TEST_F(BufferValidationTest, UnmapErrorBuffer) { … } // Test that it is valid to Unmap a destroyed buffer TEST_P(BufferMappingValidationTest, UnmapDestroyedBuffer) { … } // Test that unmap then mapping a destroyed buffer is an error. // Regression test for crbug.com/1388920. TEST_P(BufferMappingValidationTest, MapDestroyedBufferAfterUnmap) { … } // Test that it is valid to submit a buffer in a queue with a map usage if it is unmapped TEST_F(BufferValidationTest, SubmitBufferWithMapUsage) { … } // Test that it is invalid to submit a mapped buffer in a queue TEST_F(BufferValidationTest, SubmitMappedBuffer) { … } // Test that it is invalid to submit a destroyed buffer in a queue TEST_F(BufferValidationTest, SubmitDestroyedBuffer) { … } // Test that a map usage is not required to call Unmap TEST_F(BufferValidationTest, UnmapWithoutMapUsage) { … } // Test that it is valid to call Unmap on a buffer that is not mapped TEST_P(BufferMappingValidationTest, UnmapUnmappedBuffer) { … } // Test that it is invalid to call GetMappedRange on an unmapped buffer. TEST_F(BufferValidationTest, GetMappedRange_OnUnmappedBuffer) { … } // Test that it is invalid to call GetMappedRange on an unmapped buffer. TEST_P(BufferMappingValidationTest, GetMappedRange_OnUnmappedBuffer) { … } // Test that it is invalid to call GetMappedRange on a destroyed buffer. TEST_F(BufferValidationTest, GetMappedRange_OnDestroyedBuffer) { … } // Test that it is invalid to call GetMappedRange on a destroyed buffer. TEST_P(BufferMappingValidationTest, GetMappedRange_OnDestroyedBuffer) { … } // Test that it is invalid to call GetMappedRange on a buffer after MapAsync for reading TEST_F(BufferValidationTest, GetMappedRange_NonConstOnMappedForReading) { … } // Test valid cases to call GetMappedRange on a buffer. TEST_F(BufferValidationTest, GetMappedRange_ValidBufferStateCases) { … } // Test valid cases to call GetMappedRange on a buffer. TEST_P(BufferMappingValidationTest, GetMappedRange_ValidBufferStateCases) { … } // Test valid cases to call GetMappedRange on an error buffer. TEST_F(BufferValidationTest, GetMappedRange_OnErrorBuffer) { … } // Test valid cases to call GetMappedRange on an error buffer that's also OOM. TEST_F(BufferValidationTest, GetMappedRange_OnErrorBuffer_OOM) { … } // Test validation of the GetMappedRange parameters TEST_P(BufferMappingValidationTest, GetMappedRange_OffsetSizeOOB) { … } // Test that the buffer creation parameters are correctly reflected for succesfully created buffers. TEST_F(BufferValidationTest, CreationParameterReflectionForValidBuffer) { … } // Test that the buffer creation parameters are correctly reflected for buffers invalid because of // validation errors. TEST_F(BufferValidationTest, CreationParameterReflectionForErrorBuffer) { … } // Test that the buffer creation parameters are correctly reflected for buffers invalid because of // OOM. TEST_F(BufferValidationTest, CreationParameterReflectionForOOMBuffer) { … } // Test that buffer reflection doesn't show internal usages TEST_F(BufferValidationTest, CreationParameterReflectionNoInternalUsage) { … } // Test that GetMapState() shows expected buffer map state TEST_F(BufferValidationTest, GetMapState) { … } // Test that GetMapState() shows expected buffer map state TEST_P(BufferMappingValidationTest, GetMapState) { … } class BufferMapExtendedUsagesValidationTest : public BufferValidationTest { … }; // Test that MapRead or MapWrite can be combined with any other usage when creating // a buffer. TEST_F(BufferMapExtendedUsagesValidationTest, CreationMapUsageReadOrWriteNoRestrictions) { … }