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