blob: 0c6117a079bf76eeb8cc9e8fe9f4a3bf0478ba13 [file] [log] [blame]
// 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