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