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