diff options
author | John Reck <jreck@google.com> | 2018-04-23 08:15:03 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2018-04-26 13:46:12 -0700 |
commit | 1e51071240e0333b1a6cf3dd77d22e45c8677669 (patch) | |
tree | 600cecbf07d5048878d9503a62a47670d0af180e /libs/hwui/renderthread/RenderThread.cpp | |
parent | 4afbedf988425e25b74e3d246cbefaff9e10c1bb (diff) |
Remove RenderThread from EglManager
Refactor to make EglManager re-usable.
Test: hwuiunit passes, hwuimacro works
Change-Id: Ie8e9398c703fada1dc5d8baca5f42485eadea202
Diffstat (limited to 'libs/hwui/renderthread/RenderThread.cpp')
-rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 5e067dafed03..711ece46cf31 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -30,6 +30,13 @@ #include "utils/FatVector.h" #include "utils/TimeUtils.h" +#ifdef HWUI_GLES_WRAP_ENABLED +#include "debug/GlesDriver.h" +#endif + +#include <GrContextOptions.h> +#include <gl/GrGLInterface.h> + #include <gui/DisplayEventReceiver.h> #include <sys/resource.h> #include <utils/Condition.h> @@ -163,12 +170,45 @@ void RenderThread::initThreadLocals() { nsecs_t frameIntervalNanos = static_cast<nsecs_t>(1000000000 / mDisplayInfo.fps); mTimeLord.setFrameInterval(frameIntervalNanos); initializeDisplayEventReceiver(); - mEglManager = new EglManager(*this); + mEglManager = new EglManager(); mRenderState = new RenderState(*this); mVkManager = new VulkanManager(*this); mCacheManager = new CacheManager(mDisplayInfo); } +void RenderThread::requireGlContext() { + if (mEglManager->hasEglContext()) { + return; + } + mEglManager->initialize(); + renderState().onGLContextCreated(); + + if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) { +#ifdef HWUI_GLES_WRAP_ENABLED + debug::GlesDriver* driver = debug::GlesDriver::get(); + sk_sp<const GrGLInterface> glInterface(driver->getSkiaInterface()); +#else + sk_sp<const GrGLInterface> glInterface(GrGLCreateNativeInterface()); +#endif + LOG_ALWAYS_FATAL_IF(!glInterface.get()); + + GrContextOptions options; + options.fDisableDistanceFieldPaths = true; + cacheManager().configureContext(&options); + sk_sp<GrContext> grContext(GrContext::MakeGL(std::move(glInterface), options)); + LOG_ALWAYS_FATAL_IF(!grContext.get()); + setGrContext(grContext); + } +} + +void RenderThread::destroyGlContext() { + if (mEglManager->hasEglContext()) { + setGrContext(nullptr); + renderState().onGLContextDestroyed(); + mEglManager->destroy(); + } +} + void RenderThread::dumpGraphicsMemory(int fd) { globalProfileData()->dump(fd); |