Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/gl_tests/ContextLostTest.cpp
1693 views
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:
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
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
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
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
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:
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
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
171