Path: blob/main_old/src/tests/egl_tests/EGLBufferAgeTest.cpp
1693 views
//1// Copyright 2021 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// EGLBufferAgeTest.cpp:6// EGL extension EGL_EXT_buffer_age7//89#include <gtest/gtest.h>1011#include "test_utils/ANGLETest.h"12#include "util/EGLWindow.h"13#include "util/OSWindow.h"1415using namespace angle;1617class EGLBufferAgeTest : public ANGLETest18{19public:20EGLBufferAgeTest() : mDisplay(EGL_NO_DISPLAY) {}2122void testSetUp() override23{24EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};25mDisplay = eglGetPlatformDisplayEXT(26EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);27EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);28EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));29mMajorVersion = GetParam().majorVersion;30mExtensionSupported = IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_buffer_age");31}3233void testTearDown() override34{35if (mDisplay != EGL_NO_DISPLAY)36{37eglTerminate(mDisplay);38eglReleaseThread();39mDisplay = EGL_NO_DISPLAY;40}41ASSERT_EGL_SUCCESS() << "Error during test TearDown";42}4344bool chooseConfig(EGLConfig *config)45{46bool result = false;47EGLint count = 0;48EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;49EGLint attribs[] = {EGL_RED_SIZE,508,51EGL_GREEN_SIZE,528,53EGL_BLUE_SIZE,548,55EGL_ALPHA_SIZE,560,57EGL_RENDERABLE_TYPE,58clientVersion,59EGL_SURFACE_TYPE,60EGL_WINDOW_BIT,61EGL_NONE};6263result = eglChooseConfig(mDisplay, attribs, config, 1, &count);64EXPECT_EGL_TRUE(result && (count > 0));65return result;66}6768bool createContext(EGLConfig config, EGLContext *context)69{70bool result = false;71EGLint attribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE};7273*context = eglCreateContext(mDisplay, config, nullptr, attribs);74result = (*context != EGL_NO_CONTEXT);75EXPECT_TRUE(result);76return result;77}7879bool createWindowSurface(EGLConfig config, EGLNativeWindowType win, EGLSurface *surface)80{81bool result = false;82EGLint attribs[] = {EGL_NONE};8384*surface = eglCreateWindowSurface(mDisplay, config, win, attribs);85result = (*surface != EGL_NO_SURFACE);86EXPECT_TRUE(result);87return result;88}8990EGLint queryAge(EGLSurface surface)91{92EGLint value = 0;93bool result = eglQuerySurface(mDisplay, surface, EGL_BUFFER_AGE_EXT, &value);94EXPECT_TRUE(result);95return value;96}9798EGLDisplay mDisplay = EGL_NO_DISPLAY;99EGLint mMajorVersion = 0;100const EGLint kWidth = 64;101const EGLint kHeight = 64;102bool mExtensionSupported = false;103};104105// Query for buffer age106TEST_P(EGLBufferAgeTest, QueryBufferAge)107{108ANGLE_SKIP_TEST_IF(!mExtensionSupported);109110EGLConfig config = EGL_NO_CONFIG_KHR;111EXPECT_TRUE(chooseConfig(&config));112113EGLContext context = EGL_NO_CONTEXT;114EXPECT_TRUE(createContext(config, &context));115ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";116117EGLSurface surface = EGL_NO_SURFACE;118119OSWindow *osWindow = OSWindow::New();120osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);121EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));122ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";123124EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));125ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";126127glClearColor(1.0, 0.0, 0.0, 1.0);128129const uint32_t loopcount = 15;130EGLint expectedAge = 0;131for (uint32_t i = 0; i < loopcount; i++)132{133EGLint age = queryAge(surface);134// Should start with zero age and then flip to buffer count - which we don't know.135if ((expectedAge == 0) && (age > 0))136{137expectedAge = age;138}139EXPECT_EQ(age, expectedAge);140141glClear(GL_COLOR_BUFFER_BIT);142ASSERT_GL_NO_ERROR() << "glClear failed";143eglSwapBuffers(mDisplay, surface);144ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";145}146EXPECT_GT(expectedAge, 0);147148EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));149ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";150151eglDestroySurface(mDisplay, surface);152surface = EGL_NO_SURFACE;153osWindow->destroy();154OSWindow::Delete(&osWindow);155156eglDestroyContext(mDisplay, context);157context = EGL_NO_CONTEXT;158}159160// Verify contents of buffer are as expected161TEST_P(EGLBufferAgeTest, VerifyContents)162{163ANGLE_SKIP_TEST_IF(!mExtensionSupported);164165EGLConfig config = EGL_NO_CONFIG_KHR;166EXPECT_TRUE(chooseConfig(&config));167168EGLContext context = EGL_NO_CONTEXT;169EXPECT_TRUE(createContext(config, &context));170ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";171172EGLSurface surface = EGL_NO_SURFACE;173174OSWindow *osWindow = OSWindow::New();175osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);176EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));177ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";178179EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));180ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";181182const angle::GLColor kLightGray(191, 191, 191, 255); // 0.75183const angle::GLColor kDarkGray(64, 64, 64, 255); // 0.25184const angle::GLColor kColorSet[] = {185GLColor::blue, GLColor::cyan, kDarkGray, GLColor::green, GLColor::red,186GLColor::white, GLColor::yellow, GLColor::black, GLColor::magenta, kLightGray,187GLColor::black, // Extra loops until color cycled through188GLColor::black, GLColor::black, GLColor::black, GLColor::black};189190EGLint age = 0;191angle::GLColor expectedColor = GLColor::black;192int loopCount = (sizeof(kColorSet) / sizeof(kColorSet[0]));193for (int i = 0; i < loopCount; i++)194{195age = queryAge(surface);196if (age > 0)197{198// Check that color/content is what we expect199expectedColor = kColorSet[i - age];200EXPECT_PIXEL_COLOR_EQ(1, 1, expectedColor);201}202203float red = kColorSet[i].R / 255.0;204float green = kColorSet[i].G / 255.0;205float blue = kColorSet[i].B / 255.0;206float alpha = kColorSet[i].A / 255.0;207208glClearColor(red, green, blue, alpha);209glClear(GL_COLOR_BUFFER_BIT);210ASSERT_GL_NO_ERROR() << "glClear failed";211eglSwapBuffers(mDisplay, surface);212ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";213}214EXPECT_GT(age, 0);215216EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));217ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";218219eglDestroySurface(mDisplay, surface);220surface = EGL_NO_SURFACE;221osWindow->destroy();222OSWindow::Delete(&osWindow);223224eglDestroyContext(mDisplay, context);225context = EGL_NO_CONTEXT;226}227228// Verify EGL_BAD_SURFACE when not current229TEST_P(EGLBufferAgeTest, UncurrentContextBadSurface)230{231ANGLE_SKIP_TEST_IF(!mExtensionSupported);232233EGLConfig config = EGL_NO_CONFIG_KHR;234EXPECT_TRUE(chooseConfig(&config));235236EGLContext context = EGL_NO_CONTEXT;237EXPECT_TRUE(createContext(config, &context));238ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";239240EGLSurface surface = EGL_NO_SURFACE;241242OSWindow *osWindow = OSWindow::New();243osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);244EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));245ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";246247// No current context248249EGLint value = 0;250EXPECT_EGL_FALSE(eglQuerySurface(mDisplay, surface, EGL_BUFFER_AGE_EXT, &value));251EXPECT_EGL_ERROR(EGL_BAD_SURFACE);252253EGLContext otherContext = EGL_NO_CONTEXT;254EXPECT_TRUE(createContext(config, &otherContext));255ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";256257// Surface current to another context258EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, otherContext));259// Make context the active context260EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));261262value = 0;263EXPECT_EGL_FALSE(eglQuerySurface(mDisplay, surface, EGL_BUFFER_AGE_EXT, &value));264EXPECT_EGL_ERROR(EGL_BAD_SURFACE);265266eglDestroySurface(mDisplay, surface);267surface = EGL_NO_SURFACE;268osWindow->destroy();269OSWindow::Delete(&osWindow);270271eglDestroyContext(mDisplay, otherContext);272otherContext = EGL_NO_CONTEXT;273274eglDestroyContext(mDisplay, context);275context = EGL_NO_CONTEXT;276}277278// Expect age always == 1 when EGL_BUFFER_PRESERVED is chosen279TEST_P(EGLBufferAgeTest, BufferPreserved)280{281ANGLE_SKIP_TEST_IF(!mExtensionSupported);282283EGLConfig config = EGL_NO_CONFIG_KHR;284EGLint count = 0;285EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;286EGLint attribs[] = {EGL_RED_SIZE,2878,288EGL_GREEN_SIZE,2898,290EGL_BLUE_SIZE,2918,292EGL_ALPHA_SIZE,2930,294EGL_RENDERABLE_TYPE,295clientVersion,296EGL_SURFACE_TYPE,297EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT,298EGL_NONE};299300EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count));301// Skip if no configs, this indicates EGL_BUFFER_PRESERVED is not supported.302ANGLE_SKIP_TEST_IF(count == 0);303304EGLContext context = EGL_NO_CONTEXT;305EXPECT_TRUE(createContext(config, &context));306ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";307308EGLSurface surface = EGL_NO_SURFACE;309310OSWindow *osWindow = OSWindow::New();311osWindow->initialize("EGLBufferAgeTest", kWidth, kHeight);312EXPECT_TRUE(createWindowSurface(config, osWindow->getNativeWindow(), &surface));313ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";314315EXPECT_TRUE(eglMakeCurrent(mDisplay, surface, surface, context));316ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";317318glClearColor(1.0, 0.0, 0.0, 1.0);319320const uint32_t loopcount = 10;321EGLint expectedAge = 1;322for (uint32_t i = 0; i < loopcount; i++)323{324EGLint age = queryAge(surface);325EXPECT_EQ(age, expectedAge);326327glClear(GL_COLOR_BUFFER_BIT);328ASSERT_GL_NO_ERROR() << "glClear failed";329eglSwapBuffers(mDisplay, surface);330ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";331}332333EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));334ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";335336eglDestroySurface(mDisplay, surface);337surface = EGL_NO_SURFACE;338osWindow->destroy();339OSWindow::Delete(&osWindow);340341eglDestroyContext(mDisplay, context);342context = EGL_NO_CONTEXT;343}344345ANGLE_INSTANTIATE_TEST(EGLBufferAgeTest,346WithNoFixture(ES2_OPENGLES()),347WithNoFixture(ES3_OPENGLES()),348WithNoFixture(ES2_OPENGL()),349WithNoFixture(ES3_OPENGL()),350WithNoFixture(ES2_VULKAN()),351WithNoFixture(ES3_VULKAN()));352353