OverlayPlaneBase.cpp revision 927f4c04efeec7f2f63bbf10dd6552bc4b65317f
1d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu/*
2d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Copyright © 2012 Intel Corporation
3d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * All rights reserved.
4d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *
5d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Permission is hereby granted, free of charge, to any person obtaining a
6d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * copy of this software and associated documentation files (the "Software"),
7d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * to deal in the Software without restriction, including without limitation
8d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * and/or sell copies of the Software, and to permit persons to whom the
10d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Software is furnished to do so, subject to the following conditions:
11d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *
12d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * The above copyright notice and this permission notice (including the next
13d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * paragraph) shall be included in all copies or substantial portions of the
14d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Software.
15d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *
16d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * IN THE SOFTWARE.
23d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *
24d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu * Authors:
25d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *    Jackie Li <yaodong.li@intel.com>
26d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu *
27d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu */
28d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
29d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <math.h>
30d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <HwcTrace.h>
31d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <Drm.h>
32d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <Hwcomposer.h>
33d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/OverlayPlaneBase.h>
34d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/TTMBufferMapper.h>
35d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <common/GrallocSubBuffer.h>
36d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
37d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu// FIXME: remove it
38d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu#include <OMX_IVCommon.h>
39d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
40d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace android {
41d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiunamespace intel {
42d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
43d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::OverlayPlaneBase(int index, int disp)
44d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    : DisplayPlane(index, PLANE_OVERLAY, disp),
45d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mTTMBuffers(),
46d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mBackBuffer(0),
47d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mWsbm(0),
48d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu      mPipeConfig(0)
49d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
50d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
51d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
52d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
53d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayPlaneBase::~OverlayPlaneBase()
54d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
55d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
56d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    deinitialize();
57d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
58d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
59d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::initialize(uint32_t bufferCount)
60d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
61d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
62d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
63d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
64d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!drm) {
65d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to get drm");
66d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
67d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
68d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
69d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // NOTE: use overlay's data buffer count for a overlay plane
70d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mTTMBuffers.setCapacity(overlayDataBufferCount);
71d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
72d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // init wsbm
73d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mWsbm = new Wsbm(drm->getDrmFd());
74d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mWsbm || !mWsbm->initialize()) {
75d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        DEINIT_AND_RETURN_FALSE("failed to create wsbm");
76d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
77d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
78d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // create overlay back buffer
79d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mBackBuffer = createBackBuffer();
80d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mBackBuffer) {
81d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        DEINIT_AND_RETURN_FALSE("failed to create overlay back buffer");
82d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
83d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
84d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // reset back buffer
85d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    resetBackBuffer();
86d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
87d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!DisplayPlane::initialize(overlayDataBufferCount)) {
88d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        DEINIT_AND_RETURN_FALSE("failed to initialize display plane");
89d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
90d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
91d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
92d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
93d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deinitialize()
94d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
95d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    DisplayPlane::deinitialize();
96d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
97d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // delete back buffer
98d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    deleteBackBuffer();
99d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
100d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // delete wsbm
101d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (mWsbm) {
102d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        delete mWsbm;
103d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mWsbm = 0;
104d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
105d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
106d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
107d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::invalidateBufferCache()
108d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
109d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    BufferMapper* mapper;
110d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
111d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // clear plane buffer cache
112d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    DisplayPlane::invalidateBufferCache();
113d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
114d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // clear TTM buffer cache
115d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    for (size_t i = 0; i < mTTMBuffers.size(); i++) {
116d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mapper = mTTMBuffers.valueAt(i);
117d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // put it
118d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (mapper)
119d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            putTTMMapper(mapper);
120d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
121d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
122d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
123d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::assignToDevice(int disp)
124d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
125d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t pipeConfig = 0;
126d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
127d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
128d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ATRACE("disp = %d", disp);
129d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
130d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch (disp) {
131d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case IDisplayDevice::DEVICE_EXTERNAL:
132d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pipeConfig = (0x2 << 6);
133d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
134d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case IDisplayDevice::DEVICE_PRIMARY:
135d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    default:
136d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pipeConfig = 0;
137d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
138d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
139d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
140d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // if pipe switching happened, then disable overlay first
141d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (mPipeConfig != pipeConfig)
142d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        disable();
143d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
144d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mPipeConfig = pipeConfig;
145d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mDevice = disp;
146d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
147d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
148d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
149d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
150d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::setZOrderConfig(ZOrderConfig& config)
151d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
152d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
153d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
154d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
155d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::reset()
156d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
157d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
158d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
159d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // reset back buffer
160d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    resetBackBuffer();
161d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
162d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // flush
163d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    flush(FLUSH_NEEDED);
164d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
165d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
166d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
167d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::enable()
168d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
169d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
170d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
171d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
172d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer)
173d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
174d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
175d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (backBuffer->OCMD & 0x1)
176d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return true;
177d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
178d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD |= 0x1;
179d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
180d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // flush
181d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    flush(FLUSH_NEEDED);
182d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
183d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
184d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
185d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::disable()
186d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
187d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
188d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
189d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
190d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer)
191d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
192d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
193d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!(backBuffer->OCMD & 0x1))
194d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return true;
195d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
196d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD &= ~0x1;
197d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
198d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // flush
199d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    flush(FLUSH_NEEDED | WAIT_VBLANK);
200d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
201d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
202d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
203d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
204d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::flush(uint32_t flags)
205d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
206d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
207d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
208d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ATRACE("flags = %#x", flags);
209d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
210d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!drm) {
211d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to get drm");
212d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
213d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
214d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
215d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!flags && !(flags & FLUSH_NEEDED))
216d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
217d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
218d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    struct drm_psb_register_rw_arg arg;
219d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
220d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
221d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    arg.overlay_write_mask = 1;
222d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    arg.overlay_read_mask = 0;
223d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    arg.overlay.b_wms = 0;
224d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    arg.overlay.b_wait_vblank = (flags & WAIT_VBLANK) ? 1 : 0;
225d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    arg.overlay.OVADD = (mBackBuffer->gttOffsetInPage << 12);
226d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
227d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // pipe select
228d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    arg.overlay.OVADD |= mPipeConfig;
229d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (flags & UPDATE_COEF)
230d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        arg.overlay.OVADD |= 1;
231d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
232d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // issue ioctl
233d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret = drm->writeReadIoctl(DRM_PSB_REGISTER_RW, &arg, sizeof(arg));
234d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
235d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        WTRACE("overlay update failed with error code %d", ret);
236d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
237d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
238d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
239d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
240d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
241d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
242d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuOverlayBackBuffer* OverlayPlaneBase::createBackBuffer()
243d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
244d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int size;
245d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int alignment;
246d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    void *wsbmBufferObject;
247d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    void *virtAddr;
248d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t gttOffsetInPage;
249d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t handle;
250d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBuffer *backBuffer;
251d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret;
252d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
253d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
254d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
255d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    size = sizeof(OverlayBackBufferBlk);
256d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    alignment = 64 * 1024;
257d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    wsbmBufferObject = 0;
258d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = mWsbm->allocateTTMBuffer(size, alignment, &wsbmBufferObject);
259d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
260d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to allocate buffer");
261d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return 0;
262d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
263d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
264d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    virtAddr = mWsbm->getCPUAddress(wsbmBufferObject);
265d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    gttOffsetInPage = mWsbm->getGttOffset(wsbmBufferObject);
266d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
267d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // create back buffer
268d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer = (OverlayBackBuffer *)malloc(sizeof(OverlayBackBuffer));
269d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
270d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to allocate back buffer");
271d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        goto alloc_err;
272d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
273d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
274d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->buf = (OverlayBackBufferBlk *)virtAddr;
275d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->gttOffsetInPage = gttOffsetInPage;
276d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->bufObject = (uint32_t)wsbmBufferObject;
277d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
278d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("cpu %p, gtt %d", virtAddr, gttOffsetInPage);
279d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
280d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return backBuffer;
281d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiualloc_err:
282d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mWsbm->destroyTTMBuffer(wsbmBufferObject);
283d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return 0;
284d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
285d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
286d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::deleteBackBuffer()
287d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
288d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    void *wsbmBufferObject;
289d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret;
290d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
291d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mBackBuffer)
292d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
293d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
294d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    wsbmBufferObject = (void *)mBackBuffer->bufObject;
295d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = mWsbm->destroyTTMBuffer(wsbmBufferObject);
296d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
297d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        WTRACE("failed to delete back buffer");
298d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
299d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // free back buffer
300d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    free(mBackBuffer);
301d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mBackBuffer = 0;
302d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
303d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
304d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::resetBackBuffer()
305d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
306d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer;
307d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
308d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
309d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
310d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mBackBuffer)
311d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
312d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
313d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mBackBuffer->buf)
314d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
315d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
316d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer = mBackBuffer->buf;
317d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
318d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    memset(backBuffer, 0, sizeof(OverlayBackBufferBlk));
319d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
320d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /*reset overlay*/
321d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCLRC0 = (OVERLAY_INIT_CONTRAST << 18) |
322d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         (OVERLAY_INIT_BRIGHTNESS & 0xff);
323d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCLRC1 = OVERLAY_INIT_SATURATION;
324d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DCLRKV = OVERLAY_INIT_COLORKEY;
325d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DCLRKM = OVERLAY_INIT_COLORKEYMASK;
326d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCONFIG = 0;
327d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCONFIG |= (0x1 << 3);
328d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCONFIG |= (0x1 << 27);
329d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SCHRKEN &= ~(0x7 << 24);
330d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SCHRKEN |= 0xff;
331d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
332d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
333d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy QiuBufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper)
334d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
335d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    struct VideoPayloadBuffer *payload;
336d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t khandle;
337d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t w, h;
338d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t yStride, uvStride;
339d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    stride_t stride;
340d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int srcX, srcY, srcW, srcH;
341d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int tmp;
342d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
343d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    DataBuffer *buf;
344d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ssize_t index;
345d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    TTMBufferMapper *mapper;
346d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret;
347d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
348d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    payload = (struct VideoPayloadBuffer *)grallocMapper.getCpuAddress(SUB_BUFFER1);
349d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!payload) {
350d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid payload buffer");
351d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return 0;
352d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
353d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
354d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // init ttm buffer
355d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    khandle = payload->rotated_buffer_handle;
356d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    index = mTTMBuffers.indexOfKey(khandle);
357d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (index < 0) {
358d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        VTRACE("unmapped TTM buffer, will map it");
359d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        buf = new DataBuffer(khandle);
360d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!buf) {
361d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            ETRACE("failed to create buffer");
362d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            return 0;
363d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
364d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
365d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        w = payload->rotated_width;
366d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        h = payload->rotated_height;
367d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcX = grallocMapper.getCrop().x;
368d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcY = grallocMapper.getCrop().y;
369d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcW = grallocMapper.getCrop().w;
370d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        srcH = grallocMapper.getCrop().h;
371d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
372d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (mTransform == PLANE_TRANSFORM_90 || mTransform == PLANE_TRANSFORM_270) {
373d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tmp = srcH;
374d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcH = srcW;
375d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcW = tmp;
376d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
377d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tmp = srcX;
378d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcX = srcY;
379d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcY = tmp;
380d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
381d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
382d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // skip pading bytes in rotate buffer
383d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        switch(mTransform) {
384d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case PLANE_TRANSFORM_90:
385d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcX += ((srcW + 0xf) & ~0xf) - srcW;
386d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
387d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case PLANE_TRANSFORM_180:
388d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcX += ((srcW + 0xf) & ~0xf) - srcW;
389d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcY += ((srcH + 0xf) & ~0xf) - srcH;
390d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
391d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case PLANE_TRANSFORM_270:
392d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            srcY += ((srcH + 0xf) & ~0xf) - srcH;
393d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
394d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        default:
395d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
396d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
397d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
398d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // calculate stride
399d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        switch (grallocMapper.getFormat()) {
400d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_YV12:
401d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_I420:
402d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            yStride = align_to(align_to(w, 32), 64);
403d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            uvStride = align_to(yStride >> 1, 64);
404d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.yStride = yStride;
405d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.uvStride = uvStride;
406d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
407d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:
408d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            yStride = align_to(align_to(w, 32), 64);
409d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            uvStride = yStride;
410d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.yStride = yStride;
411d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.uvStride = uvStride;
412d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
413d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_YUY2:
414d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        case HAL_PIXEL_FORMAT_UYVY:
415d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            yStride = align_to((align_to(w, 32) << 1), 64);
416d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            uvStride = 0;
417d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.yStride = yStride;
418d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            stride.yuv.uvStride = uvStride;
419d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            break;
420d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
421d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
422d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // update buffer
423d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        buf->setStride(stride);
424d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        buf->setWidth(w);
425d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        buf->setHeight(h);
426d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        buf->setCrop(srcX, srcY, srcW, srcH);
427d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        buf->setFormat(grallocMapper.getFormat());
428d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
429d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // create buffer mapper
430d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mapper = new TTMBufferMapper(*mWsbm, *buf);
431d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!mapper) {
432d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            ETRACE("failed to allocate mapper");
433d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            goto mapper_err;
434d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
435d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // map ttm buffer
436d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ret = mapper->map();
437d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!ret) {
438d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            ETRACE("failed to map");
439d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            goto map_err;
440d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
441d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
442d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // add mapper
443d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        index = mTTMBuffers.add(khandle, mapper);
444d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (index < 0) {
445d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            ETRACE("failed to add TTMMapper");
446d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            goto add_err;
447d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
448d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else {
449d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        VTRACE("got mapper in saved ttm buffers");
450d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mapper = reinterpret_cast<TTMBufferMapper *>(mTTMBuffers.valueAt(index));
451d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
452d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
453d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // sync rotated data buffer.
454d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // Well, I have to, video driver DOESN'T support sync this buffer
455d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = mapper->waitIdle();
456d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
457d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        WTRACE("failed to wait for idle");
458d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
459d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
460d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    XTRACE();
461d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
462d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return mapper;
463d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuadd_err:
464d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mapper->unmap();
465d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiumap_err:
466d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    delete mapper;
467d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return 0;
468d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiumapper_err:
469d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    delete buf;
470d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return 0;
471d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
472d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
473d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::putTTMMapper(BufferMapper* mapper)
474d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
475d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!mapper)
476d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
477d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
478d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // unmap it
479d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mapper->unmap();
480d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
481d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // remove it from recorded TTM buffers
482d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mTTMBuffers.removeItem(mapper->getKey());
483d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
484d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // destroy this mapper
485d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    delete mapper;
486d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
487d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
488d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::rotatedBufferReady(BufferMapper& mapper)
489d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
490d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    struct VideoPayloadBuffer *payload;
491d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t format;
492d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
493d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // only NV12_VED has rotated buffer
494d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    format = mapper.getFormat();
495d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (format != OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar)
496d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
497d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
498d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    payload = (struct VideoPayloadBuffer *)mapper.getCpuAddress(SUB_BUFFER1);
499d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // check payload
500d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!payload) {
501d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("no payload found");
502d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
503d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
504d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
505d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (payload->force_output_method == FORCE_OUTPUT_GPU)
506d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
507d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
508d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (payload->client_transform != mTransform) {
509d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        WTRACE("client is not ready");
510d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
511d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
512d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
513d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
514d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
515d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
516d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::checkPosition(int& x, int& y, int& w, int& h)
517d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
518d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int outputIndex = -1;
519d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    struct Output *output;
520d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    drmModeModeInfoPtr mode;
521d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    drmModeCrtcPtr drmCrtc;
522d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    Drm *drm = Hwcomposer::getInstance().getDrm();
523d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
524d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch (mDevice) {
525d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case IDisplayDevice::DEVICE_PRIMARY:
526d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        outputIndex = Drm::OUTPUT_PRIMARY;
527d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
528d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case IDisplayDevice::DEVICE_EXTERNAL:
529d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        outputIndex = Drm::OUTPUT_EXTERNAL;
530d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
531d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
532d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
533d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (outputIndex < 0)
534d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
535d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
536d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!drm) {
537d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to get drm");
538d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
539d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
540d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
541d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // get output
542d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    output = drm->getOutput(outputIndex);
543d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!output) {
544d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to get output");
545d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
546d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
547d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
548d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    drmCrtc = output->crtc;
549d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!drmCrtc)
550d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
551d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
552d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mode = &drmCrtc->mode;
553d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!drmCrtc->mode_valid || !mode->hdisplay || !mode->vdisplay)
554d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return;
555d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
556d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (x < 0)
557d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        x = 0;
558d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (y < 0)
559d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        y = 0;
560d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((x + w) > mode->hdisplay)
561d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        w = mode->hdisplay - x;
562d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((y + h) > mode->vdisplay)
563d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        h = mode->vdisplay - y;
564d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
565d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
566d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper)
567d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
568d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
569d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
570d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
571d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
572d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
573d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
574d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
575d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
576d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t format = mapper.getFormat();
577d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12);
578d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t yStride = mapper.getStride().yuv.yStride;
579d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t uvStride = mapper.getStride().yuv.uvStride;
580d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t w = mapper.getWidth();
581d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t h = mapper.getHeight();
582d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcX= mapper.getCrop().x;
583d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcY= mapper.getCrop().y;
584d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
585d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // clear original format setting
586d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD &= ~(0xf << 10);
587d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
588d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // Y/U/V plane must be 4k bytes aligned.
589d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_0Y = gttOffsetInBytes;
590927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu    if (mIsProtectedBuffer) {
591927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        // temporary workaround until vsync event logic is corrected.
592927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        // it seems that overlay buffer update and renderring can be overlapped,
593927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        // as such encryption bit may be cleared during HW rendering
594927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu        backBuffer->OSTART_0Y |= 0x01;
595927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu    }
596927f4c04efeec7f2f63bbf10dd6552bc4b65317fAndy Qiu
597d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_0U = gttOffsetInBytes;
598d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_0V = gttOffsetInBytes;
599d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
600d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_1Y = backBuffer->OSTART_0Y;
601d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_1U = backBuffer->OSTART_0U;
602d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTART_1V = backBuffer->OSTART_0V;
603d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
604d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch(format) {
605d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_YV12:    /*YV12*/
606d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
607d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = yStride * h;
608d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2));
609d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
610d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
611d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_I420:    /*I420*/
612d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
613d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = yStride * h;
614d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = backBuffer->OBUF_0U + (uvStride * (h / 2));
615d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
616d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
617d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /**
618d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     * NOTE: this is the decoded video format, align the height to 32B
619d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     * as it's defined by video driver
620d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     */
621d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:    /*NV12*/
622d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
623d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = yStride * align_to(h, 32);
624d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = 0;
625d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_NV12_2;
626d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
627d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_YUY2:    /*YUY2*/
628d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
629d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = 0;
630d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = 0;
631d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422;
632d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_PACKED_ORDER_YUY2;
633d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
634d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_UYVY:    /*UYVY*/
635d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0Y = 0;
636d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0U = 0;
637d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OBUF_0V = 0;
638d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_FORMAT_PACKED_YUV422;
639d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->OCMD |= OVERLAY_PACKED_ORDER_UYVY;
640d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
641d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    default:
642d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("unsupported format %d", format);
643d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
644d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
645d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
646d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_0Y += srcY * yStride + srcX;
647d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_0V += (srcY / 2) * uvStride + srcX;
648d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_0U += (srcY / 2) * uvStride + srcX;
649d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_1Y = backBuffer->OBUF_0Y;
650d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_1U = backBuffer->OBUF_0U;
651d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OBUF_1V = backBuffer->OBUF_0V;
652d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
653d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("done. offset (%d, %d, %d)",
654d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          backBuffer->OBUF_0Y,
655d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          backBuffer->OBUF_0U,
656d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          backBuffer->OBUF_0V);
657d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
658d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
659d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
660d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuuint32_t OverlayPlaneBase::calculateSWidthSW(uint32_t offset, uint32_t width)
661d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
662d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ATRACE("offset = %d, width = %d", offset, width);
663d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
664d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t swidth = ((offset + width + 0x3F) >> 6) - (offset >> 6);
665d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
666d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidth <<= 1;
667d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidth -= 1;
668d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
669d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return swidth;
670d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
671d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
672d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper)
673d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
674d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    CTRACE();
675d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
676d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
677d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
678d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
679d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
680d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
681d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
682d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t swidthy = 0;
683d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t swidthuv = 0;
684d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t format = mapper.getFormat();
685d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t width = mapper.getCrop().w;
686d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t height = mapper.getCrop().h;
687d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t yStride = mapper.getStride().yuv.yStride;
688d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t uvStride = mapper.getStride().yuv.uvStride;
689d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t offsety = backBuffer->OBUF_0Y;
690d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t offsetu = backBuffer->OBUF_0U;
691d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
692d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    switch (format) {
693d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_YV12:              /*YV12*/
694d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_I420:              /*I420*/
695d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:          /*NV12*/
696d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
697d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_YUY2:              /*YUY2*/
698d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    case HAL_PIXEL_FORMAT_UYVY:              /*UYVY*/
699d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        width <<= 1;
700d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        break;
701d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    default:
702d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("unsupported format %d", format);
703d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
704d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
705d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
706d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (width <= 0 || height <= 0) {
707d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid src dim");
708d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
709d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
710d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
711d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (yStride <=0 && uvStride <= 0) {
712d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid source stride");
713d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
714d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
715d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
716d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SWIDTH = width | ((width / 2) << 16);
717d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidthy = calculateSWidthSW(offsety, width);
718d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    swidthuv = calculateSWidthSW(offsetu, width / 2);
719d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SWIDTHSW = (swidthy << 2) | (swidthuv << 18);
720d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->SHEIGHT = height | ((height / 2) << 16);
721d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OSTRIDE = (yStride & (~0x3f)) | ((uvStride & (~0x3f)) << 16);
722d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
723d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    XTRACE();
724d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
725d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
726d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
727d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
728d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setCoeffRegs(double *coeff, int mantSize,
729d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                                  coeffPtr pCoeff, int pos)
730d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
731d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int maxVal, icoeff, res;
732d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int sign;
733d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double c;
734d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
735d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    sign = 0;
736d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    maxVal = 1 << mantSize;
737d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    c = *coeff;
738d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (c < 0.0) {
739d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        sign = 1;
740d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        c = -c;
741d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
742d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
743d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    res = 12 - mantSize;
744d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) {
745d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 3;
746d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
747d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(4 * maxVal);
748d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) {
749d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 2;
750d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
751d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(2 * maxVal);
752d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) {
753d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 1;
754d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
755d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(maxVal);
756d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) {
757d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].exponent = 0;
758d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        pCoeff[pos].mantissa = icoeff << res;
759d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = (double)icoeff / (double)(maxVal / 2);
760d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else {
761d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        /* Coeff out of range */
762d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
763d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
764d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
765d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    pCoeff[pos].sign = sign;
766d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (sign)
767d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        *coeff = -(*coeff);
768d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
769d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
770d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
771d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiuvoid OverlayPlaneBase::updateCoeff(int taps, double fCutoff,
772d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                                 bool isHoriz, bool isY,
773d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                                 coeffPtr pCoeff)
774d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
775d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int i, j, j1, num, pos, mantSize;
776d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double pi = 3.1415926535, val, sinc, window, sum;
777d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS];
778d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    double diff;
779d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int tapAdjust[MAX_TAPS], tap2Fix;
780d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool isVertAndUV;
781d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
782d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (isHoriz)
783d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mantSize = 7;
784d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    else
785d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mantSize = 6;
786d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
787d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    isVertAndUV = !isHoriz && !isY;
788d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    num = taps * 16;
789d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    for (i = 0; i < num  * 2; i++) {
790d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num);
791d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (val == 0.0)
792d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sinc = 1.0;
793d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        else
794d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sinc = sin(val) / val;
795d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
796d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        /* Hamming window */
797d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        window = (0.54 - 0.46 * cos(2 * i * pi / (2 * num - 1)));
798d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        rawCoeff[i] = sinc * window;
799d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
800d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
801d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    for (i = 0; i < N_PHASES; i++) {
802d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        /* Normalise the coefficients. */
803d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        sum = 0.0;
804d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++) {
805d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            pos = i + j * 32;
806d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sum += rawCoeff[pos];
807d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
808d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++) {
809d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            pos = i + j * 32;
810d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            coeffs[i][j] = rawCoeff[pos] / sum;
811d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
812d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
813d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        /* Set the register values. */
814d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++) {
815d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            pos = j + i * taps;
816d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            if ((j == (taps - 1) / 2) && !isVertAndUV)
817d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                setCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos);
818d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            else
819d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                setCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos);
820d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
821d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
822d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        tapAdjust[0] = (taps - 1) / 2;
823d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) {
824d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tapAdjust[j1] = tapAdjust[0] - j;
825d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            tapAdjust[++j1] = tapAdjust[0] + j;
826d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
827d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
828d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        /* Adjust the coefficients. */
829d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        sum = 0.0;
830d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (j = 0; j < taps; j++)
831d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            sum += coeffs[i][j];
832d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (sum != 1.0) {
833d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            for (j1 = 0; j1 < taps; j1++) {
834d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                tap2Fix = tapAdjust[j1];
835d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                diff = 1.0 - sum;
836d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                coeffs[i][tap2Fix] += diff;
837d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                pos = tap2Fix + i * taps;
838d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV)
839d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    setCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos);
840d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                else
841d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    setCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos);
842d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
843d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                sum = 0.0;
844d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                for (j = 0; j < taps; j++)
845d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    sum += coeffs[i][j];
846d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                if (sum == 1.0)
847d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                    break;
848d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            }
849d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
850d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
851d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
852d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
853d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::scalingSetup(BufferMapper& mapper)
854d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
855d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int xscaleInt, xscaleFract, yscaleInt, yscaleFract;
856d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int xscaleIntUV, xscaleFractUV;
857d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int yscaleIntUV, yscaleFractUV;
858d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int deinterlace_factor = 1;
859d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /* UV is half the size of Y -- YUV420 */
860d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int uvratio = 2;
861d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t newval;
862d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    coeffRec xcoeffY[N_HORIZ_Y_TAPS * N_PHASES];
863d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    coeffRec xcoeffUV[N_HORIZ_UV_TAPS * N_PHASES];
864d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int i, j, pos;
865d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool scaleChanged = false;
866d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    int x, y, w, h;
867d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
868d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
869d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
870d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
871d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
872d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
873d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
874d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    x = mPosition.x;
875d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    y = mPosition.y;
876d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    w = mPosition.w;
877d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    h = mPosition.h;
878d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
879d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // check position
880d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    checkPosition(x, y, w, h);
881d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("final position (%d, %d, %d, %d)", x, y, w, h);
882d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
883d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if ((w <= 0) || (h <= 0)) {
884d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu         ETRACE("invalid dst width/height");
885d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu         return false;
886d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
887d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
888d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // setup dst position
889d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DWINPOS = (y << 16) | x;
890d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->DWINSZ = (h << 16) | w;
891d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
892d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcWidth = mapper.getCrop().w;
893d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t srcHeight = mapper.getCrop().h;
894d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t dstWidth = w;
895d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    uint32_t dstHeight = h;
896d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
897d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    VTRACE("src (%dx%d), dst (%dx%d)",
898d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          srcWidth, srcHeight,
899d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu          dstWidth, dstHeight);
900d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /*
901d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     * Y down-scale factor as a multiple of 4096.
902d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     */
903d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (srcWidth == dstWidth && srcHeight == dstHeight) {
904d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        xscaleFract = (1 << 12);
905d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        yscaleFract = (1 << 12)/deinterlace_factor;
906d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    } else {
907d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        xscaleFract = ((srcWidth - 1) << 12) / dstWidth;
908d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        yscaleFract = ((srcHeight - 1) << 12) / (dstHeight * deinterlace_factor);
909d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
910d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
911d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /* Calculate the UV scaling factor. */
912d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleFractUV = xscaleFract / uvratio;
913d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleFractUV = yscaleFract / uvratio;
914d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
915d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /*
916d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     * To keep the relative Y and UV ratios exact, round the Y scales
917d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     * to a multiple of the Y/UV ratio.
918d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     */
919d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleFract = xscaleFractUV * uvratio;
920d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleFract = yscaleFractUV * uvratio;
921d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
922d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /* Integer (un-multiplied) values. */
923d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleInt = xscaleFract >> 12;
924d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleInt = yscaleFract >> 12;
925d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
926d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    xscaleIntUV = xscaleFractUV >> 12;
927d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    yscaleIntUV = yscaleFractUV >> 12;
928d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
929d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /* Check scaling ratio */
930d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (xscaleInt > INTEL_OVERLAY_MAX_SCALING_RATIO) {
931d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("xscaleInt > %d", INTEL_OVERLAY_MAX_SCALING_RATIO);
932d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
933d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
934d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
935d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /* shouldn't get here */
936d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (xscaleIntUV > INTEL_OVERLAY_MAX_SCALING_RATIO) {
937d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("xscaleIntUV > %d", INTEL_OVERLAY_MAX_SCALING_RATIO);
938d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
939d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
940d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
941d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    newval = (xscaleInt << 15) |
942d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20);
943d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (newval != backBuffer->YRGBSCALE) {
944d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        scaleChanged = true;
945d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->YRGBSCALE = newval;
946d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
947d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
948d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    newval = (xscaleIntUV << 15) | ((xscaleFractUV & 0xFFF) << 3) |
949d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ((yscaleFractUV & 0xFFF) << 20);
950d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (newval != backBuffer->UVSCALE) {
951d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        scaleChanged = true;
952d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->UVSCALE = newval;
953d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
954d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
955d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    newval = yscaleInt << 16 | yscaleIntUV;
956d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (newval != backBuffer->UVSCALEV) {
957d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        scaleChanged = true;
958d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        backBuffer->UVSCALEV = newval;
959d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
960d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
961d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /* Recalculate coefficients if the scaling changed. */
962d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    /*
963d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     * Only Horizontal coefficients so far.
964d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu     */
965d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (scaleChanged) {
966d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        double fCutoffY;
967d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        double fCutoffUV;
968d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
969d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        fCutoffY = xscaleFract / 4096.0;
970d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        fCutoffUV = xscaleFractUV / 4096.0;
971d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
972d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        /* Limit to between 1.0 and 3.0. */
973d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffY < MIN_CUTOFF_FREQ)
974d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffY = MIN_CUTOFF_FREQ;
975d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffY > MAX_CUTOFF_FREQ)
976d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffY = MAX_CUTOFF_FREQ;
977d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffUV < MIN_CUTOFF_FREQ)
978d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffUV = MIN_CUTOFF_FREQ;
979d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (fCutoffUV > MAX_CUTOFF_FREQ)
980d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            fCutoffUV = MAX_CUTOFF_FREQ;
981d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
982d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        updateCoeff(N_HORIZ_Y_TAPS, fCutoffY, true, true, xcoeffY);
983d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        updateCoeff(N_HORIZ_UV_TAPS, fCutoffUV, true, false, xcoeffUV);
984d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
985d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (i = 0; i < N_PHASES; i++) {
986d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            for (j = 0; j < N_HORIZ_Y_TAPS; j++) {
987d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                pos = i * N_HORIZ_Y_TAPS + j;
988d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                backBuffer->Y_HCOEFS[pos] =
989d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                        (xcoeffY[pos].sign << 15 |
990d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         xcoeffY[pos].exponent << 12 |
991d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         xcoeffY[pos].mantissa);
992d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            }
993d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
994d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        for (i = 0; i < N_PHASES; i++) {
995d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            for (j = 0; j < N_HORIZ_UV_TAPS; j++) {
996d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                pos = i * N_HORIZ_UV_TAPS + j;
997d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                backBuffer->UV_HCOEFS[pos] =
998d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                         (xcoeffUV[pos].sign << 15 |
999d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                          xcoeffUV[pos].exponent << 12 |
1000d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu                          xcoeffUV[pos].mantissa);
1001d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            }
1002d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1003d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1004d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1005d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    XTRACE();
1006d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
1007d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
1008d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1009d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiubool OverlayPlaneBase::setDataBuffer(BufferMapper& grallocMapper)
1010d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu{
1011d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    BufferMapper *mapper;
1012d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    bool ret;
1013d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1014d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    RETURN_FALSE_IF_NOT_INIT();
1015d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1016d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // get gralloc mapper
1017d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    mapper = &grallocMapper;
1018d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    // check transform when overlay is attached to primary device
1019d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (mTransform && !mPipeConfig) {
1020d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!rotatedBufferReady(grallocMapper)) {
1021d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            WTRACE("rotated buffer is not ready");
1022d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            return false;
1023d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1024d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1025d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        // get rotated data buffer mapper
1026d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        mapper = getTTMMapper(grallocMapper);
1027d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        if (!mapper) {
1028d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            ETRACE("failed to get rotated buffer");
1029d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu            return false;
1030d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        }
1031d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1032d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1033d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    OverlayBackBufferBlk *backBuffer = mBackBuffer->buf;
1034d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (!backBuffer) {
1035d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("invalid back buffer");
1036d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1037d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1038d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1039d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = bufferOffsetSetup(*mapper);
1040d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
1041d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to set up buffer offsets");
1042d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1043d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1044d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1045d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = coordinateSetup(*mapper);
1046d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
1047d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to set up overlay coordinates");
1048d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1049d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1050d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1051d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    ret = scalingSetup(*mapper);
1052d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    if (ret == false) {
1053d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        ETRACE("failed to set up scaling parameters");
1054d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu        return false;
1055d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    }
1056d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1057d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    backBuffer->OCMD |= 0x1;
1058d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu    return true;
1059d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu}
1060d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1061d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace intel
1062d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu} // namespace android
1063d6e27b5e0db47512cdcf1ea61e6860eab61156ebAndy Qiu
1064