// // Copyright 2021 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. // // EGLSurfaceTestMac: // Tests pertaining to egl::Surface. // #include #include #include #include "common/Color.h" #include "common/platform.h" #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" #include "util/EGLWindow.h" #include "util/OSWindow.h" using namespace angle; namespace { class EGLSurfaceTestMac : public ANGLETest { protected: void testSetUp() override { // Get display. EGLAttrib dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE}; mDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast(EGL_DEFAULT_DISPLAY), dispattrs); ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY); ASSERT_TRUE(eglInitialize(mDisplay, nullptr, nullptr) == EGL_TRUE); // Find a default config. const EGLint configAttributes[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, EGL_DONT_CARE, EGL_GREEN_SIZE, EGL_DONT_CARE, EGL_BLUE_SIZE, EGL_DONT_CARE, EGL_ALPHA_SIZE, EGL_DONT_CARE, EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_STENCIL_SIZE, EGL_DONT_CARE, EGL_NONE}; EGLint configCount; EGLint ret = eglChooseConfig(mDisplay, configAttributes, &mConfig, 1, &configCount); if (!ret || configCount == 0) { return; } // Create a window, context and surface if multisampling is possible. mOSWindow = OSWindow::New(); mOSWindow->initialize("EGLSurfaceTestMac", kWindowWidth, kWindowHeight); setWindowVisible(mOSWindow, true); EGLint contextAttributes[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, GetParam().majorVersion, EGL_CONTEXT_MINOR_VERSION_KHR, GetParam().minorVersion, EGL_NONE, }; mContext = eglCreateContext(mDisplay, mConfig, EGL_NO_CONTEXT, contextAttributes); ASSERT_TRUE(mContext != EGL_NO_CONTEXT); } void testTearDown() override { if (mSurface) { eglSwapBuffers(mDisplay, mSurface); } eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (mSurface) { eglDestroySurface(mDisplay, mSurface); ASSERT_EGL_SUCCESS(); } if (mContext != EGL_NO_CONTEXT) { eglDestroyContext(mDisplay, mContext); ASSERT_EGL_SUCCESS(); } if (mOSWindow) { OSWindow::Delete(&mOSWindow); } eglTerminate(mDisplay); } void initializeSurface(int contentsScale) { EGLNativeWindowType nativeWindow = mOSWindow->getNativeWindow(); CALayer *layer = reinterpret_cast(nativeWindow); layer.contentsScale = contentsScale; mSurface = eglCreateWindowSurface(mDisplay, mConfig, nativeWindow, nullptr); ASSERT_EGL_SUCCESS(); eglMakeCurrent(mDisplay, mSurface, mSurface, mContext); ASSERT_EGL_SUCCESS(); } protected: static constexpr int kWindowWidth = 16; static constexpr int kWindowHeight = 8; OSWindow *mOSWindow = nullptr; EGLDisplay mDisplay = EGL_NO_DISPLAY; EGLContext mContext = EGL_NO_CONTEXT; EGLSurface mSurface = EGL_NO_SURFACE; EGLConfig mConfig; }; // Test Mac's layer's content scale > 1 and check the initial viewport is set correctly. TEST_P(EGLSurfaceTestMac, ContentsScale) { constexpr int contentsScale = 2; initializeSurface(contentsScale); GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); ASSERT_EQ(viewport[0], 0); ASSERT_EQ(viewport[1], 0); ASSERT_EQ(viewport[2], kWindowWidth * contentsScale); ASSERT_EQ(viewport[3], kWindowHeight * contentsScale); GLColor clearColor(255, 0, 0, 255); glClearColor(clearColor.R, clearColor.G, clearColor.B, clearColor.A); glClear(GL_COLOR_BUFFER_BIT); ASSERT_GL_NO_ERROR(); EXPECT_PIXEL_COLOR_EQ(0, 0, clearColor); EXPECT_PIXEL_COLOR_EQ(kWindowWidth, 0, clearColor); EXPECT_PIXEL_COLOR_EQ(0, kWindowHeight, clearColor); EXPECT_PIXEL_COLOR_EQ(kWindowHeight * contentsScale - 1, kWindowHeight * contentsScale - 1, clearColor); } } // anonymous namespace ANGLE_INSTANTIATE_TEST(EGLSurfaceTestMac, WithNoFixture(ES2_OPENGL()), WithNoFixture(ES3_OPENGL()), WithNoFixture(ES2_METAL()), WithNoFixture(ES3_METAL()));