xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ContextLostTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // BindGeneratesResourceTest.cpp : Tests of the GL_CHROMIUM_bind_generates_resource extension.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker namespace angle
12*8975f5c5SAndroid Build Coastguard Worker {
13*8975f5c5SAndroid Build Coastguard Worker class ContextLostTest : public ANGLETest<>
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker   protected:
ContextLostTest()16*8975f5c5SAndroid Build Coastguard Worker     ContextLostTest() {}
17*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()18*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
19*8975f5c5SAndroid Build Coastguard Worker     {
20*8975f5c5SAndroid Build Coastguard Worker         if (IsEGLClientExtensionEnabled("EGL_EXT_create_context_robustness"))
21*8975f5c5SAndroid Build Coastguard Worker         {
22*8975f5c5SAndroid Build Coastguard Worker             setContextResetStrategy(EGL_LOSE_CONTEXT_ON_RESET_EXT);
23*8975f5c5SAndroid Build Coastguard Worker         }
24*8975f5c5SAndroid Build Coastguard Worker         else
25*8975f5c5SAndroid Build Coastguard Worker         {
26*8975f5c5SAndroid Build Coastguard Worker             setContextResetStrategy(EGL_NO_RESET_NOTIFICATION_EXT);
27*8975f5c5SAndroid Build Coastguard Worker         }
28*8975f5c5SAndroid Build Coastguard Worker     }
29*8975f5c5SAndroid Build Coastguard Worker };
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker // GL_CHROMIUM_lose_context is implemented in the frontend
TEST_P(ContextLostTest,ExtensionStringExposed)32*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostTest, ExtensionStringExposed)
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
35*8975f5c5SAndroid Build Coastguard Worker }
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker // Use GL_CHROMIUM_lose_context to lose a context and verify using GL_EXT_robustness
TEST_P(ContextLostTest,BasicUsageEXT)38*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostTest, BasicUsageEXT)
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
41*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_robustness") ||
42*8975f5c5SAndroid Build Coastguard Worker                        !IsEGLClientExtensionEnabled("EGL_EXT_create_context_robustness"));
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
45*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
46*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(glGetGraphicsResetStatusEXT(), GL_GUILTY_CONTEXT_RESET);
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     // Errors should be continually generated
49*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 10; i++)
50*8975f5c5SAndroid Build Coastguard Worker     {
51*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
52*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_CONTEXT_LOST);
53*8975f5c5SAndroid Build Coastguard Worker     }
54*8975f5c5SAndroid Build Coastguard Worker }
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker // Use GL_CHROMIUM_lose_context to lose a context and verify using GL_KHR_robustness
TEST_P(ContextLostTest,BasicUsageKHR)57*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostTest, BasicUsageKHR)
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
60*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_KHR_robustness") ||
61*8975f5c5SAndroid Build Coastguard Worker                        !IsEGLClientExtensionEnabled("EGL_EXT_create_context_robustness"));
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
64*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
65*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(glGetGraphicsResetStatusKHR(), GL_GUILTY_CONTEXT_RESET);
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     // Errors should be continually generated
68*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 10; i++)
69*8975f5c5SAndroid Build Coastguard Worker     {
70*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
71*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_CONTEXT_LOST);
72*8975f5c5SAndroid Build Coastguard Worker     }
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker // When context is lost, polling queries such as glGetSynciv with GL_SYNC_STATUS should always
76*8975f5c5SAndroid Build Coastguard Worker // return GL_SIGNALED
TEST_P(ContextLostTest,PollingQuery)77*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostTest, PollingQuery)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
80*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker     GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
83*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
86*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     GLint syncStatus = 0;
89*8975f5c5SAndroid Build Coastguard Worker     glGetSynciv(sync, GL_SYNC_STATUS, 1, nullptr, &syncStatus);
90*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_CONTEXT_LOST);
91*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(syncStatus, GL_SIGNALED);
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     // Check that the query fails and the result is unmodified for other queries
94*8975f5c5SAndroid Build Coastguard Worker     GLint syncCondition = 0xBADF00D;
95*8975f5c5SAndroid Build Coastguard Worker     glGetSynciv(sync, GL_SYNC_CONDITION, 1, nullptr, &syncCondition);
96*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_CONTEXT_LOST);
97*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(syncCondition, 0xBADF00D);
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker // When context is lost, polling queries such as glGetSynciv with GL_SYNC_STATUS should always
101*8975f5c5SAndroid Build Coastguard Worker // return GL_SIGNALED
TEST_P(ContextLostTest,ParallelCompileReadyQuery)102*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostTest, ParallelCompileReadyQuery)
103*8975f5c5SAndroid Build Coastguard Worker {
104*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
105*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_KHR_parallel_shader_compile"));
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker     GLuint vs = CompileShader(GL_VERTEX_SHADER, essl1_shaders::vs::Simple());
108*8975f5c5SAndroid Build Coastguard Worker     GLuint fs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::UniformColor());
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     GLuint program = glCreateProgram();
111*8975f5c5SAndroid Build Coastguard Worker     glAttachShader(program, vs);
112*8975f5c5SAndroid Build Coastguard Worker     glAttachShader(program, fs);
113*8975f5c5SAndroid Build Coastguard Worker     glLinkProgram(program);
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
118*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     GLint shaderCompletionStatus = 0;
121*8975f5c5SAndroid Build Coastguard Worker     glGetShaderiv(vs, GL_COMPLETION_STATUS_KHR, &shaderCompletionStatus);
122*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_CONTEXT_LOST);
123*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(shaderCompletionStatus, GL_TRUE);
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     GLint programCompletionStatus = 0;
126*8975f5c5SAndroid Build Coastguard Worker     glGetProgramiv(program, GL_COMPLETION_STATUS_KHR, &programCompletionStatus);
127*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_CONTEXT_LOST);
128*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(programCompletionStatus, GL_TRUE);
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     // Check that the query fails and the result is unmodified for other queries
131*8975f5c5SAndroid Build Coastguard Worker     GLint shaderType = 0xBADF00D;
132*8975f5c5SAndroid Build Coastguard Worker     glGetShaderiv(vs, GL_SHADER_TYPE, &shaderType);
133*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_CONTEXT_LOST);
134*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(shaderType, 0xBADF00D);
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     GLint linkStatus = 0xBADF00D;
137*8975f5c5SAndroid Build Coastguard Worker     glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
138*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_CONTEXT_LOST);
139*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(linkStatus, 0xBADF00D);
140*8975f5c5SAndroid Build Coastguard Worker }
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker class ContextLostTestES32 : public ContextLostTest
143*8975f5c5SAndroid Build Coastguard Worker {};
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker // Use GL_CHROMIUM_lose_context to lose a context and verify using GLES 3.2 function
TEST_P(ContextLostTestES32,BasicUsage)146*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostTestES32, BasicUsage)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
149*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsEGLClientExtensionEnabled("EGL_EXT_create_context_robustness"));
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker     glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
152*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
153*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(glGetGraphicsResetStatus(), GL_GUILTY_CONTEXT_RESET);
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     // Errors should be continually generated
156*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < 10; i++)
157*8975f5c5SAndroid Build Coastguard Worker     {
158*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, 0);
159*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_CONTEXT_LOST);
160*8975f5c5SAndroid Build Coastguard Worker     }
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker class ContextLostSkipValidationTest : public ANGLETest<>
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker   protected:
ContextLostSkipValidationTest()166*8975f5c5SAndroid Build Coastguard Worker     ContextLostSkipValidationTest() {}
167*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()168*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
169*8975f5c5SAndroid Build Coastguard Worker     {
170*8975f5c5SAndroid Build Coastguard Worker         if (IsEGLClientExtensionEnabled("EGL_EXT_create_context_robustness"))
171*8975f5c5SAndroid Build Coastguard Worker         {
172*8975f5c5SAndroid Build Coastguard Worker             setContextResetStrategy(EGL_LOSE_CONTEXT_ON_RESET_EXT);
173*8975f5c5SAndroid Build Coastguard Worker             setNoErrorEnabled(true);
174*8975f5c5SAndroid Build Coastguard Worker         }
175*8975f5c5SAndroid Build Coastguard Worker         else
176*8975f5c5SAndroid Build Coastguard Worker         {
177*8975f5c5SAndroid Build Coastguard Worker             setContextResetStrategy(EGL_NO_RESET_NOTIFICATION_EXT);
178*8975f5c5SAndroid Build Coastguard Worker         }
179*8975f5c5SAndroid Build Coastguard Worker     }
180*8975f5c5SAndroid Build Coastguard Worker };
181*8975f5c5SAndroid Build Coastguard Worker 
182*8975f5c5SAndroid Build Coastguard Worker // Use GL_CHROMIUM_lose_context to lose a context and verify
TEST_P(ContextLostSkipValidationTest,LostNoErrorGetProgram)183*8975f5c5SAndroid Build Coastguard Worker TEST_P(ContextLostSkipValidationTest, LostNoErrorGetProgram)
184*8975f5c5SAndroid Build Coastguard Worker {
185*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker     GLuint program = glCreateProgram();
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker     glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker     GLint val = 0;
192*8975f5c5SAndroid Build Coastguard Worker     glGetProgramiv(program, GL_INFO_LOG_LENGTH, &val);  // Should not crash.
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
196*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
197*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ContextLostTest,
198*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_NULL()),
199*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_D3D9()),
200*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_D3D11()),
201*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES3_D3D11()),
202*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_VULKAN()),
203*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES3_VULKAN()));
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ContextLostSkipValidationTest,
206*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_NULL()),
207*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_D3D9()),
208*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_D3D11()),
209*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES3_D3D11()),
210*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES2_VULKAN()),
211*8975f5c5SAndroid Build Coastguard Worker                        WithRobustness(ES3_VULKAN()));
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ContextLostTestES32);
214*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ContextLostTestES32, WithRobustness(ES32_VULKAN()));
215*8975f5c5SAndroid Build Coastguard Worker 
216*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
217