// // Copyright 2016 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // EGLRobustnessTest.cpp: tests for EGL_EXT_create_context_robustness // // Tests causing GPU resets are disabled, use the following args to run them: // --gtest_also_run_disabled_tests --gtest_filter=EGLRobustnessTest\* #include <gtest/gtest.h> #include "common/debug.h" #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" #include "util/OSWindow.h" usingnamespaceangle; class EGLRobustnessTest : public ANGLETest<> { … }; class EGLRobustnessTestES3 : public EGLRobustnessTest { … }; class EGLRobustnessTestES31 : public EGLRobustnessTest { … }; // Check glGetGraphicsResetStatusEXT returns GL_NO_ERROR if we did nothing TEST_P(EGLRobustnessTest, NoErrorByDefault) { … } // Checks that the application gets no loss with NO_RESET_NOTIFICATION TEST_P(EGLRobustnessTest, DISABLED_NoResetNotification) { … } // Checks that resetting the ANGLE display allows to get rid of the context loss. // Also checks that the application gets notified of the loss of the display. // We coalesce both tests to reduce the number of TDRs done on Windows: by default // having more than 5 TDRs in a minute will cause Windows to disable the GPU until // the computer is rebooted. TEST_P(EGLRobustnessTest, DISABLED_ResettingDisplayWorks) { … } // Test to reproduce the crash when running // dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.uniform_block.fragment // on Pixel 6 TEST_P(EGLRobustnessTestES3, ContextResetOnInvalidLocalShaderVariableAccess) { … } // Similar to ContextResetOnInvalidLocalShaderVariableAccess, but the program is created on a // context that's not robust, but used on one that is. TEST_P(EGLRobustnessTestES3, ContextResetOnInvalidLocalShaderVariableAccess_ShareGroupBeforeProgramCreation) { … } // Similar to ContextResetOnInvalidLocalShaderVariableAccess, but the program is created on a // context that's not robust, but used on one that is. TEST_P(EGLRobustnessTestES3, ContextResetOnInvalidLocalShaderVariableAccess_ShareGroupAfterProgramCreation) { … } // Test to ensure shader local variable write out of bound won't crash // when the context has robustness enabled, and EGL_NO_RESET_NOTIFICATION_EXT // is set as the value for attribute EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEFY_EXT TEST_P(EGLRobustnessTestES3, ContextNoResetOnInvalidLocalShaderVariableAccess) { … } // Similar to ContextNoResetOnInvalidLocalShaderVariableAccess, but the program is created on a // context that's not robust, but used on one that is. TEST_P(EGLRobustnessTestES3, ContextNoResetOnInvalidLocalShaderVariableAccess_ShareGroupBeforeProgramCreation) { … } // Similar to ContextNoResetOnInvalidLocalShaderVariableAccess, but the program is created on a // context that's not robust, but used on one that is. TEST_P(EGLRobustnessTestES3, ContextNoResetOnInvalidLocalShaderVariableAccess_ShareGroupAfterProgramCreation) { … } // Replicate test // dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds_non_robust.reset_status.writes // .local_array.fragment // Test that when writing out-of-bounds in fragment shader: // 1) After draw command, test receives GL_CONTEXT_LOST error or GL_NO_ERROR. // 2) eglMakeCurrent(EGL_NO_CONTEXT) on lost context should return EGL_SUCCESS. TEST_P(EGLRobustnessTestES3, NonRobustContextOnInvalidLocalShaderVariableAccessShouldNotCrash) { … } // Test that using a program in a non-robust context, then sharing it with a robust context and // using it with the same state (but with an OOB access) works. TEST_P(EGLRobustnessTestES31, NonRobustContextThenOOBInSharedRobustContext) { … } // Similar to NonRobustContextThenOOBInSharedRobustContext, but access is in vertex shader. TEST_P(EGLRobustnessTestES31, NonRobustContextThenOOBInSharedRobustContext_VertexShader) { … } // Similar to NonRobustContextThenOOBInSharedRobustContext, but access is in compute shader. TEST_P(EGLRobustnessTestES31, NonRobustContextThenOOBInSharedRobustContext_ComputeShader) { … } // Test that indirect indices on unsized storage buffer arrays work. Regression test for the // ClampIndirectIndices AST transformation. TEST_P(EGLRobustnessTestES31, IndirectIndexOnUnsizedStorageBufferArray) { … } // Similar to IndirectIndexOnUnsizedStorageBufferArray, but without a block instance name. TEST_P(EGLRobustnessTestES31, IndirectIndexOnUnsizedStorageBufferArray_NoBlockInstanceName) { … } // Test context destruction after recovering from a long running task. TEST_P(EGLRobustnessTest, DISABLED_LongRunningTaskVulkanShutdown) { … } GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(…); ANGLE_INSTANTIATE_TEST(…); ANGLE_INSTANTIATE_TEST(…); ANGLE_INSTANTIATE_TEST(…);