diff options
author | 2021-01-15 14:27:06 -0800 | |
---|---|---|
committer | 2021-02-16 17:38:12 +0100 | |
commit | 5fdf7b8d26f3cd1a2f2fb8a441d40d33270d3b77 (patch) | |
tree | 42fb177d3a385875f96f560e5abc6ab35d034d7c /libs | |
parent | d8385e060c12acc21010956f4fbe57daa526a41a (diff) |
Add SurfaceControl to hwui
add a method, setSurfaceControl, for java layer to pass surface control to the render thread
Bug: 173671170
Test: call setSurfaceControl method in ViewRootImpl.java
Change-Id: I886a79c377938f19cf38b9058f2bec64e1439000
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 9 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 14 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 13 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.h | 16 |
7 files changed, 70 insertions, 0 deletions
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 4966bfa1c1e9..df66981853bb 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -189,6 +189,13 @@ static void android_view_ThreadedRenderer_setSurface(JNIEnv* env, jobject clazz, } } +static void android_view_ThreadedRenderer_setSurfaceControl(JNIEnv* env, jobject clazz, + jlong proxyPtr, jlong surfaceControlPtr) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + ASurfaceControl* surfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControlPtr); + proxy->setSurfaceControl(surfaceControl); +} + static jboolean android_view_ThreadedRenderer_pause(JNIEnv* env, jobject clazz, jlong proxyPtr) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); @@ -671,6 +678,8 @@ static const JNINativeMethod gMethods[] = { {"nSetName", "(JLjava/lang/String;)V", (void*)android_view_ThreadedRenderer_setName}, {"nSetSurface", "(JLandroid/view/Surface;Z)V", (void*)android_view_ThreadedRenderer_setSurface}, + {"nSetSurfaceControl", "(JJ)V", + (void*)android_view_ThreadedRenderer_setSurfaceControl}, {"nPause", "(J)Z", (void*)android_view_ThreadedRenderer_pause}, {"nSetStopped", "(JZ)V", (void*)android_view_ThreadedRenderer_setStopped}, {"nSetLightAlpha", "(JFF)V", (void*)android_view_ThreadedRenderer_setLightAlpha}, diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 65afcc3a2558..9543d47640e6 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -133,6 +133,7 @@ void CanvasContext::removeRenderNode(RenderNode* node) { void CanvasContext::destroy() { stopDrawing(); setSurface(nullptr); + setSurfaceControl(nullptr); freePrefetchedLayers(); destroyHardwareResources(); mAnimationContext->destroy(); @@ -173,6 +174,19 @@ void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { setupPipelineSurface(); } +void CanvasContext::setSurfaceControl(ASurfaceControl* surfaceControl) { + if (surfaceControl == mSurfaceControl) return; + + auto funcs = mRenderThread.getASurfaceControlFunctions(); + if (mSurfaceControl != nullptr) { + funcs.releaseFunc(mSurfaceControl); + } + mSurfaceControl = surfaceControl; + if (mSurfaceControl != nullptr) { + funcs.acquireFunc(mSurfaceControl); + } +} + void CanvasContext::setupPipelineSurface() { bool hasSurface = mRenderPipeline->setSurface( mNativeSurface ? mNativeSurface->getNativeWindow() : nullptr, mSwapBehavior); diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index b31883b9ae94..917b00cb6591 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -112,6 +112,7 @@ public: void setSwapBehavior(SwapBehavior swapBehavior); void setSurface(ANativeWindow* window, bool enableTimeout = true); + void setSurfaceControl(ASurfaceControl* surfaceControl); bool pauseSurface(); void setStopped(bool stopped); bool hasSurface() const { return mNativeSurface.get(); } @@ -218,6 +219,9 @@ private: RenderThread& mRenderThread; std::unique_ptr<ReliableSurface> mNativeSurface; + // The SurfaceControl reference is passed from ViewRootImpl, can be set to + // NULL to remove the reference + ASurfaceControl* mSurfaceControl = nullptr; // stopped indicates the CanvasContext will reject actual redraw operations, // and defer repaint until it is un-stopped bool mStopped = false; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 0ade8dde12eb..e14842f89b61 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -84,6 +84,19 @@ void RenderProxy::setSurface(ANativeWindow* window, bool enableTimeout) { }); } +void RenderProxy::setSurfaceControl(ASurfaceControl* surfaceControl) { + auto funcs = mRenderThread.getASurfaceControlFunctions(); + if (surfaceControl) { + funcs.acquireFunc(surfaceControl); + } + mRenderThread.queue().post([this, control = surfaceControl, funcs]() mutable { + mContext->setSurfaceControl(control); + if (control) { + funcs.releaseFunc(control); + } + }); +} + void RenderProxy::allocateBuffers() { mRenderThread.queue().post([=]() { mContext->allocateBuffers(); }); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index a4adb16a930e..366d6b5a172c 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -20,6 +20,7 @@ #include <SkBitmap.h> #include <android/native_window.h> #include <cutils/compiler.h> +#include <android/surface_control.h> #include <utils/Functor.h> #include "../FrameMetricsObserver.h" @@ -72,6 +73,7 @@ public: void setName(const char* name); void setSurface(ANativeWindow* window, bool enableTimeout = true); + void setSurfaceControl(ASurfaceControl* surfaceControl); void allocateBuffers(); bool pause(); void setStopped(bool stopped); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 7750a31b817f..26101867c43f 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,6 +50,17 @@ 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!"); +} + void RenderThread::frameCallback(int64_t frameTimeNanos, void* data) { RenderThread* rt = reinterpret_cast<RenderThread*>(data); int64_t vsyncId = AChoreographer_getVsyncId(rt->mChoreographer); diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index 4fbb07168ac0..bb7c5181e112 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -78,6 +78,16 @@ struct VsyncSource { virtual ~VsyncSource() {} }; +typedef void (*ASC_acquire)(ASurfaceControl* control); +typedef void (*ASC_release)(ASurfaceControl* control); + +struct ASurfaceControlFunctions { + ASurfaceControlFunctions(); + + ASC_acquire acquireFunc; + ASC_release releaseFunc; +}; + class ChoreographerSource; class DummyVsyncSource; @@ -121,6 +131,10 @@ public: void preload(); + const ASurfaceControlFunctions& getASurfaceControlFunctions() { + return mASurfaceControlFunctions; + } + /** * isCurrent provides a way to query, if the caller is running on * the render thread. @@ -189,6 +203,8 @@ private: sk_sp<GrDirectContext> mGrContext; CacheManager* mCacheManager; sp<VulkanManager> mVkManager; + + ASurfaceControlFunctions mASurfaceControlFunctions; }; } /* namespace renderthread */ |