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