summaryrefslogtreecommitdiff
authorbaocheng 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)
commit0250e75ebab1e04d848f0fc3232e3e5de00a51cb (patch)
tree215adc049985acb1688f1bc95baf51c88b777220
parent734918da9d1ec127eedc10a54ce408752443236c (diff)
downloadhwcomposer-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>
Diffstat
-rw-r--r--service/2.1/utils/hal/Android.bp6
-rw-r--r--service/2.1/utils/hal/include/composer-hal/2.1/ComposerResources.h81
-rw-r--r--service/2.1/utils/passthrough/Android.bp6
-rw-r--r--service/2.2/utils/passthrough/Android.bp6
-rw-r--r--service/2.3/default/Android.bp8
-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.xml11
-rw-r--r--service/2.3/utils/passthrough/Android.bp6
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"],