123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998 |
- /*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include <gtest/gtest.h>
- #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
- #include <configstore/Utils.h>
- #include <utils/String8.h>
- #include <EGL/egl.h>
- #include <gui/Surface.h>
- #include <gui/IConsumerListener.h>
- #include <gui/IProducerListener.h>
- #include <gui/IGraphicBufferConsumer.h>
- #include <gui/BufferQueue.h>
- bool hasEglExtension(EGLDisplay dpy, const char* extensionName) {
- const char* exts = eglQueryString(dpy, EGL_EXTENSIONS);
- size_t cropExtLen = strlen(extensionName);
- size_t extsLen = strlen(exts);
- bool equal = !strcmp(extensionName, exts);
- android::String8 extString(extensionName);
- android::String8 space(" ");
- bool atStart = !strncmp(extString + space, exts, cropExtLen + 1);
- bool atEnd = (cropExtLen + 1) < extsLen &&
- !strcmp(space + extString, exts + extsLen - (cropExtLen + 1));
- bool inMiddle = strstr(exts, space + extString + space);
- return equal || atStart || atEnd || inMiddle;
- }
- namespace android {
- #define EGL_UNSIGNED_TRUE static_cast<EGLBoolean>(EGL_TRUE)
- // retrieve wide-color setting from configstore
- using namespace android::hardware::configstore;
- using namespace android::hardware::configstore::V1_0;
- #define METADATA_SCALE(x) (static_cast<EGLint>(x * EGL_METADATA_SCALING_EXT))
- static bool hasWideColorDisplay =
- getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);
- static bool hasHdrDisplay =
- getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasHDRDisplay>(false);
- class EGLTest : public ::testing::Test {
- public:
- void get8BitConfig(EGLConfig& config);
- void setSurfaceSmpteMetadata(EGLSurface surface);
- void checkSurfaceSmpteMetadata(EGLSurface eglSurface);
- protected:
- EGLDisplay mEglDisplay;
- protected:
- EGLTest() :
- mEglDisplay(EGL_NO_DISPLAY) {
- }
- virtual void SetUp() {
- mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EGLint majorVersion;
- EGLint minorVersion;
- EXPECT_TRUE(eglInitialize(mEglDisplay, &majorVersion, &minorVersion));
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- RecordProperty("EglVersionMajor", majorVersion);
- RecordProperty("EglVersionMajor", minorVersion);
- }
- virtual void TearDown() {
- EGLBoolean success = eglTerminate(mEglDisplay);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- }
- };
- TEST_F(EGLTest, DISABLED_EGLConfigEightBitFirst) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- EGLint attrs[] = {
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_NONE
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_GE(numConfigs, 1);
- EGLint components[3];
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EXPECT_GE(components[0], 8);
- EXPECT_GE(components[1], 8);
- EXPECT_GE(components[2], 8);
- }
- TEST_F(EGLTest, EGLTerminateSucceedsWithRemainingObjects) {
- EGLint numConfigs;
- EGLConfig config;
- EGLint attrs[] = {
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 8,
- EGL_NONE
- };
- EXPECT_TRUE(eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config,
- mANW.get(), NULL);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface) ;
- // do not destroy eglSurface
- // eglTerminate is called in the tear down and should destroy it for us
- }
- TEST_F(EGLTest, EGLConfigRGBA8888First) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- EGLint attrs[] = {
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 8,
- EGL_NONE
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_GE(numConfigs, 1);
- EGLint components[4];
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EXPECT_GE(components[0], 8);
- EXPECT_GE(components[1], 8);
- EXPECT_GE(components[2], 8);
- EXPECT_GE(components[3], 8);
- }
- TEST_F(EGLTest, EGLDisplayP3) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- if (!hasWideColorDisplay) {
- // skip this test if device does not have wide-color display
- std::cerr << "[ ] Device does not support wide-color, test skipped" << std::endl;
- return;
- }
- // Test that display-p3 extensions exist
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3"));
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3_linear"));
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3_passthrough"));
- // Use 8-bit to keep forcus on Display-P3 aspect
- EGLint attrs[] = {
- // clang-format off
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 8,
- EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FIXED_EXT,
- EGL_NONE, EGL_NONE
- // clang-format on
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(1, numConfigs);
- EGLint components[4];
- EGLint value;
- eglGetConfigAttrib(mEglDisplay, config, EGL_CONFIG_ID, &value);
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EXPECT_EQ(components[0], 8);
- EXPECT_EQ(components[1], 8);
- EXPECT_EQ(components[2], 8);
- EXPECT_EQ(components[3], 8);
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_EXT,
- EGL_NONE, EGL_NONE
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_GL_COLORSPACE_KHR, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_GL_COLORSPACE_DISPLAY_P3_EXT, value);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLDisplayP3Passthrough) {
- EGLConfig config;
- EGLBoolean success;
- if (!hasWideColorDisplay) {
- // skip this test if device does not have wide-color display
- std::cerr << "[ ] Device does not support wide-color, test skipped" << std::endl;
- return;
- }
- // Test that display-p3 extensions exist
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3"));
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3_linear"));
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3_passthrough"));
- get8BitConfig(config);
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT,
- EGL_NONE, EGL_NONE
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- android_dataspace dataspace =
- static_cast<android_dataspace>(ANativeWindow_getBuffersDataSpace(mANW.get()));
- ASSERT_EQ(dataspace, HAL_DATASPACE_DISPLAY_P3);
- EGLint value;
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_GL_COLORSPACE_KHR, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT, value);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLDisplayP31010102) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- if (!hasWideColorDisplay) {
- // skip this test if device does not have wide-color display
- std::cerr << "[ ] Device does not support wide-color, test skipped" << std::endl;
- return;
- }
- // Test that display-p3 extensions exist
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3"));
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3_linear"));
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_display_p3_passthrough"));
- // Use 8-bit to keep forcus on Display-P3 aspect
- EGLint attrs[] = {
- // clang-format off
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
- EGL_RED_SIZE, 10,
- EGL_GREEN_SIZE, 10,
- EGL_BLUE_SIZE, 10,
- EGL_ALPHA_SIZE, 2,
- EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FIXED_EXT,
- EGL_NONE, EGL_NONE
- // clang-format on
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(1, numConfigs);
- EGLint components[4];
- EGLint value;
- eglGetConfigAttrib(mEglDisplay, config, EGL_CONFIG_ID, &value);
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EXPECT_EQ(components[0], 10);
- EXPECT_EQ(components[1], 10);
- EXPECT_EQ(components[2], 10);
- EXPECT_EQ(components[3], 2);
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_EXT,
- EGL_NONE, EGL_NONE
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_GL_COLORSPACE_KHR, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_GL_COLORSPACE_DISPLAY_P3_EXT, value);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- void EGLTest::get8BitConfig(EGLConfig& config) {
- EGLint numConfigs;
- EGLBoolean success;
- // Use 8-bit to keep focus on colorspace aspect
- const EGLint attrs[] = {
- // clang-format off
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 8,
- EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FIXED_EXT,
- EGL_NONE,
- // clang-format on
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(1, numConfigs);
- EGLint components[4];
- EGLint value;
- eglGetConfigAttrib(mEglDisplay, config, EGL_CONFIG_ID, &value);
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- // Verify component sizes on config match what was asked for.
- EXPECT_EQ(components[0], 8);
- EXPECT_EQ(components[1], 8);
- EXPECT_EQ(components[2], 8);
- EXPECT_EQ(components[3], 8);
- }
- void EGLTest::setSurfaceSmpteMetadata(EGLSurface surface) {
- if (hasEglExtension(mEglDisplay, "EGL_EXT_surface_SMPTE2086_metadata")) {
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT,
- METADATA_SCALE(0.640));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT,
- METADATA_SCALE(0.330));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT,
- METADATA_SCALE(0.290));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT,
- METADATA_SCALE(0.600));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT,
- METADATA_SCALE(0.150));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT,
- METADATA_SCALE(0.060));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_WHITE_POINT_X_EXT,
- METADATA_SCALE(0.3127));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_WHITE_POINT_Y_EXT,
- METADATA_SCALE(0.3290));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_MAX_LUMINANCE_EXT,
- METADATA_SCALE(300));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_SMPTE2086_MIN_LUMINANCE_EXT,
- METADATA_SCALE(0.7));
- }
- if (hasEglExtension(mEglDisplay, "EGL_EXT_surface_CTA861_3_metadata")) {
- eglSurfaceAttrib(mEglDisplay, surface, EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT,
- METADATA_SCALE(300));
- eglSurfaceAttrib(mEglDisplay, surface, EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT,
- METADATA_SCALE(75));
- }
- }
- void EGLTest::checkSurfaceSmpteMetadata(EGLSurface eglSurface) {
- EGLBoolean success;
- EGLint value;
- if (hasEglExtension(mEglDisplay, "EGL_EXT_surface_SMPTE2086_metadata")) {
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.640), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.330), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.290), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.600), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.150), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.060), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_WHITE_POINT_X_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.3127), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_WHITE_POINT_Y_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.3290), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_MAX_LUMINANCE_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(300.0), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_SMPTE2086_MIN_LUMINANCE_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(0.7), value);
- }
- if (hasEglExtension(mEglDisplay, "EGL_EXT_surface_CTA861_3_metadata")) {
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(300.0), value);
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(METADATA_SCALE(75.0), value);
- }
- }
- TEST_F(EGLTest, EGLBT2020Linear) {
- EGLConfig config;
- EGLBoolean success;
- if (!hasHdrDisplay) {
- // skip this test if device does not have HDR display
- RecordProperty("hasHdrDisplay", false);
- return;
- }
- // Test that bt2020 linear extension exists
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_bt2020_linear"))
- << "EGL_EXT_gl_colorspace_bt2020_linear extension not available";
- ASSERT_NO_FATAL_FAILURE(get8BitConfig(config));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- std::vector<EGLint> winAttrs;
- winAttrs.push_back(EGL_GL_COLORSPACE_KHR);
- winAttrs.push_back(EGL_GL_COLORSPACE_BT2020_PQ_EXT);
- winAttrs.push_back(EGL_NONE);
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs.data());
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- EGLint value;
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_GL_COLORSPACE_KHR, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_GL_COLORSPACE_BT2020_PQ_EXT, value);
- ASSERT_NO_FATAL_FAILURE(setSurfaceSmpteMetadata(eglSurface));
- ASSERT_NO_FATAL_FAILURE(checkSurfaceSmpteMetadata(eglSurface));
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLBT2020PQ) {
- EGLConfig config;
- EGLBoolean success;
- if (!hasHdrDisplay) {
- // skip this test if device does not have HDR display
- RecordProperty("hasHdrDisplay", false);
- return;
- }
- // Test that bt2020-pq extension exists
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_gl_colorspace_bt2020_pq"))
- << "EGL_EXT_gl_colorspace_bt2020_pq extension not available";
- ASSERT_NO_FATAL_FAILURE(get8BitConfig(config));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- std::vector<EGLint> winAttrs;
- winAttrs.push_back(EGL_GL_COLORSPACE_KHR);
- winAttrs.push_back(EGL_GL_COLORSPACE_BT2020_PQ_EXT);
- winAttrs.push_back(EGL_NONE);
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs.data());
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- EGLint value;
- success = eglQuerySurface(mEglDisplay, eglSurface, EGL_GL_COLORSPACE_KHR, &value);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_GL_COLORSPACE_BT2020_PQ_EXT, value);
- ASSERT_NO_FATAL_FAILURE(setSurfaceSmpteMetadata(eglSurface));
- ASSERT_NO_FATAL_FAILURE(checkSurfaceSmpteMetadata(eglSurface));
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLConfigFP16) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- if (!hasWideColorDisplay) {
- // skip this test if device does not have wide-color display
- RecordProperty("hasWideColorDisplay", false);
- return;
- }
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_EXT_pixel_format_float"));
- const EGLint attrs[] = {
- // clang-format off
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_RED_SIZE, 16,
- EGL_GREEN_SIZE, 16,
- EGL_BLUE_SIZE, 16,
- EGL_ALPHA_SIZE, 16,
- EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
- EGL_NONE,
- // clang-format on
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(1, numConfigs);
- EGLint components[4];
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EXPECT_GE(components[0], 16);
- EXPECT_GE(components[1], 16);
- EXPECT_GE(components[2], 16);
- EXPECT_GE(components[3], 16);
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), NULL);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLNoConfigContext) {
- if (!hasWideColorDisplay) {
- // skip this test if device does not have wide-color display
- RecordProperty("hasWideColorDisplay", false);
- return;
- }
- ASSERT_TRUE(hasEglExtension(mEglDisplay, "EGL_KHR_no_config_context"));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- std::vector<EGLint> contextAttributes;
- contextAttributes.reserve(4);
- contextAttributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
- contextAttributes.push_back(2);
- contextAttributes.push_back(EGL_NONE);
- contextAttributes.push_back(EGL_NONE);
- EGLContext eglContext = eglCreateContext(mEglDisplay, EGL_NO_CONFIG_KHR, EGL_NO_CONTEXT,
- contextAttributes.data());
- EXPECT_NE(EGL_NO_CONTEXT, eglContext);
- EXPECT_EQ(EGL_SUCCESS, eglGetError());
- if (eglContext != EGL_NO_CONTEXT) {
- eglDestroyContext(mEglDisplay, eglContext);
- }
- }
- // Emulate what a native application would do to create a
- // 10:10:10:2 surface.
- TEST_F(EGLTest, EGLConfig1010102) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- if (!hasWideColorDisplay) {
- // skip this test if device does not have wide-color display
- RecordProperty("hasWideColorDisplay", false);
- return;
- }
- const EGLint attrs[] = {
- // clang-format off
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
- EGL_RED_SIZE, 10,
- EGL_GREEN_SIZE, 10,
- EGL_BLUE_SIZE, 10,
- EGL_ALPHA_SIZE, 2,
- EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FIXED_EXT,
- EGL_NONE, EGL_NONE
- // clang-format on
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(1, numConfigs);
- EGLint components[4];
- EGLint value;
- eglGetConfigAttrib(mEglDisplay, config, EGL_CONFIG_ID, &value);
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_RED_SIZE, &components[0]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_GREEN_SIZE, &components[1]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_BLUE_SIZE, &components[2]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- success = eglGetConfigAttrib(mEglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- EXPECT_EQ(components[0], 10);
- EXPECT_EQ(components[1], 10);
- EXPECT_EQ(components[2], 10);
- EXPECT_EQ(components[3], 2);
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), NULL);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLInvalidColorspaceAttribute) {
- EGLConfig config;
- ASSERT_NO_FATAL_FAILURE(get8BitConfig(config));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_BACK_BUFFER,
- EGL_NONE,
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_BAD_ATTRIBUTE, eglGetError());
- ASSERT_EQ(EGL_NO_SURFACE, eglSurface);
- }
- TEST_F(EGLTest, EGLUnsupportedColorspaceFormatCombo) {
- EGLint numConfigs;
- EGLConfig config;
- EGLBoolean success;
- const EGLint attrs[] = {
- // clang-format off
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_RED_SIZE, 16,
- EGL_GREEN_SIZE, 16,
- EGL_BLUE_SIZE, 16,
- EGL_ALPHA_SIZE, 16,
- EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
- EGL_NONE,
- // clang-format on
- };
- success = eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs);
- ASSERT_EQ(EGL_UNSIGNED_TRUE, success);
- ASSERT_EQ(1, numConfigs);
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- const EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_EXT,
- EGL_NONE,
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_BAD_MATCH, eglGetError());
- ASSERT_EQ(EGL_NO_SURFACE, eglSurface);
- }
- TEST_F(EGLTest, EGLCreateWindowFailAndSucceed) {
- EGLConfig config;
- ASSERT_NO_FATAL_FAILURE(get8BitConfig(config));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_BACK_BUFFER,
- EGL_NONE,
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_BAD_ATTRIBUTE, eglGetError());
- ASSERT_EQ(EGL_NO_SURFACE, eglSurface);
- // Now recreate surface with a valid colorspace. Ensure proper cleanup is done
- // in the first failed attempt (e.g. native_window_api_disconnect).
- winAttrs[1] = EGL_GL_COLORSPACE_LINEAR_KHR;
- eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- TEST_F(EGLTest, EGLCreateWindowTwoColorspaces) {
- EGLConfig config;
- ASSERT_NO_FATAL_FAILURE(get8BitConfig(config));
- struct DummyConsumer : public BnConsumerListener {
- void onFrameAvailable(const BufferItem& /* item */) override {}
- void onBuffersReleased() override {}
- void onSidebandStreamChanged() override {}
- };
- // Create a EGLSurface
- sp<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> consumer;
- BufferQueue::createBufferQueue(&producer, &consumer);
- consumer->consumerConnect(new DummyConsumer, false);
- sp<Surface> mSTC = new Surface(producer);
- sp<ANativeWindow> mANW = mSTC;
- const EGLint winAttrs[] = {
- // clang-format off
- EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_DISPLAY_P3_EXT,
- EGL_NONE,
- // clang-format on
- };
- EGLSurface eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), winAttrs);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- android_dataspace dataspace = static_cast<android_dataspace>(ANativeWindow_getBuffersDataSpace(mANW.get()));
- ASSERT_EQ(dataspace, HAL_DATASPACE_DISPLAY_P3);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- // Now create with default attribute (EGL_GL_COLORSPACE_LINEAR_KHR)
- eglSurface = eglCreateWindowSurface(mEglDisplay, config, mANW.get(), NULL);
- ASSERT_EQ(EGL_SUCCESS, eglGetError());
- ASSERT_NE(EGL_NO_SURFACE, eglSurface);
- dataspace = static_cast<android_dataspace>(ANativeWindow_getBuffersDataSpace(mANW.get()));
- // Make sure the dataspace has been reset to UNKNOWN
- ASSERT_NE(dataspace, HAL_DATASPACE_DISPLAY_P3);
- EXPECT_TRUE(eglDestroySurface(mEglDisplay, eglSurface));
- }
- }
|