blob: a594898d272440f8511f1bbe620f1aac5046914c [file] [log] [blame]
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// BindGeneratesResourceTest.cpp : Tests of the GL_CHROMIUM_bind_generates_resource extension.
#include "test_utils/ANGLETest.h"
namespace angle
{
class ContextLostTest : public ANGLETest
{
protected:
ContextLostTest() { setContextResetStrategy(EGL_LOSE_CONTEXT_ON_RESET_EXT); }
};
// GL_CHROMIUM_lose_context is implemented in the frontend
TEST_P(ContextLostTest, ExtensionStringExposed)
{
EXPECT_TRUE(EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
}
// Use GL_CHROMIUM_lose_context to lose a context and verify
TEST_P(ContextLostTest, BasicUsage)
{
ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_robustness"));
glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(glGetGraphicsResetStatusEXT(), GL_GUILTY_CONTEXT_RESET);
glBindTexture(GL_TEXTURE_2D, 0);
EXPECT_GL_ERROR(GL_OUT_OF_MEMORY);
}
// When context is lost, polling queries such as glGetSynciv with GL_SYNC_STATUS should always
// return GL_SIGNALED
TEST_P(ContextLostTest, PollingQuery)
{
ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
EXPECT_GL_NO_ERROR();
glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
EXPECT_GL_NO_ERROR();
GLint syncStatus = 0;
glGetSynciv(sync, GL_SYNC_STATUS, 1, nullptr, &syncStatus);
EXPECT_GL_ERROR(GL_CONTEXT_LOST);
EXPECT_GLENUM_EQ(syncStatus, GL_SIGNALED);
// Check that the query fails and the result is unmodified for other queries
GLint syncCondition = 0xBADF00D;
glGetSynciv(sync, GL_SYNC_CONDITION, 1, nullptr, &syncCondition);
EXPECT_GL_ERROR(GL_CONTEXT_LOST);
EXPECT_GLENUM_EQ(syncCondition, 0xBADF00D);
}
// When context is lost, polling queries such as glGetSynciv with GL_SYNC_STATUS should always
// return GL_SIGNALED
TEST_P(ContextLostTest, ParallelCompileReadyQuery)
{
ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_CHROMIUM_lose_context"));
ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_KHR_parallel_shader_compile"));
GLuint vs = CompileShader(GL_VERTEX_SHADER, essl1_shaders::vs::Simple());
GLuint fs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::UniformColor());
GLuint program = glCreateProgram();
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
EXPECT_GL_NO_ERROR();
glLoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET, GL_INNOCENT_CONTEXT_RESET);
EXPECT_GL_NO_ERROR();
GLint shaderCompletionStatus = 0;
glGetShaderiv(vs, GL_COMPLETION_STATUS_KHR, &shaderCompletionStatus);
EXPECT_GL_ERROR(GL_CONTEXT_LOST);
EXPECT_GLENUM_EQ(shaderCompletionStatus, GL_TRUE);
GLint programCompletionStatus = 0;
glGetProgramiv(program, GL_COMPLETION_STATUS_KHR, &programCompletionStatus);
EXPECT_GL_ERROR(GL_CONTEXT_LOST);
EXPECT_GLENUM_EQ(programCompletionStatus, GL_TRUE);
// Check that the query fails and the result is unmodified for other queries
GLint shaderType = 0xBADF00D;
glGetShaderiv(vs, GL_SHADER_TYPE, &shaderType);
EXPECT_GL_ERROR(GL_CONTEXT_LOST);
EXPECT_GLENUM_EQ(shaderType, 0xBADF00D);
GLint linkStatus = 0xBADF00D;
glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
EXPECT_GL_ERROR(GL_CONTEXT_LOST);
EXPECT_GLENUM_EQ(linkStatus, 0xBADF00D);
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST(ContextLostTest,
ES2_NULL(),
ES2_D3D9(),
ES2_D3D11(),
ES3_D3D11(),
ES2_VULKAN(),
ES3_VULKAN());
} // namespace angle