// Copyright (C) 2017 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 "OpenGLTestContext.h" #include "host-common/GraphicsAgentFactory.h" #include "host-common/testing/MockGraphicsAgentFactory.h" #include "Standalone.h" namespace gfxstream { namespace gl { static bool sDisplayNeedsInit = true; EGLDisplay getDisplay() { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); if (sDisplayNeedsInit) { egl->eglUseOsEglApi(!shouldUseHostGpu(), EGL_FALSE); } EGLDisplay dpy = egl->eglGetDisplay(EGL_DEFAULT_DISPLAY); EXPECT_TRUE(dpy != EGL_NO_DISPLAY); if (sDisplayNeedsInit) { EGLint eglMaj, eglMin; EGLBoolean init_res = egl->eglInitialize(dpy, &eglMaj, &eglMin); EXPECT_TRUE(init_res != EGL_FALSE); sDisplayNeedsInit = false; } return dpy; } EGLConfig createConfig(EGLDisplay dpy, EGLint r, EGLint g, EGLint b, EGLint a, EGLint d, EGLint s, EGLint ms) { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); const EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RED_SIZE, r, EGL_GREEN_SIZE, g, EGL_BLUE_SIZE, b, EGL_ALPHA_SIZE, a, EGL_DEPTH_SIZE, d, EGL_STENCIL_SIZE, s, EGL_SAMPLES, ms, EGL_NONE }; EGLint nConfigs; EGLConfig configOut; EGLBoolean chooseConfigResult = egl->eglChooseConfig( dpy, configAttribs, &configOut, 1, &nConfigs); EXPECT_TRUE(chooseConfigResult != EGL_FALSE); EXPECT_TRUE(nConfigs > 0); return configOut; } EGLSurface pbufferSurface(EGLDisplay dpy, ::EGLConfig config, EGLint w, EGLint h) { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); const EGLint pbufferAttribs[] = { EGL_WIDTH, w, EGL_HEIGHT, h, EGL_NONE, }; EGLSurface pbuf = egl->eglCreatePbufferSurface( dpy, config, pbufferAttribs); EXPECT_TRUE(pbuf != EGL_NO_SURFACE); return pbuf; } EGLContext createContext(EGLDisplay dpy, ::EGLConfig config, EGLint maj, EGLint min) { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); const EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, maj, EGL_NONE }; EGLContext cxt = egl->eglCreateContext(dpy, config, EGL_NO_CONTEXT, contextAttribs); EXPECT_TRUE(cxt != EGL_NO_CONTEXT); return cxt; } void destroyContext(EGLDisplay dpy, EGLContext cxt) { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); EGLBoolean destroyContextRes = egl->eglDestroyContext(dpy, cxt); EXPECT_TRUE(destroyContextRes != GL_FALSE); } void destroySurface(EGLDisplay dpy, EGLSurface surface) { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); EGLBoolean destroySurfaceRes = egl->eglDestroySurface(dpy, surface); EXPECT_TRUE(destroySurfaceRes != GL_FALSE); } void destroyDisplay(EGLDisplay dpy) { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); EGLBoolean terminateRes = egl->eglTerminate(dpy); EXPECT_TRUE(terminateRes != GL_FALSE); sDisplayNeedsInit = true; } // static void GLTest::SetUpTestSuite() { android::emulation::injectGraphicsAgents(android::emulation::MockGraphicsAgentFactory()); } void GLTest::SetUp() { // setupStandaloneLibrarySearchPaths(); const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); gl = LazyLoadedGLESv2Dispatch::get(); gles1 = LazyLoadedGLESv1Dispatch::get(); EXPECT_TRUE(egl != nullptr); EXPECT_TRUE(gl != nullptr); EXPECT_TRUE(gles1 != nullptr); m_display = getDisplay(); m_config = createConfig(m_display, 8, 8, 8, 8, 24, 8, 0); m_surface = pbufferSurface(m_display, m_config, kTestSurfaceSize[0], kTestSurfaceSize[1]); egl->eglSetMaxGLESVersion(3); m_context = createContext(m_display, m_config, 3, 0); egl->eglMakeCurrent(m_display, m_surface, m_surface, m_context); } void GLTest::TearDown() { const EGLDispatch* egl = LazyLoadedEGLDispatch::get(); egl->eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); destroyContext(m_display, m_context); destroySurface(m_display, m_surface); destroyDisplay(m_display); EXPECT_EQ(EGL_SUCCESS, egl->eglGetError()) << "GLTest TearDown found EGL error"; } } // namespace gl } // namespace gfxstream