author | baocheng sun <baocheng.sun@amlogic.com> | 2019-12-24 06:14:56 (GMT) |
---|---|---|
committer | sky zhou <sky.zhou@amlogic.com> | 2020-05-21 11:10:07 (GMT) |
commit | 0250e75ebab1e04d848f0fc3232e3e5de00a51cb (patch) | |
tree | 215adc049985acb1688f1bc95baf51c88b777220 | |
parent | 734918da9d1ec127eedc10a54ce408752443236c (diff) | |
download | hwcomposer-0250e75ebab1e04d848f0fc3232e3e5de00a51cb.zip hwcomposer-0250e75ebab1e04d848f0fc3232e3e5de00a51cb.tar.gz hwcomposer-0250e75ebab1e04d848f0fc3232e3e5de00a51cb.tar.bz2 |
hwc: change the behavior of composerLayer [2/3]
PD#SWPL-18099
Problem:
When playing a 4k video and press back in YouTube, SurfaceView will not
be destroyed. And in composer service process, there is a composerLayer.
CompserLayer has a ComposerHandleCache which will hold the graphic
buffer handles cached in it and lead to ion orphaned memory.
Solution:
Change the behavior of composerLayer.
Verify:
Verify on newton
Change-Id: I42f952c61826588c283bd3363fbfef6df444f7f6
Signed-off-by: baocheng sun <baocheng.sun@amlogic.com>
-rw-r--r-- | service/2.1/utils/hal/Android.bp | 6 | ||||
-rw-r--r-- | service/2.1/utils/hal/include/composer-hal/2.1/ComposerResources.h | 81 | ||||
-rw-r--r-- | service/2.1/utils/passthrough/Android.bp | 6 | ||||
-rw-r--r-- | service/2.2/utils/passthrough/Android.bp | 6 | ||||
-rw-r--r-- | service/2.3/default/Android.bp | 8 | ||||
-rw-r--r-- | service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.rc (renamed from service/2.3/default/android.hardware.graphics.composer@2.3-service.rc) | 2 | ||||
-rw-r--r-- | service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.xml | 11 | ||||
-rw-r--r-- | service/2.3/utils/passthrough/Android.bp | 6 |
8 files changed, 109 insertions, 17 deletions
diff --git a/service/2.1/utils/hal/Android.bp b/service/2.1/utils/hal/Android.bp index 7a501fc..45831a1 100644 --- a/service/2.1/utils/hal/Android.bp +++ b/service/2.1/utils/hal/Android.bp @@ -14,20 +14,22 @@ // limitations under the License. cc_library_headers { - name: "android.hardware.graphics.composer@2.1-hal", + name: "android.hardware.graphics.composer@2.1-hal-vendor", defaults: ["hidl_defaults"], - vendor_available: true, + vendor: true, shared_libs: [ "android.hardware.graphics.composer@2.1", "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.mapper@3.0", "libhardware", // TODO remove hwcomposer2.h dependency + "libamgralloc_ext_vendor@2", ], export_shared_lib_headers: [ "android.hardware.graphics.composer@2.1", "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.mapper@3.0", "libhardware", + "libamgralloc_ext_vendor@2", ], header_libs: [ "android.hardware.graphics.composer@2.1-command-buffer", diff --git a/service/2.1/utils/hal/include/composer-hal/2.1/ComposerResources.h b/service/2.1/utils/hal/include/composer-hal/2.1/ComposerResources.h index 18d184e..2a06130 100644 --- a/service/2.1/utils/hal/include/composer-hal/2.1/ComposerResources.h +++ b/service/2.1/utils/hal/include/composer-hal/2.1/ComposerResources.h @@ -29,6 +29,8 @@ #include <android/hardware/graphics/mapper/3.0/IMapper.h> #include <log/log.h> +#include "am_gralloc_ext.h" + namespace android { namespace hardware { namespace graphics { @@ -131,6 +133,19 @@ class ComposerHandleCache { STREAM, }; + enum class DrmFbType { + DRM_FB_UNDEFINED = 0, + // scattered buffer, can be used for rendering. + DRM_FB_RENDER = 1, + // contiguous buffer, can be used for scanout. + DRM_FB_SCANOUT, + // no image data, fill with color. + DRM_FB_DIM, + // video type, used for video. + DRM_FB_VIDEO, + DRM_FB_VIDEO_OVERLAY, + }; + ComposerHandleCache(ComposerHandleImporter& importer, HandleType type, uint32_t cacheSize) : mImporter(importer), mHandleType(type), mHandles(cacheSize, nullptr) {} @@ -190,21 +205,83 @@ class ComposerHandleCache { } } + // release cache + Error releaseCache(uint32_t slot) { + if (slot >= 0 && slot < mHandles.size()) { + slot++; + switch (mHandleType) { + case HandleType::BUFFER: + for (; slot < mHandles.size(); slot++) { + if (mHandles[slot]) + mImporter.freeBuffer(mHandles[slot]); + mHandles[slot] = nullptr; + } + break; + case HandleType::STREAM: + for (; slot < mHandles.size(); slot++) { + if (mHandles[slot]) + mImporter.freeStream(mHandles[slot]); + mHandles[slot] = nullptr; + } + break; + default: + break; + } + return Error::NONE; + } else { + return Error::BAD_PARAMETER; + } + } + + bool isChangedFromeVideoToUi(const native_handle_t* handle) { + bool changed = false; + if (am_gralloc_is_omx_v4l_buffer(handle) || am_gralloc_is_omx2_v4l2_buffer(handle) || + am_gralloc_is_omx_metadata_buffer(handle)) { + mFbType = DrmFbType::DRM_FB_VIDEO; + } else if (am_gralloc_is_overlay_buffer(handle)) { + mFbType = DrmFbType::DRM_FB_VIDEO_OVERLAY; + } else if (am_gralloc_get_width(handle) <= 1 && am_gralloc_get_height(handle) <= 1) { + mFbType = DrmFbType::DRM_FB_DIM; + } else if (am_gralloc_is_coherent_buffer(handle)) { + if (mFbType == DrmFbType::DRM_FB_VIDEO) { + changed = true; + } + mFbType = DrmFbType::DRM_FB_SCANOUT; + } else { + if (mFbType == DrmFbType::DRM_FB_VIDEO) { + changed = true; + } + mFbType = DrmFbType::DRM_FB_RENDER; + } + return changed; + } + // when fromCache is true, look up in the cache; otherwise, update the cache Error getHandle(uint32_t slot, bool fromCache, const native_handle_t* inHandle, const native_handle_t** outHandle, const native_handle** outReplacedHandle) { + + Error error = Error::NONE; if (fromCache) { *outReplacedHandle = nullptr; - return lookupCache(slot, outHandle); + error = lookupCache(slot, outHandle); } else { *outHandle = inHandle; - return updateCache(slot, inHandle, outReplacedHandle); + error = updateCache(slot, inHandle, outReplacedHandle); } + + if (mHandleType == HandleType::BUFFER) { + bool changed = isChangedFromeVideoToUi(*outHandle); + if (changed) + releaseCache(slot); + } + + return error; } private: ComposerHandleImporter& mImporter; HandleType mHandleType = HandleType::INVALID; + DrmFbType mFbType = DrmFbType::DRM_FB_UNDEFINED; std::vector<const native_handle_t*> mHandles; }; diff --git a/service/2.1/utils/passthrough/Android.bp b/service/2.1/utils/passthrough/Android.bp index 4d3c976..077b70a 100644 --- a/service/2.1/utils/passthrough/Android.bp +++ b/service/2.1/utils/passthrough/Android.bp @@ -1,5 +1,5 @@ cc_library_headers { - name: "android.hardware.graphics.composer@2.1-passthrough", + name: "android.hardware.graphics.composer@2.1-passthrough-vendor", defaults: ["hidl_defaults"], vendor: true, shared_libs: [ @@ -13,10 +13,10 @@ cc_library_headers { "libhwc2onfbadapter", ], header_libs: [ - "android.hardware.graphics.composer@2.1-hal", + "android.hardware.graphics.composer@2.1-hal-vendor", ], export_header_lib_headers: [ - "android.hardware.graphics.composer@2.1-hal", + "android.hardware.graphics.composer@2.1-hal-vendor", ], export_include_dirs: ["include"], } diff --git a/service/2.2/utils/passthrough/Android.bp b/service/2.2/utils/passthrough/Android.bp index 318ce91..523206c 100644 --- a/service/2.2/utils/passthrough/Android.bp +++ b/service/2.2/utils/passthrough/Android.bp @@ -1,13 +1,13 @@ cc_library_headers { - name: "android.hardware.graphics.composer@2.2-passthrough", + name: "android.hardware.graphics.composer@2.2-passthrough-vendor", defaults: ["hidl_defaults"], vendor: true, header_libs: [ - "android.hardware.graphics.composer@2.1-passthrough", + "android.hardware.graphics.composer@2.1-passthrough-vendor", "android.hardware.graphics.composer@2.2-hal", ], export_header_lib_headers: [ - "android.hardware.graphics.composer@2.1-passthrough", + "android.hardware.graphics.composer@2.1-passthrough-vendor", "android.hardware.graphics.composer@2.2-hal", ], export_include_dirs: ["include"], diff --git a/service/2.3/default/Android.bp b/service/2.3/default/Android.bp index 07afd6c..2efae69 100644 --- a/service/2.3/default/Android.bp +++ b/service/2.3/default/Android.bp @@ -15,14 +15,15 @@ // cc_binary { - name: "android.hardware.graphics.composer@2.3-service", + name: "android.hardware.graphics.composer@2.3-service.droidlogic", defaults: ["hidl_defaults"], vendor: true, relative_install_path: "hw", srcs: ["service.cpp"], - init_rc: ["android.hardware.graphics.composer@2.3-service.rc"], + vintf_fragments: ["android.hardware.graphics.composer@2.3-service.droidlogic.xml"], + init_rc: ["android.hardware.graphics.composer@2.3-service.droidlogic.rc"], header_libs: [ - "android.hardware.graphics.composer@2.3-passthrough", + "android.hardware.graphics.composer@2.3-passthrough-vendor", ], shared_libs: [ "android.hardware.graphics.composer@2.1", @@ -42,5 +43,6 @@ cc_binary { "liblog", "libsync", "libutils", + "libamgralloc_ext_vendor@2", ], } diff --git a/service/2.3/default/android.hardware.graphics.composer@2.3-service.rc b/service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.rc index 81ce890..38d5c65 100644 --- a/service/2.3/default/android.hardware.graphics.composer@2.3-service.rc +++ b/service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.rc @@ -1,4 +1,4 @@ -service vendor.hwcomposer-2-3 /vendor/bin/hw/android.hardware.graphics.composer@2.3-service +service vendor.hwcomposer-2-3 /vendor/bin/hw/android.hardware.graphics.composer@2.3-service.droidlogic class hal animation user system group graphics drmrpc diff --git a/service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.xml b/service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.xml new file mode 100644 index 0000000..07bb8d7 --- a/dev/null +++ b/service/2.3/default/android.hardware.graphics.composer@2.3-service.droidlogic.xml @@ -0,0 +1,11 @@ +<manifest version="1.0" type="device"> + <hal format="hidl"> + <name>android.hardware.graphics.composer</name> + <transport>hwbinder</transport> + <version>2.3</version> + <interface> + <name>IComposer</name> + <instance>default</instance> + </interface> + </hal> +</manifest> diff --git a/service/2.3/utils/passthrough/Android.bp b/service/2.3/utils/passthrough/Android.bp index 3ae6b16..d6fbe69 100644 --- a/service/2.3/utils/passthrough/Android.bp +++ b/service/2.3/utils/passthrough/Android.bp @@ -15,15 +15,15 @@ // cc_library_headers { - name: "android.hardware.graphics.composer@2.3-passthrough", + name: "android.hardware.graphics.composer@2.3-passthrough-vendor", defaults: ["hidl_defaults"], vendor: true, header_libs: [ - "android.hardware.graphics.composer@2.2-passthrough", + "android.hardware.graphics.composer@2.2-passthrough-vendor", "android.hardware.graphics.composer@2.3-hal", ], export_header_lib_headers: [ - "android.hardware.graphics.composer@2.2-passthrough", + "android.hardware.graphics.composer@2.2-passthrough-vendor", "android.hardware.graphics.composer@2.3-hal", ], export_include_dirs: ["include"], |