// Copyright 2019 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 <cstring> #include <memory> #include <string> #include "dawn/native/DawnNative.h" #include "dawn/tests/DawnTest.h" #include "dawn/tests/MockCallback.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" #include "gmock/gmock.h" namespace dawn { namespace { _; Exactly; HasSubstr; MockCppCallback; MockMapAsyncCallback; MockQueueWorkDoneCallback; static const int fakeUserData = …; class DeviceLostTest : public DawnTest { … }; // Test that DeviceLostCallback is invoked when LostForTesting is called TEST_P(DeviceLostTest, DeviceLostCallbackIsCalled) { … } // Test that submit fails after the device is lost TEST_P(DeviceLostTest, SubmitAfterDeviceLost) { … } // Test that CreateBindGroupLayout fails when device is lost TEST_P(DeviceLostTest, CreateBindGroupLayoutFails) { … } // Test that GetBindGroupLayout fails when device is lost TEST_P(DeviceLostTest, GetBindGroupLayoutFails) { … } // Test that CreateBindGroup fails when device is lost TEST_P(DeviceLostTest, CreateBindGroupFails) { … } // Test that CreatePipelineLayout fails when device is lost TEST_P(DeviceLostTest, CreatePipelineLayoutFails) { … } // Tests that CreateRenderBundleEncoder fails when device is lost TEST_P(DeviceLostTest, CreateRenderBundleEncoderFails) { … } // Tests that CreateComputePipeline fails when device is lost TEST_P(DeviceLostTest, CreateComputePipelineFails) { … } // Tests that CreateRenderPipeline fails when device is lost TEST_P(DeviceLostTest, CreateRenderPipelineFails) { … } // Tests that CreateSampler fails when device is lost TEST_P(DeviceLostTest, CreateSamplerFails) { … } // Tests that CreateShaderModule fails when device is lost TEST_P(DeviceLostTest, CreateShaderModuleFails) { … } // Note that no device lost tests are done for swapchain because it is awkward to create a // wgpu::Surface in this file. SwapChainValidationTests.CreateSwapChainFailsAfterDevLost covers // this validation. // Tests that CreateTexture fails when device is lost TEST_P(DeviceLostTest, CreateTextureFails) { … } // Test that CreateBuffer fails when device is lost TEST_P(DeviceLostTest, CreateBufferFails) { … } // Test that buffer.MapAsync for writing fails after device is lost TEST_P(DeviceLostTest, BufferMapAsyncFailsForWriting) { … } // Test that BufferMapAsync for writing calls back with success when device lost after // mapping TEST_P(DeviceLostTest, BufferMapAsyncBeforeLossFailsForWriting) { … } // Test that buffer.Unmap after device is lost TEST_P(DeviceLostTest, BufferUnmapAfterDeviceLost) { … } // Test that mappedAtCreation fails after device is lost TEST_P(DeviceLostTest, CreateBufferMappedAtCreationFails) { … } // Test that BufferMapAsync for reading fails after device is lost TEST_P(DeviceLostTest, BufferMapAsyncFailsForReading) { … } // Test that BufferMapAsync for reading calls back with success when device lost after // mapping TEST_P(DeviceLostTest, BufferMapAsyncBeforeLossFailsForReading) { … } // Test that WriteBuffer after device is lost TEST_P(DeviceLostTest, WriteBufferAfterDeviceLost) { … } // Test it's possible to GetMappedRange on a buffer created mapped after device loss TEST_P(DeviceLostTest, GetMappedRange_CreateBufferMappedAtCreationAfterLoss) { … } // Test that device loss doesn't change the result of GetMappedRange, mappedAtCreation version. TEST_P(DeviceLostTest, GetMappedRange_CreateBufferMappedAtCreationBeforeLoss) { … } // Test that device loss doesn't change the result of GetMappedRange, mapping for reading version. TEST_P(DeviceLostTest, GetMappedRange_MapAsyncReading) { … } // Test that device loss doesn't change the result of GetMappedRange, mapping for writing version. TEST_P(DeviceLostTest, GetMappedRange_MapAsyncWriting) { … } // TODO(dawn:929): mapasync read + resolve + loss getmappedrange != nullptr. // TODO(dawn:929): mapasync write + resolve + loss getmappedrange != nullptr. // Test that Command Encoder Finish fails when device lost TEST_P(DeviceLostTest, CommandEncoderFinishFails) { … } // Test QueueOnSubmittedWorkDone after device is lost. TEST_P(DeviceLostTest, QueueOnSubmittedWorkDoneAfterDeviceLost) { … } // Test QueueOnSubmittedWorkDone when the device is lost after calling OnSubmittedWorkDone TEST_P(DeviceLostTest, QueueOnSubmittedWorkDoneBeforeLossFails) { … } // Test that LostForTesting can only be called on one time TEST_P(DeviceLostTest, LoseDeviceForTestingOnce) { … } TEST_P(DeviceLostTest, DeviceLostDoesntCallUncapturedError) { … } // Test that WGPUCreatePipelineAsyncStatus_Success is returned when device is lost // before the callback of Create*PipelineAsync() is called. TEST_P(DeviceLostTest, DeviceLostBeforeCreatePipelineAsyncCallback) { … } // This is a regression test for crbug.com/1212385 where Dawn didn't clean up all // references to bind group layouts such that the cache was non-empty at the end // of shut down. TEST_P(DeviceLostTest, FreeBindGroupAfterDeviceLossWithPendingCommands) { … } // This is a regression test for crbug.com/1365011 where ending a render pass with an indirect draw // in it after the device is lost would cause render commands to be leaked. TEST_P(DeviceLostTest, DeviceLostInRenderPassWithDrawIndirect) { … } // Attempting to set an object label after device loss should not cause an error. TEST_P(DeviceLostTest, SetLabelAfterDeviceLoss) { … } DAWN_INSTANTIATE_TEST(DeviceLostTest, D3D11Backend(), D3D12Backend(), MetalBackend(), NullBackend(), OpenGLBackend(), OpenGLESBackend(), VulkanBackend()); } // anonymous namespace } // namespace dawn