1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2008 The Android Open Source Project
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Not a Contribution, Apache license notifications and license are retained
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * for attribution purposes only.
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License.
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License.
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby*/
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayUtils.h"
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "overlayRotator.h"
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
23b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace ovutils = overlay::utils;
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
25b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace overlay {
26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
27b166940edca6e312463461438e2aa66e9852c26aBenoit GobyMdpRot::MdpRot() {
28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    reset();
29b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    init();
30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
32b166940edca6e312463461438e2aa66e9852c26aBenoit GobyMdpRot::~MdpRot() { close(); }
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
34b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::enabled() const { return mRotImgInfo.enable; }
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
36b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setRotations(uint32_t r) { mRotImgInfo.rotations = r; }
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
38b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint MdpRot::getDstMemId() const {
39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return mRotDataInfo.dst.memory_id;
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
42b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::getDstOffset() const {
43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return mRotDataInfo.dst.offset;
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
46b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::getDstFormat() const {
47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return mRotImgInfo.dst.format;
48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
50b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::getSessId() const { return mRotImgInfo.session_id; }
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
52b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setDownscale(int ds) {
53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if ((utils::ROT_DS_EIGHTH == ds) && (mRotImgInfo.src_rect.h & 0xF)) {
54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // Ensure src_rect.h is a multiple of 16 for 1/8 downscaling.
55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // This is an undocumented MDP Rotator constraint.
56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotImgInfo.src_rect.h = utils::aligndown(mRotImgInfo.src_rect.h, 16);
57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.downscale_ratio = ds;
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
61b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::save() {
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mLSRotImgInfo = mRotImgInfo;
63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
65b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::rotConfChanged() const {
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // 0 means same
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(0 == ::memcmp(&mRotImgInfo, &mLSRotImgInfo,
68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                sizeof (msm_rotator_img_info))) {
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
74b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::init()
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!mFd.open(Res::rotPath, O_RDWR)){
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("MdpRot failed to init %s", Res::rotPath);
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
83b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setSource(const overlay::utils::Whf& awhf) {
84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    utils::Whf whf(awhf);
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.src.format = whf.format;
86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.src.width = whf.w;
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.src.height = whf.h;
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.src_rect.w = whf.w;
91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.src_rect.h = whf.h;
92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.dst.width = whf.w;
94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.dst.height = whf.h;
95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
97b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setFlags(const utils::eMdpFlags& flags) {
98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotImgInfo.secure = 0;
99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(flags & utils::OV_MDP_SECURE_OVERLAY_SESSION)
100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotImgInfo.secure = 1;
101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
103b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::setTransform(const utils::eTransform& rot)
104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int r = utils::getMdpOrient(rot);
106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    setRotations(r);
107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //getMdpOrient will switch the flips if the source is 90 rotated.
108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Clients in Android dont factor in 90 rotation while deciding the flip.
109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOrientation = static_cast<utils::eTransform>(r);
110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE_IF(DEBUG_OVERLAY, "%s: r=%d", __FUNCTION__, r);
111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
113b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::doTransform() {
114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(mOrientation & utils::OVERLAY_TRANSFORM_ROT_90)
115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        utils::swap(mRotImgInfo.dst.width, mRotImgInfo.dst.height);
116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
118b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::commit() {
119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    doTransform();
120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(rotConfChanged()) {
121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotImgInfo.enable = 1;
122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(!overlay::mdp_wrapper::startRotator(mFd.getFD(), mRotImgInfo)) {
123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("MdpRot commit failed");
124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            dump();
125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mRotImgInfo.enable = 0;
126b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
127b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        save();
129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotDataInfo.session_id = mRotImgInfo.session_id;
130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
134b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyuint32_t MdpRot::calcOutputBufSize() {
135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::Whf destWhf(mRotImgInfo.dst.width,
136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            mRotImgInfo.dst.height, mRotImgInfo.dst.format);
137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return Rotator::calcOutputBufSize(destWhf);
138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
140b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::open_i(uint32_t numbufs, uint32_t bufsz)
141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
142b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OvMem mem;
143b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i");
145b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!mem.open(numbufs, bufsz, mRotImgInfo.secure)){
147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("%s: Failed to open", __func__);
148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mem.close();
149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
151b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVASSERT(MAP_FAILED != mem.addr(), "MAP failed");
153b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVASSERT(mem.getFD() != -1, "getFd is -1");
154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotDataInfo.dst.memory_id = mem.getFD();
156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mRotDataInfo.dst.offset = 0;
157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mMem.curr().m = mem;
158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
161b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::close() {
162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool success = true;
163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(mFd.valid() && (getSessId() != 0)) {
164b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(!mdp_wrapper::endRotator(mFd.getFD(), getSessId())) {
165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("Mdp Rot error endRotator, fd=%d sessId=%u",
166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                    mFd.getFD(), getSessId());
167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            success = false;
168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!mFd.close()) {
171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("Mdp Rot error closing fd");
172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        success = false;
173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!mMem.close()) {
175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("Mdp Rot error closing mem");
176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        success = false;
177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    reset();
179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return success;
180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
182b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::remap(uint32_t numbufs) {
183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // if current size changed, remap
184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    uint32_t opBufSize = calcOutputBufSize();
185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(opBufSize == mMem.curr().size()) {
186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE_IF(DEBUG_OVERLAY, "%s: same size %d", __FUNCTION__, opBufSize);
187b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return true;
188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE_IF(DEBUG_OVERLAY, "%s: size changed - remapping", __FUNCTION__);
191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    OVASSERT(!mMem.prev().valid(), "Prev should not be valid");
192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // ++mMem will make curr to be prev, and prev will be curr
194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ++mMem;
195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!open_i(numbufs, opBufSize)) {
196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("%s Error could not open", __FUNCTION__);
197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
198b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    for (uint32_t i = 0; i < numbufs; ++i) {
200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mMem.curr().mRotOffset[i] = i * opBufSize;
201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
205b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::reset() {
206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::memset0(mRotImgInfo);
207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::memset0(mLSRotImgInfo);
208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::memset0(mRotDataInfo);
209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::memset0(mMem.curr().mRotOffset);
210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::memset0(mMem.prev().mRotOffset);
211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mMem.curr().mCurrOffset = 0;
212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mMem.prev().mCurrOffset = 0;
213b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mOrientation = utils::OVERLAY_TRANSFORM_0;
214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
215b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
216b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool MdpRot::queueBuffer(int fd, uint32_t offset) {
217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(enabled()) {
218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotDataInfo.src.memory_id = fd;
219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotDataInfo.src.offset = offset;
220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        remap(RotMem::Mem::ROT_NUM_BUFS);
222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        OVASSERT(mMem.curr().m.numBufs(),
223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                "queueBuffer numbufs is 0");
224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mRotDataInfo.dst.offset =
225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                mMem.curr().mRotOffset[mMem.curr().mCurrOffset];
226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mMem.curr().mCurrOffset =
227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                (mMem.curr().mCurrOffset + 1) % mMem.curr().m.numBufs();
228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(!overlay::mdp_wrapper::rotate(mFd.getFD(), mRotDataInfo)) {
230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("MdpRot failed rotate");
231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            dump();
232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // if the prev mem is valid, we need to close
236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(mMem.prev().valid()) {
237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            // FIXME if no wait for vsync the above
238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            // play will return immediatly and might cause
239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            // tearing when prev.close is called.
240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            if(!mMem.prev().close()) {
241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ALOGE("%s error in closing prev rot mem", __FUNCTION__);
242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                return false;
243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            }
244b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return true;
247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
249b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::dump() const {
250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpRot start ==");
251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mFd.dump();
252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mMem.curr().m.dump();
253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mdp_wrapper::dump("mRotImgInfo", mRotImgInfo);
254b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mdp_wrapper::dump("mRotDataInfo", mRotDataInfo);
255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGE("== Dump MdpRot end ==");
256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
258b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid MdpRot::getDump(char *buf, size_t len) const {
259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::getDump(buf, len, "MdpRotCtrl(msm_rotator_img_info)", mRotImgInfo);
260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::getDump(buf, len, "MdpRotData(msm_rotator_data_info)", mRotDataInfo);
261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} // namespace overlay
264