diff options
Diffstat (limited to 'libs/hwui/renderthread/RenderThread.cpp')
-rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 66 |
1 files changed, 55 insertions, 11 deletions
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 206b58f62ea7..5dc02e8454ac 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -33,6 +33,7 @@ #include <GrContextOptions.h> #include <gl/GrGLInterface.h> +#include <dlfcn.h> #include <sys/resource.h> #include <utils/Condition.h> #include <utils/Log.h> @@ -49,10 +50,44 @@ static bool gHasRenderThreadInstance = false; static JVMAttachHook gOnStartHook = nullptr; +ASurfaceControlFunctions::ASurfaceControlFunctions() { + void* handle_ = dlopen("libandroid.so", RTLD_NOW | RTLD_NODELETE); + acquireFunc = (ASC_acquire) dlsym(handle_, "ASurfaceControl_acquire"); + LOG_ALWAYS_FATAL_IF(acquireFunc == nullptr, + "Failed to find required symbol ASurfaceControl_acquire!"); + + releaseFunc = (ASC_release) dlsym(handle_, "ASurfaceControl_release"); + LOG_ALWAYS_FATAL_IF(releaseFunc == nullptr, + "Failed to find required symbol ASurfaceControl_release!"); + + registerListenerFunc = (ASC_registerSurfaceStatsListener) dlsym(handle_, + "ASurfaceControl_registerSurfaceStatsListener"); + LOG_ALWAYS_FATAL_IF(registerListenerFunc == nullptr, + "Failed to find required symbol ASurfaceControl_registerSurfaceStatsListener!"); + + unregisterListenerFunc = (ASC_unregisterSurfaceStatsListener) dlsym(handle_, + "ASurfaceControl_unregisterSurfaceStatsListener"); + LOG_ALWAYS_FATAL_IF(unregisterListenerFunc == nullptr, + "Failed to find required symbol ASurfaceControl_unregisterSurfaceStatsListener!"); + + getAcquireTimeFunc = (ASCStats_getAcquireTime) dlsym(handle_, + "ASurfaceControlStats_getAcquireTime"); + LOG_ALWAYS_FATAL_IF(getAcquireTimeFunc == nullptr, + "Failed to find required symbol ASurfaceControlStats_getAcquireTime!"); + + getFrameNumberFunc = (ASCStats_getFrameNumber) dlsym(handle_, + "ASurfaceControlStats_getFrameNumber"); + LOG_ALWAYS_FATAL_IF(getFrameNumberFunc == nullptr, + "Failed to find required symbol ASurfaceControlStats_getFrameNumber!"); +} + void RenderThread::frameCallback(int64_t frameTimeNanos, void* data) { RenderThread* rt = reinterpret_cast<RenderThread*>(data); + int64_t vsyncId = AChoreographer_getVsyncId(rt->mChoreographer); + int64_t frameDeadline = AChoreographer_getFrameDeadline(rt->mChoreographer); rt->mVsyncRequested = false; - if (rt->timeLord().vsyncReceived(frameTimeNanos) && !rt->mFrameCallbackTaskPending) { + if (rt->timeLord().vsyncReceived(frameTimeNanos, frameTimeNanos, vsyncId, frameDeadline) && + !rt->mFrameCallbackTaskPending) { ATRACE_NAME("queue mFrameCallbackTask"); rt->mFrameCallbackTaskPending = true; nsecs_t runAt = (frameTimeNanos + rt->mDispatchFrameDelay); @@ -132,7 +167,7 @@ RenderThread::RenderThread() , mRenderState(nullptr) , mEglManager(nullptr) , mFunctorManager(WebViewFunctorManager::instance()) - , mVkManager(nullptr) { + , mGlobalProfileData(mJankDataMutex) { Properties::load(); start("RenderThread"); } @@ -166,7 +201,7 @@ void RenderThread::initThreadLocals() { initializeChoreographer(); mEglManager = new EglManager(); mRenderState = new RenderState(*this); - mVkManager = new VulkanManager(); + mVkManager = VulkanManager::getInstance(); mCacheManager = new CacheManager(); } @@ -190,13 +225,17 @@ void RenderThread::requireGlContext() { auto glesVersion = reinterpret_cast<const char*>(glGetString(GL_VERSION)); auto size = glesVersion ? strlen(glesVersion) : -1; cacheManager().configureContext(&options, glesVersion, size); - sk_sp<GrContext> grContext(GrContext::MakeGL(std::move(glInterface), options)); + sk_sp<GrDirectContext> grContext(GrDirectContext::MakeGL(std::move(glInterface), options)); LOG_ALWAYS_FATAL_IF(!grContext.get()); setGrContext(grContext); } void RenderThread::requireVkContext() { - if (mVkManager->hasVkContext()) { + // the getter creates the context in the event it had been destroyed by destroyRenderingContext + // Also check if we have a GrContext before returning fast. VulkanManager may be shared with + // the HardwareBitmapUploader which initializes the Vk context without persisting the GrContext + // in the rendering thread. + if (vulkanManager().hasVkContext() && mGrContext) { return; } mVkManager->initialize(); @@ -204,7 +243,7 @@ void RenderThread::requireVkContext() { initGrContextOptions(options); auto vkDriverVersion = mVkManager->getDriverVersion(); cacheManager().configureContext(&options, &vkDriverVersion, sizeof(vkDriverVersion)); - sk_sp<GrContext> grContext = mVkManager->createContext(options); + sk_sp<GrDirectContext> grContext = mVkManager->createContext(options); LOG_ALWAYS_FATAL_IF(!grContext.get()); setGrContext(grContext); } @@ -222,11 +261,16 @@ void RenderThread::destroyRenderingContext() { mEglManager->destroy(); } } else { - if (vulkanManager().hasVkContext()) { - setGrContext(nullptr); - vulkanManager().destroy(); - } + setGrContext(nullptr); + mVkManager.clear(); + } +} + +VulkanManager& RenderThread::vulkanManager() { + if (!mVkManager.get()) { + mVkManager = VulkanManager::getInstance(); } + return *mVkManager.get(); } void RenderThread::dumpGraphicsMemory(int fd) { @@ -263,7 +307,7 @@ Readback& RenderThread::readback() { return *mReadback; } -void RenderThread::setGrContext(sk_sp<GrContext> context) { +void RenderThread::setGrContext(sk_sp<GrDirectContext> context) { mCacheManager->reset(context); if (mGrContext) { mRenderState->onContextDestroyed(); |