| // |
| // Copyright 2018 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. |
| // |
| // RequestExtensionTest: |
| // Tests that extensions can be requested and are disabled by default when using |
| // EGL_ANGLE_request_extension |
| // |
| |
| #include "test_utils/ANGLETest.h" |
| |
| #include "util/EGLWindow.h" |
| |
| namespace angle |
| { |
| |
| class RequestExtensionTest : public ANGLETest<> |
| { |
| protected: |
| RequestExtensionTest() { setExtensionsEnabled(false); } |
| }; |
| |
| // Test that a known requestable extension is disabled by default and make sure it can be requested |
| // if possible |
| TEST_P(RequestExtensionTest, ExtensionsDisabledByDefault) |
| { |
| EXPECT_TRUE(IsEGLDisplayExtensionEnabled(getEGLWindow()->getDisplay(), |
| "EGL_ANGLE_create_context_extensions_enabled")); |
| EXPECT_FALSE(IsGLExtensionEnabled("GL_OES_rgb8_rgba8")); |
| |
| if (IsGLExtensionRequestable("GL_OES_rgb8_rgba8")) |
| { |
| glRequestExtensionANGLE("GL_OES_rgb8_rgba8"); |
| EXPECT_TRUE(IsGLExtensionEnabled("GL_OES_rgb8_rgba8")); |
| } |
| } |
| |
| // Test the queries for the requestable extension strings |
| TEST_P(RequestExtensionTest, Queries) |
| { |
| ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_request_extension")); |
| |
| const GLubyte *requestableExtString = glGetString(GL_REQUESTABLE_EXTENSIONS_ANGLE); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_NE(nullptr, requestableExtString); |
| |
| if (getClientMajorVersion() >= 3) |
| { |
| GLint numExtensions = 0; |
| glGetIntegerv(GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE, &numExtensions); |
| EXPECT_GL_NO_ERROR(); |
| |
| for (GLint extIdx = 0; extIdx < numExtensions; extIdx++) |
| { |
| const GLubyte *requestableExtIndexedString = |
| glGetStringi(GL_REQUESTABLE_EXTENSIONS_ANGLE, extIdx); |
| EXPECT_GL_NO_ERROR(); |
| EXPECT_NE(nullptr, requestableExtIndexedString); |
| } |
| |
| // Request beyond the end of the array |
| const GLubyte *requestableExtIndexedString = |
| glGetStringi(GL_REQUESTABLE_EXTENSIONS_ANGLE, numExtensions); |
| EXPECT_GL_ERROR(GL_INVALID_VALUE); |
| EXPECT_EQ(nullptr, requestableExtIndexedString); |
| } |
| } |
| |
| // Test that capture/replay succeeds when requesting an extension marks textures as dirty |
| TEST_P(RequestExtensionTest, ReplayTextureInitState) |
| { |
| ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_request_extension")); |
| |
| // This extension is chosen because it's requestable and always supported. |
| ASSERT_TRUE(IsGLExtensionRequestable("GL_OES_vertex_array_object")); |
| |
| // Do not use RAII so that the texture is not deleted. |
| GLuint tex; |
| glGenTextures(1, &tex); |
| glBindTexture(GL_TEXTURE_2D, tex); |
| ASSERT_GL_NO_ERROR(); |
| |
| // In the capture context created with extensions disabled, this command marks all textures |
| // as dirty. If the replay context is created with extensions enabled, this command would |
| // be skipped and the texture state at the end of the frame would not match. |
| glRequestExtensionANGLE("GL_OES_vertex_array_object"); |
| EXPECT_GL_NO_ERROR(); |
| } |
| |
| // Use this to select which configurations (e.g. which renderer, which GLES major version) these |
| // tests should be run against. |
| ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(RequestExtensionTest); |
| |
| } // namespace angle |