From 77eb21f7d9c6e34e985dfa96152fb8b6c40f9a8a Mon Sep 17 00:00:00 2001 From: Ioan-Cristian Szabo Date: Fri, 22 Dec 2017 17:32:17 +0000 Subject: Fix destruction order of singleton objects and resolve hang GLES issue. Change-Id: I9df42d4255b371b275a74aa521406e6796ee436b Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/113901 Reviewed-by: Anthony Barbier Tested-by: Anthony Barbier --- src/runtime/GLES_COMPUTE/GCScheduler.cpp | 74 +++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) (limited to 'src/runtime/GLES_COMPUTE') diff --git a/src/runtime/GLES_COMPUTE/GCScheduler.cpp b/src/runtime/GLES_COMPUTE/GCScheduler.cpp index b2235ea6f9..f19b43348d 100644 --- a/src/runtime/GLES_COMPUTE/GCScheduler.cpp +++ b/src/runtime/GLES_COMPUTE/GCScheduler.cpp @@ -28,11 +28,27 @@ using namespace arm_compute; -GCScheduler::GCScheduler() = default; +std::once_flag GCScheduler::_initialize_symbols; + +GCScheduler::GCScheduler() + : _display(EGL_NO_DISPLAY), _context(EGL_NO_CONTEXT) +{ +} + +GCScheduler::~GCScheduler() +{ + eglDestroyContext(_display, _context); + eglTerminate(_display); + + _context = EGL_NO_CONTEXT; + _display = EGL_NO_DISPLAY; +} void GCScheduler::default_init() { - GCKernelLibrary::get().init("./cs_shaders/"); + setup_context(); + + GCKernelLibrary::get().init("./cs_shaders/", _display, _context); } void GCScheduler::init(EGLDisplay dpy, EGLContext ctx) @@ -42,6 +58,7 @@ void GCScheduler::init(EGLDisplay dpy, EGLContext ctx) GCScheduler &GCScheduler::get() { + std::call_once(_initialize_symbols, opengles31_is_available); static GCScheduler scheduler; return scheduler; } @@ -59,3 +76,56 @@ void GCScheduler::sync() { ARM_COMPUTE_GL_CHECK(glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)); } + +void GCScheduler::setup_context() +{ + EGLBoolean res; + _display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + + ARM_COMPUTE_ERROR_ON_MSG(_display == EGL_NO_DISPLAY, "Failed to get display: 0x%x.", eglGetError()); + + res = eglInitialize(_display, nullptr, nullptr); + + ARM_COMPUTE_ERROR_ON_MSG(res == EGL_FALSE, "Failed to initialize egl: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + const char *egl_extension_st = eglQueryString(_display, EGL_EXTENSIONS); + ARM_COMPUTE_ERROR_ON_MSG((strstr(egl_extension_st, "EGL_KHR_create_context") == nullptr), "Failed to query EGL_KHR_create_context"); + ARM_COMPUTE_ERROR_ON_MSG((strstr(egl_extension_st, "EGL_KHR_surfaceless_context") == nullptr), "Failed to query EGL_KHR_surfaceless_context"); + ARM_COMPUTE_UNUSED(egl_extension_st); + + const EGLint config_attribs[] = + { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, + EGL_NONE + }; + EGLConfig cfg; + EGLint count; + + res = eglChooseConfig(_display, config_attribs, &cfg, 1, &count); + + ARM_COMPUTE_ERROR_ON_MSG(res == EGL_FALSE, "Failed to choose config: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + res = eglBindAPI(EGL_OPENGL_ES_API); + + ARM_COMPUTE_ERROR_ON_MSG(res == EGL_FALSE, "Failed to bind api: 0x%x.", eglGetError()); + + const EGLint attribs[] = + { + EGL_CONTEXT_CLIENT_VERSION, 3, + EGL_NONE + }; + _context = eglCreateContext(_display, + cfg, + EGL_NO_CONTEXT, + attribs); + + ARM_COMPUTE_ERROR_ON_MSG(_context == EGL_NO_CONTEXT, "Failed to create context: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); + + res = eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, _context); + + ARM_COMPUTE_ERROR_ON_MSG(res == EGL_FALSE, "Failed to make current: 0x%x.", eglGetError()); + ARM_COMPUTE_UNUSED(res); +} -- cgit v1.2.1