From b4684bce38db3ad03ab3f52ce5177246408b7f3f Mon Sep 17 00:00:00 2001 From: Naseer Ahmed Date: Mon, 14 Nov 2011 14:32:10 -0800 Subject: [PATCH] overlay: Enable ION for rotator Change-Id: I08f1cd0f8d49812ba8723a137913e386365c946a --- liboverlay/Android.mk | 12 +++++++--- liboverlay/overlayLib.cpp | 48 +++++++++++++++++++++++++++++++++++-- liboverlay/overlayLib.h | 5 ++++ liboverlay/overlayLibUI.cpp | 32 +++++++++++++++++++++++++ liboverlay/overlayLibUI.h | 9 ++++++- 5 files changed, 100 insertions(+), 6 deletions(-) diff --git a/liboverlay/Android.mk b/liboverlay/Android.mk index a257de2..0f3512c 100644 --- a/liboverlay/Android.mk +++ b/liboverlay/Android.mk @@ -19,14 +19,20 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES) -LOCAL_SHARED_LIBRARIES := liblog libcutils +LOCAL_SHARED_LIBRARIES := liblog libcutils libutils LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -LOCAL_C_INCLUDES += hardware/msm7k/libgralloc-qsd8k +LOCAL_C_INCLUDES += hardware/qcom/display/libgralloc LOCAL_SRC_FILES := \ overlayLib.cpp \ overlayLibUI.cpp \ LOCAL_CFLAGS:= -DLOG_TAG=\"OverlayLib\" + +ifeq ($(TARGET_USES_ION),true) + LOCAL_CFLAGS += -DUSE_ION + LOCAL_SHARED_LIBRARIES += libmemalloc +endif + ifeq ($(TARGET_USE_HDMI_AS_PRIMARY),true) LOCAL_CFLAGS += -DHDMI_AS_PRIMARY endif @@ -41,7 +47,7 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_SHARED_LIBRARIES := liblog liboverlay libcutils LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -LOCAL_C_INCLUDES += hardware/msm7k/libgralloc-qsd8k +LOCAL_C_INCLUDES += hardware/qcom/display/libgralloc LOCAL_SRC_FILES := overlay.cpp LOCAL_MODULE := overlay.default include $(BUILD_SHARED_LIBRARY) diff --git a/liboverlay/overlayLib.cpp b/liboverlay/overlayLib.cpp index 1f599a2..f0db551 100644 --- a/liboverlay/overlayLib.cpp +++ b/liboverlay/overlayLib.cpp @@ -26,6 +26,10 @@ static inline size_t ALIGN(size_t x, size_t align) { } using namespace overlay; +using android::sp; +using gralloc::IMemAlloc; +using gralloc::IonController; +using gralloc::alloc_data; #ifdef HDMI_AS_PRIMARY bool Overlay::sHDMIAsPrimary = true; @@ -1406,7 +1410,11 @@ bool OverlayControlChannel::getSize(int& size) const { } OverlayDataChannel::OverlayDataChannel() : mNoRot(false), mFD(-1), mRotFD(-1), - mPmemFD(-1), mPmemAddr(0), mUpdateDataChannel(0) { + mPmemFD(-1), mPmemAddr(0), mUpdateDataChannel(0) +{ +#ifdef USE_ION + mAlloc = gralloc::IAllocController::getInstance(); +#endif } OverlayDataChannel::~OverlayDataChannel() { @@ -1462,6 +1470,30 @@ bool OverlayDataChannel::mapRotatorMemory(int num_buffers, bool uiChannel, int r { mPmemAddr = MAP_FAILED; +#ifdef USE_ION + alloc_data data; + data.base = 0; + data.fd = -1; + data.offset = 0; + data.size = mPmemOffset * num_buffers; + data.align = getpagesize(); + data.uncached = true; + + int err = mAlloc->allocate(data, GRALLOC_USAGE_PRIVATE_ADSP_HEAP| + GRALLOC_USAGE_PRIVATE_SMI_HEAP, 0); + if(err) { + reportError("Cant allocate from ION"); + close(mFD); + mFD = -1; + close(mRotFD); + mRotFD = -1; + return false; + } + mPmemFD = data.fd; + mPmemAddr = data.base; + mBufferType = data.allocType; +#else + if((requestType == NEW_REQUEST) && !uiChannel) { mPmemFD = open("/dev/pmem_smipool", O_RDWR | O_SYNC); if(mPmemFD >= 0) @@ -1493,6 +1525,7 @@ bool OverlayDataChannel::mapRotatorMemory(int num_buffers, bool uiChannel, int r } } } +#endif // Set this flag if source memory is fb if(uiChannel) mRotData.src.flags |= MDP_MEMORY_ID_TYPE_FB; @@ -1537,8 +1570,13 @@ bool OverlayDataChannel::closeDataChannel() { return true; if (!mNoRot && mRotFD > 0) { +#ifdef USE_ION + sp memalloc = mAlloc->getAllocator(mBufferType); + memalloc->free_buffer(mPmemAddr, mPmemOffset * mNumBuffers, 0, mPmemFD); +#else munmap(mPmemAddr, mPmemOffset * mNumBuffers); - + close(mPmemFD); +#endif close(mPmemFD); mPmemFD = -1; close(mRotFD); @@ -1591,8 +1629,14 @@ bool OverlayDataChannel::queueBuffer(uint32_t offset) { // Unmap the old PMEM memory after the queueBuffer has returned if (oldPmemFD != -1 && oldPmemAddr != MAP_FAILED) { +#ifdef USE_ION + sp memalloc = mAlloc->getAllocator(mBufferType); + memalloc->free_buffer(oldPmemAddr, oldPmemOffset * mNumBuffers, 0, oldPmemFD); +#else munmap(oldPmemAddr, oldPmemOffset * mNumBuffers); close(oldPmemFD); +#endif + oldPmemFD = -1; } return result; diff --git a/liboverlay/overlayLib.h b/liboverlay/overlayLib.h index 1402037..0ad92ce 100644 --- a/liboverlay/overlayLib.h +++ b/liboverlay/overlayLib.h @@ -40,6 +40,9 @@ #include #include #include +#include +#include +#include #define HW_OVERLAY_MAGNIFICATION_LIMIT 8 #define HW_OVERLAY_MINIFICATION_LIMIT HW_OVERLAY_MAGNIFICATION_LIMIT @@ -215,6 +218,8 @@ class OverlayDataChannel { int mCurrentItem; int mNumBuffers; int mUpdateDataChannel; + android::sp mAlloc; + int mBufferType; bool openDevices(int fbnum = -1, bool uichannel = false, int num_buffers = 2); bool mapRotatorMemory(int num_buffers, bool uiChannel, int requestType); diff --git a/liboverlay/overlayLibUI.cpp b/liboverlay/overlayLibUI.cpp index ccd97c0..dd19cd9 100644 --- a/liboverlay/overlayLibUI.cpp +++ b/liboverlay/overlayLibUI.cpp @@ -19,6 +19,10 @@ #include "gralloc_priv.h" #define LOG_TAG "OverlayUI" +using android::sp; +using gralloc::IMemAlloc; +using gralloc::alloc_data; + namespace { /* helper functions */ bool checkOVState(int w, int h, int format, int orientation, @@ -315,6 +319,27 @@ status_t Rotator::startRotSession(msm_rotator_img_info& rotInfo, return NO_INIT; } +#ifdef USE_ION + alloc_data data; + data.base = 0; + data.fd = -1; + data.offset = 0; + data.size = mSize * mNumBuffers; + data.align = getpagesize(); + data.uncached = true; + + int err = mAlloc->allocate(data, GRALLOC_USAGE_PRIVATE_ADSP_HEAP| + GRALLOC_USAGE_PRIVATE_SMI_HEAP, 0); + + if(err) { + LOGE("Cant allocate from ION"); + closeRotSession(); + return NO_INIT; + } + mPmemFD = data.fd; + mPmemAddr = data.base; + mBufferType = data.allocType; +#else mSessionID = rotInfo.session_id; mPmemFD = open("/dev/pmem_adsp", O_RDWR | O_SYNC); if (mPmemFD < 0) { @@ -329,6 +354,7 @@ status_t Rotator::startRotSession(msm_rotator_img_info& rotInfo, closeRotSession(); return NO_INIT; } +#endif mCurrentItem = 0; for (int i = 0; i < mNumBuffers; i++) @@ -343,8 +369,14 @@ status_t Rotator::closeRotSession() { if (mSessionID != NO_INIT && mFD != NO_INIT) { ioctl(mFD, MSM_ROTATOR_IOCTL_FINISH, &mSessionID); close(mFD); +#ifdef USE_ION + sp memalloc = mAlloc->getAllocator(mBufferType); + memalloc->free_buffer(mPmemAddr, mSize * mNumBuffers, 0, mPmemFD); +#else munmap(mPmemAddr, mSize * mNumBuffers); close(mPmemFD); +#endif + close(mPmemFD); } mFD = NO_INIT; diff --git a/liboverlay/overlayLibUI.h b/liboverlay/overlayLibUI.h index a044df6..2cb1ffe 100644 --- a/liboverlay/overlayLibUI.h +++ b/liboverlay/overlayLibUI.h @@ -101,11 +101,18 @@ class Rotator { int mCurrentItem; int mNumBuffers; int mSize; + android::sp mAlloc; + int mBufferType; Rotator(const Rotator& objROtator); Rotator& operator=(const Rotator& objRotator); public: - explicit Rotator() : mFD(NO_INIT), mSessionID(NO_INIT), mPmemFD(-1) { }; + explicit Rotator() : mFD(NO_INIT), mSessionID(NO_INIT), mPmemFD(-1) + { +#ifdef USE_ION + mAlloc = gralloc::IAllocController::getInstance(); +#endif + } ~Rotator() { closeRotSession(); } status_t startRotSession(msm_rotator_img_info& rotInfo, int size, int numBuffers = max_num_buffers);