diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp index 6fc251dc815ce62c3472356b646b44caa2c08b82..5b4ab5f2d3b1bcd4c826629c160de9ffcaebc0a9 100644 --- a/libs/hwui/WebViewFunctorManager.cpp +++ b/libs/hwui/WebViewFunctorManager.cpp @@ -86,6 +86,10 @@ void WebViewFunctor_release(int functor) { WebViewFunctorManager::instance().releaseFunctor(functor); } +void WebViewFunctor_reportRenderingThreads(int functor, const int32_t* thread_ids, size_t size) { + WebViewFunctorManager::instance().reportRenderingThreads(functor, thread_ids, size); +} + static std::atomic_int sNextId{1}; WebViewFunctor::WebViewFunctor(void* data, const WebViewFunctorCallbacks& callbacks, @@ -260,6 +264,10 @@ void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) { funcs.transactionDeleteFunc(transaction); } +void WebViewFunctor::reportRenderingThreads(const int32_t* thread_ids, size_t size) { + // TODO(b/329219352): Pass the threads to HWUI and update the ADPF session. +} + WebViewFunctorManager& WebViewFunctorManager::instance() { static WebViewFunctorManager sInstance; return sInstance; @@ -346,6 +354,17 @@ void WebViewFunctorManager::destroyFunctor(int functor) { } } +void WebViewFunctorManager::reportRenderingThreads(int functor, const int32_t* thread_ids, + size_t size) { + std::lock_guard _lock{mLock}; + for (auto& iter : mFunctors) { + if (iter->id() == functor) { + iter->reportRenderingThreads(thread_ids, size); + break; + } + } +} + sp<WebViewFunctor::Handle> WebViewFunctorManager::handleFor(int functor) { std::lock_guard _lock{mLock}; for (auto& iter : mActiveFunctors) { diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h index 0a02f2d4b72051d29469e33aaacc45543510fa6f..1bf2c1f9c4ef95a6d2a11189db73c605cf52263c 100644 --- a/libs/hwui/WebViewFunctorManager.h +++ b/libs/hwui/WebViewFunctorManager.h @@ -81,6 +81,8 @@ public: ASurfaceControl* getSurfaceControl(); void mergeTransaction(ASurfaceTransaction* transaction); + void reportRenderingThreads(const int32_t* thread_ids, size_t size); + sp<Handle> createHandle() { LOG_ALWAYS_FATAL_IF(mCreatedHandle); mCreatedHandle = true; @@ -110,6 +112,7 @@ public: void releaseFunctor(int functor); void onContextDestroyed(); void destroyFunctor(int functor); + void reportRenderingThreads(int functor, const int32_t* thread_ids, size_t size); sp<WebViewFunctor::Handle> handleFor(int functor); diff --git a/libs/hwui/private/hwui/WebViewFunctor.h b/libs/hwui/private/hwui/WebViewFunctor.h index 493c943079ab68ad82288024ae152f0a10dac5ba..dbd8a16dfcfca6b3ba098ea4c5fbf0f238a236ba 100644 --- a/libs/hwui/private/hwui/WebViewFunctor.h +++ b/libs/hwui/private/hwui/WebViewFunctor.h @@ -106,6 +106,11 @@ ANDROID_API int WebViewFunctor_create(void* data, const WebViewFunctorCallbacks& // and it should be considered alive & active until that point. ANDROID_API void WebViewFunctor_release(int functor); +// Reports the list of threads critical for frame production for the given +// functor. Must be called on render thread. +ANDROID_API void WebViewFunctor_reportRenderingThreads(int functor, const int32_t* thread_ids, + size_t size); + } // namespace android::uirenderer #endif // FRAMEWORKS_BASE_WEBVIEWFUNCTOR_H diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h index 44fe56fcaf4bc4b703ea5e652a69473501b7df45..b865d0ebeb1f92b03b28bd09aaaa754f9d123e03 100644 --- a/native/webview/plat_support/draw_fn.h +++ b/native/webview/plat_support/draw_fn.h @@ -23,7 +23,8 @@ extern "C" { // 1 is Android Q. This matches kAwDrawGLInfoVersion version 3. // 2 Adds transfer_function_* and color_space_toXYZD50 to AwDrawFn_DrawGLParams. // 3 Adds SurfaceControl related functions. -static const int kAwDrawFnVersion = 3; +// 4 Adds AwDrawFn_ReportRenderingThreads to AwDrawFnFunctionTable. +static const int kAwDrawFnVersion = 4; // Returns parent ASurfaceControl for WebView overlays. It will be have same // geometry as the surface we draw into and positioned below it (underlay). @@ -268,6 +269,10 @@ typedef int AwDrawFn_CreateFunctor_v3( // released, and it should be considered alive & active until that point. typedef void AwDrawFn_ReleaseFunctor(int functor); +// Report the list of threads critical for frame production for the given +// functor. Must be called on render thread. +typedef void AwDrawFn_ReportRenderingThreads(int functor, const int32_t* thread_ids, size_t size); + struct AwDrawFnFunctionTable { int version; AwDrawFn_QueryRenderMode* query_render_mode; @@ -276,6 +281,8 @@ struct AwDrawFnFunctionTable { AwDrawFn_ReleaseFunctor* release_functor; // Added in version 3. AwDrawFn_CreateFunctor_v3* create_functor_v3; + // Added in version 4. + AwDrawFn_ReportRenderingThreads* report_rendering_threads; }; #ifdef __cplusplus diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp index 1584350bb6f1229af690e80d87d605e6096ec20d..5d3e24c382bf7de83b02a2bff46100c004e0c35b 100644 --- a/native/webview/plat_support/draw_functor.cpp +++ b/native/webview/plat_support/draw_functor.cpp @@ -290,15 +290,20 @@ AwDrawFnRenderMode QueryRenderMode(void) { } } +void ReportRenderingThreads(int functor, const int32_t* thread_ids, size_t size) { + uirenderer::WebViewFunctor_reportRenderingThreads(functor, thread_ids, size); +} + jlong GetDrawFnFunctionTable() { - static AwDrawFnFunctionTable function_table = { - .version = kAwDrawFnVersion, - .query_render_mode = &QueryRenderMode, - .create_functor = &CreateFunctor, - .release_functor = &ReleaseFunctor, - .create_functor_v3 = &CreateFunctor_v3, - }; - return reinterpret_cast<intptr_t>(&function_table); + static AwDrawFnFunctionTable function_table = { + .version = kAwDrawFnVersion, + .query_render_mode = &QueryRenderMode, + .create_functor = &CreateFunctor, + .release_functor = &ReleaseFunctor, + .create_functor_v3 = &CreateFunctor_v3, + .report_rendering_threads = &ReportRenderingThreads, + }; + return reinterpret_cast<intptr_t>(&function_table); } const char kClassName[] = "com/android/webview/chromium/DrawFunctor";